void FCV_GETESTLOCALERR(realtype *ele, int *ier) { /* Attach user data to vector */ realtype *f2c_data = N_VGetArrayPointer(F2C_CVODE_vec); N_VSetArrayPointer(ele, F2C_CVODE_vec); *ier = 0; *ier = CVodeGetEstLocalErrors(CV_cvodemem, F2C_CVODE_vec); /* Reset data pointers */ N_VSetArrayPointer(f2c_data, F2C_CVODE_vec); return; }
string CVodesIntegrator::getErrorInfo(int N) { N_Vector errs = N_VNew_Serial(static_cast<sd_size_t>(m_neq)); N_Vector errw = N_VNew_Serial(static_cast<sd_size_t>(m_neq)); CVodeGetErrWeights(m_cvode_mem, errw); CVodeGetEstLocalErrors(m_cvode_mem, errs); vector<tuple<double, double, size_t> > weightedErrors; for (size_t i=0; i<m_neq; i++) { double err = NV_Ith_S(errs, i) * NV_Ith_S(errw, i); weightedErrors.emplace_back(-abs(err), err, i); } N_VDestroy(errs); N_VDestroy(errw); N = std::min(N, static_cast<int>(m_neq)); sort(weightedErrors.begin(), weightedErrors.end()); stringstream s; for (int i=0; i<N; i++) { s << get<2>(weightedErrors[i]) << ": " << get<1>(weightedErrors[i]) << endl; } return s.str(); }