177 {
178 LOG_UNIT_TEST;
179
180
181
182 FunctionParserAD R;
183 std::string func = "x*a";
184 R.SetADFlags(FunctionParserAD::ADCacheDerivatives, true);
185
186
187 R.Parse(func, "x,a");
188
189
190 R.AddVariable("y");
191 R.RegisterDerivative("a", "x", "a");
192
193
194 double p[3];
195 double & x = p[0];
196 double & a = p[1];
197 double & y = p[2];
198
199 FunctionParserAD dR(R);
200 CPPUNIT_ASSERT_EQUAL (dR.AutoDiff("x"), -1);
201 dR.Optimize();
202
203
204 FunctionParserAD d2R(dR);
205 CPPUNIT_ASSERT_EQUAL (d2R.AutoDiff("x"), -1);
206 d2R.Optimize();
207
208
209
210 for (x = -1.0; x < 1.0; x+=0.3726)
211 for (a = -1.0; a < 1.0; a+=0.2642)
212 for (y = -1.0; y < 1.0; y+=0.3156)
213 {
214 LIBMESH_ASSERT_FP_EQUAL(x*a, R.Eval(p), 1.e-12);
215 LIBMESH_ASSERT_FP_EQUAL(a+x*a, dR.Eval(p), 1.e-12);
216 LIBMESH_ASSERT_FP_EQUAL(2*a+x*a, d2R.Eval(p), 1.e-12);
217 }
218 }