/* Fortran interface to C "set" routines having integer arguments; see farkode.h for further details */ void FARK_SETIIN(char key_name[], long int *ival, int *ier) { if (!strncmp(key_name, "ORDER", 5)) *ier = ARKodeSetOrder(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "DENSE_ORDER", 11)) *ier = ARKodeSetDenseOrder(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "LINEAR", 6)) *ier = ARKodeSetLinear(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "NONLINEAR", 9)) *ier = ARKodeSetNonlinear(ARK_arkodemem); else if (!strncmp(key_name, "FIXEDPOINT", 10)) *ier = ARKodeSetFixedPoint(ARK_arkodemem, (long int) *ival); else if (!strncmp(key_name, "NEWTON", 6)) *ier = ARKodeSetNewton(ARK_arkodemem); else if (!strncmp(key_name, "EXPLICIT", 8)) *ier = ARKodeSetExplicit(ARK_arkodemem); else if (!strncmp(key_name, "IMPLICIT", 8)) *ier = ARKodeSetImplicit(ARK_arkodemem); else if (!strncmp(key_name, "IMEX", 4)) *ier = ARKodeSetImEx(ARK_arkodemem); else if (!strncmp(key_name, "IRK_TABLE_NUM", 13)) *ier = ARKodeSetIRKTableNum(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "ERK_TABLE_NUM", 13)) *ier = ARKodeSetERKTableNum(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "ARK_TABLE_NUM", 13)) *ier = ARKodeSetARKTableNum(ARK_arkodemem, (int) ival[0], (int) ival[1]); else if (!strncmp(key_name, "MAX_NSTEPS", 10)) *ier = ARKodeSetMaxNumSteps(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "HNIL_WARNS", 10)) *ier = ARKodeSetMaxHnilWarns(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "PREDICT_METHOD", 14)) *ier = ARKodeSetPredictorMethod(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "MAX_ERRFAIL", 11)) *ier = ARKodeSetMaxErrTestFails(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "MAX_CONVFAIL", 12)) *ier = ARKodeSetMaxConvFails(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "MAX_NITERS", 10)) *ier = ARKodeSetMaxNonlinIters(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "ADAPT_SMALL_NEF", 15)) *ier = ARKodeSetSmallNumEFails(ARK_arkodemem, (int) *ival); else if (!strncmp(key_name, "LSETUP_MSBP", 11)) *ier = ARKodeSetMaxStepsBetweenLSet(ARK_arkodemem, (int) *ival); else { *ier = -99; printf("FARKSETIIN: Unrecognized key.\n\n"); } 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"; } }