void Ida::writeSimulationInfo() { long int nst, nfe, nsetups, nni, ncfn, netf; long int nfQe, netfQ; long int nfSe, nfeS, nsetupsS, nniS, ncfnS, netfS; long int nfQSe, netfQS; int qlast, qcur; realtype h0u, hlast, hcur, tcur; int flag; flag = IDAGetIntegratorStats(_idaMem, &nst, &nfe, &nsetups, &netf, &qlast, &qcur, &h0u, &hlast, &hcur, &tcur); flag = IDAGetNonlinSolvStats(_idaMem, &nni, &ncfn); LOGGER_WRITE("Cvode: number steps = " + to_string(nst), LC_SOLV, LL_INFO); LOGGER_WRITE("Cvode: function evaluations 'f' = " + to_string(nfe), LC_SOLV, LL_INFO); LOGGER_WRITE("Cvode: error test failures 'netf' = " + to_string(netfS), LC_SOLV, LL_INFO); LOGGER_WRITE("Cvode: linear solver setups 'nsetups' = " + to_string(nsetups), LC_SOLV, LL_INFO); LOGGER_WRITE("Cvode: nonlinear iterations 'nni' = " + to_string(nni), LC_SOLV, LL_INFO); LOGGER_WRITE("Cvode: convergence failures 'ncfn' = " + to_string(ncfn), LC_SOLV, LL_INFO); }
void FIDA_SOLVE(realtype *tout, realtype *tret, realtype *yret, realtype *ypret, int *itask, int *ier) { int klast, kcur; *ier = 0; /* Attach user data to vectors */ N_VSetArrayPointer(yret, F2C_IDA_vec); N_VSetArrayPointer(ypret, F2C_IDA_ypvec); *ier = IDASolve(IDA_idamem, *tout, tret, F2C_IDA_vec, F2C_IDA_ypvec, *itask); /* Reset data pointers */ N_VSetArrayPointer(NULL, F2C_IDA_vec); N_VSetArrayPointer(NULL, F2C_IDA_ypvec); /* Set optional outputs */ IDAGetWorkSpace(IDA_idamem, &IDA_iout[0], /* LENRW */ &IDA_iout[1]); /* LENIW */ IDAGetIntegratorStats(IDA_idamem, &IDA_iout[2], /* NST */ &IDA_iout[3], /* NRE */ &IDA_iout[7], /* NSETUPS */ &IDA_iout[4], /* NETF */ &klast, /* KLAST */ &kcur, /* KCUR */ &IDA_rout[0], /* HINUSED */ &IDA_rout[1], /* HLAST */ &IDA_rout[2], /* HCUR */ &IDA_rout[3]); /* TCUR */ IDA_iout[8] = (long int) klast; IDA_iout[9] = (long int) kcur; IDAGetNonlinSolvStats(IDA_idamem, &IDA_iout[6], /* NNI */ &IDA_iout[5]); /* NCFN */ IDAGetNumBacktrackOps(IDA_idamem, &IDA_iout[10]); /* NBCKTRK */ IDAGetTolScaleFactor(IDA_idamem, &IDA_rout[4]); /* TOLSFAC */ /* Root finding is on */ if (IDA_nrtfn != 0) IDAGetNumGEvals(IDA_idamem, &IDA_iout[11]); /* NGE */ switch(IDA_ls) { case IDA_LS_DENSE: case IDA_LS_BAND: case IDA_LS_LAPACKDENSE: case IDA_LS_LAPACKBAND: IDADlsGetWorkSpace(IDA_idamem, &IDA_iout[12], &IDA_iout[13]); /* LENRWLS, LENIWLS */ IDADlsGetLastFlag(IDA_idamem, &IDA_iout[14]); /* LSTF */ IDADlsGetNumResEvals(IDA_idamem, &IDA_iout[15]); /* NRE */ IDADlsGetNumJacEvals(IDA_idamem, &IDA_iout[16]); /* NJE */ break; case IDA_LS_KLU: case IDA_LS_SUPERLUMT: IDASlsGetLastFlag(IDA_idamem, &IDA_iout[14]); /* LSTF */ IDASlsGetNumJacEvals(IDA_idamem, &IDA_iout[16]); /* NJE */ break; case IDA_LS_SPGMR: case IDA_LS_SPBCG: case IDA_LS_SPTFQMR: IDASpilsGetWorkSpace(IDA_idamem, &IDA_iout[12], &IDA_iout[13]); /* LENRWLS, LENIWLS */ IDASpilsGetLastFlag(IDA_idamem, &IDA_iout[14]); /* LSTF */ IDASpilsGetNumResEvals(IDA_idamem, &IDA_iout[15]); /* NRE */ IDASpilsGetNumJtimesEvals(IDA_idamem, &IDA_iout[16]); /* NJE */ IDASpilsGetNumPrecEvals(IDA_idamem, &IDA_iout[17]); /* NPE */ IDASpilsGetNumPrecSolves(IDA_idamem, &IDA_iout[18]); /* NPS */ IDASpilsGetNumLinIters(IDA_idamem, &IDA_iout[19]); /* NLI */ IDASpilsGetNumConvFails(IDA_idamem, &IDA_iout[20]); /* NCFL */ break; } return; }
void Ida::solve(const SOLVERCALL action) { bool writeEventOutput = (_settings->getGlobalSettings()->getOutputPointType() == OPT_ALL); bool writeOutput = !(_settings->getGlobalSettings()->getOutputPointType() == OPT_NONE); #ifdef RUNTIME_PROFILING MEASURETIME_REGION_DEFINE(idaSolveFunctionHandler, "solve"); if(MeasureTime::getInstance() != NULL) { MEASURETIME_START(solveFunctionStartValues, idaSolveFunctionHandler, "solve"); } #endif if (_idasettings && _system) { // Solver und System für Integration vorbereiten if ((action & RECORDCALL) && (action & FIRST_CALL)) { #ifdef RUNTIME_PROFILING MEASURETIME_REGION_DEFINE(idaInitializeHandler, "IDAInitialize"); if(MeasureTime::getInstance() != NULL) { MEASURETIME_START(measuredFunctionStartValues, idaInitializeHandler, "IDAInitialize"); } #endif initialize(); #ifdef RUNTIME_PROFILING if(MeasureTime::getInstance() != NULL) { MEASURETIME_END(measuredFunctionStartValues, measuredFunctionEndValues, (*measureTimeFunctionsArray)[4], idaInitializeHandler); } #endif if (writeOutput) writeToFile(0, _tCurrent, _h); _tLastWrite = 0; return; } if ((action & RECORDCALL) && !(action & FIRST_CALL)) { writeToFile(_accStps, _tCurrent, _h); return; } // Nach einem TimeEvent wird der neue Zustand recorded if (action & RECALL) { _firstStep = true; if (writeEventOutput) writeToFile(0, _tCurrent, _h); if (writeOutput) writeIDAOutput(_tCurrent, _h, _locStps); _continuous_system->getContinuousStates(_y); } // Solver soll fortfahren _solverStatus = ISolver::CONTINUE; while ((_solverStatus & ISolver::CONTINUE) && !_interrupt ) { // Zuvor wurde initialize aufgerufen und hat funktioniert => RESET IDID if (_idid == 5000) _idid = 0; // Solveraufruf if (_idid == 0) { // Zähler zurücksetzen _accStps = 0; _locStps = 0; // Solverstart IDACore(); } // Integration war nicht erfolgreich und wurde auch nicht vom User unterbrochen if (_idid != 0 && _idid != 1) { _solverStatus = ISolver::SOLVERERROR; //throw std::invalid_argument(_idid,_tCurrent,"IDA::solve()"); throw std::invalid_argument("IDA::solve()"); } // Abbruchkriterium (erreichen der Endzeit) else if ((_tEnd - _tCurrent) <= dynamic_cast<ISolverSettings*>(_idasettings)->getEndTimeTol()) _solverStatus = DONE; } _firstCall = false; } else { throw std::invalid_argument("IDA::solve()"); } #ifdef RUNTIME_PROFILING if(MeasureTime::getInstance() != NULL) { MEASURETIME_END(solveFunctionStartValues, solveFunctionEndValues, (*measureTimeFunctionsArray)[1], idaSolveFunctionHandler); long int nst, nfe, nsetups, netf, nni, ncfn; int qlast, qcur; realtype h0u, hlast, hcur, tcur; int flag; flag = IDAGetIntegratorStats(_idaMem, &nst, &nfe, &nsetups, &netf, &qlast, &qcur, &h0u, &hlast, &hcur, &tcur); flag = IDAGetNonlinSolvStats(_idaMem, &nni, &ncfn); MeasureTimeValuesSolver solverVals = MeasureTimeValuesSolver(nfe, netf); (*measureTimeFunctionsArray)[6]->_sumMeasuredValues->_numCalcs += nst; (*measureTimeFunctionsArray)[6]->_sumMeasuredValues->add(&solverVals); } #endif }