46template <
typename ScalarT>
47ScalarT
func(
const ScalarT&
a,
const ScalarT& b,
const ScalarT&
c) {
48 ScalarT r =
c*std::log(b+1.)/std::sin(
a);
54 double& drda,
double& drdb,
55 double& d2rda2,
double& d2rdb2,
double& d2rdadb)
57 drda = -(
c*std::log(b+1.)/std::pow(std::sin(
a),2.))*std::cos(
a);
58 drdb =
c / ((b+1.)*std::sin(
a));
59 d2rda2 =
c*std::log(b+1.)/std::sin(
a) + 2.*(
c*std::log(b+1.)/std::pow(std::sin(
a),3.))*std::pow(std::cos(
a),2.);
60 d2rdb2 = -
c / (std::pow(b+1.,2.)*std::sin(
a));
61 d2rdadb = -
c / ((b+1.)*std::pow(std::sin(
a),2.))*std::cos(
a);
66template <
typename ScalarT>
68 ScalarT& r, ScalarT& drda, ScalarT& drdb) {
90template <
typename ScalarT>
92 const ScalarT& v_a,
const ScalarT& v_b,
93 ScalarT& r, ScalarT& drda, ScalarT& drdb,
94 ScalarT& z_a, ScalarT& z_b) {
101 FadType a_fad(1,
a); a_fad.fastAccessDx(0) = v_a;
102 FadType b_fad(1, b); b_fad.fastAccessDx(0) = v_b;
105 FadType r_fad, drda_fad, drdb_fad;
109 drda = drda_fad.val();
110 drdb = drdb_fad.val();
111 z_a = drda_fad.dx(0);
112 z_b = drdb_fad.dx(0);
117 double pi = std::atan(1.0)*4.0;
129 double r_ad, drda_ad, drdb_ad, z_a_ad, z_b_ad;
136 double drda, drdb, d2rda2, d2rdb2, d2rdadb;
138 double z_a = d2rda2*v_a + d2rdadb*v_b;
139 double z_b = d2rdadb*v_a + d2rdb2*v_b;
144 std::cout.setf(std::ios::scientific);
145 std::cout.precision(
p);
146 std::cout <<
" r = " << std::setw(w) << r <<
" (original) == "
147 << std::setw(w) << r_ad <<
" (AD) Error = " << std::setw(w)
148 << r - r_ad << std::endl
149 <<
"dr/da = " << std::setw(w) << drda <<
" (analytic) == "
150 << std::setw(w) << drda_ad <<
" (AD) Error = " << std::setw(w)
151 << drda - drda_ad << std::endl
152 <<
"dr/db = " << std::setw(w) << drdb <<
" (analytic) == "
153 << std::setw(w) << drdb_ad <<
" (AD) Error = " << std::setw(w)
154 << drdb - drdb_ad << std::endl
155 <<
"z_a = " << std::setw(w) << z_a <<
" (analytic) == "
156 << std::setw(w) << z_a_ad <<
" (AD) Error = " << std::setw(w)
157 << z_a - z_a_ad << std::endl
158 <<
"z_b = " << std::setw(w) << z_b <<
" (analytic) == "
159 << std::setw(w) << z_b_ad <<
" (AD) Error = " << std::setw(w)
160 << z_b - z_b_ad << std::endl;
162 double tol = 1.0e-14;
163 if (std::fabs(r - r_ad) <
tol &&
164 std::fabs(drda - drda_ad) <
tol &&
165 std::fabs(drdb - drdb_ad) <
tol &&
166 std::fabs(z_a - z_a_ad) <
tol &&
167 std::fabs(z_b - z_b_ad) <
tol) {
168 std::cout <<
"\nExample passed!" << std::endl;
172 std::cout <<
"\nSomething is wrong, example failed!" << std::endl;
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
Sacado::Fad::DFad< double > FadType
ScalarT func(const ScalarT &a, const ScalarT &b, const ScalarT &c)
void func_and_deriv2(const ScalarT &a, const ScalarT &b, const ScalarT &c, const ScalarT &v_a, const ScalarT &v_b, ScalarT &r, ScalarT &drda, ScalarT &drdb, ScalarT &z_a, ScalarT &z_b)
void func_and_deriv(const ScalarT &a, const ScalarT &b, const ScalarT &c, ScalarT &r, ScalarT &drda, ScalarT &drdb)
void analytic_deriv(double a, double b, double c, double &drda, double &drdb, double &d2rda2, double &d2rdb2, double &d2rdadb)