Skip to content

Commit

Permalink
Changed generated code and some lib functions to return errors to FMI…
Browse files Browse the repository at this point in the history
… Simulator.

Found bug in FMU Compilance Checker: modelica-tools/FMUComplianceChecker#37
  • Loading branch information
Andreas authored and Andreas committed Nov 13, 2018
1 parent 8460136 commit 0e45909
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 13 deletions.
8 changes: 4 additions & 4 deletions Compiler/Template/CodegenOMSIC_Equations.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ template equationCall(SimEqSystem eq, String modelNamePrefixStr, String input)
>>
case SES_ALGEBRAIC_SYSTEM(__) then
<<
<%CodegenUtil.symbolName(modelNamePrefixStr,"algSystFunction")%>_<%algSysIndex%>(<%input%>);
status = (<%CodegenUtil.symbolName(modelNamePrefixStr,"algSystFunction")%>_<%algSysIndex%>(<%input%>)==omsi_ok && status==omsi_ok)? omsi_ok : status;
>>
else
/* ToDo: generate Warning */
Expand Down Expand Up @@ -246,17 +246,17 @@ template generateDereivativeMatrixColumnCall(OMSIFunction column, String modelNa
case OMSI_FUNCTION() then
let bodyBuffer = ( equations |> eq =>
<<
<%equationCall(eq, modelName, "this_function, seed")%>
<%equationCall(eq, modelName, "this_function, model_vars_and_params")%>
>>
;separator="\n")

let &functionPrototypes += <<omsi_status <%CodegenUtil.symbolName(modelName,"derivativeMatFunc")%>_<%index%>(omsi_function_t* this_function, omsi_real* seed, omsi_real* dirDerivative);<%\n%>>>
let &functionPrototypes += <<omsi_status <%CodegenUtil.symbolName(modelName,"derivativeMatFunc")%>_<%index%>(omsi_function_t* this_function, const omsi_values* model_vars_and_params, void* data);<%\n%>>>

<<
/*
Description something
*/
omsi_status <%CodegenUtil.symbolName(modelName,"derivativeMatFunc")%>_<%index%>(omsi_function_t* this_function, omsi_real* seed, omsi_real* dirDerivative){
omsi_status <%CodegenUtil.symbolName(modelName,"derivativeMatFunc")%>_<%index%>(omsi_function_t* this_function, const omsi_values* model_vars_and_params, void* data){
<%bodyBuffer%>
Expand Down
22 changes: 17 additions & 5 deletions Compiler/Template/CodegenOMSI_common.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,14 @@ template generateOmsiFunctionCode(OMSIFunction omsiFunction, String FileNamePref
/* Equations evaluation */
omsi_status <%FileNamePrefix%>_allEqns(omsi_function_t* simulation, omsi_values* model_vars_and_params, void* data){
/* Variables */
omsi_status status;
status = omsi_ok;
<%functionCall%>
return omsi_ok;
return status;
}

#if defined(__cplusplus)
Expand Down Expand Up @@ -174,7 +179,7 @@ template generateOmsiAlgSystemCode (SimEqSystem equationSystem, String FileNameP
let &functionPrototypes +=
<<
omsi_status <%FileNamePrefix%>_resFunction_<%algSystem.algSysIndex%> (omsi_function_t* this_function, const omsi_values* model_vars_and_params, omsi_real* res);
omsi_status <%FileNamePrefix%>_algSystFunction_<%algSystem.algSysIndex%>(omsi_algebraic_system_t* this_alg_system, const omsi_values* model_vars_and_params, omsi_values* out_function_vars);
omsi_status <%FileNamePrefix%>_algSystFunction_<%algSystem.algSysIndex%>(omsi_algebraic_system_t* this_alg_system, const omsi_values* model_vars_and_params, void* data);
>>
let headerFileName = FileNamePrefix+"_sim_algSyst_"+algSystem.algSysIndex
let headerFileContent = generateCodeHeader(FileNamePrefix, &includes, headerFileName, &functionPrototypes)
Expand Down Expand Up @@ -212,14 +217,21 @@ template generateOmsiAlgSystemCode (SimEqSystem equationSystem, String FileNameP
*/
omsi_status <%FileNamePrefix%>_algSystFunction_<%algSystem.algSysIndex%>(omsi_algebraic_system_t* this_alg_system,
const omsi_values* model_vars_and_params,
omsi_values* out_function_vars){
void* data){
/* Variables */
omsi_status status;
/* Log function call */
filtered_base_logger(global_logCategories, log_all, omsi_ok,
"fmi2Evaluate: Solve algebraic system <%algSystem.algSysIndex%>.");
/* call API function something */
solveLapack(this_alg_system, model_vars_and_params, NULL);
status = omsi_solve_algebraic_system(this_alg_system, model_vars_and_params);
/* ToDo: Add crazy stuff here */
return omsi_ok;
return status;
}

#if defined(__cplusplus)
Expand Down
17 changes: 14 additions & 3 deletions SimulationRuntime/OMSI/base/src/omsi_solve_alg_system.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,24 @@
#include <omsi_solve_alg_system.h>


#if 0

omsi_status omsi_solve_algebraic_system (omsi_algebraic_system_t* alg_system) {

omsi_status omsi_solve_algebraic_system (omsi_algebraic_system_t* alg_system,
const omsi_values* read_only_model_vars_and_params) {

/* Check if solver is ready */
if (alg_system->solver_data == NULL ) {
filtered_base_logger(global_logCategories, log_statuserror, omsi_fatal,
"fmi2Evaluate: Solver for %s system %u of size %u not set.",
alg_system->isLinear ? "linear":"nonlinear",
alg_system->id,
alg_system->n_iteration_vars);
return omsi_fatal;
}

/* Log solver call */
filtered_base_logger(global_logCategories, log_all, omsi_ok,
"fmi2Something: Solve %s system %u of size %u with solver %s.",
"fmi2Evaluate: Solve %s system %u of size %u with solver %s.",
alg_system->isLinear ? "linear":"nonlinear",
alg_system->id,
alg_system->n_iteration_vars,
Expand Down
5 changes: 5 additions & 0 deletions SimulationRuntime/OMSIC/src/omsu/omsu_continuous_simulation.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ omsi_status omsi_new_discrete_state(osu_t* OSU,
eventInfo->nextEventTime = 0;

returnValue = omsi_event_update(OSU, eventInfo);

if (returnValue == omsi_fatal) {
eventInfo->terminateSimulation = omsi_true;
}

return returnValue;
}

Expand Down
6 changes: 5 additions & 1 deletion SimulationRuntime/OMSIC/src/omsu/omsu_event_simulation.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ omsi_status omsi_event_update(osu_t* OSU,

/* Variables */
omsi_int i;
omsi_status status;
/* threadData_t *threadData = OSU->threadData; */

if (nullPointer(OSU, "fmi2EventUpdate", "eventInfo", eventInfo)) {
Expand Down Expand Up @@ -167,7 +168,10 @@ omsi_status omsi_event_update(osu_t* OSU,
#endif

/*evaluate functionDAE */
OSU->osu_data->sim_data->simulation->evaluate(OSU->osu_data->sim_data->simulation, OSU->osu_data->sim_data->simulation->function_vars, NULL);
status = OSU->osu_data->sim_data->simulation->evaluate(OSU->osu_data->sim_data->simulation, OSU->osu_data->sim_data->simulation->function_vars, NULL);
if (status != omsi_ok) {
return status;
}

#if 0
/* deactivate sample events */
Expand Down

0 comments on commit 0e45909

Please sign in to comment.