FMI_Window_sa.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. /* ---------------------------------------------------------------------------*
  2. * Sample implementation of an generic master FMU -
  3. * ---------------------------------------------------------------------------*/
  4. /*
  5. Template for a FMU
  6. */
  7. #define MODEL_IDENTIFIER GM
  8. #define MODEL_GUID "{41f87101-edf2-4eef-90f3-42db56d4565f}"
  9. #define FMI2_FUNCTION_PREFIX WINDOW_SA
  10. #include <stdio.h>
  11. #include "string.h"
  12. #include "fmi2Functions.h"
  13. #include <float.h>
  14. #include "FMI_Window_sa.h"
  15. #include <math.h>
  16. #include "fmi2.h"
  17. #include "sim_support.h"
  18. #define MAX 100000
  19. #define NUMBER_OF_REALS 5
  20. #define NUMBER_OF_STRINGS 0
  21. #define NUMBER_OF_BOOLEANS 0
  22. #define NUMBER_OF_INTEGERS 0
  23. /*
  24. * The input
  25. */
  26. #define _out_tau 0
  27. #define _out_height 1
  28. #define _in_reaction_force 2
  29. #define _in_displacement 3
  30. #define _in_speed 4
  31. double relativeError(double a, double b){
  32. if(a==0){
  33. return 0;
  34. }
  35. return fabs((a - b) / a);
  36. }
  37. /*
  38. * Helper function for absolute error
  39. */
  40. double absoluteError(double a, double b){
  41. return fabs(a - b);
  42. }
  43. /*
  44. * is_close function for double comparison
  45. */
  46. int is_close(double a, double b, double REL_TOL, double ABS_TOL){
  47. return ((absoluteError(a,b)<ABS_TOL) && (relativeError(a,b)<REL_TOL));
  48. }
  49. fmi2Status fmi2SetDebugLogging(fmi2Component fc, fmi2Boolean loggingOn, size_t nCategories, const fmi2String categories[])
  50. {
  51. FMUInstance* fi = (FMUInstance *)fc;
  52. fi->fmu[0].setDebugLogging(fi->c_fmu[0],loggingOn,nCategories,categories);
  53. return fmi2OK;
  54. }
  55. fmi2Status fmi2SetString(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, const fmi2String value[])
  56. {
  57. FMUInstance* comp = (FMUInstance *)fc;
  58. memset(comp->out_conditions_executed,0,sizeof(fmi2Boolean)*_NR_OF_OUT_CONDITIONS);
  59. return fmi2Error;
  60. }
  61. fmi2Status fmi2GetString(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, fmi2String value[])
  62. {
  63. return fmi2Error;
  64. }
  65. fmi2Status fmi2SetReal(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, const fmi2Real value[])
  66. {
  67. FMUInstance* comp = (FMUInstance *)fc;
  68. int i;
  69. int isset[NUMBER_OF_REALS];
  70. memset(isset, 0, sizeof(int)*NUMBER_OF_REALS);
  71. for (i = 0; i < nvr; i++)
  72. {
  73. comp->r[vr[i]] = value[i];
  74. isset[vr[i]] = 1;
  75. }
  76. /*Generated: */
  77. fmi2Boolean in_condition[_NR_OF_IN_CONDITIONS];
  78. /*Condition checking:*/
  79. // true
  80. in_condition[0] = 1;
  81. if(in_condition[0]){
  82. if(isset[_in_reaction_force]){
  83. comp->stored_windowsa_reaction_force = comp->r[_in_reaction_force];
  84. }
  85. if(isset[_in_speed]){
  86. comp->stored_windowsa_speed = comp->r[_in_speed];
  87. }
  88. if(isset[_in_displacement]){
  89. comp->stored_windowsa_displacement = comp->r[_in_displacement];
  90. }
  91. /* If mealy do update_in and recursive call */
  92. }
  93. //out_condition_executed := empty map
  94. memset(comp->out_conditions_executed,0,sizeof(fmi2Boolean)*_NR_OF_OUT_CONDITIONS);
  95. return fmi2OK;
  96. }
  97. fmi2Status fmi2GetReal(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, fmi2Real value[])
  98. {
  99. FMUInstance* comp = (FMUInstance *)fc;
  100. printf("%s: getReal with vr: \n", comp->instanceName);
  101. for (int i = 0; i < nvr; ++i) {
  102. printf("vr[%d] = %d \n", i, vr[i]);
  103. }
  104. int isEmpty = 1;
  105. for (int i=0; i<_NR_OF_OUT_CONDITIONS;i++){
  106. if(comp->out_conditions_executed[i] !=0){
  107. isEmpty = 0;
  108. break;
  109. }
  110. }
  111. /*Eval conditions:*/
  112. if(1){
  113. comp->out_conditions_executed[0] = 1;
  114. }
  115. for(int i=0; i<_NR_OF_OUT_CONDITIONS;i++){
  116. if(comp->out_conditions_executed[i]){
  117. comp->r[_out_tau] = comp->stored_window_reaction_torque;
  118. printf("setted out_tau: %f\n",comp->r[_out_tau]);
  119. comp->r[_out_height] = comp->stored_window_height;
  120. printf("setted out_height: %f\n",comp->r[_out_height]);
  121. }
  122. }
  123. for (int i = 0; i < nvr; i++)
  124. {
  125. value[i] = comp->r[(vr[i])];
  126. }
  127. return fmi2OK;
  128. }
  129. fmi2Status fmi2SetBoolean(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, const fmi2Boolean value[])
  130. {
  131. FMUInstance* comp = (FMUInstance *)fc;
  132. int i;
  133. for (i = 0; i < nvr; i++)
  134. {
  135. comp->b[vr[i]] = value[i];
  136. }
  137. /*Generated: */
  138. fmi2Boolean in_condition[_NR_OF_IN_CONDITIONS];
  139. /*Condition checking:*/
  140. // true
  141. in_condition[0] = 1;
  142. if(in_condition[0]){
  143. /* If mealy do update_in and recursive call */
  144. }
  145. return fmi2OK;
  146. //out_condition_executed := empty map
  147. memset(comp->out_conditions_executed,0,sizeof(fmi2Boolean)*_NR_OF_OUT_CONDITIONS);
  148. return fmi2OK;
  149. }
  150. fmi2Status fmi2GetBoolean(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, fmi2Boolean value[])
  151. {
  152. FMUInstance* comp = (FMUInstance *)fc;
  153. int i;
  154. for (i = 0; i < nvr; i++)
  155. {
  156. value[i] = comp->b[vr[i]];
  157. }
  158. return fmi2OK;
  159. }
  160. fmi2Component fmi2Instantiate(fmi2String instanceName, fmi2Type fmuType, fmi2String fmuGUID, fmi2String fmuLocation, const fmi2CallbackFunctions* functions, fmi2Boolean visible, fmi2Boolean loggingOn)
  161. {
  162. //Declare data structure for fmu instance
  163. FMUInstance* fi;
  164. printf("%s in fmiInstantiate\n",instanceName);
  165. //Perform checks on passed callback functions
  166. if (loggingOn) {
  167. if (!functions->logger);
  168. //return NULL;
  169. }
  170. //Check for instanceName
  171. if (!instanceName || strlen(instanceName)==0) {
  172. // print (and/or log) instanceName is missing
  173. //return NULL;
  174. }
  175. //Check passed GUID to defined model GUID
  176. if (strcmp(fmuGUID, MODEL_GUID))
  177. {
  178. // print (and/or log) GUID doesn't match
  179. //return NULL;
  180. }
  181. //Allocate fmu instance Memory
  182. // TODO check if "canNotUseMemoryManagementFunctions == true/false". If false memory allocation not possible
  183. fi = (FMUInstance *)functions->allocateMemory(1, sizeof(FMUInstance));
  184. if (fi) {
  185. // Think about what to do with variable values. Using these structs and pointers slows down simulation computations. Maybe only necessary for input, output and tunable parameters??
  186. fi->r = functions->allocateMemory(NUMBER_OF_REALS, sizeof(fmi2Real));
  187. fi->i = functions->allocateMemory(NUMBER_OF_INTEGERS, sizeof(fmi2Integer));
  188. fi->b = functions->allocateMemory(NUMBER_OF_BOOLEANS, sizeof(fmi2Boolean));
  189. fi->s = functions->allocateMemory(NUMBER_OF_STRINGS, sizeof(fmi2String));
  190. } // variables in predefined arrays (performance issue) --> makes multiple instances of fmu impossible
  191. fi->instanceName = functions->allocateMemory(1 + strlen(instanceName), sizeof(char));
  192. fi->GUID = functions->allocateMemory(1 + strlen(fmuGUID), sizeof(char));
  193. strcpy((char*)fi->instanceName, instanceName);
  194. strcpy((char*)fi->GUID, fmuGUID);
  195. fi->functions = functions;
  196. fi->loggingOn = loggingOn;
  197. fi->isVisible = visible;
  198. fi->state = fmuInstantiated;
  199. /* Load the inner FMUs:*/
  200. loadDll("Window.dll", &(fi->fmu[0]), "");
  201. fi->fmuResourceLocation[0] = "Window";
  202. /*Instantiate inner components*/
  203. for (int i=0; i<1; i++){
  204. fi->c_fmu[i] = fi->fmu[i].instantiate("Window", fmi2CoSimulation, "{6732d7cb-1034-4ea3-b345-8072a4efef22}", fi->fmuResourceLocation[i] , fi->functions, visible, 0);
  205. }
  206. return fi;
  207. }
  208. fmi2Status fmi2SetupExperiment(fmi2Component fc, fmi2Boolean toleranceDefined, fmi2Real tolerance,
  209. fmi2Real startTime, fmi2Boolean stopTimeDefined, fmi2Real stopTime) {
  210. FMUInstance* fi = (FMUInstance*) fc;
  211. printf("%s in fmiSetupExperiment\n",fi->instanceName);
  212. if (fi->state != fmuInstantiated)
  213. {
  214. printf("fmu: %s was not instantiated before calling fmiSetupExperiment\n", fi->instanceName);
  215. return fmi2Error;
  216. }
  217. fi->currentTime = startTime;
  218. fi->stopTimeDefined = stopTimeDefined;
  219. fi->toleranceDefined = toleranceDefined;
  220. if (stopTimeDefined)
  221. {
  222. fi->stopTime = stopTime;
  223. }
  224. /*
  225. * setup inner
  226. */
  227. fmi2Status fmi2Flag = fmi2OK;
  228. fi->state = fmuExperimentSettedUp;
  229. for(int i=0; i<1; i++){
  230. fmi2Flag = fi->fmu[i].setupExperiment(fi->c_fmu[i], toleranceDefined, tolerance, startTime, fmi2True, stopTime);
  231. if (fmi2Flag == fmi2Error){
  232. fi->state = fmuError;
  233. }
  234. }
  235. fi->stored_windowsa_reaction_force=0;
  236. fi->stored_windowsa_displacement=0;
  237. fi->stored_windowsa_speed=0;
  238. fi->stored_window_reaction_torque=0;
  239. fi->stored_window_height=0;
  240. return fmi2Flag;
  241. }
  242. fmi2Status fmi2EnterInitializationMode(fmi2Component fc)
  243. {
  244. FMUInstance* fi = (FMUInstance*) fc;
  245. printf("%s in fmiEnterInitializationMode\n",fi->instanceName);
  246. if (fi->state != fmuExperimentSettedUp)
  247. {
  248. printf("fmu: %s experiment was not set-up before calling fmiEnterInitializationMode\n", fi->instanceName);
  249. return fmi2Error;
  250. }
  251. fi->state = fmuInitMode;
  252. fmi2Status fmi2Flag = fmi2OK;
  253. for(int i=0; i<1; i++){
  254. fmi2Flag = fi->fmu[i].enterInitializationMode(fi->c_fmu[i]);
  255. if (fmi2Flag == fmi2Error){
  256. return fi->state = fmuError;
  257. }
  258. }
  259. return fmi2Flag;
  260. }
  261. fmi2Status fmi2ExitInitializationMode(fmi2Component fc)
  262. {
  263. FMUInstance* fi = (FMUInstance*) fc;
  264. printf("%s in fmiExitInitializationMode\n",fi->instanceName);
  265. if (fi->state != fmuInitMode)
  266. {
  267. printf("fmu: %s did not enter Initialization Mode before calling fmiExitInitializationMode\n", fi->instanceName);
  268. return fmi2Error;
  269. }
  270. // TODO
  271. //initStatus = calculateInitialUnknownValues();
  272. //initialize();
  273. fi->state = fmuInitialized;
  274. fmi2Status fmi2Flag = fmi2OK;
  275. for(int i=0; i<1;i++){
  276. fmi2Flag = fi->fmu[i].exitInitializationMode(fi->c_fmu[i]);
  277. if (fmi2Flag == fmi2Error){
  278. return fi->state = fmuError;
  279. }
  280. }
  281. return fmi2Flag;
  282. }
  283. static fmi2Status DoInnerStep(fmi2Component fc, int index, fmi2Real currentCommPoint, fmi2Real commStepSize){
  284. fmi2Status status = fmi2OK;
  285. FMUInstance* fi = (FMUInstance *)fc;
  286. fmi2Real dt = currentCommPoint - fi->time_last_fmu[index];
  287. fmi2Real h = commStepSize + dt;
  288. if (1){
  289. fmi2ValueReference vr_toWindow[3] = {3,4,0};
  290. fmi2Real values[3];
  291. values[0] = fi->stored_windowsa_reaction_force;
  292. values[1] = fi->stored_windowsa_speed;
  293. values[2] = fi->stored_windowsa_displacement;
  294. fi->fmu[index].setReal(fi->c_fmu[index],vr_toWindow, 3, &values[0]);
  295. }
  296. status = fi->fmu[index].doStep(fi->c_fmu[index],fi->time_last_fmu[index],h,fmi2True);
  297. if(status == fmi2OK){
  298. fi->time_last_fmu[index]+= h;
  299. }
  300. if (1){
  301. fmi2ValueReference vr_fromWindow[2] = {1,2};
  302. fmi2Real out_values[2];
  303. fi->fmu[index].getReal(fi->c_fmu[index],vr_fromWindow, 2, &out_values[0]);
  304. fi->stored_window_reaction_torque = out_values[0];
  305. fi->stored_window_height = out_values[1];
  306. }
  307. return status;
  308. }
  309. fmi2Status fmi2DoStep(fmi2Component fc , fmi2Real currentCommPoint, fmi2Real commStepSize, fmi2Boolean noPrevFMUState)
  310. {
  311. FMUInstance* fi = (FMUInstance *)fc;
  312. fmi2Status simStatus = fmi2OK;
  313. printf("%s in fmiDoStep(), ct:%f, h:%f\n",fi->instanceName,currentCommPoint,commStepSize);
  314. memset(fi->out_conditions_executed,0,sizeof(fmi2Boolean)*_NR_OF_OUT_CONDITIONS);
  315. /*
  316. Calculate the elapsed time since the last transition
  317. */
  318. fmi2Real e = MAX;
  319. fmi2Real elapsed_fmu[_NR_OF_FMUS];
  320. for (int i=0; i<_NR_OF_FMUS; i++){
  321. elapsed_fmu[i] = currentCommPoint - fi->time_last_fmu[i];
  322. e = (elapsed_fmu[i]<e)? elapsed_fmu[i]:e;
  323. }
  324. if(1){
  325. simStatus= DoInnerStep(fc,0,currentCommPoint,commStepSize);
  326. }
  327. memset(fi->in_condition_executed, 0, sizeof(fmi2Boolean)*_NR_OF_IN_CONDITIONS);
  328. return simStatus;
  329. }
  330. fmi2Status fmi2Terminate(fmi2Component fc)
  331. {
  332. FMUInstance* fi = (FMUInstance *)fc;
  333. printf("%s in fmiTerminate\n",fi->instanceName);
  334. // do check if fi may be terminated
  335. for (int i=0;i<1;i++){
  336. fi->fmu[i].terminate(fi->c_fmu[i]);
  337. }
  338. fi->state = fmuTerminated;
  339. return fmi2OK;
  340. }
  341. void fmi2FreeInstance(fmi2Component fc)
  342. {
  343. FMUInstance* fi = (FMUInstance*) fc;
  344. printf("%s in fmiFreeInstance\n",fi->instanceName);
  345. for(int i=0;i<_NR_OF_FMUS;i++){
  346. fi->fmu[i].freeInstance(fi->c_fmu[i]);
  347. }
  348. if (fi) {
  349. fi->functions->freeMemory(fi->r);
  350. fi->functions->freeMemory(fi->i);
  351. fi->functions->freeMemory(fi->b);
  352. fi->functions->freeMemory(fi->s);// TODO has to be done with loop
  353. fi->functions->freeMemory((void*)fi->instanceName);
  354. fi->functions->freeMemory((void*)fi->GUID);
  355. fi->functions->freeMemory((void*)fi);
  356. }
  357. }
  358. //To be implemented
  359. const char* fmi2GetVersion() {
  360. printf("Function fmiGetVersion not supported\n");
  361. return NULL;
  362. }
  363. const char* fmi2GetTypesPlatform() {
  364. printf("Function fmiGetTypesPlatform not supported\n");
  365. return NULL;
  366. }
  367. fmi2Status fmi2Reset(fmi2Component fc)
  368. {
  369. printf("Function fmiReset not supported\n");
  370. return fmi2Error;
  371. }
  372. fmi2Status fmi2SetInteger(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, const fmi2Integer value[])
  373. {
  374. FMUInstance * comp = (FMUInstance*) fc;
  375. printf("Function fmiSetInteger not supported\n");
  376. memset(comp->out_conditions_executed,0,sizeof(fmi2Boolean)*_NR_OF_OUT_CONDITIONS);
  377. return fmi2Error;
  378. }
  379. fmi2Status fmi2GetInteger(fmi2Component fc, const fmi2ValueReference vr[], size_t nvr, fmi2Integer value[])
  380. {
  381. printf("Function fmiGetInteger not supported\n");
  382. return fmi2Error;
  383. }
  384. /*******OWN IMPLEMENTATION OF Get/Set FMU state*******/
  385. fmi2Status fmi2GetFMUstate (fmi2Component c, fmi2FMUstate* FMUstate) {
  386. FMUInstance* orig = (FMUInstance*)c;
  387. FMUInstance* fi = (FMUInstance *)FMUstate;
  388. *FMUstate = fi;
  389. fi = orig->functions->allocateMemory(1, sizeof(FMUInstance));
  390. *FMUstate = fi;
  391. fi->functions = orig->functions;
  392. if (fi) {
  393. // Think about what to do with variable values. Using these structs and pointers slows down simulation computations. Maybe only necessary for input, output and tunable parameters??
  394. fi->r = fi->functions->allocateMemory(NUMBER_OF_REALS, sizeof(fmi2Real));
  395. fi->i = fi->functions->allocateMemory(NUMBER_OF_INTEGERS, sizeof(fmi2Integer));
  396. fi->b = fi->functions->allocateMemory(NUMBER_OF_BOOLEANS, sizeof(fmi2Boolean));
  397. fi->s = fi->functions->allocateMemory(NUMBER_OF_STRINGS, sizeof(fmi2String));
  398. } // variables in predefined arrays (performance issue) --> makes multiple instances of fmu impossible
  399. fi->instanceName = orig->functions->allocateMemory(1 + strlen(orig->instanceName), sizeof(char));
  400. fi->GUID = orig->functions->allocateMemory(1 + strlen(orig->GUID), sizeof(char));
  401. strcpy((char *)fi->instanceName, (char *)orig->instanceName);
  402. strcpy((char *)fi->GUID, (char *)orig->GUID);
  403. fi->functions = orig->functions;
  404. fi->loggingOn = orig->loggingOn;
  405. fi->isVisible = orig->isVisible;
  406. fi->state = orig->state;
  407. fi->startTime = orig->startTime;
  408. fi->stopTime = orig->stopTime;
  409. fi->currentTime = orig->currentTime;
  410. /* TODO: Store all the rest here.*/
  411. fi->fmu[0] = orig->fmu[0];
  412. fi->c_fmu[0] = orig->c_fmu[0];
  413. for(int i=0; i<_NR_OF_IN_CONDITIONS;i++){
  414. fi->in_condition_executed[i] = orig->in_condition_executed[i];
  415. }
  416. for(int i=0; i<_NR_OF_OUT_CONDITIONS;i++){
  417. fi->out_conditions_executed[i] = orig->out_conditions_executed[i];
  418. }
  419. for(int i=0;i<_NR_OF_FMUS;i++){
  420. fi->time_last_fmu[i] = orig->time_last_fmu[i];
  421. }
  422. /* Generated */
  423. fi->stored_windowsa_reaction_force=orig->stored_windowsa_reaction_force;
  424. fi->stored_windowsa_displacement=orig->stored_windowsa_displacement;
  425. fi->stored_windowsa_speed=orig->stored_windowsa_speed;
  426. fi->stored_window_reaction_torque=orig->stored_window_reaction_torque;
  427. fi->stored_window_height=orig->stored_window_height;
  428. fi->toleranceDefined = orig->toleranceDefined;
  429. /*
  430. * This is a hierarchical call. First let the lower FMUs do their state saving
  431. * We will store the saved fmu state in the fi->c_order[i]
  432. */
  433. for(int i=0;i<_NR_OF_FMUS;i++){
  434. fi->fmu[i]=orig->fmu[i];
  435. orig->fmu[i].getFMUstate(orig->c_fmu[i],fi->c_fmu[i]);
  436. fi->fmuResourceLocation[i] = fi->functions->allocateMemory(1+strlen(orig->fmuResourceLocation[i]), sizeof(char));
  437. strcpy((char *)fi->fmuResourceLocation[i],(char *)orig->fmuResourceLocation[i]);
  438. /*make shallow copies of the stored fmus*/
  439. }
  440. //copy r
  441. int i=0;
  442. for (i=0; i< NUMBER_OF_REALS;i++){
  443. //printf("Setting real: %i %f\n", i, orig->r[i]);
  444. fi->r[i] = orig->r[i];
  445. //printf("Setted real: %i %f\n", i, fi->r[i]);
  446. }
  447. //copy s
  448. for (i=0; i< NUMBER_OF_STRINGS;i++){
  449. //fi->s[i] = orig->s[i]; // why are this not deep copies?
  450. fi->s[i] = fi->functions->allocateMemory(1+strlen(orig->s[i]),sizeof(char));
  451. strcpy((char *)fi->s[i],(char *)orig->s[i]);
  452. }
  453. //copy i
  454. for (i=0; i< NUMBER_OF_INTEGERS;i++){
  455. fi->i[i] = orig->i[i];
  456. }
  457. //copy b
  458. for (i=0; i< NUMBER_OF_BOOLEANS;i++){
  459. fi->b[i] = orig->b[i];
  460. }
  461. return fmi2OK;
  462. }
  463. fmi2Status fmi2SetFMUstate (fmi2Component c, fmi2FMUstate FMUstate) {
  464. FMUInstance* orig = (FMUInstance*)FMUstate;
  465. FMUInstance* fi = (FMUInstance*)c;
  466. /*
  467. * First restore the hierarchical fmus.
  468. */
  469. for(int i=0;i<_NR_OF_FMUS;i++){
  470. fi->fmu[i].setFMUstate(fi->c_fmu[i],orig->c_fmu[i]);
  471. fi->fmuResourceLocation[i] = orig->functions->allocateMemory(1+strlen(orig->fmuResourceLocation[i]), sizeof(char));
  472. strcpy((char *)fi->fmuResourceLocation[i],(char *)orig->fmuResourceLocation[i]);
  473. }
  474. //set time etc correct, name and GUID should still be ok ;-)
  475. printf("setting time values from %f to %f\n", fi->currentTime, orig->currentTime);
  476. fi->state = orig->state;
  477. fi->startTime = orig->startTime;
  478. fi->stopTime = orig->stopTime;
  479. fi->currentTime = orig->currentTime;
  480. fi->fmu[0] = orig->fmu[0];
  481. fi->c_fmu[0] = orig->c_fmu[0];
  482. for(int i=0; i<_NR_OF_IN_CONDITIONS;i++){
  483. fi->in_condition_executed[i] = orig->in_condition_executed[i];
  484. }
  485. for(int i=0; i<_NR_OF_OUT_CONDITIONS;i++){
  486. fi->out_conditions_executed[i] = orig->out_conditions_executed[i];
  487. }
  488. for(int i=0;i<_NR_OF_FMUS;i++){
  489. fi->time_last_fmu[i] = orig->time_last_fmu[i];
  490. }
  491. /* Generated */
  492. fi->stored_windowsa_reaction_force=orig->stored_windowsa_reaction_force;
  493. fi->stored_windowsa_displacement=orig->stored_windowsa_displacement;
  494. fi->stored_windowsa_speed=orig->stored_windowsa_speed;
  495. fi->stored_window_reaction_torque=orig->stored_window_reaction_torque;
  496. fi->stored_window_height=orig->stored_window_height;
  497. fi->toleranceDefined = orig->toleranceDefined;
  498. fi->toleranceDefined = orig->toleranceDefined;
  499. printf("setting real values\n");
  500. //copy r
  501. int i=0;
  502. for (i=0; i< NUMBER_OF_REALS;i++){
  503. fi->r[i] = orig->r[i];
  504. }
  505. printf("setting string values\n");
  506. //copy s
  507. for (i=0; i< NUMBER_OF_STRINGS;i++){
  508. fi->s[i] = orig->s[i];
  509. }
  510. //copy i
  511. for (i=0; i< NUMBER_OF_INTEGERS;i++){
  512. fi->i[i] = orig->i[i];
  513. }
  514. //copy b
  515. for (i=0; i< NUMBER_OF_BOOLEANS;i++){
  516. fi->b[i] = orig->b[i];
  517. }
  518. return fmi2OK;
  519. }
  520. /****************************************************/
  521. fmi2Status fmi2FreeFMUstate(fmi2Component c, fmi2FMUstate* FMUstate) {
  522. printf("Function fmiFreeFMUstate not supported\n");
  523. return fmi2Error;
  524. }
  525. fmi2Status fmi2SerializedFMUstateSize(fmi2Component c, fmi2FMUstate FMUstate, size_t *size) {
  526. printf("Function fmiSerializedFMUstateSize not supported\n");
  527. return fmi2Error;
  528. }
  529. fmi2Status fmi2SerializeFMUstate (fmi2Component c, fmi2FMUstate FMUstate, fmi2Byte serializedState[], size_t size) {
  530. printf("Function fmiSerializeFMUstate not supported\n");
  531. return fmi2Error;
  532. }
  533. fmi2Status fmi2DeSerializeFMUstate (fmi2Component c, const fmi2Byte serializedState[], size_t size, fmi2FMUstate* FMUstate) {
  534. printf("Function fmiDeSerializeFMUstate not supported\n");
  535. return fmi2Error;
  536. }
  537. fmi2Status fmi2GetDirectionalDerivative(fmi2Component c, const fmi2ValueReference vUnknown_ref[], size_t nUnknown,
  538. const fmi2ValueReference vKnown_ref[] , size_t nKnown, const fmi2Real dvKnown[], fmi2Real dvUnknown[]) {
  539. printf("Function fmiGetDirectionalDerivative not supported\n");
  540. return fmi2Error;
  541. }
  542. fmi2Status fmi2SetRealInputDerivatives(fmi2Component c, const fmi2ValueReference vr[], size_t nvr,
  543. const fmi2Integer order[], const fmi2Real value[]) {
  544. printf("Function fmiGetDirectionalDerivative not supported\n");
  545. return fmi2Error;
  546. }
  547. fmi2Status fmi2GetRealOutputDerivatives(fmi2Component c, const fmi2ValueReference vr[], size_t nvr,
  548. const fmi2Integer order[], fmi2Real value[]) {
  549. printf("Function fmiGetDirectionalDerivative not supported\n");
  550. return fmi2Error;
  551. }
  552. fmi2Status fmi2CancelStep(fmi2Component c) {
  553. printf("Function fmiGetDirectionalDerivative not supported\n");
  554. return fmi2Error;
  555. }
  556. fmi2Status fmi2GetStatus(fmi2Component c, const fmi2StatusKind s, fmi2Status *value) {
  557. printf("Function fmiGetStatus not supported\n");
  558. return fmi2Error;
  559. }
  560. fmi2Status fmi2GetRealStatus(fmi2Component c, const fmi2StatusKind s, fmi2Real *value) {
  561. if(s == fmi2LastSuccessfulTime){
  562. FMUInstance* comp = (FMUInstance*) c;
  563. *value = comp->currentTime;
  564. return fmi2OK;
  565. }
  566. printf("Function fmiGetRealStatus not supported\n");
  567. return fmi2Error;
  568. }
  569. fmi2Status fmi2GetIntegerStatus(fmi2Component c, const fmi2StatusKind s, fmi2Integer *value) {
  570. printf("Function fmiGetIntegerStatus not supported\n");
  571. return fmi2Error;
  572. }
  573. fmi2Status fmi2GetBooleanStatus(fmi2Component c, const fmi2StatusKind s, fmi2Boolean *value) {
  574. printf("Function fmiGetBooleanStatus not supported\n");
  575. return fmi2Error;
  576. }
  577. fmi2Status fmi2GetStringStatus(fmi2Component c, const fmi2StatusKind s, fmi2String *value) {
  578. printf("Function fmiGetStringStatus not supported\n");
  579. return fmi2Error;
  580. }