/* Fortran interface to C "set" routines having real arguments; see farkode.h for further details */ void FARK_SETRIN(char key_name[], realtype *rval, int *ier) { if (!strncmp(key_name, "INIT_STEP", 9)) *ier = ARKodeSetInitStep(ARK_arkodemem, *rval); else if (!strncmp(key_name, "MAX_STEP", 8)) *ier = ARKodeSetMaxStep(ARK_arkodemem, *rval); else if (!strncmp(key_name, "MIN_STEP", 8)) *ier = ARKodeSetMinStep(ARK_arkodemem, *rval); else if (!strncmp(key_name, "STOP_TIME", 9)) *ier = ARKodeSetStopTime(ARK_arkodemem, *rval); else if (!strncmp(key_name, "NLCONV_COEF", 11)) *ier = ARKodeSetNonlinConvCoef(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_CFL", 9)) *ier = ARKodeSetCFLFraction(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_SAFETY", 12)) *ier = ARKodeSetSafetyFactor(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_BIAS", 10)) *ier = ARKodeSetErrorBias(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_GROWTH", 12)) *ier = ARKodeSetMaxGrowth(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_BOUNDS", 12)) *ier = ARKodeSetFixedStepBounds(ARK_arkodemem, rval[0], rval[1]); else if (!strncmp(key_name, "ADAPT_ETAMX1", 12)) *ier = ARKodeSetMaxFirstGrowth(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_ETAMXF", 12)) *ier = ARKodeSetMaxEFailGrowth(ARK_arkodemem, *rval); else if (!strncmp(key_name, "ADAPT_ETACF", 11)) *ier = ARKodeSetMaxCFailGrowth(ARK_arkodemem, *rval); else if (!strncmp(key_name, "NONLIN_CRDOWN", 11)) *ier = ARKodeSetNonlinCRDown(ARK_arkodemem, *rval); else if (!strncmp(key_name, "NONLIN_RDIV", 9)) *ier = ARKodeSetNonlinRDiv(ARK_arkodemem, *rval); else if (!strncmp(key_name, "LSETUP_DGMAX", 12)) *ier = ARKodeSetDeltaGammaMax(ARK_arkodemem, *rval); else if (!strncmp(key_name, "FIXED_STEP", 10)) *ier = ARKodeSetFixedStep(ARK_arkodemem, *rval); else { *ier = -99; printf("FARKSETRIN: Unrecognized key: %s\n\n",key_name); } return; }
void Arkode::initialize() { _properties = dynamic_cast<ISystemProperties*>(_system); _continuous_system = dynamic_cast<IContinuous*>(_system); _event_system = dynamic_cast<IEvent*>(_system); _mixed_system = dynamic_cast<IMixedSystem*>(_system); _time_system = dynamic_cast<ITime*>(_system); IGlobalSettings* global_settings = dynamic_cast<ISolverSettings*>(_arkodesettings)->getGlobalSettings(); // Kennzeichnung, dass initialize()() (vor der Integration) aufgerufen wurde _idid = 5000; _tLastEvent = 0.0; _event_n = 0; SolverDefaultImplementation::initialize(); _dimSys = _continuous_system->getDimContinuousStates(); _dimZeroFunc = _event_system->getDimZeroFunc(); if (_dimSys == 0) _dimSys = 1; // introduce dummy state if (_dimSys <= 0) { _idid = -1; throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); } else { // Allocate state vectors, stages and temporary arrays if (_z) delete[] _z; if (_zInit) delete[] _zInit; if (_zWrite) delete[] _zWrite; if (_zeroSign) delete[] _zeroSign; if (_absTol) delete[] _absTol; if(_delta) delete [] _delta; if(_deltaInv) delete [] _deltaInv; if(_ysave) delete [] _ysave; _z = new double[_dimSys]; _zInit = new double[_dimSys]; _zWrite = new double[_dimSys]; _zeroSign = new int[_dimZeroFunc]; _absTol = new double[_dimSys]; _delta =new double[_dimSys]; _deltaInv =new double[_dimSys]; _ysave =new double[_dimSys]; memset(_z, 0, _dimSys * sizeof(double)); memset(_zInit, 0, _dimSys * sizeof(double)); memset(_ysave, 0, _dimSys * sizeof(double)); // Counter initialisieren _outStps = 0; if (_arkodesettings->getDenseOutput()) { // Ausgabeschrittweite _hOut = global_settings->gethOutput(); } // Allocate memory for the solver //arkodeCreate _arkodeMem = ARKodeCreate(); /* if (check_flag((void*) _cvodeMem, "CVodeCreate", 0)) { _idid = -5; throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); } */ // // Make Cvode ready for integration // // Set initial values for CVODE _continuous_system->evaluateAll(IContinuous::CONTINUOUS); _continuous_system->getContinuousStates(_zInit); memcpy(_z, _zInit, _dimSys * sizeof(double)); // Get nominal values _absTol[0] = 1.0; // in case of dummy state _continuous_system->getNominalStates(_absTol); for (int i = 0; i < _dimSys; i++) _absTol[i] *= dynamic_cast<ISolverSettings*>(_arkodesettings)->getATol(); _ARK_y0 = N_VMake_Serial(_dimSys, _zInit); _ARK_y = N_VMake_Serial(_dimSys, _z); _ARK_yWrite = N_VMake_Serial(_dimSys, _zWrite); _ARK_absTol = N_VMake_Serial(_dimSys, _absTol); /* if (check_flag((void*) _CV_y0, "N_VMake_Serial", 0)) { _idid = -5; throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); } */ // Initialize Cvode (Initial values are required) _idid = ARKodeInit(_arkodeMem, NULL, ARK_fCallback, _tCurrent, _ARK_y0); if (_idid < 0) { _idid = -5; throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); } // Set Tolerances _idid = ARKodeSVtolerances(_arkodeMem, dynamic_cast<ISolverSettings*>(_arkodesettings)->getRTol(), _ARK_absTol); // RTOL and ATOL if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVode::initialize()"); // Set the pointer to user-defined data _idid = ARKodeSetUserData(_arkodeMem, _data); if (_idid < 0) throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); _idid = ARKodeSetInitStep(_arkodeMem, 1e-6); // INITIAL STEPSIZE if (_idid < 0) throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); _idid = ARKodeSetMaxConvFails(_arkodeMem, 100); // Maximale Fehler im Konvergenztest if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVoder::initialize()"); _idid = ARKodeSetMinStep(_arkodeMem, dynamic_cast<ISolverSettings*>(_arkodesettings)->getLowerLimit()); // MINIMUM STEPSIZE if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVode::initialize()"); _idid = ARKodeSetMaxStep(_arkodeMem, global_settings->getEndTime() / 10.0); // MAXIMUM STEPSIZE if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVode::initialize()"); _idid = ARKodeSetMaxNonlinIters(_arkodeMem, 5); // Max number of iterations if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVode::initialize()"); _idid = ARKodeSetMaxErrTestFails(_arkodeMem, 100); if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVode::initialize()"); _idid = ARKodeSetMaxNumSteps(_arkodeMem, 1000); // Max Number of steps if (_idid < 0) throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); // Initialize linear solver /* #ifdef USE_SUNDIALS_LAPACK _idid = CVLapackDense(_cvodeMem, _dimSys); #else */ _idid = ARKDense(_arkodeMem, _dimSys); /* #endif */ if (_idid < 0) throw ModelicaSimulationError(SOLVER,"Cvode::initialize()"); // Use own jacobian matrix // Check if Colored Jacobians are worth to use if (_idid < 0) throw ModelicaSimulationError(SOLVER,"ARKode::initialize()"); if (_dimZeroFunc) { _idid = ARKodeRootInit(_arkodeMem, _dimZeroFunc, &ARK_ZerofCallback); memset(_zeroSign, 0, _dimZeroFunc * sizeof(int)); _idid = ARKodeSetRootDirection(_arkodeMem, _zeroSign); if (_idid < 0) throw ModelicaSimulationError(SOLVER,"CVode::initialize()"); memset(_zeroSign, -1, _dimZeroFunc * sizeof(int)); memset(_zeroVal, -1, _dimZeroFunc * sizeof(int)); } _arkode_initialized = true; // // CVODE is ready for integration // // BOOST_LOG_SEV(cvode_lg::get(), cvode_info) << "CVode initialized"; } }
/// Set the maximum time step of the Runge-Kutta method. void SetMaxStep(double dt_max) { flag = ARKodeSetMaxStep(sundials_mem, dt_max); }