#include #include #include #include "fmiCSFunctions.h" #include "fmi1_functions.h" #include #include #include #include #include "jmi_log.h" #include "ModelicaUtilities.h" #include "ModelicaStandardTables.h" #define MODEL_IDENTIFIER AMS_AMSSim extern void dgemm_(char* TRANSA, char* TRANSB, int* M, int* N, int* K, double* ALPHA, double* A, int* LDA, double* B, int* LDB, double* BETA, double* C, int* LDC); const char *C_GUID = "edcbe8d237ec19d804acff79b5ba282e"; static int model_ode_guards_init(jmi_t* jmi); static int model_init_R0(jmi_t* jmi, jmi_real_t** res); static int model_ode_initialize(jmi_t* jmi); static const int N_real_ci = 3; static const int N_real_cd = 0; static const int N_real_pi = 10; static const int N_real_pd = 0; static const int N_integer_ci = 0 + 0; static const int N_integer_cd = 0 + 0; static const int N_integer_pi = 6 + 0; static const int N_integer_pd = 0 + 0; static const int N_boolean_ci = 0; static const int N_boolean_cd = 0; static const int N_boolean_pi = 8; static const int N_boolean_pd = 0; static const int N_string_ci = 0; static const int N_string_cd = 0; static const int N_string_pi = 0; static const int N_string_pd = 0; static const int N_real_dx = 0; static const int N_real_x = 0; static const int N_real_u = 0; static const int N_real_w = 0; static const int N_real_d = 0; static const int N_integer_d = 0 + 0; static const int N_integer_u = 0 + 0; static const int N_boolean_d = 0; static const int N_boolean_u = 0; static const int N_string_d = 0; static const int N_string_u = 0; static const int N_ext_objs = 0; static const int N_sw = 0; static const int N_eq_F = 0; static const int N_eq_R = 0; static const int N_dae_blocks = 0; static const int N_dae_init_blocks = 0; static const int N_guards = 0; static const int N_eq_F0 = 0 + 0; static const int N_eq_F1 = 0; static const int N_eq_Fp = 0; static const int N_eq_R0 = 0 + 0; static const int N_sw_init = 0; static const int N_guards_init = 0; static const int Scaling_method = JMI_SCALING_NONE; #define sf(i) (jmi->variable_scaling_factors[i]) static const int N_outputs = 0; static const int Output_vrefs[1] = {-1}; static int CAD_dae_n_nz = 1; static const int CAD_dae_nz_rows[1] = {-1}; static const int CAD_dae_nz_cols[1] = {-1}; static const int CAD_ODE_A_n_nz = 0; static const int CAD_ODE_B_n_nz = 0; static const int CAD_ODE_C_n_nz = 0; static const int CAD_ODE_D_n_nz = 0; static const int CAD_ODE_A_nz_rows[1] = {-1}; static const int CAD_ODE_A_nz_cols[1] = {-1}; static const int CAD_ODE_B_nz_rows[1] = {-1}; static const int CAD_ODE_B_nz_cols[1] = {-1}; static const int CAD_ODE_C_nz_rows[1] = {-1}; static const int CAD_ODE_C_nz_cols[1] = {-1}; static const int CAD_ODE_D_nz_rows[1] = {-1}; static const int CAD_ODE_D_nz_cols[1] = {-1}; static const int N_initial_relations = 0; static const int DAE_initial_relations[] = { -1 }; static const int N_relations = 0; static const int DAE_relations[] = { -1 }; static const int N_nominals = 0; static const jmi_real_t DAE_nominals[] = { 0.0 }; #define _R_0 ((*(jmi->z))[jmi->offs_real_ci+0]) #define _M_1 ((*(jmi->z))[jmi->offs_real_ci+1]) #define _Cair_2 ((*(jmi->z))[jmi->offs_real_ci+2]) #define __block_jacobian_check_tol_4 ((*(jmi->z))[jmi->offs_real_pi+0]) #define __cs_rel_tol_6 ((*(jmi->z))[jmi->offs_real_pi+1]) #define __cs_step_size_8 ((*(jmi->z))[jmi->offs_real_pi+2]) #define __events_default_tol_10 ((*(jmi->z))[jmi->offs_real_pi+3]) #define __events_tol_factor_11 ((*(jmi->z))[jmi->offs_real_pi+4]) #define __nle_solver_default_tol_15 ((*(jmi->z))[jmi->offs_real_pi+5]) #define __nle_solver_min_tol_17 ((*(jmi->z))[jmi->offs_real_pi+6]) #define __nle_solver_regularization_tolerance_18 ((*(jmi->z))[jmi->offs_real_pi+7]) #define __nle_solver_step_limit_factor_19 ((*(jmi->z))[jmi->offs_real_pi+8]) #define __nle_solver_tol_factor_20 ((*(jmi->z))[jmi->offs_real_pi+9]) #define __block_solver_experimental_mode_5 ((*(jmi->z))[jmi->offs_integer_pi+0]) #define __cs_solver_7 ((*(jmi->z))[jmi->offs_integer_pi+1]) #define __iteration_variable_scaling_12 ((*(jmi->z))[jmi->offs_integer_pi+2]) #define __log_level_13 ((*(jmi->z))[jmi->offs_integer_pi+3]) #define __nle_solver_max_iter_16 ((*(jmi->z))[jmi->offs_integer_pi+4]) #define __residual_equation_scaling_23 ((*(jmi->z))[jmi->offs_integer_pi+5]) #define __block_jacobian_check_3 ((*(jmi->z))[jmi->offs_boolean_pi+0]) #define __enforce_bounds_9 ((*(jmi->z))[jmi->offs_boolean_pi+1]) #define __nle_solver_check_jac_cond_14 ((*(jmi->z))[jmi->offs_boolean_pi+2]) #define __rescale_after_singular_jac_21 ((*(jmi->z))[jmi->offs_boolean_pi+3]) #define __rescale_each_step_22 ((*(jmi->z))[jmi->offs_boolean_pi+4]) #define __runtime_log_to_file_24 ((*(jmi->z))[jmi->offs_boolean_pi+5]) #define __use_Brent_in_1d_25 ((*(jmi->z))[jmi->offs_boolean_pi+6]) #define __use_jacobian_equilibration_26 ((*(jmi->z))[jmi->offs_boolean_pi+7]) #define _time ((*(jmi->z))[jmi->offs_t]) const char *fmi_runtime_options_map_names[] = { "_block_jacobian_check", "_block_jacobian_check_tol", "_block_solver_experimental_mode", "_cs_rel_tol", "_cs_solver", "_cs_step_size", "_enforce_bounds", "_events_default_tol", "_events_tol_factor", "_iteration_variable_scaling", "_log_level", "_nle_solver_check_jac_cond", "_nle_solver_default_tol", "_nle_solver_max_iter", "_nle_solver_min_tol", "_nle_solver_regularization_tolerance", "_nle_solver_step_limit_factor", "_nle_solver_tol_factor", "_rescale_after_singular_jac", "_rescale_each_step", "_residual_equation_scaling", "_runtime_log_to_file", "_use_Brent_in_1d", "_use_jacobian_equilibration", NULL }; const int fmi_runtime_options_map_vrefs[] = { 536870931, 3, 268435469, 4, 268435470, 5, 536870932, 6, 7, 268435471, 268435472, 536870933, 8, 268435473, 9, 10, 11, 12, 536870934, 536870935, 268435474, 536870936, 536870937, 536870938, 0 }; const int fmi_runtime_options_map_length = 24; #define _real_ci(i) ((*(jmi->z))[jmi->offs_real_ci+i]) #define _real_cd(i) ((*(jmi->z))[jmi->offs_real_cd+i]) #define _real_pi(i) ((*(jmi->z))[jmi->offs_real_pi+i]) #define _real_pd(i) ((*(jmi->z))[jmi->offs_real_pd+i]) #define _real_dx(i) ((*(jmi->z))[jmi->offs_real_dx+i]) #define _real_x(i) ((*(jmi->z))[jmi->offs_real_x+i]) #define _real_u(i) ((*(jmi->z))[jmi->offs_real_u+i]) #define _real_w(i) ((*(jmi->z))[jmi->offs_real_w+i]) #define _t ((*(jmi->z))[jmi->offs_t]) #define _real_d(i) ((*(jmi->z))[jmi->offs_real_d+i]) #define _integer_d(i) ((*(jmi->z))[jmi->offs_integer_d+i]) #define _integer_u(i) ((*(jmi->z))[jmi->offs_integer_u+i]) #define _boolean_d(i) ((*(jmi->z))[jmi->offs_boolean_d+i]) #define _boolean_u(i) ((*(jmi->z))[jmi->offs_boolean_u+i]) #define _pre_real_dx(i) ((*(jmi->z))[jmi->offs_pre_real_dx+i]) #define _pre_real_x(i) ((*(jmi->z))[jmi->offs_pre_real_x+i]) #define _pre_real_u(i) ((*(jmi->z))[jmi->offs_pre_real_u+i]) #define _pre_real_w(i) ((*(jmi->z))[jmi->offs_pre_real_w+i]) #define _pre_real_d(i) ((*(jmi->z))[jmi->offs_pre_real_d+i]) #define _pre_integer_d(i) ((*(jmi->z))[jmi->offs_pre_integer_d+i]) #define _pre_integer_u(i) ((*(jmi->z))[jmi->offs_pre_integer_u+i]) #define _pre_boolean_d(i) ((*(jmi->z))[jmi->offs_pre_boolean_d+i]) #define _pre_boolean_u(i) ((*(jmi->z))[jmi->offs_pre_boolean_u+i]) #define _sw(i) ((*(jmi->z))[jmi->offs_sw + i]) #define _sw_init(i) ((*(jmi->z))[jmi->offs_sw_init + i]) #define _pre_sw(i) ((*(jmi->z))[jmi->offs_pre_sw + i]) #define _pre_sw_init(i) ((*(jmi->z))[jmi->offs_pre_sw_init + i]) #define _guards(i) ((*(jmi->z))[jmi->offs_guards + i]) #define _guards_init(i) ((*(jmi->z))[jmi->offs_guards_init + i]) #define _pre_guards(i) ((*(jmi->z))[jmi->offs_pre_guards + i]) #define _pre_guards_init(i) ((*(jmi->z))[jmi->offs_pre_guards_init + i]) #define _atInitial (jmi->atInitial) static int model_ode_guards(jmi_t* jmi) { return 0; } static int model_ode_next_time_event(jmi_t* jmi, jmi_real_t* nextTime) { jmi_real_t nextTimeEvent; jmi_real_t nextTimeEventTmp; jmi_real_t nSamp; nextTimeEvent = JMI_INF; *nextTime = nextTimeEvent; return 0; } static int model_ode_derivatives(jmi_t* jmi) { int ef = 0; model_ode_guards(jmi); /************* ODE section *********/ /************ Real outputs *********/ /****Integer and boolean outputs ***/ /**** Other variables ***/ /********* Write back reinits *******/ return ef; } static int model_ode_derivatives_dir_der(jmi_t* jmi) { int ef = 0; return ef; } static int model_ode_outputs(jmi_t* jmi) { int ef = 0; return ef; } static int model_ode_guards_init(jmi_t* jmi) { return 0; } static int model_ode_initialize(jmi_t* jmi) { int ef = 0; model_ode_guards(jmi); return ef; } static int model_ode_initialize_dir_der(jmi_t* jmi) { int ef = 0; /* This function is not needed - no derivatives of the initialization system is exposed.*/ return ef; } static int model_dae_F(jmi_t* jmi, jmi_real_t** res) { return 0; } static int model_dae_dir_dF(jmi_t* jmi, jmi_real_t** res, jmi_real_t** dF, jmi_real_t** dz) { return 0; } static int model_dae_R(jmi_t* jmi, jmi_real_t** res) { return 0; } static int model_init_F0(jmi_t* jmi, jmi_real_t** res) { return 0; } static int model_init_F1(jmi_t* jmi, jmi_real_t** res) { return 0; } static int model_init_Fp(jmi_t* jmi, jmi_real_t** res) { /* C_DAE_initial_dependent_parameter_residuals */ return -1; } static int model_init_eval_parameters(jmi_t* jmi) { return 0; } static int model_init_R0(jmi_t* jmi, jmi_real_t** res) { return 0; } int jmi_new(jmi_t** jmi, jmi_callbacks_t* jmi_callbacks) { jmi_init(jmi, N_real_ci, N_real_cd, N_real_pi, N_real_pd, N_integer_ci, N_integer_cd, N_integer_pi, N_integer_pd, N_boolean_ci, N_boolean_cd, N_boolean_pi, N_boolean_pd, N_string_ci, N_string_cd, N_string_pi, N_string_pd, N_real_dx, N_real_x, N_real_u, N_real_w, N_real_d, N_integer_d, N_integer_u, N_boolean_d, N_boolean_u, N_string_d, N_string_u, N_outputs, (int (*))Output_vrefs, N_sw, N_sw_init, N_guards, N_guards_init, N_dae_blocks, N_dae_init_blocks, N_initial_relations, (int (*))DAE_initial_relations, N_relations, (int (*))DAE_relations, (jmi_real_t *) DAE_nominals, Scaling_method, N_ext_objs, jmi_callbacks); /* Initialize the DAE interface */ jmi_dae_init(*jmi, *model_dae_F, N_eq_F, NULL, 0, NULL, NULL, *model_dae_dir_dF, CAD_dae_n_nz,(int (*))CAD_dae_nz_rows,(int (*))CAD_dae_nz_cols, CAD_ODE_A_n_nz, (int (*))CAD_ODE_A_nz_rows, (int(*))CAD_ODE_A_nz_cols, CAD_ODE_B_n_nz, (int (*))CAD_ODE_B_nz_rows, (int(*))CAD_ODE_B_nz_cols, CAD_ODE_C_n_nz, (int (*))CAD_ODE_C_nz_rows, (int(*))CAD_ODE_C_nz_cols, CAD_ODE_D_n_nz, (int (*))CAD_ODE_D_nz_rows, (int(*))CAD_ODE_D_nz_cols, *model_dae_R, N_eq_R, NULL, 0, NULL, NULL,*model_ode_derivatives, *model_ode_derivatives_dir_der, *model_ode_outputs,*model_ode_initialize,*model_ode_guards, *model_ode_guards_init,*model_ode_next_time_event); /* Initialize the Init interface */ jmi_init_init(*jmi, *model_init_F0, N_eq_F0, NULL, 0, NULL, NULL, *model_init_F1, N_eq_F1, NULL, 0, NULL, NULL, *model_init_Fp, N_eq_Fp, NULL, 0, NULL, NULL, *model_init_eval_parameters, *model_init_R0, N_eq_R0, NULL, 0, NULL, NULL); return 0; } int jmi_terminate(jmi_t* jmi) { return 0; } int jmi_set_start_values(jmi_t* jmi) { _R_0 = (8.314472); _M_1 = (0.02897); _Cair_2 = (716.75); __block_jacobian_check_3 = (JMI_FALSE); __block_jacobian_check_tol_4 = (1.0E-6); __block_solver_experimental_mode_5 = (0); __cs_rel_tol_6 = (1.0E-6); __cs_solver_7 = (0); __cs_step_size_8 = (0.0010); __enforce_bounds_9 = (JMI_FALSE); __events_default_tol_10 = (1.0E-10); __events_tol_factor_11 = (1.0E-4); __iteration_variable_scaling_12 = (1); __log_level_13 = (3); __nle_solver_check_jac_cond_14 = (JMI_FALSE); __nle_solver_default_tol_15 = (1.0E-10); __nle_solver_max_iter_16 = (100); __nle_solver_min_tol_17 = (1.0E-12); __nle_solver_regularization_tolerance_18 = (-1.0); __nle_solver_step_limit_factor_19 = (10.0); __nle_solver_tol_factor_20 = (1.0E-4); __rescale_after_singular_jac_21 = (JMI_TRUE); __rescale_each_step_22 = (JMI_FALSE); __residual_equation_scaling_23 = (1); __runtime_log_to_file_24 = (JMI_FALSE); __use_Brent_in_1d_25 = (JMI_FALSE); __use_jacobian_equilibration_26 = (JMI_FALSE); model_init_eval_parameters(jmi); return 0; } const char *jmi_get_model_identifier() { return "AMS_AMSSim"; } /* void _emit(log_t *log, char* message) { fmi1_me_emit(log, message); } void create_log_file_if_needed(log_t *log) { fmi1_me_create_log_file_if_needed(log); } BOOL emitted_category(log_t *log, category_t category) { fmi1_me_emitted_category(log, category); } */ /* FMI for co-simulation Functions*/ /* Inquire version numbers of header files */ DllExport const char* fmiGetTypesPlatform() { return fmi1_cs_get_types_platform(); } DllExport const char* fmiGetVersion() { return fmi1_cs_get_version(); } DllExport void fmiFreeSlaveInstance(fmiComponent c) { fmi1_cs_free_slave_instance(c); } /* Creation and destruction of model instances and setting debug status */ DllExport fmiComponent fmiInstantiateSlave(fmiString instanceName, fmiString GUID, fmiString fmuLocation, fmiString mimeType, fmiReal timeout, fmiBoolean visible, fmiBoolean interactive, fmiCallbackFunctions functions, fmiBoolean loggingOn) { return fmi1_cs_instantiate_slave(instanceName, GUID, fmuLocation, mimeType, timeout, visible, interactive, functions, loggingOn); } DllExport fmiStatus fmiTerminateSlave(fmiComponent c) { return fmi1_cs_terminate_slave(c); } DllExport fmiStatus fmiInitializeSlave(fmiComponent c, fmiReal tStart, fmiBoolean StopTimeDefined, fmiReal tStop){ return fmi1_cs_initialize_slave(c,tStart,StopTimeDefined,tStop); } DllExport fmiStatus fmiSetDebugLogging(fmiComponent c, fmiBoolean loggingOn) { return fmi1_cs_set_debug_logging(c, loggingOn); } DllExport fmiStatus fmiDoStep(fmiComponent c, fmiReal currentCommunicationPoint, fmiReal communicationStepSize, fmiBoolean newStep) { return fmi1_cs_do_step(c, currentCommunicationPoint, communicationStepSize, newStep); } DllExport fmiStatus fmiCancelStep(fmiComponent c){ return fmi1_cs_cancel_step(c); } DllExport fmiStatus fmiResetSlave(fmiComponent c) { return fmi1_cs_reset_slave(c); } DllExport fmiStatus fmiGetRealOutputDerivatives(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger order[], fmiReal value[]){ return fmi1_cs_get_real_output_derivatives(c, vr, nvr, order, value); } DllExport fmiStatus fmiSetRealInputDerivatives(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger order[], const fmiReal value[]){ return fmi1_cs_set_real_input_derivatives(c,vr,nvr,order,value); } DllExport fmiStatus fmiSetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiReal value[]) { return fmi1_cs_set_real(c, vr, nvr, value); } DllExport fmiStatus fmiSetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger value[]) { return fmi1_cs_set_integer(c, vr, nvr, value); } DllExport fmiStatus fmiSetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiBoolean value[]) { return fmi1_cs_set_boolean(c, vr, nvr, value); } DllExport fmiStatus fmiSetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiString value[]) { return fmi1_cs_set_string(c, vr, nvr, value); } DllExport fmiStatus fmiGetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiReal value[]) { return fmi1_cs_get_real(c, vr, nvr, value); } DllExport fmiStatus fmiGetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiInteger value[]) { return fmi1_cs_get_integer(c, vr, nvr, value); } DllExport fmiStatus fmiGetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiBoolean value[]) { return fmi1_cs_get_boolean(c, vr, nvr, value); } DllExport fmiStatus fmiGetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiString value[]) { return fmi1_cs_get_string(c, vr, nvr, value); } DllExport fmiStatus fmiGetStatus(fmiComponent c, const fmiStatusKind s, fmiStatus* value){ return fmi1_cs_get_status(c,s,value); } DllExport fmiStatus fmiGetRealStatus(fmiComponent c, const fmiStatusKind s, fmiReal* value){ return fmi1_cs_get_real_status(c, s, value); } DllExport fmiStatus fmiGetIntegerStatus(fmiComponent c, const fmiStatusKind s, fmiInteger* value){ return fmi1_cs_get_integer_status(c, s, value); } DllExport fmiStatus fmiGetBooleanStatus(fmiComponent c, const fmiStatusKind s, fmiBoolean* value){ return fmi1_cs_get_boolean_status(c, s, value); } DllExport fmiStatus fmiGetStringStatus(fmiComponent c, const fmiStatusKind s, fmiString* value){ return fmi1_cs_get_string_status(c,s,value); } /* NOTE IN THE FILE FMICSFUNCTIONS.H WHY? */ /* DLLExport fmiStatus fmiSaveState(fmiComponent c, size_t index){ return fmi_save_state(c,index); } DLLExport fmiStatus fmiRestoreState(fmiComponent c, size_t index){ return fmi_restore_state(c,index); } */