diff --git a/src/compute-disc-error.cc b/src/compute-disc-error.cc index f08b7cb97ac6e785f07beaf981fa3db6bbc3d2e7..47b9ab09505fd219fbda0ba0ca08212343d62b84 100644 --- a/src/compute-disc-error.cc +++ b/src/compute-disc-error.cc @@ -51,10 +51,9 @@ void measureEOC(const GridView gridView, typedef Dune::Functions::PQkNodalBasis<GridView, order> FEBasis; FEBasis feBasis(gridView); - FEBasis referenceFEBasis(referenceGridView); ////////////////////////////////////////////////////////////////////////////////// - // Read the data whose error is to be measured, and the reference data + // Read the data whose error is to be measured ////////////////////////////////////////////////////////////////////////////////// // Input data @@ -71,26 +70,15 @@ void measureEOC(const GridView gridView, for (size_t i=0; i<x.size(); i++) x[i] = TargetSpace(embeddedX[i]); - // Reference configuration - EmbeddedVectorType embeddedReferenceX(referenceFEBasis.size()); - inFile.open(parameterSet.get<std::string>("referenceData"), std::ios_base::binary); - if (not inFile) - DUNE_THROW(IOError, "File " << parameterSet.get<std::string>("referenceData") << " could not be opened."); - GenericVector::readBinary(inFile, embeddedReferenceX); - - SolutionType referenceX(embeddedReferenceX.size()); - for (size_t i=0; i<referenceX.size(); i++) - referenceX[i] = TargetSpace(embeddedReferenceX[i]); - - //CosseratVTKWriter<typename GridView::Grid>::template write<FEBasis>(feBasis,x, "cosserat_infile_" + std::to_string(gridView.grid().maxLevel()+1)); - - ///////////////////////////////////////////////////////////////// // Measure the discretization error ///////////////////////////////////////////////////////////////// -#if 0 + if (parameterSet.get<std::string>("discretizationErrorMode")=="analytical") { + using FufemFEBasis = DuneFunctionsBasis<FEBasis>; + FufemFEBasis fufemFEBasis(feBasis); + // Read reference solution and its derivative into a PythonFunction typedef VirtualDifferentiableFunction<FieldVector<double, dim>, TargetSpace::CoordinateType> FBase; @@ -98,33 +86,44 @@ void measureEOC(const GridView gridView, auto referenceSolution = module.get("fdf").toC<std::shared_ptr<FBase>>(); // The numerical solution, as a grid function - GFE::EmbeddedGlobalGFEFunction<FufemFEBasis, TargetSpace> numericalSolution(feBasis, x); + GFE::EmbeddedGlobalGFEFunction<FufemFEBasis, TargetSpace> numericalSolution(fufemFEBasis, x); // QuadratureRule for the integral of the L^2 error QuadratureRuleKey quadKey(dim,6); // Compute the embedded L^2 error - double l2Error = DiscretizationError<GridType::LeafGridView>::computeL2Error(&numericalSolution, - referenceSolution.get(), - quadKey); + double l2Error = DiscretizationError<GridView>::computeL2Error(&numericalSolution, + referenceSolution.get(), + quadKey); // Compute the embedded H^1 error - double h1Error = DiscretizationError<GridType::LeafGridView>::computeH1HalfNormDifferenceSquared(grid->leafGridView(), - &numericalSolution, - referenceSolution.get(), - quadKey); + double h1Error = DiscretizationError<GridView>::computeH1HalfNormDifferenceSquared(gridView, + &numericalSolution, + referenceSolution.get(), + quadKey); - std::cout << "elements: " << grid->leafGridView().size(0) + std::cout << "elements: " << gridView.size(0) << " " << "L^2 error: " << l2Error << " "; std::cout << "H^1 error: " << std::sqrt(l2Error*l2Error + h1Error) << std::endl; } -#endif if (parameterSet.get<std::string>("discretizationErrorMode")=="discrete") { - std::cout << "FOO" << std::endl; + FEBasis referenceFEBasis(referenceGridView); + + // Reference configuration + EmbeddedVectorType embeddedReferenceX(referenceFEBasis.size()); + inFile.open(parameterSet.get<std::string>("referenceData"), std::ios_base::binary); + if (not inFile) + DUNE_THROW(IOError, "File " << parameterSet.get<std::string>("referenceData") << " could not be opened."); + GenericVector::readBinary(inFile, embeddedReferenceX); + + SolutionType referenceX(embeddedReferenceX.size()); + for (size_t i=0; i<referenceX.size(); i++) + referenceX[i] = TargetSpace(embeddedReferenceX[i]); + using FufemFEBasis = DuneFunctionsBasis<FEBasis>; FufemFEBasis fufemReferenceFEBasis(referenceFEBasis); FufemFEBasis fufemFEBasis(feBasis);