From fadc99d3739ee880f4f50be9ff63b70c73737c21 Mon Sep 17 00:00:00 2001 From: Oliver Sander <oliver.sander@tu-dresden.de> Date: Fri, 14 Jun 2019 16:51:21 +0200 Subject: [PATCH] Remove the program rod-eoc It combined computing rod configurations and their discretization errors. Nowadays the way to do that is to use rod3d.cc for the rod configurations, and compute-disc-errors.cc for the errors. Hence rod-eoc.cc is not needed anymore and can go. --- src/CMakeLists.txt | 3 +- src/rod-eoc.cc | 248 --------------------------------------------- 2 files changed, 1 insertion(+), 250 deletions(-) delete mode 100644 src/rod-eoc.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 98aea9b5..15adcea1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,8 +3,7 @@ set(programs compute-disc-error film-on-substrate gradient-flow harmonicmaps - rod3d - rod-eoc) + rod3d) # rodobstacle) foreach(_program ${programs}) diff --git a/src/rod-eoc.cc b/src/rod-eoc.cc deleted file mode 100644 index 5926b97b..00000000 --- a/src/rod-eoc.cc +++ /dev/null @@ -1,248 +0,0 @@ -#include <config.h> - -#include <dune/common/bitsetvector.hh> -#include <dune/common/parametertree.hh> -#include <dune/common/parametertreeparser.hh> - -#include <dune/grid/onedgrid.hh> - -#include <dune/istl/io.hh> - -#include <dune/functions/functionspacebases/lagrangebasis.hh> - -#include <dune/fufem/functionspacebases/p1nodalbasis.hh> -#include <dune/fufem/assemblers/operatorassembler.hh> -#include <dune/fufem/assemblers/localassemblers/laplaceassembler.hh> -#include <dune/fufem/assemblers/localassemblers/massassembler.hh> - -#include <dune/solvers/solvers/iterativesolver.hh> -#include <dune/solvers/norms/energynorm.hh> - -#include <dune/gfe/rigidbodymotion.hh> -#include <dune/gfe/geodesicdifference.hh> -#include <dune/gfe/rotation.hh> -#include <dune/gfe/rodassembler.hh> -#include <dune/gfe/riemanniantrsolver.hh> -#include <dune/gfe/geodesicfefunctionadaptor.hh> -#include <dune/gfe/rodwriter.hh> - -typedef Dune::OneDGrid GridType; - -typedef RigidBodyMotion<double,3> TargetSpace; -typedef std::vector<RigidBodyMotion<double,3> > SolutionType; - -const int blocksize = TargetSpace::TangentVector::dimension; - -using namespace Dune; -using std::string; - -void solve (const GridType& grid, - SolutionType& x, - int numLevels, - const TargetSpace& dirichletValue, - const ParameterTree& parameters) -{ - // read solver setting - const double innerTolerance = parameters.get<double>("innerTolerance"); - const double tolerance = parameters.get<double>("tolerance"); - const int maxTrustRegionSteps = parameters.get<int>("maxTrustRegionSteps"); - const double initialTrustRegionRadius = parameters.get<double>("initialTrustRegionRadius"); - const int multigridIterations = parameters.get<int>("numIt"); - - // read rod parameter settings - const double A = parameters.get<double>("A"); - const double J1 = parameters.get<double>("J1"); - const double J2 = parameters.get<double>("J2"); - const double E = parameters.get<double>("E"); - const double nu = parameters.get<double>("nu"); - - // Create a function space basis - typedef Dune::Functions::LagrangeBasis<typename GridType::LeafGridView, 1> FEBasis; - FEBasis feBasis(grid.leafGridView()); - - // Transitional: the same basis as a dune-fufem object - typedef DuneFunctionsBasis<FEBasis> FufemFEBasis; - FufemFEBasis fufemFeBasis(feBasis); - - // Create a local assembler - RodLocalStiffness<OneDGrid::LeafGridView,double> localStiffness(grid.leafGridView(), - A, J1, J2, E, nu); - - - - - x.resize(grid.size(1)); - - // ////////////////////////// - // Initial solution - // ////////////////////////// - - for (size_t i=0; i<x.size(); i++) { - x[i].r[0] = 0; - x[i].r[1] = 0; - x[i].r[2] = double(i)/(x.size()-1); - x[i].q = Rotation<double,3>::identity(); - } - - // set Dirichlet value - x.back() = dirichletValue; - - // Both ends are Dirichlet - BitSetVector<blocksize> dirichletNodes(grid.size(1)); - dirichletNodes.unsetAll(); - - dirichletNodes[0] = dirichletNodes.back() = true; - - // /////////////////////////////////////////// - // Create a solver for the rod problem - // /////////////////////////////////////////// - - RodAssembler<FEBasis,3> rodAssembler(feBasis, &localStiffness); - - RiemannianTrustRegionSolver<FEBasis,RigidBodyMotion<double,3> > rodSolver; -#if 1 - rodSolver.setup(grid, - &rodAssembler, - x, - dirichletNodes, - tolerance, - maxTrustRegionSteps, - initialTrustRegionRadius, - multigridIterations, - innerTolerance, - 1, 3, 3, - 100, // iterations of the base solver - 1e-8, // base tolerance - false); // instrumentation -#else - rodSolver.setupTCG(grid, - &rodAssembler, - x, - dirichletNodes, - tolerance, - maxTrustRegionSteps, - initialTrustRegionRadius, - multigridIterations, - innerTolerance, - false); // instrumentation -#endif - - // ///////////////////////////////////////////////////// - // Solve! - // ///////////////////////////////////////////////////// - - rodSolver.setInitialIterate(x); - rodSolver.solve(); - - x = rodSolver.getSol(); -} - -int main (int argc, char *argv[]) try -{ - // parse data file - ParameterTree parameterSet; - if (argc==2) - ParameterTreeParser::readINITree(argv[1], parameterSet); - else - ParameterTreeParser::readINITree("rod-eoc.parset", parameterSet); - - // read solver settings - const int numLevels = parameterSet.get<int>("numLevels"); - const int numRodBaseElements = parameterSet.get<int>("numRodBaseElements"); - - // ///////////////////////////////////////// - // Read Dirichlet values - // ///////////////////////////////////////// - - RigidBodyMotion<double,3> dirichletValue; - dirichletValue.r[0] = parameterSet.get<double>("dirichletValueX"); - dirichletValue.r[1] = parameterSet.get<double>("dirichletValueY"); - dirichletValue.r[2] = parameterSet.get<double>("dirichletValueZ"); - - FieldVector<double,3> axis; - axis[0] = parameterSet.get<double>("dirichletAxisX"); - axis[1] = parameterSet.get<double>("dirichletAxisY"); - axis[2] = parameterSet.get<double>("dirichletAxisZ"); - double angle = parameterSet.get<double>("dirichletAngle"); - - dirichletValue.q = Rotation<double,3>(axis, M_PI*angle/180); - - // /////////////////////////////////////////////////////////// - // First compute the 'exact' solution on a very fine grid - // /////////////////////////////////////////////////////////// - - // Create the reference grid - - GridType referenceGrid(numRodBaseElements, 0, 1); - - referenceGrid.globalRefine(numLevels-1); - - // Solve the rod Dirichlet problem - SolutionType referenceSolution; - solve(referenceGrid, referenceSolution, numLevels, dirichletValue, parameterSet); - - - // ////////////////////////////////////////////////////////////////////// - // Compute mass matrix and laplace matrix to emulate L2 and H1 norms - // ////////////////////////////////////////////////////////////////////// - - typedef P1NodalBasis<GridType::LeafGridView,double> FEBasis; - FEBasis basis(referenceGrid.leafGridView()); - OperatorAssembler<FEBasis,FEBasis> operatorAssembler(basis, basis); - - LaplaceAssembler<GridType, FEBasis::LocalFiniteElement, FEBasis::LocalFiniteElement> laplaceLocalAssembler; - MassAssembler<GridType, FEBasis::LocalFiniteElement, FEBasis::LocalFiniteElement> massMatrixLocalAssembler; - - typedef Dune::BCRSMatrix<Dune::FieldMatrix<double,1,1> > ScalarMatrixType; - ScalarMatrixType laplace, massMatrix; - - operatorAssembler.assemble(laplaceLocalAssembler, laplace); - operatorAssembler.assemble(massMatrixLocalAssembler, massMatrix); - - // /////////////////////////////////////////////////////////// - // Compute on all coarser levels, and compare - // /////////////////////////////////////////////////////////// - - for (int i=1; i<=numLevels; i++) { - - GridType grid(numRodBaseElements, 0, 1); - grid.globalRefine(i-1); - - // compute again - SolutionType solution; - solve(grid, solution, i, dirichletValue, parameterSet); - - // Prolong solution to the very finest grid - for (int j=i; j<numLevels; j++) - GeodesicFEFunctionAdaptor<FEBasis,TargetSpace>::geodesicFEFunctionAdaptor(grid, solution); - - std::stringstream numberAsAscii; - numberAsAscii << i; - writeRod(solution, "rodGrid_" + numberAsAscii.str()); - - assert(referenceSolution.size() == solution.size()); - - BlockVector<TargetSpace::TangentVector> difference = computeGeodesicDifference(solution,referenceSolution); - - H1SemiNorm< BlockVector<TargetSpace::TangentVector> > h1Norm(laplace); - H1SemiNorm< BlockVector<TargetSpace::TangentVector> > l2Norm(massMatrix); - - // Compute max-norm difference - std::cout << "Level: " << i-1 - << ", max-norm error: " << difference.infinity_norm() - << std::endl; - - std::cout << "Level: " << i-1 - << ", L2 error: " << l2Norm(difference) - << std::endl; - - std::cout << "Level: " << i-1 - << ", H1 error: " << h1Norm(difference) - << std::endl; - - } - -} catch (Exception& e) -{ - std::cout << e.what() << std::endl; -} -- GitLab