Skip to content

Commit

Permalink
- update fmi because of new solver interface
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@8170 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Jens Frenkel committed Mar 10, 2011
1 parent ed77d99 commit 3ca1659
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 40 deletions.
45 changes: 43 additions & 2 deletions c_runtime/CMakeLists.txt
Expand Up @@ -115,6 +115,47 @@ MACRO(BUILDMODELFMU model dir Flags CSRC)
#ENDFOREACH(model ${model_sources})
ENDMACRO(BUILDMODELFMU)

# MACRO BUILDMODEL
MACRO(BUILDMODELFMUMOS model mos Flags CSRC)

INCLUDE_DIRECTORIES(${OMCTRUNCHOME}/c_runtime)

SET(OMC_MODELNAME ${model})
# generate model.mos

# Variablen fuer openmodelica2sarturis
SET(OMC_CODE ${CMAKE_CURRENT_BINARY_DIR}/${model}.cpp
${CMAKE_CURRENT_BINARY_DIR}/${model}_functions.cpp
${CMAKE_CURRENT_BINARY_DIR}/${model}_init.txt)
SET(OMC_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${model}.cpp
${CMAKE_CURRENT_BINARY_DIR}/${model}_FMU.cpp
${CMAKE_CURRENT_BINARY_DIR}/${model}_functions.cpp
${CMAKE_CURRENT_BINARY_DIR}/${model}_functions.h
${CMAKE_CURRENT_BINARY_DIR}/${model}_records.c)
# custom command fuer openmodelicacompiler
ADD_CUSTOM_COMMAND(OUTPUT ${OMC_OUTPUT}
COMMAND ${OMC_DEBUG} ${Flags} ${mos}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Erzeuge Code fuer ${model} with ${OMC_DEBUG}")
# target fuer OM_OUTPUT
ADD_CUSTOM_TARGET(${model}codegen ALL DEPENDS ${OMC_OUTPUT})

SET(OMC_FMU_CODE ${OMCTRUNCHOME}/c_runtime/fmu_model_interface.h
${OMCTRUNCHOME}/c_runtime/fmiModelFunctions.h
${OMCTRUNCHOME}/c_runtime/fmiModelTypes.h)

ADD_LIBRARY(${model} SHARED ${OMC_OUTPUT} ${CSRC} ${OMC_FMU_CODE})
TARGET_LINK_LIBRARIES(${model} sim c_runtime f2c sendData ModelicaExternalC)

# Dependencies
ADD_DEPENDENCIES(${model} ${model}codegen)

IF(MODELS_INSTALL)
INSTALL(TARGETS ${model} ARCHIVE DESTINATION ${MODELS_INSTALL_PATH})
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/modelDescription.xml DESTINATION ${MODELS_INSTALL_PATH})
ENDIF(MODELS_INSTALL)
#ENDFOREACH(model ${model_sources})
ENDMACRO(BUILDMODELFMUMOS)

# Check if example files are to be exported
SHOW_VARIABLE(MODELS_INSTALL BOOL "Install models" ON)
Expand Down Expand Up @@ -164,13 +205,13 @@ SET(c_runtime_headers blaswrap.h f2c.h integer_array.h memory_pool.h
sendData/sendData.h)

SET(sim_sources simulation_runtime.cpp simulation_init.cpp simulation_input.cpp
simulation_events.cpp linearize.cpp solver_dasrt.cpp solver_main.cpp
simulation_events.cpp linearize.cpp solver_main.cpp
simulation_result_plt.cpp simulation_result_csv.cpp
simulation_result_mat.cpp simulation_delay.cpp tables.cpp options.cpp
dgesv_aux.c simulation_modelinfo.c)

