Skip to content

Commit

Permalink
- improved preliminary functionality for external input file
Browse files Browse the repository at this point in the history
 - initial point 
- added missing .h file to Makefile
 



git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19243 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Feb 21, 2014
1 parent 1c4f6e6 commit 8876713
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 12 deletions.
9 changes: 9 additions & 0 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -587,6 +587,7 @@ template simulationFile(SimCode simCode, String guid)
<%symbolName(modelNamePrefixStr,"functionAlgebraics")%>,
<%symbolName(modelNamePrefixStr,"functionDAE")%>,
<%symbolName(modelNamePrefixStr,"input_function")%>,
<%symbolName(modelNamePrefixStr,"input_function_init")%>,
<%symbolName(modelNamePrefixStr,"output_function")%>,
<%symbolName(modelNamePrefixStr,"function_storeDelayed")%>,
<%symbolName(modelNamePrefixStr,"functionODE_inline")%>,
Expand Down Expand Up @@ -1247,6 +1248,14 @@ template functionInput(ModelInfo modelInfo, String modelNamePrefix)
;separator="\n"%>
return 0;
}

int <%symbolName(modelNamePrefix,"input_function_init")%>(DATA *data)
{
<%vars.inputVars |> SIMVAR(__) hasindex i0 =>
'$P$ATTRIBUTE<%cref(name)%>.start = data->simulationInfo.inputVars[<%i0%>];'
;separator="\n"%>
return 0;
}
>>
end match
end functionInput;
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/Makefile.common
Expand Up @@ -23,7 +23,7 @@ RUNTIME_HEADERS = $(LIBF2CHEADER) \

RUNTIMELINEAR_HEADERS = ./linearization/linearize.h

RUNTIMEOPTIMZ_HEADERS = ./optimization/interfaceOptimization.h
RUNTIMEOPTIMZ_HEADERS = ./optimization/interfaceOptimization.h ./optimization/ipoptODEstruct.h ./optimization/localFunction.h

RUNTIMESIMULATION_HEADERS = ./simulation/modelinfo.h \
./simulation/options.h \
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/openmodelica_func.h
Expand Up @@ -107,6 +107,7 @@ int (*functionDAE)(DATA *data);

/* functions for input and output */
int (*input_function)(DATA*);
int (*input_function_init)(DATA*);
int (*output_function)(DATA*);

/* function for storing value histories of delayed expressions
Expand Down
9 changes: 5 additions & 4 deletions SimulationRuntime/c/optimization/mainOptimizer/ipoptODE.c
Expand Up @@ -255,9 +255,9 @@ static int set_optimizer_flags(IPOPT_DATA_ *iData, IpoptProblem *nlp)
AddIpoptNumOption(*nlp,"bound_mult_init_val",1e-3);
AddIpoptNumOption(*nlp,"mu_init",1e-3);
AddIpoptNumOption(*nlp,"nu_init",1e-9);
//AddIpoptStrOption(*nlp,"bound_mult_init_method","constant");
AddIpoptStrOption(*nlp,"bound_mult_init_method","constant");
//AddIpoptStrOption(*nlp,"print_options_documentation","yes");
AddIpoptStrOption(*nlp,"bound_mult_init_method","mu-based");
//AddIpoptStrOption(*nlp,"bound_mult_init_method","mu-based");
AddIpoptNumOption(*nlp,"eta_phi",1e-010);

//dependency_detection_with_rhs
Expand All @@ -279,9 +279,10 @@ static int set_optimizer_flags(IPOPT_DATA_ *iData, IpoptProblem *nlp)
if(ACTIVE_STREAM(LOG_IPOPT_FULL))
AddIpoptIntOption(*nlp, "print_level", 7);

/*AddIpoptStrOption(nlp, "derivative_test_print_all", "yes");
/*
* AddIpoptStrOption(nlp, "derivative_test_print_all", "yes");
* AddIpoptNumOption(nlp,"derivative_test_perturbation",1e-6);
*/
*/

