lines 6-91 of file: speed/fadbad/ode.cpp {xrst_begin fadbad_ode.cpp} Fadbad Speed: Ode ################# Specifications ************** See :ref:`link_ode-name` . Implementation ************** {xrst_spell_off} {xrst_code cpp} */ // suppress conversion warnings before other includes # include // # include # include # include # include # include # include // list of possible options # include extern std::map global_option; namespace fadbad { // define fabs for use by ode_evaluate fadbad::F fabs(const fadbad::F& x) { return std::max(-x, x); } } bool link_ode( size_t size , size_t repeat , CppAD::vector &x , CppAD::vector &jacobian ) { // speed test global option values if( global_option["atomic"] ) return false; if( global_option["memory"] || global_option["onetape"] || global_option["optimize"] ) return false; // ------------------------------------------------------------- // setup assert( x.size() == size ); assert( jacobian.size() == size * size ); typedef fadbad::F ADScalar; typedef CppAD::vector ADVector; size_t i, j; size_t p = 0; // use ode to calculate function values size_t n = size; // number of independent variables size_t m = n; // number of dependent variables ADVector X(n), Y(m); // independent and dependent variables // ------------------------------------------------------------- while(repeat--) { // choose next x value CppAD::uniform_01(n, x); for(j = 0; j < n; j++) { // set value of x[j] X[j] = x[j]; // set up for X as the independent variable vector X[j].diff((unsigned int) j, (unsigned int) n); } // evaluate function CppAD::ode_evaluate(X, p, Y); // return values with Y as the dependent variable vector for(i = 0; i < m; i++) { for(j = 0; j < n; j++) jacobian[ i * n + j ] = Y[i].d((unsigned int) j); } } return true; } /* {xrst_code} {xrst_spell_on} {xrst_end fadbad_ode.cpp}