From 6aa3db78e5ee0977914178286fa06bf81478e849 Mon Sep 17 00:00:00 2001 From: Jens Frenkel Date: Thu, 10 Nov 2011 15:50:50 +0000 Subject: [PATCH] - update CMakeFiles - simulation_init.cpp -> simulation_init.c git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@10405 f25d12d1-65f4-0310-ae8a-bbce733d8d8e --- SimulationRuntime/c/CMakeLists.txt | 4 +- .../c/ModelicaExternalC/CMakeLists.txt | 8 +- SimulationRuntime/c/build_mingw_libs.bat | 2 +- SimulationRuntime/c/simulation/CMakeLists.txt | 1 + .../c/simulation/math-support/CMakeLists.txt | 2 +- ...{simulation_init.cpp => simulation_init.c} | 268 ++++++++++-------- .../simulation/math-support/simulation_init.h | 1 - .../c/simulation/solver/solver_main.h | 7 +- 8 files changed, 162 insertions(+), 131 deletions(-) rename SimulationRuntime/c/simulation/math-support/{simulation_init.cpp => simulation_init.c} (78%) diff --git a/SimulationRuntime/c/CMakeLists.txt b/SimulationRuntime/c/CMakeLists.txt index 2f38aed514a..ecdc3f220cf 100644 --- a/SimulationRuntime/c/CMakeLists.txt +++ b/SimulationRuntime/c/CMakeLists.txt @@ -92,7 +92,7 @@ MACRO(BUILDMODEL model dir Flags CSRC) ADD_CUSTOM_TARGET(${model}codegen ALL DEPENDS ${OMC_OUTPUT}) ADD_EXECUTABLE(${model} ${OMC_OUTPUT} ${CSRC}) - TARGET_LINK_LIBRARIES(${model} sim c_runtime f2c meta sendData ModelicaExternalC libexpat) + TARGET_LINK_LIBRARIES(${model} simulation sim c_runtime f2c meta sendData ModelicaExternalC libexpat) # Dependencies ADD_DEPENDENCIES(${model} ${model}codegen) @@ -153,7 +153,7 @@ MACRO(BUILDMODELMOS model mos Flags CSRC) ADD_DEFINITIONS(/TP ${model}.c) ADD_EXECUTABLE(${model} ${OMC_OUTPUT} ${CSRC}) - TARGET_LINK_LIBRARIES(${model} util math-support results solver f2c meta sendData ModelicaExternalC libexpat) + TARGET_LINK_LIBRARIES(${model} simulation util math-support results solver f2c meta sendData ModelicaExternalC libexpat) # Dependencies ADD_DEPENDENCIES(${model} ${model}codegen) diff --git a/SimulationRuntime/c/ModelicaExternalC/CMakeLists.txt b/SimulationRuntime/c/ModelicaExternalC/CMakeLists.txt index 1b49b95694c..64f34110db0 100644 --- a/SimulationRuntime/c/ModelicaExternalC/CMakeLists.txt +++ b/SimulationRuntime/c/ModelicaExternalC/CMakeLists.txt @@ -1,12 +1,12 @@ # Sources and Headers set(ModelicaExternalC_sources ModelicaInternal.c ModelicaStrings.c - ModelicaTablesImpl.c) -# tables.cpp + ModelicaTablesImpl.c + tables.cpp) # ModelicaUtilities.c) -SET(ModelicaExternalC_headers ModelicaTables.h) -# tables.h +SET(ModelicaExternalC_headers ModelicaTables.h + tables.h) # ModelicaUtilities.h) # Library ModelicaExternalC diff --git a/SimulationRuntime/c/build_mingw_libs.bat b/SimulationRuntime/c/build_mingw_libs.bat index e6e01d25f77..33626a8300a 100644 --- a/SimulationRuntime/c/build_mingw_libs.bat +++ b/SimulationRuntime/c/build_mingw_libs.bat @@ -12,7 +12,7 @@ del ..\..\mosh\src\options.o *.o *.a pushd ..\..\mosh\src g++ -O3 -c options.cpp popd -mingw32-make -f Makefile.omdev.mingw +mingw32-make -f Makefile.omdev.mingw %1 pause rem del ..\..\mosh\src\options.o *.o rem del interactive\*.o diff --git a/SimulationRuntime/c/simulation/CMakeLists.txt b/SimulationRuntime/c/simulation/CMakeLists.txt index eb74d1f33d5..897b04208c1 100644 --- a/SimulationRuntime/c/simulation/CMakeLists.txt +++ b/SimulationRuntime/c/simulation/CMakeLists.txt @@ -17,6 +17,7 @@ SET(simulation_headers simulation_input_xml.h simulation_runtime.h options.h ../linearization/linearize.h) # Library util +ADD_DEFINITIONS(/DNO_INTERACTIVE_DEPENDENCY) ADD_LIBRARY(simulation ${simulation_sources} ${simulation_headers}) #TARGET_LINK_LIBRARIES(util) diff --git a/SimulationRuntime/c/simulation/math-support/CMakeLists.txt b/SimulationRuntime/c/simulation/math-support/CMakeLists.txt index 14e4a3a8933..2eb089d067e 100644 --- a/SimulationRuntime/c/simulation/math-support/CMakeLists.txt +++ b/SimulationRuntime/c/simulation/math-support/CMakeLists.txt @@ -6,7 +6,7 @@ SET(math_support_sources bigden.c enorm.c hybrd1.c nelmead.c qform.c r1updt.c biglag.c dogleg.c fdjac1.c hybrj.c newuoa.c qrfac.c trsapp.c dpmpar.c hybrd.c lsame.c newuob.c r1mpyq.c update.c simulation_events.cpp simulation_delay.cpp - simulation_init.cpp dgesv_aux.c ) + simulation_init.cpp dgesv_aux.c ringbuffer.c ) SET(math_support_headers blaswrap.h matrix.h ringbuffer.h simulation_delay.h simulation_events.h simulation_init.h) diff --git a/SimulationRuntime/c/simulation/math-support/simulation_init.cpp b/SimulationRuntime/c/simulation/math-support/simulation_init.c similarity index 78% rename from SimulationRuntime/c/simulation/math-support/simulation_init.cpp rename to SimulationRuntime/c/simulation/math-support/simulation_init.c index 79fdb72d960..0a1621e4d8f 100644 --- a/SimulationRuntime/c/simulation/math-support/simulation_init.cpp +++ b/SimulationRuntime/c/simulation/math-support/simulation_init.c @@ -35,7 +35,7 @@ #include "simulation_runtime.h" #include "solver_main.h" #include -#include +#include enum INIT_INIT_METHOD { @@ -68,15 +68,19 @@ const char *optiMethodStr[4] = {"unknown", "simplex", "nelder_mead_ex", "newuoa" void leastSquare(long *nz, double *z, double *funcValue) { int indz = 0; + fortran_integer i = 0; + long j=0; + int shiftForInitFixed = 0; + int shiftForVar_attr = 0; - for(int i=0; inStates; i++) + for(i=0; inStates; i++) if(globalData->initFixed[i]==0) globalData->states[i] = z[indz++]; /* for real parameters */ - int shiftForInitFixed = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; - int shiftForVar_attr = globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; - for(int i=0; inParameters; i++) + shiftForInitFixed = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; + shiftForVar_attr = globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; + for(i=0; inParameters; i++) if(globalData->initFixed[i+shiftForInitFixed] == 0 && globalData->var_attr[i+shiftForVar_attr] == 1) globalData->parameters[i] = z[indz++]; @@ -87,8 +91,8 @@ void leastSquare(long *nz, double *z, double *funcValue) initial_residual(1.0); *funcValue = 0; - for(int i=0; inInitialResiduals; i++) - *funcValue += globalData->initialResiduals[i] * globalData->initialResiduals[i]; + for(j=0; inInitialResiduals; j++) + *funcValue += globalData->initialResiduals[j] * globalData->initialResiduals[j]; if(useVerboseOutput(LOG_INIT)) { @@ -110,8 +114,13 @@ void leastSquare(long *nz, double *z, double *funcValue) double leastSquareWithLambda(long nz, double *z, double* scale, double lambda) { int indz = 0; + fortran_integer i = 0; + int shiftForInitFixed = 0; + int shiftForVar_attr = 0; + long j = 0; + double funcValue = 0; - for(int i=0; inStates; i++) + for(i=0; inStates; i++) if(globalData->initFixed[i]==0) { globalData->states[i] = z[indz] * (scale ? scale[indz] : 1.0); @@ -119,9 +128,9 @@ double leastSquareWithLambda(long nz, double *z, double* scale, double lambda) } /* for real parameters */ - int shiftForInitFixed = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; - int shiftForVar_attr = globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; - for(int i=0; inParameters; i++) + shiftForInitFixed = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; + shiftForVar_attr = globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; + for(i=0; inParameters; i++) if(globalData->initFixed[i+shiftForInitFixed] == 0 && globalData->var_attr[i+shiftForVar_attr] == 1) { globalData->parameters[i] = z[indz] * (scale ? scale[indz] : 1.0); @@ -134,9 +143,8 @@ double leastSquareWithLambda(long nz, double *z, double* scale, double lambda) initial_residual(lambda); - double funcValue = 0; - for(int i=0; inInitialResiduals; i++) - funcValue += globalData->initialResiduals[i] * globalData->initialResiduals[i]; + for(j=0; inInitialResiduals; j++) + funcValue += globalData->initialResiduals[j] * globalData->initialResiduals[j]; return funcValue; } @@ -156,13 +164,13 @@ void NelderMeadOptimization(long N, double beta = 2; /* beta > 1 */ double gamma = 0.5; /* 0 < gamma < 1 */ - double* simplex = new double[(N+1) * N]; - double* fvalues = new double[N+1]; + double* simplex = (double*)calloc((N+1) * N,sizeof(double)); + double* fvalues = (double*)calloc(N+1,sizeof(double)); - double* xr = new double[N]; - double* xe = new double[N]; - double* xk = new double[N]; - double* xbar = new double[N]; + double* xr = (double*)calloc(N,sizeof(double)); + double* xe = (double*)calloc(N,sizeof(double)); + double* xk = (double*)calloc(N,sizeof(double)); + double* xbar = (double*)calloc(N,sizeof(double)); double fxr; double fxe; @@ -172,20 +180,35 @@ void NelderMeadOptimization(long N, long xs = 0; /* worst vertex */ long xz = 0; /* second-worst vertex */ + long x = 0; + long i = 0; + + double lambda = 0.0; /* no lambda-control is activated */ + long iteration = 0; + + /* check Memory */ + assert(xr); + assert(xe); + assert(xk); + assert(xbar); + /* initialize simplex */ - for(long x=0; x fvalues[xs]) { @@ -246,48 +265,48 @@ void NelderMeadOptimization(long N, } /* calculate central point for the n best vertices */ - for(long i=0; i= fvalues[xs]) { - for(long i=0; i acc) && iteration < maxIt); /* copying solution */ - for(long i=0; i 1e-5) { fprintf(stderr, "error | reportResidualValue | error in initialization. System of initial equations are not consistent.\n"); fprintf(stderr, "error | reportResidualValue | (Least Square function value is %g)\n", funcValue); - for(int i=0; inInitialResiduals; i++) + for(i=0; inInitialResiduals; i++) { if(fabs(globalData->initialResiduals[i]) > 1e-6) { @@ -378,24 +398,25 @@ int reportResidualValue(double funcValue) * This function performs initialization using the newuoa function, which is * a trust region method that forms quadratic models by interpolation. */ -int newuoa_initialization(long& nz, double *z) +int newuoa_initialization(long *nz, double *z) { long IPRINT = sim_verbose >= LOG_INIT? 2 : 0; long MAXFUN=50000; double RHOEND=1.0e-6; - double RHOBEG=10; // This should be about one tenth of the greatest - // expected value of a variable. Perhaps the nominal - // value can be used for this. - long NPT = 2*nz+1; - double *W = new double[(NPT+13)*(NPT+nz)+3*nz*(nz+3)/2]; - NEWUOA(&nz,&NPT,z,&RHOBEG,&RHOEND,&IPRINT,&MAXFUN,W,leastSquare); + double RHOBEG=10; /* This should be about one tenth of the greatest + expected value of a variable. Perhaps the nominal + value can be used for this.*/ + long NPT = 2*(*nz)+1; + double funcValue=0; + double *W = (double*)calloc((NPT+13)*(NPT+(*nz))+3*(*nz)*((*nz)+3)/2,sizeof(double)); + assert(W); + NEWUOA(nz,&NPT,z,&RHOBEG,&RHOEND,&IPRINT,&MAXFUN,W,leastSquare); - // Calculate the residual to verify that equations are consistent. - double funcValue; - leastSquare(&nz,z,&funcValue); + /* Calculate the residual to verify that equations are consistent. */ + leastSquare(nz,z,&funcValue); - delete [] W; + free(W); return reportResidualValue(funcValue); } @@ -404,53 +425,54 @@ int newuoa_initialization(long& nz, double *z) * This function performs initialization by using the simplex algorithm. * This does not require a jacobian for the residuals. */ -int simplex_initialization(long& nz, double *z) +int simplex_initialization(long *nz, double *z) { int ind = 0; double funcValue = 0; - double *STEP = (double*) malloc(nz*sizeof(double)); - double *VAR = (double*) malloc(nz*sizeof(double)); + double *STEP = (double*) calloc((*nz),sizeof(double)); + double *VAR = (double*) calloc((*nz),sizeof(double)); + double STOPCR = 0,SIMP=0; + long IPRINT = 0, NLOOP = 0, IQUAD = 0, IFAULT = 0, MAXF = 0; + assert(STEP); + assert(VAR); /* Start with stepping .5 in each direction. */ - for (ind = 0; ind < nz; ind++) + for (ind = 0; ind < (*nz); ind++) { /* some kind of scaling */ STEP[ind] = (z[ind]!=0.0 ? fabs(z[ind])/1000.0 : 1); /* 1.0 */ VAR[ind] = 0.0; } - double STOPCR = 0, SIMP = 0; - long IPRINT = 0, NLOOP = 0, IQUAD = 0, IFAULT = 0, MAXF = 0; - - //C Set max. no. of function evaluations = 5000, print every 100. + /* Set max. no. of function evaluations = 5000, print every 100.*/ - MAXF = 5000 * nz; + MAXF = 5000 * (*nz); IPRINT = sim_verbose >= LOG_INIT ? 100 : -1; - //C Set value for stopping criterion. Stopping occurs when the - //C standard deviation of the values of the objective function at - //C the points of the current simplex < stopcr. + /* Set value for stopping criterion. Stopping occurs when the + standard deviation of the values of the objective function at + the points of the current simplex < stopcr.*/ STOPCR = 1.e-12; - NLOOP = nz; + NLOOP = (*nz); - //C Fit a quadratic surface to be sure a minimum has been found. + /* Fit a quadratic surface to be sure a minimum has been found.*/ IQUAD = 0; - //C As function value is being evaluated in DOUBLE PRECISION, it - //C should be accurate to about 15 decimals. If we set simp = 1.d-6, - //C we should get about 9 dec. digits accuracy in fitting the surface. + /* As function value is being evaluated in DOUBLE PRECISION, it + should be accurate to about 15 decimals. If we set simp = 1.d-6, + we should get about 9 dec. digits accuracy in fitting the surface.*/ SIMP = 1.e-12; - //C Now call NELMEAD to do the work. + /*C Now call NELMEAD to do the work.*/ - leastSquare(&nz,z,&funcValue); + leastSquare(nz,z,&funcValue); if ( fabs(funcValue) != 0) { - NELMEAD(z,STEP,&nz,&funcValue,&MAXF,&IPRINT,&STOPCR, + NELMEAD(z,STEP,nz,&funcValue,&MAXF,&IPRINT,&STOPCR, &NLOOP,&IQUAD,&SIMP,VAR,leastSquare,&IFAULT); } else @@ -461,7 +483,7 @@ int simplex_initialization(long& nz, double *z) } } - leastSquare(&nz,z,&funcValue); + leastSquare(nz,z,&funcValue); if(useVerboseOutput(LOG_INIT)) { printf("info | leastSquare=%g\n", funcValue); fflush(NULL); @@ -491,18 +513,20 @@ int simplex_initialization(long& nz, double *z) * This function performs initialization by using the simplex algorithm. * This does not require a jacobian for the residuals. */ -int nelderMeadEx_initialization(long& nz, double *z, double *scale) +int nelderMeadEx_initialization(long *nz, double *z, double *scale) { double STOPCR = 1.e-16; double lambda_step = 0.1; - long NLOOP = 10000 * nz; + long NLOOP = 10000 * (*nz); - double funcValue = leastSquareWithLambda(nz, z, NULL, 1.0); + double funcValue = leastSquareWithLambda((*nz), z, NULL, 1.0); double lambda = 0; long iteration = 0; - for(long l=0; l<100 && funcValue > STOPCR; l++) + long l=0,i=0; + + for(l=0; l<100 && funcValue > STOPCR; l++) { if(useVerboseOutput(LOG_INIT)) { @@ -510,17 +534,17 @@ int nelderMeadEx_initialization(long& nz, double *z, double *scale) } /*down-scale*/ - for(int i=0; inStates; ind++) { @@ -581,8 +611,8 @@ int initialize(INIT_OPTI_METHOD optiMethod) } } - int startIndPar = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; - int endIndPar = startIndPar+globalData->nParameters; + startIndPar = 2*globalData->nStates+globalData->nAlgebraic+globalData->intVariables.nAlgebraic+globalData->boolVariables.nAlgebraic; + endIndPar = startIndPar+globalData->nParameters; for(ind = startIndPar; ind < endIndPar; ind++) { if(globalData->initFixed[ind]==0 && globalData->var_attr[ind-globalData->nStates]==1) @@ -600,13 +630,13 @@ int initialize(INIT_OPTI_METHOD optiMethod) { fprintf(stdout, "info | initialize | initialization by method: %s\n", optiMethodStr[optiMethod]); fprintf(stdout, "info | initialize | fixed attribute for states:\n"); - for(int i=0;inStates; i++) + for(i=0;inStates; i++) fprintf(stdout, "info | initialize | %s(fixed=%s)\n", globalData->statesNames[i].name, (globalData->initFixed[i] ? "true" : "false")); fprintf(stdout, "info | initialize | number of non-fixed variables: %d\n", (int) nz); fflush(NULL); } - // No initial values to calculate. + /* No initial values to calculate.*/ if(nz == 0) { if(sim_verbose >= LOG_INIT) @@ -616,9 +646,10 @@ int initialize(INIT_OPTI_METHOD optiMethod) return 0; } - double *z = new double[nz]; - double *scale = new double[nz]; - if(z == NULL) {return -1;} + z = (double*)calloc(nz,sizeof(double)); + scale = (double*)calloc(nz,sizeof(double)); + assert(z); + assert(scale); /* Fill z with the non-fixed variables from x and p */ for(ind=0, indAct=0, indz=0; indnStates; ind++) @@ -640,18 +671,17 @@ int initialize(INIT_OPTI_METHOD optiMethod) } } - int retVal = 0; if(optiMethod == IOM_SIMPLEX) { - retVal = simplex_initialization(nz, z); + retVal = simplex_initialization(&nz, z); } else if(optiMethod == IOM_NELDER_MEAD_EX) { - retVal = nelderMeadEx_initialization(nz, z, scale); + retVal = nelderMeadEx_initialization(&nz, z, scale); } else if(optiMethod == IOM_NEWUOA) { - retVal = newuoa_initialization(nz, z); + retVal = newuoa_initialization(&nz, z); } else { @@ -660,13 +690,14 @@ int initialize(INIT_OPTI_METHOD optiMethod) fflush(NULL); retVal= -1; } - delete [] z; - delete [] scale; + free(z); + free(scale); return retVal; } -int old_initialization(INIT_OPTI_METHOD optiMethod) +int old_initialization(int optiMethod) { + int retVal = 0; /* call initialize function and save start values */ saveall(); /* if initial_function() uses pre-values */ initial_function(); /* set all start-Values */ @@ -687,7 +718,6 @@ int old_initialization(INIT_OPTI_METHOD optiMethod) /* first try with the given method as default simplex and */ /* then try with the other one */ - int retVal = 0; retVal = initialize(optiMethod); if(retVal != 0) @@ -726,8 +756,9 @@ int old_initialization(INIT_OPTI_METHOD optiMethod) return retVal; } -int state_initialization(INIT_OPTI_METHOD optiMethod) +int state_initialization(int optiMethod) { + int retVal = 0; /* call initialize function and save start values */ saveall(); /* if initial_function() uses pre-values */ initial_function(); /* set all start-Values */ @@ -745,7 +776,6 @@ int state_initialization(INIT_OPTI_METHOD optiMethod) /* start with the real initialization */ globalData->init = 1; /* to evaluate when-equations with initial()-conditions */ - int retVal = 0; retVal = initialize(IOM_NELDER_MEAD_EX); saveall(); /* save pre-values */ @@ -782,8 +812,8 @@ int state_initialization(INIT_OPTI_METHOD optiMethod) int initialization(const char* pInitMethod, const char* pOptiMethod) { - INIT_INIT_METHOD initMethod = IIM_STATE; /* default method */ - INIT_OPTI_METHOD optiMethod = IOM_SIMPLEX; /* default method */ + int initMethod = IIM_STATE; /* default method */ + int optiMethod = IOM_SIMPLEX; /* default method */ /* if there are user-specified options, use them! */ if(pInitMethod) diff --git a/SimulationRuntime/c/simulation/math-support/simulation_init.h b/SimulationRuntime/c/simulation/math-support/simulation_init.h index eda985fae2a..eae0b273c41 100644 --- a/SimulationRuntime/c/simulation/math-support/simulation_init.h +++ b/SimulationRuntime/c/simulation/math-support/simulation_init.h @@ -35,7 +35,6 @@ #define _SIMULATION_INIT_H #ifdef __cplusplus -#include #include extern "C"{ diff --git a/SimulationRuntime/c/simulation/solver/solver_main.h b/SimulationRuntime/c/simulation/solver/solver_main.h index 49a996b9a67..7423343898d 100644 --- a/SimulationRuntime/c/simulation/solver/solver_main.h +++ b/SimulationRuntime/c/simulation/solver/solver_main.h @@ -41,7 +41,8 @@ #define _SOLVER_MAIN_H #define DDASRT ddasrt_ -#include "fortran_types.h" +#include "openmodelica.h" + #ifdef __cplusplus extern "C" { void DDASRT( @@ -68,7 +69,7 @@ extern "C" { ); double dlamch_(char*,int); -} // extern "C" +} /* extern "C"*/ int solver_main( int argc, char** argv,double &start, double &stop, double &step, long &outputSteps, double &tolerance, int flag); @@ -78,7 +79,7 @@ extern "C" { #endif void update_DAEsystem(); #ifdef __cplusplus -} +} /* extern "C"*/ #endif #endif