// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- // vi: set et ts=4 sw=2 sts=2: #include #include #include #include #include #include #include #include "Tests.hpp" using namespace AMDiS; using ElliptParam = YaspGridBasis<2, 2>; using ElliptProblem = ProblemStat; template bool comp(DOFVector const& U, DOFVector const& V) { if (U.size() != V.size()) return false; using Int = typename DOFVector::size_type; for (Int i = 0; i < U.size(); ++i) { if (U[i] != V[i]) return false; } return true; } int main(int argc, char** argv) { Environment env(argc, argv); using namespace Dune::Indices; ElliptProblem prob("ellipt"); prob.initialize(INIT_ALL); // create 3 copies of the solution vector auto U0 = *prob.solutionVector(); auto U1 = *prob.solutionVector(); auto U2 = *prob.solutionVector(); auto u0 = makeDOFVectorView(U0); auto u1 = makeDOFVectorView(U1); auto u2 = makeDOFVectorView(U2); auto expr = [](auto const& x) { return 1 + x[0] + x[1]; }; u0.interpolate_noalias(expr); u1.interpolate(expr); u2 << expr; AMDIS_TEST( comp(U0, U1) ); AMDIS_TEST( comp(U0, U2) ); auto expr2 = [](auto const& x) { return 1 + 2*x[0] - 3*x[1]; }; u0.interpolate_noalias(u2 + expr2); u1.interpolate(u1 + expr2); u2 += expr2; AMDIS_TEST( comp(U0, U1) ); AMDIS_TEST( comp(U0, U2) ); auto expr3 = [](auto const& x) { return 1 - 0.5*x[0] - 2*x[1]; }; u0.interpolate_noalias(u2 - expr3); u1.interpolate(u1 - expr3); u2 -= expr3; AMDIS_TEST( comp(U0, U1) ); AMDIS_TEST( comp(U0, U2) ); auto du0 = derivative(u0); auto localFct = localFunction(u0); auto dlocalFct = derivative(localFct); for (auto const& e : elements(prob.gridView())) { localFct.bind(e); auto geo = e.geometry(); auto local = referenceElement(geo).position(0,0); auto y0 = localFct(local); auto y1 = u0(geo.global(local)); AMDIS_TEST(std::abs(y0 - y1) < 1.e-10); localFct.unbind(); dlocalFct.bind(e); auto g0 = dlocalFct(local); auto g1 = du0(geo.global(local)); AMDIS_TEST(two_norm(g0 - g1) < 1.e-10); dlocalFct.unbind(); } auto V0 = makeDOFVector(*prob.globalBasis()); auto v0 = makeDOFVectorView(V0); v0 << expr; // test makeDiscreteFunction int preTP1 = 0; std::integral_constant preTP2; auto tp = treepath(preTP1); auto W0 = *prob.solutionVector(); auto W1 = *prob.solutionVector(); auto W2 = *prob.solutionVector(); auto w0 = makeDiscreteFunction(W0, preTP1); auto w1 = makeDiscreteFunction(W1, preTP2); auto w2 = makeDiscreteFunction(W2, tp); // test makeDOFVectorView with (pre)treepath argument auto W3 = *prob.solutionVector(); auto W4 = *prob.solutionVector(); auto W5 = *prob.solutionVector(); auto w3 = makeDOFVectorView(W3, preTP1); auto w4 = makeDOFVectorView(W4, preTP2); auto w5 = makeDOFVectorView(W5, tp); auto w6 = prob.solution(tp); auto& W6 = *prob.solutionVector(); w3 << expr; w4 << expr; w5 << expr; w6 << expr; AMDIS_TEST( comp(W3, W4) ); AMDIS_TEST( comp(W3, W5) ); AMDIS_TEST( comp(W3, W6) ); return 0; }