Skip to content

Commit 90dce96

Browse files
author
Willi Braun
committed
- attempt to fix interactive mode
- basic functions like start, pause, change parameter should work now - splitted solver_main therefore in smaller parts git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@15179 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 73857c3 commit 90dce96

File tree

10 files changed

+492
-296
lines changed

10 files changed

+492
-296
lines changed

SimulationRuntime/c/simulation/simulation_runtime.cpp

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,33 @@ int startNonInteractiveSimulation(int argc, char**argv, DATA* data)
498498
return retVal;
499499
}
500500

501+
/*! \fn initializeResultData(DATA* simData, int cpuTime)
502+
*
503+
* \param [ref] [simData]
504+
* \param [int] [cpuTime]
505+
*
506+
* This function initializes result object to emit data.
507+
*/
508+
int initializeResultData(DATA* simData, string result_file_cstr, int cpuTime)
509+
{
510+
int retVal = 0;
511+
long maxSteps = 4 * simData->simulationInfo.numSteps;
512+
if(isInteractiveSimulation() || sim_noemit || 0 == strcmp("empty", simData->simulationInfo.outputFormat)) {
513+
sim_result = new simulation_result_empty(result_file_cstr.c_str(), maxSteps, simData, cpuTime);
514+
} else if(0 == strcmp("csv", simData->simulationInfo.outputFormat)) {
515+
sim_result = new simulation_result_csv(result_file_cstr.c_str(), maxSteps, simData, cpuTime);
516+
} else if(0 == strcmp("mat", simData->simulationInfo.outputFormat)) {
517+
sim_result = new simulation_result_mat(result_file_cstr.c_str(), simData->simulationInfo.startTime, simData->simulationInfo.stopTime, simData, cpuTime);
518+
} else if(0 == strcmp("plt", simData->simulationInfo.outputFormat)) {
519+
sim_result = new simulation_result_plt(result_file_cstr.c_str(), maxSteps, simData, cpuTime);
520+
} else {
521+
cerr << "Unknown output format: " << simData->simulationInfo.outputFormat << endl;
522+
retVal = 1;
523+
}
524+
INFO2(LOG_SOLVER,"Allocated simulation result data storage for method '%s' and file='%s'", sim_result->result_type(), result_file_cstr.c_str());
525+
return retVal;
526+
}
527+
501528
/**
502529
* Calls the solver which is selected in the parameter string "method"
503530
* This function is used for interactive and non-interactive simulation
@@ -514,20 +541,8 @@ int callSolver(DATA* simData, string result_file_cstr, string init_initMethod,
514541
int retVal = -1;
515542
const char* outVars = (outputVariablesAtEnd.size() == 0) ? NULL : outputVariablesAtEnd.c_str();
516543

517-
long maxSteps = 4 * simData->simulationInfo.numSteps;
518-
if(isInteractiveSimulation() || sim_noemit || 0 == strcmp("empty", simData->simulationInfo.outputFormat)) {
519-
sim_result = new simulation_result_empty(result_file_cstr.c_str(), maxSteps, simData, cpuTime);
520-
} else if(0 == strcmp("csv", simData->simulationInfo.outputFormat)) {
521-
sim_result = new simulation_result_csv(result_file_cstr.c_str(), maxSteps, simData, cpuTime);
522-
} else if(0 == strcmp("mat", simData->simulationInfo.outputFormat)) {
523-
sim_result = new simulation_result_mat(result_file_cstr.c_str(), simData->simulationInfo.startTime, simData->simulationInfo.stopTime, simData, cpuTime);
524-
} else if(0 == strcmp("plt", simData->simulationInfo.outputFormat)) {
525-
sim_result = new simulation_result_plt(result_file_cstr.c_str(), maxSteps, simData, cpuTime);
526-
} else {
527-
cerr << "Unknown output format: " << simData->simulationInfo.outputFormat << endl;
528-
return 1;
529-
}
530-
INFO2(LOG_SOLVER,"Allocated simulation result data storage for method '%s' and file='%s'", sim_result->result_type(), result_file_cstr.c_str());
544+
if (initializeResultData(simData, result_file_cstr, cpuTime))
545+
return -1;
531546

532547
if(simData->simulationInfo.solverMethod == std::string("")) {
533548
INFO(LOG_SOLVER, " | No solver is set, using dassl.");

SimulationRuntime/c/simulation/simulation_runtime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ extern simulation_result *sim_result;
6565
int callSolver(DATA* simData, std::string result_file_cstr, std::string init_initMethod,
6666
std::string init_optiMethod, std::string init_file, double init_time, int lambda_steps, std::string outputVariablesAtEnd, int cpuTime);
6767

68+
int initializeResultData(DATA* simData, std::string result_file_cstr, int cpuTime);
6869

6970
#endif /* cplusplus */
7071

SimulationRuntime/c/simulation/solver/dassl.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ dasrt_initial(DATA* simData, SOLVER_INFO* solverInfo, DASSL_DATA *dasslData){
123123
int i;
124124
SIMULATION_INFO *simInfo = &(simData->simulationInfo);
125125

126+
dasslData->dasslMethod = 0;
127+
126128
for(i=0; i< DASSL_MAX;i++){
127129
if(!strcmp((const char*)simInfo->solverMethod, dasslMethodStr[i])){
128130
dasslData->dasslMethod = i;
@@ -167,6 +169,8 @@ dasrt_initial(DATA* simData, SOLVER_INFO* solverInfo, DASSL_DATA *dasslData){
167169
dasslData->dasslStatisticsTmp = (unsigned int*) calloc(numStatistics, sizeof(unsigned int));
168170
ASSERT(dasslData->dasslStatisticsTmp,"out of memory");
169171

172+
dasslData->idid = 0;
173+
170174
dasslData->sqrteps = sqrt(DBL_EPSILON);
171175
dasslData->ysave = (double*) malloc(simData->modelData.nStates*sizeof(double));
172176
dasslData->delta_hh = (double*) malloc(simData->modelData.nStates*sizeof(double));
@@ -222,6 +226,7 @@ dasrt_deinitial(DASSL_DATA *dasslData){
222226
free(dasslData->info);
223227
free(dasslData->dasslStatistics);
224228
free(dasslData->dasslStatisticsTmp);
229+
free(dasslData);
225230
return 0;
226231
}
227232

@@ -256,6 +261,7 @@ int dasrt_step(DATA* simData, SOLVER_INFO* solverInfo)
256261
dasslData->idid = 0;
257262
}
258263

264+
259265
/* Calculate time steps until TOUT is reached
260266
* (DASSL calculates beyond TOUT unless info[6] is set to 1!) */
261267
tout = solverInfo->currentTime + solverInfo->currentStepSize;
@@ -383,7 +389,6 @@ int dasrt_step(DATA* simData, SOLVER_INFO* solverInfo)
383389
} while(dasslData->idid == 1 ||
384390
(dasslData->idid == -1 && solverInfo->currentTime <= simData->simulationInfo.stopTime));
385391

386-
/* at the of one step evaluate the system again */
387392
sData->timeValue = solverInfo->currentTime;
388393

389394
if(ACTIVE_STREAM(LOG_DDASRT))

0 commit comments

Comments
 (0)