diff --git a/harmonicmaps-eoc.cc b/harmonicmaps-eoc.cc index e1c629f5f491e30eb0b0f5f2fb5ed8ee1a845c12..4e9305b437854624dcc04bcf145a1652a2d069c7 100644 --- a/harmonicmaps-eoc.cc +++ b/harmonicmaps-eoc.cc @@ -33,6 +33,7 @@ const int order = 3; #include <dune/gfe/geodesicfeassembler.hh> #include <dune/gfe/riemanniantrsolver.hh> #include <dune/gfe/geodesicfefunctionadaptor.hh> +#include <dune/gfe/gfedifferencenormsquared.hh> // grid dimension const int dim = 2; @@ -270,12 +271,23 @@ int main (int argc, char *argv[]) try for (int j=0; j<solution.size(); j++) xEmbedded[j] = solution[j].globalCoordinates(); -#if ! defined THIRD_ORDER && ! defined SECOND_ORDER LeafAmiraMeshWriter<GridType> amiramesh; amiramesh.addGrid(grid->leafView()); +#if ! defined THIRD_ORDER && ! defined SECOND_ORDER amiramesh.addVertexData(xEmbedded, grid->leafView()); - amiramesh.write("harmonic_result_" + numberAsAscii.str() + ".am"); #endif + amiramesh.write("harmonic_result_" + numberAsAscii.str() + ".am"); + + double newL2 = GFEDifferenceNormSquared<FEBasis,TargetSpace>::compute(*referenceGrid, referenceSolution, + *grid, solution, + &massMatrixLocalAssembler); + newL2 = std::sqrt(newL2); + + double newH1 = GFEDifferenceNormSquared<FEBasis,TargetSpace>::compute(*referenceGrid, referenceSolution, + *grid, solution, + &laplaceLocalAssembler); + newH1 = std::sqrt(newH1); + // Prolong solution to the very finest grid for (int j=i; j<numLevels; j++) { @@ -283,7 +295,7 @@ int main (int argc, char *argv[]) try #if defined THIRD_ORDER || defined SECOND_ORDER GeodesicFEFunctionAdaptor<FEBasis,TargetSpace>::higherOrderGFEFunctionAdaptor<order>(basis, *grid, solution); #else - geodesicFEFunctionAdaptor(*grid, solution); + GeodesicFEFunctionAdaptor<FEBasis,TargetSpace>::geodesicFEFunctionAdaptor(*grid, solution); #endif } @@ -299,17 +311,18 @@ int main (int argc, char *argv[]) try H1SemiNorm< BlockVector<TargetSpace::CoordinateType> > l2Norm(massMatrix); // Compute max-norm difference + std::cout << "Level: " << i-1 << " vertices: " << xEmbedded.size() << std::endl; std::cout << "h: " << std::pow(0.5, i-1) << std::endl; std::cout << "Level: " << i-1 << ", max-norm error: " << difference.infinity_norm() << std::endl; std::cout << "Level: " << i-1 - << ", L2 error: " << l2Norm(difference) + << ", L2 error: " << l2Norm(difference) << ", new: " << newL2 << std::endl; std::cout << "Level: " << i-1 - << ", H1 error: " << h1Norm(difference) + << ", H1 error: " << h1Norm(difference) << ", new: " << newH1 << std::endl; logFile << std::pow(0.5, i-1) << " " << difference.infinity_norm()