void TerminationCriterionTest::test_gradient_common( bool absolute, bool L2 ) { MsqPrintError err(std::cout); PatchData pd; create_twelve_hex_patch( pd, err ); ASSERT_NO_ERROR(err); const double LIMIT = 1e-4; TerminationCriterion tc; if (absolute) { if (L2) tc.add_absolute_gradient_L2_norm( LIMIT ); else tc.add_absolute_gradient_inf_norm( LIMIT ); } else { if (L2) tc.add_relative_gradient_L2_norm( LIMIT ); else tc.add_relative_gradient_inf_norm( LIMIT ); } double (*func_ptr)(const Vector3D*, int) = L2 ? &lenfunc : &maxfunc; double junk, value = 1; objFunc.mGrad = Vector3D(value,value,value); tc.reset_inner( pd, ofEval, err ); ASSERT_NO_ERROR(err); tc.reset_patch( pd, err ); ASSERT_NO_ERROR(err); std::vector<Vector3D> grad; ofEval.evaluate( pd, junk, grad, err ); ASSERT_NO_ERROR(err); double limit = LIMIT; if (!absolute) limit *= func_ptr(arrptr(grad),pd.num_free_vertices()); while (func_ptr(arrptr(grad),pd.num_free_vertices()) > limit) { CPPUNIT_ASSERT(!tc.terminate()); value *= 0.1; objFunc.mGrad = Vector3D(value,value,value); ofEval.evaluate( pd, junk, grad, err ); ASSERT_NO_ERROR(err); tc.accumulate_inner( pd, 0.0, arrptr(grad), err ); ASSERT_NO_ERROR(err); tc.accumulate_patch( pd, err ); ASSERT_NO_ERROR(err); } CPPUNIT_ASSERT(tc.terminate()); }