SET(sim_headers simulation_runtime.h simulation_init.h simulation_input.h
simulation_events.h linearize.h solver_dasrt.h solver_main.h
simulation_events.h linearize.h solver_main.h
simulation_result.h simulation_result_plt.h simulation_result_mat.h
simulation_result_empty.h simulation_result_csv.h
simulation_delay.h tables.h options.h
Expand Down
112 changes: 74 additions & 38 deletions c_runtime/fmu_model_interface.c
Expand Up @@ -318,12 +318,15 @@ fmiStatus fmiGetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, f
if (nvr>0 && nullPointer(comp, "fmiGetReal", "value[]", value))
return fmiError;
#if NUMBER_OF_REALS>0
// calculate new values
if (comp->eventInfo.stateValuesChanged == fmiTrue)
{
functionODE();
comp->eventInfo.stateValuesChanged == fmiFalse;
}
if (comp->outputsvalid == fmiFalse)
{
acceptedStep=1;
functionDAE_output();
functionDAE_output2();
acceptedStep=0;
functionAlgebraics();
comp->outputsvalid = fmiTrue;
}
for (i=0; i<nvr; i++) {
Expand All @@ -349,13 +352,16 @@ fmiStatus fmiGetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr
if (nvr>0 && nullPointer(comp, "fmiGetInteger", "value[]", value))
return fmiError;
#if NUMBER_OF_INTEGERS>0
// calculate new values
if (comp->eventInfo.stateValuesChanged == fmiTrue)
{
functionODE();
comp->eventInfo.stateValuesChanged == fmiFalse;
}
if (comp->outputsvalid == fmiFalse)
{
acceptedStep=1;
functionDAE_output();
functionDAE_output2();
acceptedStep=0;
comp->outputsvalid = fmiTrue;
functionAlgebraics();
comp->outputsvalid = fmiTrue;
}
for (i=0; i<nvr; i++) {
if (vrOutOfRange(comp, "fmiGetInteger", vr[i], NUMBER_OF_INTEGERS))
Expand All @@ -380,13 +386,16 @@ fmiStatus fmiGetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr
if (nvr>0 && nullPointer(comp, "fmiGetBoolean", "value[]", value))
return fmiError;
#if NUMBER_OF_BOOLEANS>0
// calculate new values
if (comp->eventInfo.stateValuesChanged == fmiTrue)
{
functionODE();
comp->eventInfo.stateValuesChanged == fmiFalse;
}
if (comp->outputsvalid == fmiFalse)
{
acceptedStep=1;
functionDAE_output();
functionDAE_output2();
acceptedStep=0;
comp->outputsvalid = fmiTrue;
functionAlgebraics();
comp->outputsvalid = fmiTrue;
}
for (i=0; i<nvr; i++) {
if (vrOutOfRange(comp, "fmiGetBoolean", vr[i], NUMBER_OF_BOOLEANS))
Expand All @@ -411,13 +420,16 @@ fmiStatus fmiGetString(fmiComponent c, const fmiValueReference vr[], size_t nvr,
if (nvr>0 && nullPointer(comp, "fmiGetString", "value[]", value))
return fmiError;
#if NUMBER_OF_STRINGS>0
// calculate new values
if (comp->eventInfo.stateValuesChanged == fmiTrue)
{
functionODE();
comp->eventInfo.stateValuesChanged == fmiFalse;
}
if (comp->outputsvalid == fmiFalse)
{
acceptedStep=1;
functionDAE_output();
functionDAE_output2();
acceptedStep=0;
comp->outputsvalid = fmiTrue;
functionAlgebraics();
comp->outputsvalid = fmiTrue;
}
for (i=0; i<nvr; i++) {
if (vrOutOfRange(comp, "fmiGetString", vr[i], NUMBER_OF_STRINGS))
Expand Down Expand Up @@ -501,15 +513,14 @@ fmiStatus fmiGetDerivatives(fmiComponent c, fmiReal derivatives[], size_t nx) {
if (comp->eventInfo.stateValuesChanged == fmiTrue)
{
// calculate new values
function_updateDependents();
functionODE();
for (i=0; i<nx; i++) {
fmiValueReference vr = vrStatesDerivatives[i];
derivatives[i] = getReal(comp, vr); // to be implemented by the includer of this file
if (comp->loggingOn) comp->functions.logger(c, comp->instanceName, fmiOK, "log",
"fmiGetDerivatives: #r%d# = %.16g", vr, derivatives[i]);
}
comp->eventInfo.stateValuesChanged = fmiFalse;
comp->outputsvalid = fmiFalse;
}
#endif
return fmiOK;
Expand Down Expand Up @@ -566,28 +577,53 @@ fmiStatus fmiInitialize(fmiComponent c, fmiBoolean toleranceControlled, fmiReal
storeExtrapolationData();
storeExtrapolationData();

if (initialize(NULL)) return fmiError;

// Need to check for events at init=1 since e.g. initial() generate event at initialization.
//calcEnabledZeroCrossings();
function_updateDependents();
CheckForInitialEvents(&globalData->timeValue);
StartEventIteration(&globalData->timeValue);
int sampleEvent_actived = 0;
int needToIterate = 0;
int IterationNum = 0;
functionDAE(&needToIterate);
functionAliasEquations();

// Calculate initial derivatives
if(functionODE()) return fmiError;
// Calculate initial output values
acceptedStep = 1;
if(functionDAE_output()|| functionDAE_output2()) return fmiError;
while (checkForDiscreteChanges() || needToIterate)
{
saveall();
functionDAE(&needToIterate);
IterationNum++;
if (IterationNum > IterationMax) return fmiError;
}

function_updateDependents();
if (initialize(NULL)) return fmiError;

SaveZeroCrossings();
saveall();
checkTermination();
function_storeDelayed();

calcEnabledZeroCrossings();
globalData->init = 0;
// Calculate stable discrete state
// and initial ZeroCrossings
if (globalData->curSampleTimeIx < globalData->nSampleTimes)
{
sampleEvent_actived = checkForSampleEvent();
activateSampleEvents();
}
//Activate sample and evaluate again
needToIterate = 0;
IterationNum = 0;
functionDAE(&needToIterate);

while (checkForDiscreteChanges() || needToIterate)
{
saveall();
functionDAE(&needToIterate);
IterationNum++;
if (IterationNum > IterationMax) return fmiError;
}
functionAliasEquations();
SaveZeroCrossings();
if (sampleEvent_actived)
{
deactivateSampleEventsandEquations();
sampleEvent_actived = 0;
}

saveall();
// Initialization complete

comp->state = modelInitialized;
Expand Down

0 comments on commit 3ca1659

Please sign in to comment.