diff --git a/Compiler/DAELow.mo b/Compiler/DAELow.mo index 21938abfd38..4816a350201 100644 --- a/Compiler/DAELow.mo +++ b/Compiler/DAELow.mo @@ -13368,6 +13368,7 @@ public function calculateSizes "function: calculateSizes output Integer outny "number of alg. vars"; output Integer outnp "number of parameters"; output Integer outng " number of zerocrossings"; + output Integer outng_sample " number of zerocrossings that are samples"; output Integer outnext " number of external objects"; //nx cannot be strings @@ -13378,7 +13379,7 @@ algorithm matchcontinue (inDAELow) local list varlst,knvarlst,extvarlst; - Value np,ng,nx,ny,nx_1,ny_1,next,ny_string,np_string,ny_1_string; + Value np,ng,nsam,nx,ny,nx_1,ny_1,next,ny_string,np_string,ny_1_string; String np_str; Variables vars,knvars,extvars; list wc; @@ -13394,14 +13395,42 @@ algorithm knvarlst = varList(knvars); (np,np_string) = calculateParamSizes(knvarlst); np_str = intString(np); - ng = listLength(zc); + (ng,nsam) = calculateNumberZeroCrossings(zc,0,0); (nx,ny,ny_string) = calculateVarSizes(varlst, 0, 0,0); (nx_1,ny_1,ny_1_string) = calculateVarSizes(knvarlst, nx, ny,ny_string); then - (nx_1,ny_1,np,ng,next,ny_1_string,np_string); + (nx_1,ny_1,np,ng,nsam,next,ny_1_string,np_string); end matchcontinue; end calculateSizes; +protected function calculateNumberZeroCrossings + input list zcLst; + input Integer zc_index; + input Integer sample_index; + output Integer zc; + output Integer sample; +algorithm + (outCFn) := matchcontinue (zcLst,zc_index,sample_index) + local + list xs; + case ({},zc_index,sample_index) then (zc_index,sample_index); + + case (ZERO_CROSSING(relation_ = DAE.CALL(path = Absyn.IDENT(name = "sample"))) :: xs,zc_index,sample_index) + equation + sample_index = sample_index + 1; + zc_index = zc_index + 1; + (zc,sample) = calculateNumberZeroCrossings(xs,zc_index,sample_index); + then (zc,sample); + + case (ZERO_CROSSING(relation_ = DAE.RELATION(operator = _), occurEquLst = _) :: xs,zc_index,sample_index) + equation + zc_index = zc_index + 1; + (zc,sample) = calculateNumberZeroCrossings(xs,zc_index,sample_index); + then (zc,sample); + + end matchcontinue; +end calculateNumberZeroCrossings; + protected function calculateParamSizes "function: calculateParamSizes author: PA diff --git a/Compiler/Main.mo b/Compiler/Main.mo index adc43281c75..86ea009bbc4 100644 --- a/Compiler/Main.mo +++ b/Compiler/Main.mo @@ -564,7 +564,7 @@ algorithm Debug.fcall("execstat",print, "*** Main -> To instantiate at time: " +& realString(clock()) +& "\n" ); // Instantiate the program. - (cache, env, d_1, scode) = instantiate(p); + (cache, env, d_1, scode, cname) = instantiate(p); Debug.fcall("execstat",print, "*** Main -> done instantiation at time: " +& realString(clock()) +& "\n" ); Debug.fprint("beforefixmodout", "Explicit part:\n"); @@ -589,7 +589,7 @@ algorithm // Transform if equations to if expression before going into code generation. d = DAEUtil.transformIfEqToExpr(d,false); - cname = Absyn.lastClassname(p); + str = Print.getString(); silent = RTOpts.silent(); notsilent = boolNot(silent); @@ -674,8 +674,9 @@ protected function instantiate output Env.Env env; output DAE.DAElist dae; output list scode; + output Absyn.Path cname; algorithm - (cache, env, dae) := matchcontinue(program) + (cache, env, dae, cname) := matchcontinue(program) local Env.Cache c; Env.Env e; @@ -696,7 +697,7 @@ algorithm InnerOuter.emptyInstHierarchy, s); then - (c, Env.emptyEnv(), d, s); + (c, Env.emptyEnv(), d, s, Absyn.lastClassname(program)); case (_) equation // If a class to instantiate was given on the command line, instantiate @@ -711,7 +712,7 @@ algorithm s, class_path); then - (c, e, d, s); + (c, e, d, s, class_path); end matchcontinue; end instantiate; @@ -847,7 +848,7 @@ algorithm TaskGraphExt.dumpMergedGraph("merged_model.viz"); n = RTOpts.noProc(); TaskGraphExt.schedule(n); - (nx,ny,np,_,_,_,_) = DAELow.calculateSizes(indexed_dae_1); + (nx,ny,np,_,_,_,_,_) = DAELow.calculateSizes(indexed_dae_1); nps = intString(np); print("=======\nnp ="); print(nps); diff --git a/Compiler/SimCode.mo b/Compiler/SimCode.mo index d6b6165a6ee..c65930162ac 100644 --- a/Compiler/SimCode.mo +++ b/Compiler/SimCode.mo @@ -3837,7 +3837,7 @@ algorithm Integer nx, ny, np, ng, next, ny_string, np_string, ng_1; case (dlow, numOutVars, numInVars, numHelpVars, numResiduals) equation - (nx, ny, np, ng, next, ny_string, np_string) = + (nx, ny, np, ng, _ /* ng_sam */, next, ny_string, np_string) = DAELow.calculateSizes(dlow); ng_1 = filterNg(ng); then diff --git a/Compiler/SimCodegen.mo b/Compiler/SimCodegen.mo index 08d2094cdc1..265596bf333 100644 --- a/Compiler/SimCodegen.mo +++ b/Compiler/SimCodegen.mo @@ -489,25 +489,27 @@ algorithm outString:= matchcontinue (class_,loweredDAE,numberOfOutputVariables,numberOfInputVariables,numberOfHelpVariables,numberOfResidulas,fileDir) local - Integer nx,ny,np,ng,ng_1,no,ni,nh,nres,next,ny_string,np_string; + Integer nx,ny,np,ng,ng_sam,ng_1,ng_sam_1,no,ni,nh,nres,next,ny_string,np_string; String initDeinitDataStructFunction,class_str,nx_str,ny_str,np_str,ng_str,no_str,ni_str,nh_str; String nres_str,c_code2_str,c_code3_str,c_code_str,macros_str,global_bufs,str1,str,next_str; - String nystring_str, npstring_str; + String nystring_str, npstring_str, ng_sam_str; list c_code; Absyn.Path class_; DAELow.DAELow dlow; String trimmedFileDir; case (class_,dlow,no,ni,nh,nres,fileDir) equation - (nx,ny,np,ng,next,ny_string,np_string) = DAELow.calculateSizes(dlow); + (nx,ny,np,ng,ng_sam,next,ny_string,np_string) = DAELow.calculateSizes(dlow); //DAELow.dump(dlow); ng_1 = filterNg(ng); + ng_sam_1 = filterNg(ng_sam); class_str = Absyn.pathString(class_); nx_str = intString(nx); ny_str = intString(ny); np_str = intString(np); ng_str = intString(ng_1); + ng_sam_str = intString(ng_sam_1); no_str = intString(no); ni_str = intString(ni); nh_str = intString(nh); @@ -527,10 +529,14 @@ algorithm // and transform it to a C string: \ replaced by \\ // trimmedFileDir = System.stringReplace(trimmedFileDir, "\\", "\\\\"); str1 = Util.stringAppendList( - {"\n","#define NHELP ",nh_str,"\n","#define NG ",ng_str,"//number of zero crossing", - "\n","#define NX ",nx_str,"\n","#define NY ",ny_str,"\n","#define NP ", - np_str," // number of parameters\n","#define NO ",no_str, - " // number of outputvar on topmodel\n","#define NI ",ni_str," // number of inputvar on topmodel\n", + {"\n","#define NHELP ",nh_str,"\n", + "#define NG ",ng_str,"// number of zero crossing\n", + "#define NG_SAM ",ng_sam_str,"// number of zero crossings that are samples\n", + "#define NX ",nx_str,"\n", + "#define NY ",ny_str,"\n", + "#define NP ",np_str," // number of parameters\n", + "#define NO ",no_str," // number of outputvar on topmodel\n", + "#define NI ",ni_str," // number of inputvar on topmodel\n", "#define NR ",nres_str," // number of residuals for initialialization function\n", "#define NEXT ", next_str," // number of external objects\n", "#define MAXORD 5\n", @@ -539,8 +545,8 @@ algorithm "\n", global_bufs, "extern \"C\" { /* adrpo: this is needed for Visual C++ compilation to work! */\n", - " char *model_name=\"",class_str,"\";\n", - " char *model_dir=\"",trimmedFileDir,"\";\n", + " const char *model_name=\"",class_str,"\";\n", + " const char *model_dir=\"",trimmedFileDir,"\";\n", "}\n", c_code_str,c_code2_str,"\n",c_code3_str,"\n"}); str = Util.stringAppendList({str1,macros_str,"\n",initDeinitDataStructFunction,"\n"}) @@ -869,6 +875,7 @@ extObjConstructorsDecl_str," returnData->nInputVars = NI; returnData->nOutputVars = NO; returnData->nZeroCrossing = NG; + returnData->nRawSamples = NG_SAM; returnData->nInitialResiduals = NR; returnData->nHelpVars = NHELP; returnData->stringVariables.nParameters = NPSTR; @@ -1035,6 +1042,13 @@ extObjConstructorsDecl_str," } else { returnData->outputComments = 0; }\n"," + if(flags & RAWSAMPLES && returnData->nRawSamples) { + returnData->rawSampleExps = (sample_raw_time*) malloc(sizeof(sample_raw_time)*returnData->nRawSamples); + assert(returnData->rawSampleExps); + memset(returnData->rawSampleExps,0,sizeof(sample_raw_time)*returnData->nRawSamples); + } else { + returnData->rawSampleExps = 0; + } if (flags & EXTERNALVARS) { returnData->extObjs = (void**)malloc(sizeof(void*)*NEXT); if (!returnData->extObjs) { @@ -1789,7 +1803,7 @@ algorithm get_name_function_ifs_1 = Util.stringAppendList(get_name_function_ifs_1) "generate getName function" ; get_name_function = Util.stringAppendList( - {"char* getName( double* ",paramInGetNameFunction,")\n", + {"const char* getName( double* ",paramInGetNameFunction,")\n", "{\n",get_name_function_ifs_1," return \"\";\n}\n\n"}); var_defines_str = Util.stringAppendList(var_defines_1); then @@ -1801,7 +1815,7 @@ end generateVarNamesAndComments; protected function generateCDeclForStringArray "function generateCDeclForStringArray author x02lucpo - generates a static C-array with char {} + generates a static C-array with const char {} or only a char depending it the int parameters is > 0" input String inString1; input String inString2; @@ -1816,13 +1830,13 @@ algorithm case (array_name,_,number_of_strings) equation (number_of_strings == 0) = true; - res = Util.stringAppendList({"char* ",array_name,"[1] = {\"\"};\n"}); + res = Util.stringAppendList({"const char* ",array_name,"[1] = {\"\"};\n"}); then res; case (array_name,array_str,number_of_strings) equation number_of_strings_str = intString(number_of_strings); - res = Util.stringAppendList({"char* ",array_name,"[",number_of_strings_str,"]={",array_str,"};\n"}); + res = Util.stringAppendList({"const char* ",array_name,"[",number_of_strings_str,"]={",array_str,"};\n"}); then res; end matchcontinue; @@ -7287,7 +7301,7 @@ algorithm stop_str = realString(stop); step_str = realString(step); tolerance_str = realString(tolerance); - (nx,ny,np,_,_,nystring,npstring) = DAELow.calculateSizes(dlow); + (nx,ny,np,_,_,_,nystring,npstring) = DAELow.calculateSizes(dlow); nx_str = intString(nx); ny_str = intString(ny); np_str = intString(np); @@ -7768,7 +7782,7 @@ algorithm matchcontinue (inString1,inDAElist2,inDAELow3,inIntegerArray4,inIntegerArray5,inIntegerLstLst6,helpVarLst) local Codegen.CFunction func_zc,func_handle_zc,cfunc,cfunc0_1,cfunc0,cfunc_1,cfunc_2,func_zc0,func_handle_zc0,func_handle_zc0_1; - Codegen.CFunction func_handle_zc0_2,func_handle_zc0_3,func_zc0_1,func_zc_1,func_handle_zc_1,cfuncHelpvars; + Codegen.CFunction func_handle_zc0_2,func_handle_zc0_3,func_zc0_1,func_zc_1,func_handle_zc_1,cfuncHelpvars,func_sample_init; Integer cg_id1,cg_id2,cg_id; list extra_funcs1,extra_funcs2,extra_funcs; String extra_funcs_str,helpvarUpdateStr,func_str,res,cname; @@ -7813,8 +7827,10 @@ algorithm func_zc0_1 = Codegen.cAddCleanups(func_zc0, {"localData->timeValue = timeBackup;", "return 0;"}); func_zc_1 = Codegen.cMergeFns({func_zc0_1,func_zc}); func_handle_zc_1 = Codegen.cMergeFns({func_handle_zc0_3,func_handle_zc}); + + func_sample_init = generateSampleInit(zc); - func_str = Codegen.cPrintFunctionsStr({func_zc_1,func_handle_zc_1,cfunc_2}); + func_str = Codegen.cPrintFunctionsStr({func_zc_1,func_handle_zc_1,func_sample_init,cfunc_2}); res = Util.stringAppendList({extra_funcs_str,func_str}); then res; @@ -7838,7 +7854,7 @@ protected function generateZeroCrossing2 input Integer[:] inIntegerArray5; input Integer[:] inIntegerArray6; input list> inIntegerLstLst7; - input list helpVarLst; // not used her anymore + input list helpVarLst; // not used here anymore input Integer inInteger9; input Integer inInteger10; output CFunction outCFunction1; @@ -7909,6 +7925,65 @@ algorithm end matchcontinue; end generateZeroCrossing2; +protected function generateSampleInit +"Generates code to schedule sample() events." + input list zcLst; + output CFunction outFn; +protected + list sampleTimes; +algorithm + (sampleTimes) := generateSampleInit2(zcLst, 0, 0); + outFn := Codegen.cMakeFunction("void", "function_sampleInit", {}, {}); + outFn := Codegen.cAddStatements(outFn, sampleTimes); +end generateSampleInit; + +protected function generateSampleInit2 +"Generates code to schedule sample() events." + input list zcLst; + input Integer sample_index; + input Integer zc_index; + output list outStmts; +algorithm + (outCFn) := matchcontinue (zcLst,sample_index,zc_index) + local + DAELow.ZeroCrossing zc; + list xs; + DAE.Exp start,interval; + String sample_index_str, zc_index_str, e1_str, e2_str, zc_str1, zc_str2, zc_str3; + list res; + case ({},sample_index,_) then ({}); + + case (DAELow.ZERO_CROSSING(relation_ = DAE.CALL(path = Absyn.IDENT(name = "sample"),expLst = {start,interval})) :: xs,sample_index,zc_index) + equation + sample_index_str = intString(sample_index); + sample_index = sample_index + 1; + zc_index_str = intString(zc_index); + zc_index = zc_index + 1; + + e1_str = printExpCppStr(start); + e2_str = printExpCppStr(interval); + zc_str1 = Util.stringAppendList({"localData->rawSampleExps[",sample_index_str,"].start = ",e1_str,";"}); + zc_str2 = Util.stringAppendList({"localData->rawSampleExps[",sample_index_str,"].interval = ",e2_str,";"}); + zc_str3 = Util.stringAppendList({"localData->rawSampleExps[",sample_index_str,"].zc_index = ",zc_index_str,";"}); + res = generateSampleInit2(xs,sample_index,zc_index); + then (zc_str1 :: zc_str2 :: zc_str3 :: res); + + case (((zc as DAELow.ZERO_CROSSING(relation_ = DAE.RELATION(operator = _), occurEquLst = _)) :: xs),sample_index,zc_index) + equation + zc_index = zc_index + 1; + (res) = generateSampleInit2(xs,sample_index,zc_index); + then (res); + + case (((zc as DAELow.ZERO_CROSSING(occurEquLst = _)) :: xs),_,_) + equation + zc_str1 = dumpZeroCrossingStr(zc); + zc_str2 = Util.stringAppendList({"generateSampleInit :",zc_str1,"\n"}); + Error.addMessage(Error.INTERNAL_ERROR, {zc_str2}); + then fail(); + + end matchcontinue; +end generateSampleInit2; + protected function generateUpdateDepended input DAE.DAElist inDAElist; input DAELow.DAELow inDAELow; @@ -8111,7 +8186,7 @@ end getZcMixedSystem; protected function dumpZeroCrossingStr "function: dumpZeroCrossingStr author: - Dumps a ZeroCrossing to a sting. Useful for debugging." + Dumps a ZeroCrossing to a string. Useful for debugging." input DAELow.ZeroCrossing inZeroCrossing; output String outString; algorithm diff --git a/c_runtime/options.cpp b/c_runtime/options.cpp index 9f826cc1e51..c59254a0d15 100644 --- a/c_runtime/options.cpp +++ b/c_runtime/options.cpp @@ -34,7 +34,7 @@ using namespace std; -bool flagSet(char *option, int argc, char** argv) +bool flagSet(const char *option, int argc, char** argv) { for (int i=0; i /* -f */ -bool flagSet(char*, int, char**); +bool flagSet(const char*, int, char**); /* -f=value */ const std::string * getOption(const char*, int, char **); diff --git a/c_runtime/sendData/humbug.cpp b/c_runtime/sendData/humbug.cpp index 8a85241ba4e..e2481304624 100644 --- a/c_runtime/sendData/humbug.cpp +++ b/c_runtime/sendData/humbug.cpp @@ -113,7 +113,7 @@ void enableSendData(int enable) } //void initSendData(int variableCount, const char* variableNames); -void initSendData(int variableCount1, int variableCount2, char** statesNames, char** stateDerivativesNames, char** algebraicsNames) +void initSendData(int variableCount1, int variableCount2, const char** statesNames, const char** stateDerivativesNames, const char** algebraicsNames) { _errmesg(); return; diff --git a/c_runtime/sendData/humbug.h b/c_runtime/sendData/humbug.h index e8551ab1c99..191e78847d6 100644 --- a/c_runtime/sendData/humbug.h +++ b/c_runtime/sendData/humbug.h @@ -77,7 +77,7 @@ void _errmesg(); void setDataPort(int port); void enableSendData(int enable); //void initSendData(int variableCount, const char* variableNames); - void initSendData(int variableCount1, int variableCount2, char** statesNames, char** stateDerivativesNames, char** algebraicsNames); + void initSendData(int variableCount1, int variableCount2, const char** statesNames, const char** stateDerivativesNames, const char** algebraicsNames); void sendPacket(const char* data); void closeSendData(); diff --git a/c_runtime/sendData/sendData.cpp b/c_runtime/sendData/sendData.cpp index 4daf5082225..aae392a3615 100644 --- a/c_runtime/sendData/sendData.cpp +++ b/c_runtime/sendData/sendData.cpp @@ -687,7 +687,7 @@ void enableSendData(int enable) Static::enabled_ = enable; } -void initSendData(int variableCount1, int variableCount2, char** statesNames, char** stateDerivativesNames, char** algebraicsNames) +void initSendData(int variableCount1, int variableCount2, const char** statesNames, const char** stateDerivativesNames, const char** algebraicsNames) { char* port = getenv("sendDataPort"); if(port != NULL && strlen(port)) diff --git a/c_runtime/sendData/sendData.h b/c_runtime/sendData/sendData.h index 1ad69fb445c..944dbafc45d 100644 --- a/c_runtime/sendData/sendData.h +++ b/c_runtime/sendData/sendData.h @@ -92,7 +92,7 @@ extern "C" void setDataPort(int port); void enableSendData(int enable); //void initSendData(int variableCount, const char* variableNames); - void initSendData(int variableCount1, int variableCount2, char** statesNames, char** stateDerivativesNames, char** algebraicsNames); + void initSendData(int variableCount1, int variableCount2, const char** statesNames, const char** stateDerivativesNames, const char** algebraicsNames); void sendPacket(const char* data); void closeSendData(); diff --git a/c_runtime/simulation_events.cpp b/c_runtime/simulation_events.cpp index 34f161c4e09..338306fbd7e 100644 --- a/c_runtime/simulation_events.cpp +++ b/c_runtime/simulation_events.cpp @@ -31,6 +31,7 @@ #include "simulation_events.h" #include "simulation_runtime.h" #include "simulation_result.h" +#include "utility.h" #include #include // adrpo - 2006-12-05 -> for memset #include @@ -369,50 +370,93 @@ double sample(double start, double interval) { } } -void initSample(double start) { - if (sim_verbose) - printf("Calculating time of sample events is not performed yet\n"); +int compdbl(const void* a, const void* b) { + const double *v1 = (const double *) a; + const double *v2 = (const double *) b; + const double diff = *v1 - *v2; + const double epsilon = 0.00000000000001; + + if (diff < epsilon && diff > -epsilon) + return 0; + return (*v1 > *v2 ? 1 : -1); +} + +int unique(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) { + size_t nuniq = 0; + size_t i; + void *a, *b, *c; + a = base; + for (i=1; i 0) { + nuniq++; + } else { + c = ((char*)base)+(i-nuniq)*size; + memcpy(c, b, size); + } + } + return nmemb-nuniq; +} + +void initSample(double start) { + long measure_start_time = clock(); + + if (sim_verbose) printf("Notice: Calculated time of sample events is not yet used!\n"); + function_sampleInit(); /* This code will generate an array of time values when sample generates events. * The only problem is our backend does not generate this array. * Sample() and sample() also need to be changed, but this should be easy to fix. */ - /* int i; double stop = 1.0; double d; - double samples[][2] = { - {0.0,0.1}, - {0.3,0.3}, - {0.5,0.2}, - {0.0,0.15}, - }; double* events; - int num_samples = sizeof(samples)/(2*sizeof(double)); + int num_samples = globalData->nRawSamples; int max_events = 0; int ix = 0; int nuniq; for (i=0; i= samples[i][0]) - max_events += (stop - samples[i][0])/samples[i][1]+1; + if (stop >= globalData->rawSampleExps[i].start) + max_events += (stop - globalData->rawSampleExps[i].start)/globalData->rawSampleExps[i].interval+1; } - events = malloc(max_events * sizeof(double)); + events = (double*) malloc(max_events * sizeof(double) + 1); for (i=0; irawSampleExps[i].start,globalData->rawSampleExps[i].interval); + for (d=globalData->rawSampleExps[i].start; ixrawSampleExps[i].interval) { events[ix++] = d; } } - assert(ix == max_events); + // Sort, filter out values before start, filter out unique values + max_events = filter_all_lesser(events,&start,max_events,sizeof(double),compdbl); qsort(events,max_events,sizeof(double),compdbl); nuniq = unique(events,max_events,sizeof(double),compdbl); - printf("Sorted, unique events\n"); - for (i=0; isampleTimes = events; + globalData->curSampleTimeIx = 0; + globalData->nSampleTimes = nuniq; + } void saveall() { diff --git a/c_runtime/simulation_runtime.cpp b/c_runtime/simulation_runtime.cpp index 264ad9cc182..393524b172c 100644 --- a/c_runtime/simulation_runtime.cpp +++ b/c_runtime/simulation_runtime.cpp @@ -49,7 +49,7 @@ bool interactiveSimuation = false; //This variable signals if an simulation sess /* Global Data */ /***************/ -const string version = "20100427_V2"; +const string version = "20100513"; // Becomes non-zero when model terminates simulation. int modelTermination=0; @@ -88,7 +88,7 @@ int initRuntimeAndSimulation(int , char**); * \param step defines the step size between two consecutive result data. * \param stop defines the stop time of the simulation, should not be exceeded. */ -double newTime(double t, double step,double stop) +double newTime(double t, double step, double stop) { const double maxSolverStep=0.001; double newTime; @@ -111,7 +111,13 @@ double newTime(double t, double step,double stop) globalData->forceEmit = 1; } - // Do not exceed the stop time. + // Small gain taking hints from the scheduled sample events. Needs to be done better. + while (globalData->curSampleTimeIx < globalData->nSampleTimes && globalData->sampleTimes[globalData->curSampleTimeIx] < t) + globalData->curSampleTimeIx++; + if (globalData->curSampleTimeIx && globalData->curSampleTimeIx < globalData->nSampleTimes && newTime > globalData->sampleTimes[globalData->curSampleTimeIx]) { + newTime = globalData->sampleTimes[globalData->curSampleTimeIx++] + 1e-15; + } + // Do not exceed the stop time. if (newTime > stop) { newTime = stop; } diff --git a/c_runtime/simulation_runtime.h b/c_runtime/simulation_runtime.h index ff2f734b111..4ff00b2b901 100644 --- a/c_runtime/simulation_runtime.h +++ b/c_runtime/simulation_runtime.h @@ -100,6 +100,8 @@ typedef enum { INPUTCOMMENTS = 0x00200000, OUTPUTCOMMENTS = 0x00400000, + RAWSAMPLES = 0x00800000, + ALL = 0xFFFFFFFF } DATA_FLAGS; @@ -113,6 +115,11 @@ typedef struct sim_DATA_STRING { long nInputVars,nOutputVars; } DATA_STRING; +typedef struct sample_raw_time_st { + double start; + double interval; + int zc_index; +} sample_raw_time; typedef struct sim_DATA { /* this is the data structure for saving important data for this simulation. */ @@ -146,25 +153,33 @@ typedef struct sim_DATA { //extern char init_fixed[]; DATA_STRING stringVariables; - char* modelName; - char** statesNames; - char** stateDerivativesNames; - char** algebraicsNames; - char** parametersNames; - char** inputNames; - char** outputNames; - char** statesComments; - char** stateDerivativesComments; - char** algebraicsComments; - char** parametersComments; - char** inputComments; - char** outputComments; + const char* modelName; + const char** statesNames; + const char** stateDerivativesNames; + const char** algebraicsNames; + const char** parametersNames; + const char** inputNames; + const char** outputNames; + const char** statesComments; + const char** stateDerivativesComments; + const char** algebraicsComments; + const char** parametersComments; + const char** inputComments; + const char** outputComments; double timeValue; //the time for the simulation //used in some generated function // this is not changed by initializeDataStruc double lastEmittedTime; // The last time value that has been emitted. int forceEmit; // when != 0 force emit, set e.g. by newTime for equidistant output signal. + + // An array containing the initial data of samples used in the sim + sample_raw_time* rawSampleExps; + long nRawSamples; + // The queue of sample time events to be processed. + double* sampleTimes; // Warning: Not implemented yet! + long curSampleTimeIx; + long nSampleTimes; } DATA; /* Global data */ @@ -200,7 +215,7 @@ void deInitializeDataStruc(DATA* data, DATA_FLAGS flags); void setLocalData(DATA* data); // defined in model code. Used to get name of variable by investigating its pointer in the state or alg vectors. -char* getName(double* ptr); +const char* getName(double* ptr); void storeExtrapolationData(); @@ -249,6 +264,9 @@ int bound_parameters(); // and fixed start attibutes int initial_residual(); +// function for initializing time instants when sample() is activated +void function_sampleInit(); + bool isInteractiveSimulation(); int callSolver(int, char**, string, double, double, double, long, double); diff --git a/c_runtime/utility.c b/c_runtime/utility.c index 0722313fd98..8364a69b611 100644 --- a/c_runtime/utility.c +++ b/c_runtime/utility.c @@ -64,32 +64,3 @@ modelica_real rem(modelica_real x, modelica_real y) { return fmod(x, y); } - -int compdbl(const void* a, const void* b) { - const double *v1 = (const double *) a; - const double *v2 = (const double *) b; - const double diff = *v1 - *v2; - const double epsilon = 0.00000000000001; - - if (diff < epsilon && diff > -epsilon) - return 0; - return (*v1 > *v2) - (*v1 < *v2); -} - -int unique(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) { - size_t nuniq = 0; - size_t i,j; - void *a, *b, *c; - a = base; - for (i=1; i