AddIpoptIntOption(*nlp, "max_iter", 5000);

Expand Down
22 changes: 16 additions & 6 deletions SimulationRuntime/c/simulation/solver/external_input.c
Expand Up @@ -52,14 +52,17 @@ int externalInputallocate(DATA* data)
pFile = fopen("externalInput.csv","r");
data->simulationInfo.external_input.active = (modelica_boolean) (pFile != NULL);
n = 0;
m = 0;
if(data->simulationInfo.external_input.active){

while(1) {
c = fgetc(pFile);
if (c==EOF) break;
if (c=='\n') ++n;
}
--n;
data->simulationInfo.external_input.n = n;
data->simulationInfo.external_input.N = data->simulationInfo.external_input.n;
rewind(pFile);

do{
Expand All @@ -73,16 +76,19 @@ int externalInputallocate(DATA* data)
data->simulationInfo.external_input.t = (modelica_real*)calloc(data->simulationInfo.external_input.n,sizeof(modelica_real));

for(i = 0; i < data->simulationInfo.external_input.n; ++i){
fscanf(pFile, "%f", &data->simulationInfo.external_input.t[i]);
c = fscanf(pFile, "%f", &data->simulationInfo.external_input.t[i]);
for(j = 0; j < m; ++j){
fscanf(pFile, "%f", &data->simulationInfo.external_input.u[i][j]);
c = fscanf(pFile, "%f", &data->simulationInfo.external_input.u[i][j]);
}
if(c<0)
data->simulationInfo.external_input.n = i;
}
printf("========================================================");

printf("\n========================================================");
for(i = 0; i < data->simulationInfo.external_input.n; ++i){
printf("\nInput t=%f ", data->simulationInfo.external_input.t[i]);
printf("\nInput t=%f \t", data->simulationInfo.external_input.t[i]);
for(j = 0; j < m; ++j){
printf("u[%d][%d]= %f ", i,j,data->simulationInfo.external_input.u[i][j]);
printf("u[%d][%d]= %f \t", i,j,data->simulationInfo.external_input.u[i][j]);
}
}
printf("\n========================================================");
Expand All @@ -100,7 +106,7 @@ int externalInputFree(DATA* data)
int j;

free(data->simulationInfo.external_input.t);
for(j = 0; j < data->simulationInfo.external_input.n; ++j)
for(j = 0; j < data->simulationInfo.external_input.N; ++j)
free(data->simulationInfo.external_input.u[j]);
free(data->simulationInfo.external_input.u);
}
Expand All @@ -113,6 +119,10 @@ int externalInputUpdate(DATA* data)
double u1, u2;
double t, t1, dt;
int i;

if(!data->simulationInfo.external_input.active)
return -1;

t = data->localData[0]->timeValue;
while(t > data->simulationInfo.external_input.t[data->simulationInfo.external_input.i+1]
&& data->simulationInfo.external_input.i+1 < (data->simulationInfo.external_input.n-1)){
Expand Down
6 changes: 6 additions & 0 deletions SimulationRuntime/c/simulation/solver/solver_main.c
Expand Up @@ -563,6 +563,12 @@ int solver_main(DATA* data, const char* init_initMethod,
retVal = initializeSolverData(data, &solverInfo);
omc_alloc_interface.collect_a_little();

/* set inputs from file */
if(data->simulationInfo.external_input.active){
externalInputUpdate(data);
data->callback->input_function_init(data);
}

/* initialize all parts of the model */
if(0 == retVal) {
retVal = initializeModel(data, init_initMethod, init_optiMethod, init_file, init_time, lambda_steps);
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/simulation_data.h
Expand Up @@ -159,7 +159,7 @@ typedef struct EXTERNAL_INPUT
modelica_boolean active;
float** u;
float* t;
modelica_real dt;
modelica_integer N;
modelica_integer n;
modelica_integer i;

Expand Down

0 comments on commit 8876713

Please sign in to comment.