pair<double, double> WGS84Coordinate::project(double lat, double lon) const { pair<double, double> result; if (abs(lat) < 1e-10 ) { result.first = lon; result.second = -m_ml0; } else { double ms; if (abs(sin(lat)) > 1e-10) { ms = msfn(sin(lat), cos(lat), SQUARED_ECCENTRICITY) / sin(lat); } else { ms = 0.0; } result.first = ms * sin(lon *= sin(lat)); result.second = (mlfn(lat) - m_ml0) + ms * (1.0 - cos(lon)); } return result; }
TEST(MiniTensor_ROL, Paraboloid) { bool const print_output = ::testing::GTEST_FLAG(print_time); // outputs nothing Teuchos::oblackholestream bhs; std::ostream & os = (print_output == true) ? std::cout : bhs; constexpr Intrepid2::Index DIM{2}; using MSFN = Intrepid2::Paraboloid<Real, DIM>; Intrepid2::Vector<Real, DIM> min(0.0, 0.0); MSFN msfn(0.0, 0.0); ROL::MiniTensor_Objective<MSFN, Real, DIM> obj(msfn); // Set parameters. Teuchos::ParameterList params; params.sublist("Step").sublist("Line Search").sublist("Descent Method") .set("Type", "Newton-Krylov"); params.sublist("Status Test").set("Gradient Tolerance", 10.e-12); params.sublist("Status Test").set("Step Tolerance", 1.0e-14); params.sublist("Status Test").set("Iteration Limit", 128); // Define algorithm. ROL::Algorithm<Real> algo("Line Search", params); // Set Initial Guess Intrepid2::Vector<Real, DIM> xval(Intrepid2::RANDOM); ROL::MiniTensorVector<Real, DIM> x(xval); // Run Algorithm algo.run(x, obj, true, os); Intrepid2::Vector<Real, DIM> const sol = ROL::MTfromROL<Real, DIM>(x); os << "Solution : " << sol << '\n'; Real const epsilon{Intrepid2::machine_epsilon<Real>()}; Real const error = Intrepid2::norm(sol - min); ASSERT_LE(error, epsilon); }