void post_ev_alter_tree_structure(Model_t *m, ASTNode_t **node_p, ASTNode_t *parent, int child_order){ ASTNode_t *divide_node, *times_node; ASTNode_t *compartment_node; ASTNode_t *node, *next_node; unsigned int i; Species_t *sp; node = *node_p; for(i=0; i<ASTNode_getNumChildren(node); i++){ next_node = ASTNode_getChild(node, i); post_ev_alter_tree_structure(m, &next_node, *node_p, i); } if(ASTNode_getType(node) == AST_NAME){ for(i=0; i<Model_getNumSpecies(m); i++){ sp = (Species_t*)ListOf_get(Model_getListOfSpecies(m), i); if(strcmp(Species_getId(sp), ASTNode_getName(node)) == 0){ if(!Species_getHasOnlySubstanceUnits(sp) && Compartment_getSpatialDimensions(Model_getCompartmentById(m, Species_getCompartment(sp))) != 0){/* use val/comp in calculation */ divide_node = ASTNode_createWithType(AST_DIVIDE); compartment_node = ASTNode_createWithType(AST_NAME); ASTNode_setName(compartment_node, Compartment_getId(Model_getCompartmentById(m, Species_getCompartment(sp)))); ASTNode_addChild(divide_node, node); ASTNode_addChild(divide_node, compartment_node); if(parent != NULL){ ASTNode_replaceChild(parent, child_order, divide_node); }else{ *node_p = divide_node; } node = *node_p; break; }else if(Species_getHasOnlySubstanceUnits(sp) && Species_isSetInitialConcentration(sp) && Compartment_getSpatialDimensions(Model_getCompartmentById(m, Species_getCompartment(sp))) != 0){/* use val*comp in calculation */ times_node = ASTNode_createWithType(AST_TIMES); compartment_node = ASTNode_createWithType(AST_NAME); ASTNode_setName(compartment_node, Compartment_getId(Model_getCompartmentById(m, Species_getCompartment(sp)))); ASTNode_addChild(times_node, node); ASTNode_addChild(times_node, compartment_node); if(parent != NULL){ ASTNode_replaceChild(parent, child_order, times_node); }else{ *node_p = times_node; } node = *node_p; break; } } } } return; }
SBML_ODESOLVER_API void CvodeData_initializeValues(cvodeData_t *data) { int i; Parameter_t *p; Species_t *s; Compartment_t *c; odeModel_t *om = data->model; Model_t *ode = om->simple; /* First, fill cvodeData_t structure with data from the derived SBML model */ for ( i=0; i<data->nvalues; i++ ) { if ( (s = Model_getSpeciesById(ode, om->names[i])) ) data->value[i] = Species_getInitialConcentration(s); else if ( (c = Model_getCompartmentById(ode, om->names[i])) ) data->value[i] = Compartment_getSize(c); else if ((p = Model_getParameterById(ode, om->names[i])) ) data->value[i] = Parameter_getValue(p); } /* initialize assigned parameters */ for ( i=0; i<om->nass; i++ ) data->value[om->neq+i] = evaluateAST(om->assignment[i],data); /* set current time to 0 */ data->currenttime = 0.0; }
SBML_ODESOLVER_API int IntegratorInstance_updateModel(integratorInstance_t *engine) { int i; Species_t *s; Compartment_t *c; Parameter_t *p; odeModel_t *om = engine->om; cvodeData_t *data = engine->data; cvodeResults_t *results = engine->results; int nout = results->nout; int nvalues = data->nvalues; Model_t *m = om->m; for ( i=0; i<nvalues; i++ ) { if ( (s = Model_getSpeciesById(m, om->names[i])) != NULL ) { Species_setInitialConcentration(s, results->value[i][nout]); } else if ( (c = Model_getCompartmentById(m, om->names[i])) != NULL ) { Compartment_setSize(c, results->value[i][nout]); } else if ( (p = Model_getParameterById(m, om->names[i])) != NULL ) { Parameter_setValue(p, results->value[i][nout]); } else return 0; } return 1; }
static int printXMGLegend(cvodeData_t *data, int nvalues) { int i, found; odeModel_t *om = data->model; Model_t *m = om->simple; Species_t *s; Parameter_t *p; Compartment_t *c; for ( i=0; i<nvalues; i++ ) { found = 0; if ( (s = Model_getSpeciesById(m, om->names[i])) != NULL ) { if ( Species_isSetName(s) ) { GracePrintf("g0.s%d legend \"%s: %s\"\n", i+1, om->names[i], Species_getName(s)); found++; } } else if ( (c = Model_getCompartmentById(m, om->names[i])) ) { if ( Compartment_isSetName(c) ) { GracePrintf("g0.s%d legend \"%s: %s\"\n", i+1, om->names[i], Compartment_getName(c)); found++; } } else if ( (p = Model_getParameterById(m, om->names[i])) ) { if ( Parameter_isSetName(p) ) { GracePrintf("g0.s%d legend \"%s: %s\"\n", i+1, om->names[i], Parameter_getName(p)); found++; } } if ( found == 0 ) GracePrintf("g0.s%d legend \"%s\"\n", i+1, om->names[i]); } GracePrintf("legend 1.155, 0.85"); GracePrintf("legend font 8"); GracePrintf("legend char size 0.6"); return 0; }
END_TEST START_TEST (test_SBMLConvert_convertToL1_Species_Concentration) { SBMLDocument_t *d = SBMLDocument_createWithLevelAndVersion(2, 1); Model_t *m = SBMLDocument_createModel(d); const char *sid = "C"; Compartment_t *c = Compartment_create(2, 1); Species_t *s = Species_create(2, 1); Compartment_setId ( c, sid ); Compartment_setSize ( c, 1.2 ); Model_addCompartment( m, c ); Species_setId ( s, "s" ); Species_setCompartment ( s, sid ); Species_setInitialConcentration( s, 2.34 ); Model_addSpecies ( m, s ); fail_unless( SBMLDocument_setLevelAndVersion(d, 1, 2) == 1, NULL); /** * These tests will fail under Cygwin because of a minimal * setlocale() implementation (see setlocale manpage). */ #ifndef CYGWIN fail_unless( Species_getInitialAmount(Model_getSpecies(m, 0)) == 2.808, NULL ); #endif Species_t * s1 = Model_getSpecies(m, 0); fail_unless (s1 != NULL); fail_unless (!strcmp(Species_getCompartment(s1), "C")); fail_unless(Compartment_getSize(Model_getCompartmentById(m, "C")) == 1.2); fail_unless(Species_getInitialConcentration(s1) == 2.34); fail_unless(Species_isSetInitialConcentration(s1) == 1); SBMLDocument_free(d); }