131 |
|
|
132 |
/* definitions of lsode supported children of atoms, etc */ |
/* definitions of lsode supported children of atoms, etc */ |
133 |
/********************************************************************/ |
/********************************************************************/ |
|
/* default input tolerances for lsode */ |
|
|
#define RTOLDEF 1e-6 |
|
|
#define ATOLDEF 1e-6 |
|
134 |
/* solver_var children expected for state variables */ |
/* solver_var children expected for state variables */ |
135 |
static symchar *g_symbols[2]; |
static symchar *g_symbols[2]; |
136 |
#define STATERTOL g_symbols[0] |
#define STATERTOL g_symbols[0] |
234 |
d->rlist=NULL; |
d->rlist=NULL; |
235 |
d->dydx_dx=NULL; |
d->dydx_dx=NULL; |
236 |
blsys->enginedata=(void*)d; |
blsys->enginedata=(void*)d; |
237 |
|
integrator_lsode_params_default(blsys); |
238 |
|
|
239 |
} |
} |
240 |
|
|
241 |
/** |
/** |
272 |
|
|
273 |
enum ida_parameters{ |
enum ida_parameters{ |
274 |
LSODE_PARAM_TIMING |
LSODE_PARAM_TIMING |
275 |
|
,LSODE_PARAM_RTOLDEF |
276 |
|
,LSODE_PARAM_ATOLDEF |
277 |
,LSODE_PARAMS_SIZE |
,LSODE_PARAMS_SIZE |
278 |
}; |
}; |
279 |
|
|
286 |
int integrator_lsode_params_default(IntegratorSystem *blsys){ |
int integrator_lsode_params_default(IntegratorSystem *blsys){ |
287 |
|
|
288 |
asc_assert(blsys!=NULL); |
asc_assert(blsys!=NULL); |
289 |
asc_assert(blsys->engine==INTEG_IDA); |
asc_assert(blsys->engine==INTEG_LSODE); |
290 |
slv_parameters_t *p; |
slv_parameters_t *p; |
291 |
p = &(blsys->params); |
p = &(blsys->params); |
292 |
|
|
311 |
}, TRUE} |
}, TRUE} |
312 |
); |
); |
313 |
|
|
314 |
|
slv_param_real(p,LSODE_PARAM_ATOLDEF |
315 |
|
,(SlvParameterInitReal){{"atoldef" |
316 |
|
,"Scalar absolute error tolerance",1 |
317 |
|
,"Default value of the scalar absolute error tolerance (for cases" |
318 |
|
" where not specified in oda_atol var property. See 'lsode.f' for" |
319 |
|
" details" |
320 |
|
}, 1e-6, DBL_MIN, DBL_MAX } |
321 |
|
); |
322 |
|
|
323 |
|
slv_param_real(p,LSODE_PARAM_RTOLDEF |
324 |
|
,(SlvParameterInitReal){{"rtoldef" |
325 |
|
,"Scalar relative error tolerance",1 |
326 |
|
,"Default value of the scalar relative error tolerance (for cases" |
327 |
|
" where not specified in oda_rtol var property. See 'lsode.f' for" |
328 |
|
" details" |
329 |
|
}, 1e-6, DBL_MIN, DBL_MAX } |
330 |
|
); |
331 |
|
|
332 |
asc_assert(p->num_parms == LSODE_PARAMS_SIZE); |
asc_assert(p->num_parms == LSODE_PARAMS_SIZE); |
333 |
|
|
334 |
CONSOLE_DEBUG("Created %d params", p->num_parms); |
CONSOLE_DEBUG("Created %d params", p->num_parms); |
443 |
for (i=0; i<len; i++) { |
for (i=0; i<len; i++) { |
444 |
tol = ChildByChar(var_instance(blsys->y[i]),STATEATOL); |
tol = ChildByChar(var_instance(blsys->y[i]),STATEATOL); |
445 |
if (tol == NULL || !AtomAssigned(tol) ) { |
if (tol == NULL || !AtomAssigned(tol) ) { |
446 |
atoli[i] = ATOLDEF; |
atoli[i] = SLV_PARAM_REAL(&(blsys->params),LSODE_PARAM_ATOLDEF); |
447 |
ERROR_REPORTER_HERE(ASC_PROG_WARNING,"Assuming atol = %3g" |
ERROR_REPORTER_HERE(ASC_PROG_WARNING,"Assuming atol = %3g" |
448 |
"for ode_atol child undefined for state variable %ld." |
"for ode_atol child undefined for state variable %ld." |
449 |
,ATOLDEF, blsys->y_id[i] |
,atoli[i], blsys->y_id[i] |
450 |
); |
); |
451 |
} else { |
} else { |
452 |
atoli[i] = RealAtomValue(tol); |
atoli[i] = RealAtomValue(tol); |
453 |
CONSOLE_DEBUG("Using tolerance %3g for state variable %ld.",atoli[i], blsys->y_id[i]); |
CONSOLE_DEBUG("Using tolerance %3g for state variable %ld.",atoli[i], blsys->y_id[i]); |
454 |
} |
} |
455 |
} |
} |
456 |
atoli[len] = ATOLDEF; |
atoli[len] = SLV_PARAM_REAL(&(blsys->params),LSODE_PARAM_ATOLDEF); /* not sure why this one...? */ |
457 |
return atoli; |
return atoli; |
458 |
} |
} |
459 |
|
|
478 |
for (i=0; i<len; i++) { |
for (i=0; i<len; i++) { |
479 |
tol = ChildByChar(var_instance(blsys->y[i]),STATERTOL); |
tol = ChildByChar(var_instance(blsys->y[i]),STATERTOL); |
480 |
if (tol == NULL || !AtomAssigned(tol) ) { |
if (tol == NULL || !AtomAssigned(tol) ) { |
481 |
rtoli[i] = RTOLDEF; |
rtoli[i] = SLV_PARAM_REAL(&(blsys->params),LSODE_PARAM_RTOLDEF); |
482 |
|
|
483 |
ERROR_REPORTER_HERE(ASC_PROG_WARNING,"Assuming rtol = %3g" |
ERROR_REPORTER_HERE(ASC_PROG_WARNING,"Assuming rtol = %3g" |
484 |
"for ode_rtol child undefined for state variable %ld." |
"for ode_rtol child undefined for state variable %ld." |
485 |
,ATOLDEF, blsys->y_id[i] |
,rtoli[i], blsys->y_id[i] |
486 |
); |
); |
487 |
|
|
488 |
} else { |
} else { |
489 |
rtoli[i] = RealAtomValue(tol); |
rtoli[i] = RealAtomValue(tol); |
490 |
} |
} |
491 |
} |
} |
492 |
rtoli[len] = RTOLDEF; |
rtoli[len] = SLV_PARAM_REAL(&(blsys->params),LSODE_PARAM_RTOLDEF); |
493 |
return rtoli; |
return rtoli; |
494 |
} |
} |
495 |
|
|