Changeset 0833cd1 in OpenModelica


Ignore:
Timestamp:
2012-11-16T14:27:01+01:00 (11 years ago)
Author:
Adeel Asghar <adeel.asghar@…>
Branches:
Added-citation-metadata, maintenance/v1.14, maintenance/v1.15, maintenance/v1.16, maintenance/v1.17, maintenance/v1.18, maintenance/v1.19, maintenance/v1.20, maintenance/v1.21, maintenance/v1.22, maintenance/v1.23, master, omlib-staging
Children:
a395c34
Parents:
945b9890
Message:
  • fixing FMI.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13919 f25d12d1-65f4-0310-ae8a-bbce733d8d8e

Location:
Compiler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Compiler/Template/CodegenFMU.tpl

    re96e9777 r0833cd1  
    11421142    Real fmi_z[numberOfEventIndicators] "Events Indicators";
    11431143    Boolean fmi_z_positive[numberOfEventIndicators];
    1144     Real flowTimeNext;
    1145     parameter Real flowInit(fixed=false);
    1146     parameter Real flowInitInputs(fixed=false);
     1144    parameter Real flowInstantiate(fixed=false);
     1145    Real flowTime;
    11471146    parameter Real flowParamsStart(fixed=false);
    1148     Real flowTime;
    1149     Real flowStatesInputs = flowStates;
    1150     Real flowStates;
     1147    Integer flowInitStatus;
     1148    Real flowStatesInputs;
    11511149    Boolean callEventUpdate;
    11521150    Boolean newStatesAvailable;
    11531151    Integer fmi_status;
    11541152  initial algorithm
     1153    flowInstantiate := fmiFunctions.fmiInstantiateModel(fmi, "<%fmiInfo.fmiModelIdentifier%>", debugLogging);
     1154    flowTime := fmiFunctions.fmiSetTime(fmi, time, flowInstantiate);
    11551155    <%if not boolAnd(stringEq(realStartVariablesValueReferences, ""), stringEq(realStartVariablesNames, "")) then "flowParamsStart := fmiFunctions.fmiSetReal(fmi, {"+realStartVariablesValueReferences+"}, {"+realStartVariablesNames+"});"%>
    11561156    <%if not boolAnd(stringEq(integerStartVariablesValueReferences, ""), stringEq(integerStartVariablesNames, "")) then "flowParamsStart := fmiFunctions.fmiSetInteger(fmi, {"+integerStartVariablesValueReferences+"}, {"+integerStartVariablesNames+"});"%>
    11571157    <%if not boolAnd(stringEq(booleanStartVariablesValueReferences, ""), stringEq(booleanStartVariablesNames, "")) then "flowParamsStart := fmiFunctions.fmiSetBoolean(fmi, {"+booleanStartVariablesValueReferences+"}, {"+booleanStartVariablesNames+"});"%>
    11581158    <%if not boolAnd(stringEq(stringStartVariablesValueReferences, ""), stringEq(stringStartVariablesNames, "")) then "flowParamsStart := fmiFunctions.fmiSetString(fmi, {"+stringStartVariablesValueReferences+"}, {"+stringStartVariablesNames+"});"%>
    1159   initial equation
    1160     (flowTimeNext,flowInit,eventInfo) = fmiFunctions.fmiInitialize(fmi, "<%fmiInfo.fmiModelIdentifier%>", debugLogging, time, eventInfo, flowParamsStart+flowInitInputs);
     1159    (flowInitStatus, eventInfo) := fmiFunctions.fmiInitialize(fmi, eventInfo, flowParamsStart);
    11611160  <%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
    1162   <<
    1163     fmi_x = fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowParamsStart+flowInit);
    1164   >>
     1161    <<
     1162      fmi_x := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowStatesInputs);
     1163    >>
    11651164  %>
     1165  algorithm
     1166    flowInitStatus := 1;
    11661167  equation
    1167     flowTime = fmiFunctions.fmiSetTime(fmi, time, 1);
    1168     flowStates = fmiFunctions.fmiSetContinuousStates(fmi, fmi_x, flowParamsStart + flowTime);
     1168    flowTime = fmiFunctions.fmiSetTime(fmi, time, flowInstantiate);
     1169    flowStatesInputs = fmiFunctions.fmiSetContinuousStates(fmi, fmi_x, flowParamsStart + flowTime);
    11691170    der(fmi_x) = fmiFunctions.fmiGetDerivatives(fmi, numberOfContinuousStates, flowStatesInputs);
    11701171    fmi_z  = fmiFunctions.fmiGetEventIndicators(fmi, numberOfEventIndicators, flowStatesInputs);
     
    11871188  >>
    11881189  %>
    1189       (flowTimeNext, newStatesAvailable) := fmiFunctions.fmiEventUpdate(fmi, false, eventInfo, flowStatesInputs);
     1190      (newStatesAvailable) := fmiFunctions.fmiEventUpdate(fmi, false, eventInfo, flowStatesInputs);
    11901191  <%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
    11911192  <<
     
    12161217   
    12171218    package fmiFunctions
    1218       function fmiInitialize
     1219      function fmiInstantiateModel
    12191220        input fmiImportInstance fmi;
    12201221        input String instanceName;
    12211222        input Boolean debugLogging;
    1222         input Real in_Time;
    1223         input fmiEventInfo in_EventInfo;
    1224         input Real in_Flow_Init_Inputs;
    1225         output Real out_Flow_Time;
    1226         output Real out_Flow_Init;
    1227         output fmiEventInfo out_eventInfo;
    1228         external "C" out_eventInfo = fmiInitialize_OMC(fmi, instanceName, debugLogging, in_Time, in_EventInfo, in_Flow_Init_Inputs, out_Flow_Time, out_Flow_Init) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
     1223        output Real outFlowInstantiate;
     1224        external "C" outFlowInstantiate = fmiInstantiateModel_OMC(fmi, instanceName, debugLogging) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
     1225      end fmiInstantiateModel;
     1226     
     1227      function fmiInitialize
     1228        input fmiImportInstance fmi;
     1229        input fmiEventInfo inEventInfo;
     1230        input Real inFlowInit;
     1231        output Integer outFlowInitStatus;
     1232        output fmiEventInfo outEventInfo;
     1233        external "C" outEventInfo = fmiInitialize_OMC(fmi, inEventInfo, inFlowInit, outFlowInitStatus) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
    12291234      end fmiInitialize;
    12301235     
     
    12401245        input fmiImportInstance fmi;
    12411246        input Integer numberOfContinuousStates;
    1242         input Real in_Flow_Init;
     1247        input Real inFlowInit;
    12431248        output Real fmi_x[numberOfContinuousStates];
    1244         external "C" fmiGetContinuousStates_OMC(fmi, numberOfContinuousStates, in_Flow_Init, fmi_x) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
     1249        external "C" fmiGetContinuousStates_OMC(fmi, numberOfContinuousStates, inFlowInit, fmi_x) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
    12451250      end fmiGetContinuousStates;
    12461251     
     
    12741279        input fmiImportInstance fmi;
    12751280        input Boolean intermediateResults;
    1276         input fmiEventInfo in_eventInfo;
    1277         input Real in_Flow_States;
    1278         output Real out_Flow_Time;
    1279         output Boolean out_NewStates;
    1280         external "C" out_NewStates = fmiEventUpdate_OMC(fmi, intermediateResults, in_eventInfo, in_Flow_States, out_Flow_Time) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
     1281        input fmiEventInfo inEventInfo;
     1282        input Real inFlowStates;
     1283        output Boolean outNewStatesAvailable;
     1284        external "C" outNewStatesAvailable = fmiEventUpdate_OMC(fmi, intermediateResults, inEventInfo, inFlowStates) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
    12811285      end fmiEventUpdate;
    12821286     
  • Compiler/runtime/FMIWrapper.c

    rff12947 r0833cd1  
    146146 * Wrapper for the FMI function fmiInstantiateModel.
    147147 */
    148 void fmiInstantiateModel_OMC(void* fmi, char* instanceName)
    149 {
    150   fmi1_import_instantiate_model((fmi1_import_t*)fmi, instanceName);
    151 }
    152 
    153 /*
    154  * Wrapper for the FMI function fmiSetTime.
    155  * Returns status.
    156  */
    157 double fmiSetTime_OMC(void* fmi, double time, double flowTime)
    158 {
    159   fmi1_import_set_time((fmi1_import_t*)fmi, time);
    160   return flowTime;
    161 }
    162 
    163 /*
    164  * Wrapper for the FMI function fmiSetDebugLogging.
    165  * Returns status.
    166  */
    167 int fmiSetDebugLogging_OMC(void* fmi, int debugLogging)
    168 {
    169   return fmi1_import_set_debug_logging((fmi1_import_t*)fmi, debugLogging);
    170 }
    171 
    172 /*
    173  * Wrapper for the FMI function fmiInitialize.
    174  * Returns FMI Event Info i.e fmi1_event_info_t.
    175  */
    176 void* fmiInitialize_OMC(void* fmi, char* instanceName, int debugLogging, double time, void* in_eventInfo, double flowInit, double* fmi_TNext, double* fmi_Initialized)
     148double fmiInstantiateModel_OMC(void* fmi, char* instanceName, int debugLogging)
    177149{
    178150  static int init = 0;
    179151  if (!init) {
    180152    init = 1;
    181     fmiInstantiateModel_OMC(fmi, instanceName);
    182     fmiSetDebugLogging_OMC(fmi, debugLogging);
    183     fmiSetTime_OMC(fmi, time, 1);
    184 
     153    fmi1_import_instantiate_model((fmi1_import_t*)fmi, instanceName);
     154    fmi1_import_set_debug_logging((fmi1_import_t*)fmi, debugLogging);
     155  }
     156  return 1;
     157}
     158
     159/*
     160 * Wrapper for the FMI function fmiSetTime.
     161 * Returns status.
     162 */
     163double fmiSetTime_OMC(void* fmi, double time, double flowInstantiate)
     164{
     165  fmi1_import_set_time((fmi1_import_t*)fmi, time);
     166  return flowInstantiate;
     167}
     168
     169/*
     170 * Wrapper for the FMI function fmiSetDebugLogging.
     171 * Returns status.
     172 */
     173int fmiSetDebugLogging_OMC(void* fmi, int debugLogging)
     174{
     175  return fmi1_import_set_debug_logging((fmi1_import_t*)fmi, debugLogging);
     176}
     177
     178/*
     179 * Wrapper for the FMI function fmiInitialize.
     180 * Returns FMI Event Info i.e fmi1_event_info_t.
     181 */
     182void* fmiInitialize_OMC(void* fmi, void* inEventInfo, double flowInit, int* status)
     183{
     184  static int init = 0;
     185  if (!init) {
     186    init = 1;
    185187    fmi1_boolean_t toleranceControlled = fmi1_true;
    186188    fmi1_real_t relativeTolerance = 0.001;
    187189    fmi1_event_info_t* eventInfo = malloc(sizeof(fmi1_event_info_t));
    188190    fmi1_status_t fmistatus = fmi1_import_initialize((fmi1_import_t*)fmi, toleranceControlled, relativeTolerance, eventInfo);
    189     *fmi_TNext = (double)fmistatus;
     191    *status = fmistatus;
    190192    return eventInfo;
    191193  }
    192   return in_eventInfo;
     194  return inEventInfo;
    193195}
    194196
     
    199201void fmiGetContinuousStates_OMC(void* fmi, int numberOfContinuousStates, double flowInit, double* states)
    200202{
     203  int i;
     204  for (i = 0 ; i < numberOfContinuousStates ; i++)
     205    fprintf(stderr, "State before %d = %f\n", i, states[i]);fflush(NULL);
    201206  fmi1_import_get_continuous_states((fmi1_import_t*)fmi, (fmi1_real_t*)states, numberOfContinuousStates);
     207  for (i = 0 ; i < numberOfContinuousStates ; i++)
     208      fprintf(stderr, "State after %d = %f\n", i, states[i]);fflush(NULL);
    202209}
    203210
     
    331338 * Returns FMI Event Info i.e fmi1_event_info_t
    332339 */
    333 int fmiEventUpdate_OMC(void* fmi, int intermediateResults, void* eventInfo, double flowStates, double* flowTime)
     340int fmiEventUpdate_OMC(void* fmi, int intermediateResults, void* eventInfo, double flowStates)
    334341{
    335342  fmi1_event_info_t* e = (fmi1_event_info_t*)eventInfo;
Note: See TracChangeset for help on using the changeset viewer.