extern int BackendDAEEXT_setAssignment(int lenass1, int lenass2, modelica_metatype ass1, modelica_metatype ass2) { int nelts=0; int i=0; nelts = MMC_HDRSLOTS(MMC_GETHDR(ass1)); if (nelts > 0) { n = lenass1; if(match) { free(match); } match = (int*) malloc(n * sizeof(int)); for(i=0; i<n; ++i) { match[i] = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(ass1)[i])-1; if (match[i]<0) match[i] = -1; } } nelts = MMC_HDRSLOTS(MMC_GETHDR(ass2)); if (nelts > 0) { m = lenass2; if(row_match) { free(row_match); } row_match = (int*) malloc(m * sizeof(int)); for(i=0; i<m; ++i) { row_match[i] = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(ass2)[i])-1; if (row_match[i]<0) row_match[i] = -1; } } return 1; }
extern void BackendDAEEXT_setIncidenceMatrix(modelica_integer nvars, modelica_integer neqns, modelica_integer nz, modelica_metatype incidencematrix) { int i=0; long int i1; int j=0; modelica_integer nelts = MMC_HDRSLOTS(MMC_GETHDR(incidencematrix)); if (col_ptrs) free(col_ptrs); col_ptrs = (int*) malloc((neqns+1) * sizeof(int)); col_ptrs[neqns]=nz; if (col_ids) free(col_ids); col_ids = (int*) malloc(nz * sizeof(int)); for(i=0; i<neqns; ++i) { modelica_metatype ie = MMC_STRUCTDATA(incidencematrix)[i]; col_ptrs[i] = j; while(MMC_GETHDR(ie) == MMC_CONSHDR) { i1 = MMC_UNTAGFIXNUM(MMC_CAR(ie)); if (i1>0) { col_ids[j++] = i1-1; } ie = MMC_CDR(ie); } } }
extern void BackendDAEEXT_getAssignment(modelica_metatype ass1, modelica_metatype ass2) { int i=0; long len1 = MMC_HDRSLOTS(MMC_GETHDR(ass1)); long len2 = MMC_HDRSLOTS(MMC_GETHDR(ass2)); if (n > len1 || m > len2) { char nstr[64],mstr[64],len1str[64],len2str[64]; const char *tokens[4] = {len2str,mstr,len1str,nstr}; snprintf(nstr,64,"%ld", (long) n); snprintf(mstr,64,"%ld", (long) m); snprintf(len1str,64,"%ld", (long) len1); snprintf(len2str,64,"%ld", (long) len2); c_add_message(NULL,-1,ErrorType_symbolic,ErrorLevel_internal,"BackendDAEEXT.getAssignment failed because n=%s>arrayLength(ass1)=%s or m=%s>arrayLength(ass2)=%s",tokens,4); MMC_THROW(); } if (match != NULL) { for(i=0; i<n; ++i) { if (match[i] >= 0) MMC_STRUCTDATA(ass1)[i] = mmc_mk_icon(match[i]+1); else MMC_STRUCTDATA(ass1)[i] = mmc_mk_icon(-1); } } if (row_match != NULL) { for(i=0; i<m; ++i) { if (row_match[i] >= 0) MMC_STRUCTDATA(ass2)[i] = mmc_mk_icon(row_match[i]+1); else MMC_STRUCTDATA(ass2)[i] = mmc_mk_icon(-1); } } }
const char* UnitParserExt_unit2str(void *nums, void *denoms, void *tpnoms, void *tpdenoms, void *tpstrs) { long int i1,i2; string tpParam; Unit unit; unit.unitVec.clear(); unit.typeParamVec.clear(); /* Add baseunits*/ while(MMC_GETHDR(nums) == MMC_CONSHDR) { i1 = MMC_UNTAGFIXNUM(MMC_CAR(nums)); i2 = MMC_UNTAGFIXNUM(MMC_CAR(denoms)); unit.unitVec.push_back(Rational(i1,i2)); nums = MMC_CDR(nums); denoms = MMC_CDR(denoms); } /* Add type parameters*/ while(MMC_GETHDR(tpnoms) == MMC_CONSHDR) { i1 = MMC_UNTAGFIXNUM(MMC_CAR(tpnoms)); i2 = MMC_UNTAGFIXNUM(MMC_CAR(tpdenoms)); tpParam = string(MMC_STRINGDATA(MMC_CAR(tpstrs))); unit.typeParamVec.insert(std::pair<string,Rational>(tpParam,Rational(i1,i2))); tpnoms = MMC_CDR(tpnoms); tpdenoms = MMC_CDR(tpdenoms); } //string res = unitParser->unit2str(unit); string res = unitParser->prettyPrintUnit2str(unit); return strcpy(ModelicaAllocateString(res.size()), res.c_str()); }
extern void Error_addSourceMessage(threadData_t *threadData,int _id, void *msg_type, void *severity, int _sline, int _scol, int _eline, int _ecol, int _read_only, const char* _filename, const char* _msg, void* tokenlst) { ErrorMessage::TokenList tokens; while(MMC_GETHDR(tokenlst) != MMC_NILHDR) { tokens.push_back(string(MMC_STRINGDATA(MMC_CAR(tokenlst)))); tokenlst=MMC_CDR(tokenlst); } add_source_message(threadData,_id, (ErrorType) (MMC_HDRCTOR(MMC_GETHDR(msg_type))-Error__SYNTAX_3dBOX0), (ErrorLevel) (MMC_HDRCTOR(MMC_GETHDR(severity))-Error__INTERNAL_3dBOX0), _msg,tokens,_sline,_scol,_eline,_ecol,_read_only,_filename); }
extern void Error_addMessage(threadData_t *threadData,int errorID, void *msg_type, void *severity, const char* message, modelica_metatype tokenlst) { ErrorMessage::TokenList tokens; while (MMC_GETHDR(tokenlst) != MMC_NILHDR) { const char* token = MMC_STRINGDATA(MMC_CAR(tokenlst)); tokens.push_back(string(token)); tokenlst=MMC_CDR(tokenlst); } add_source_message(threadData,errorID, (ErrorType) (MMC_HDRCTOR(MMC_GETHDR(msg_type))-Error__SYNTAX_3dBOX0), (ErrorLevel) (MMC_HDRCTOR(MMC_GETHDR(severity))-Error__INTERNAL_3dBOX0), message,tokens,0,0,0,0,0,""); }
void Error_addMessage(int errorID, void *msg_type, void *severity, const char* message, modelica_metatype tokenlst) { ErrorMessage::TokenList tokens; if (error_on) { while(MMC_GETHDR(tokenlst) != MMC_NILHDR) { const char* token = MMC_STRINGDATA(MMC_CAR(tokenlst)); tokens.push_back(string(token)); tokenlst=MMC_CDR(tokenlst); } add_message(errorID, (ErrorType) (MMC_HDRCTOR(MMC_GETHDR(msg_type))-Error__SYNTAX_3dBOX0), (ErrorLevel) (MMC_HDRCTOR(MMC_GETHDR(severity))-Error__ERROR_3dBOX0), message,tokens); } }
modelica_metatype boxptr_stringUpdateStringChar(threadData_t *threadData,metamodelica_string str, metamodelica_string c, modelica_metatype iix) { int ix = MMC_UNTAGFIXNUM(iix); int length = 0; unsigned header = MMC_GETHDR(str); unsigned nwords = MMC_HDRSLOTS(header) + 1; struct mmc_string *p = NULL; void *res = NULL; MMC_CHECK_STRING(str); MMC_CHECK_STRING(c); /* fprintf(stderr, "stringUpdateStringChar(%s,%s,%ld)\n", MMC_STRINGDATA(str),MMC_STRINGDATA(c),ix); */ if (ix < 1 || MMC_STRLEN(c) != 1) MMC_THROW_INTERNAL(); length = MMC_STRLEN(str); if (ix > length) MMC_THROW_INTERNAL(); p = (struct mmc_string *) mmc_alloc_words_atomic(nwords); p->header = header; memcpy(p->data, MMC_STRINGDATA(str), length+1 /* include NULL */); p->data[ix-1] = MMC_STRINGDATA(c)[0]; res = MMC_TAGPTR(p); MMC_CHECK_STRING(res); return res; }
modelica_metatype arrayAppend(modelica_metatype arr1, modelica_metatype arr2) { int nelts1 = MMC_HDRSLOTS(MMC_GETHDR(arr1)); int nelts2 = MMC_HDRSLOTS(MMC_GETHDR(arr2)); void* res = (struct mmc_struct*)mmc_mk_box_no_assign(nelts1 + nelts2, MMC_ARRAY_TAG); void **arr1p = MMC_STRUCTDATA(arr1); void **arr2p = MMC_STRUCTDATA(arr2); void **resp = MMC_STRUCTDATA(res); int i; for (i=0; i<nelts1; ++i) { resp[i] = arr1p[i]; } for (i=0; i<nelts2; ++i) { resp[i+nelts1] = arr2p[i]; } return res; }
modelica_metatype arrayCopy(modelica_metatype arr) { int nelts = MMC_HDRSLOTS(MMC_GETHDR(arr)); void* res = (struct mmc_struct*)mmc_mk_box_no_assign(nelts, MMC_ARRAY_TAG); void **arrp = MMC_STRUCTDATA(arr); void **resp = MMC_STRUCTDATA(res); memcpy(resp, arrp, sizeof(modelica_metatype)*nelts); return res; }
extern void* HpcOmSchedulerExt_scheduleMetis(modelica_metatype xadjIn, modelica_metatype adjncyIn, modelica_metatype vwgtIn, modelica_metatype adjwgtIn, int npartsIn) { #if defined(_MSC_VER) HPC_OM_VS(); #else int xadjNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(xadjIn)); //number of elements in xadj-array int adjncyNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjncyIn)); //number of elements in adjncy-array int vwgtNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(vwgtIn)); //number of elements in vwgt-array int adjwgtNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjwgtIn)); //number of elements in adjwgt-array int nparts = npartsIn; int* xadj = (int *) malloc(xadjNelts*sizeof(int)); int* adjncy = (int *) malloc(adjncyNelts*sizeof(int)); int* vwgt = (int *) malloc(vwgtNelts*sizeof(int)); int* adjwgt = (int *) malloc(adjwgtNelts*sizeof(int)); //setup xadj for(int i=0; i<xadjNelts; i++) { int xadjElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(xadjIn)[i]); //std::cerr << "xadjElem: " << xadjElem << std::endl; xadj[i] = xadjElem; } //setup adjncy for(int i=0; i<adjncyNelts; i++) { int adjncyElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjncyIn)[i]); //std::cerr << "adjncyElem: " << adjncyElem << std::endl; adjncy[i] = adjncyElem; } //setup vwgt for(int i=0; i<vwgtNelts; i++) { int vwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(vwgtIn)[i]); //std::cerr << "vwgtElem: " << vwgtElem << std::endl; vwgt[i] = vwgtElem; } //setup adjwgt for(int i=0; i<adjwgtNelts; i++) { int adjwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjwgtIn)[i]); //std::cerr << "adjwgtElem: " << adjwgtElem << std::endl; adjwgt[i] = adjwgtElem; } return HpcOmSchedulerExtImpl__scheduleMetis(xadj, adjncy, vwgt, adjwgt, xadjNelts, adjncyNelts, nparts); }
modelica_metatype arrayList(modelica_metatype arr) { modelica_metatype result; int nelts = MMC_HDRSLOTS(MMC_GETHDR(arr))-1; void **vecp = MMC_STRUCTDATA(arr); void *res = mmc_mk_nil(); for(; nelts >= 0; --nelts) { res = mmc_mk_cons(vecp[nelts],res); } return res; }
extern void* HpcOmSchedulerExt_schedulehMetis(modelica_metatype xadjIn, modelica_metatype adjncyIn, modelica_metatype vwgtIn, modelica_metatype adjwgtIn, int npartsIn) { int vwgtsNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(xadjIn)); //number of elements in xadj-array int eptrNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjncyIn)); //number of elements in adjncy-array int eintNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(vwgtIn)); //number of elements in vwgt-array int hewgtsNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjwgtIn)); //number of elements in adjwgt-array int nparts = npartsIn; int* vwgts = (int *) malloc(vwgtsNelts*sizeof(int)); int* eptr = (int *) malloc(eptrNelts*sizeof(int)); int* eint = (int *) malloc(eintNelts*sizeof(int)); int* hewgts = (int *) malloc(hewgtsNelts*sizeof(int)); //setup xadj for(int i=0; i<vwgtsNelts; i++) { int xadjElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(xadjIn)[i]); std::cerr << "vwgtsElem: " << xadjElem << std::endl; vwgts[i] = xadjElem; } //setup adjncy for(int i=0; i<eptrNelts; i++) { int adjncyElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjncyIn)[i]); std::cerr << "eptrElem: " << adjncyElem << std::endl; eptr[i] = adjncyElem; } //setup vwgt for(int i=0; i<eintNelts; i++) { int vwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(vwgtIn)[i]); std::cerr << "eintElem: " << vwgtElem << std::endl; eint[i] = vwgtElem; } //setup adjwgt for(int i=0; i<hewgtsNelts; i++) { int adjwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjwgtIn)[i]); std::cerr << "adjwgtElem: " << adjwgtElem << std::endl; hewgts[i] = adjwgtElem; } return HpcOmSchedulerExtImpl__scheduleMetis(vwgts, eptr, eint, hewgts, vwgtsNelts, eptrNelts, nparts); #endif }
modelica_metatype arrayCopy(modelica_metatype arr) { int nelts = MMC_HDRSLOTS(MMC_GETHDR(arr)); void* res = (struct mmc_struct*)mmc_mk_box_no_assign(nelts, MMC_ARRAY_TAG); void **arrp = MMC_STRUCTDATA(arr); void **resp = MMC_STRUCTDATA(res); int i = 0; for(i=0; i<nelts; i++) { resp[i] = arrp[i]; } return res; }
static void* SimulationResultsImpl__readDataset(const char *filename, void *vars, int dimsize, int suggestReadAllVars, SimulationResult_Globals* simresglob, int runningTestsuite) { const char *msg[2] = {"",""}; void *res,*col; char *var; double *vals; int i; if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,simresglob)) { return NULL; } res = mmc_mk_nil(); switch (simresglob->curFormat) { case MATLAB4: { ModelicaMatVariable_t *mat_var; if (dimsize == 0) { dimsize = simresglob->matReader.nrows; } else if (simresglob->matReader.nrows != dimsize) { fprintf(stderr, "dimsize: %d, rows %d\n", dimsize, simresglob->matReader.nrows); c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("readDataset(...): Expected and actual dimension sizes do not match."), NULL, 0); return NULL; } if (suggestReadAllVars) { omc_matlab4_read_all_vals(&simresglob->matReader); } while (MMC_NILHDR != MMC_GETHDR(vars)) { var = MMC_STRINGDATA(MMC_CAR(vars)); vars = MMC_CDR(vars); mat_var = omc_matlab4_find_var(&simresglob->matReader,var); if (mat_var == NULL) { msg[0] = runningTestsuite ? SystemImpl__basename(filename) : filename; msg[1] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not read variable %s in file %s."), msg, 2); return NULL; } else if (mat_var->isParam) { col=mmc_mk_nil(); for (i=0;i<dimsize;i++) col=mmc_mk_cons(mmc_mk_rcon((mat_var->index<0)?-simresglob->matReader.params[abs(mat_var->index)-1]:simresglob->matReader.params[abs(mat_var->index)-1]),col); res = mmc_mk_cons(col,res); } else { vals = omc_matlab4_read_vals(&simresglob->matReader,mat_var->index); col=mmc_mk_nil(); for (i=0;i<dimsize;i++) col=mmc_mk_cons(mmc_mk_rcon(vals[i]),col); res = mmc_mk_cons(col,res); } } return res; } case PLT: { return read_ptolemy_dataset(filename,vars,dimsize); } case CSV: { while (MMC_NILHDR != MMC_GETHDR(vars)) { var = MMC_STRINGDATA(MMC_CAR(vars)); vars = MMC_CDR(vars); vals = simresglob->csvReader ? read_csv_dataset(simresglob->csvReader,var) : NULL; if (vals == NULL) { msg[0] = runningTestsuite ? SystemImpl__basename(filename) : filename; msg[1] = var; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not read variable %s in file %s."), msg, 2); return NULL; } else { col=mmc_mk_nil(); for (i=0;i<dimsize;i++) { col=mmc_mk_cons(mmc_mk_rcon(vals[i]),col); } res = mmc_mk_cons(col,res); } } return res; } default: msg[0] = PlotFormatStr[simresglob->curFormat]; c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("readDataSet() not implemented for plot format: %s\n"), msg, 1); return NULL; } }