#ifndef TESTMULTILEVELMONTECARLO_HPP #define TESTMULTILEVELMONTECARLO_HPP #include "MultilevelEstimator.hpp" #include "TestMonteCarlo.hpp" class TestMultilevelMonteCarlo : public TestWithParam { protected: double epsilon = 0.003; Levels levels{3, 4, 5}; Samples samples{12, 6, 3}; MeshesCreator meshesCreator; PDESolverCreator pdeSolverCreator; EstimatorMap estMapSeriell; EstimatorMap estMapParallel; std::unique_ptr mlmcSeriell; std::unique_ptr mlmcParallel; double MeanTolerance() { return mlmcSeriell->TotalError(); } double SVarTolerance() { return mlmcSeriell->TotalError(); } TestMultilevelMonteCarlo() : meshesCreator(MeshesCreator(). WithDistribute("RCB"). WithoutOverlap()), pdeSolverCreator(PDESolverCreator(). WithProblem(GetParam().problemName). WithQuantity(GetParam().quantity). WithModel(GetParam().model)), mlmcSeriell(EstimatorCreator("MultilevelMonteCarlo"). WithPDESolverCreator(pdeSolverCreator). WithMeshesCreator(meshesCreator). WithInitSamples(samples). WithInitLevel(levels). WithEpsilon(epsilon). WithParallel(false). CreateUnique()), mlmcParallel(EstimatorCreator("MultilevelMonteCarlo"). WithPDESolverCreator(pdeSolverCreator). WithMeshesCreator(meshesCreator). WithInitSamples(samples). WithInitLevel(levels). WithEpsilon(epsilon). WithParallel(true). CreateUnique()) { mout << GetParam() << endl; mout.StartBlock("Monte Carlo seriell"); mout << "Start" << endl; mlmcSeriell->Method(); mout.EndBlock(); mout << endl; mlmcSeriell->EstimatorResults(); mout.StartBlock("Monte Carlo parallel"); mout << "Start" << endl; mlmcParallel->Method(); mout.EndBlock(); mout << endl; mlmcParallel->EstimatorResults(); } }; #endif //TESTMULTILEVELMONTECARLO_HPP