Skip to content
Snippets Groups Projects
multi-body-problem.cc 19.2 KiB
Newer Older
podlesny's avatar
.
podlesny committed
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifdef HAVE_IPOPT
#undef HAVE_IPOPT
#endif

#include <atomic>
#include <cmath>
#include <csignal>
#include <exception>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <memory>

#include <dune/common/bitsetvector.hh>
#include <dune/common/exceptions.hh>
#include <dune/common/fmatrix.hh>
#include <dune/common/function.hh>
#include <dune/common/fvector.hh>
#include <dune/common/parallel/mpihelper.hh>
#include <dune/common/parametertree.hh>
#include <dune/common/parametertreeparser.hh>

#include <dune/grid/common/mcmgmapper.hh>
#include <dune/istl/bcrsmatrix.hh>
#include <dune/istl/bvector.hh>

#include <dune/fufem/boundarypatch.hh>
#include <dune/fufem/formatstring.hh>
podlesny's avatar
podlesny committed
#include <dune/fufem/hdf5/file.hh>
podlesny's avatar
.
podlesny committed

#include <dune/solvers/norms/energynorm.hh>


/*
#include <dune/solvers/solvers/loopsolver.hh>
#include <dune/solvers/solvers/solver.hh>*/
#include <dune/tnnmg/problem-classes/convexproblem.hh>

#include <dune/contact/common/deformedcontinuacomplex.hh>
#include <dune/contact/common/couplingpair.hh>
#include <dune/contact/projections/normalprojection.hh>

#include <dune/tectonic/geocoordinate.hh>
#include <dune/tectonic/globalfriction.hh>
podlesny's avatar
podlesny committed

podlesny's avatar
.
podlesny committed

#include "assemblers.hh"
#include "gridselector.hh"
podlesny's avatar
podlesny committed
#include "explicitgrid.hh"
#include "explicitvectors.hh"
podlesny's avatar
podlesny committed
#include "data-structures/enumparser.hh"
#include "data-structures/enums.hh"
podlesny's avatar
.  
podlesny committed
#include "data-structures/contactnetwork.hh"
podlesny's avatar
podlesny committed
#include "data-structures/matrices.hh"
#include "data-structures/program_state.hh"

podlesny's avatar
.  
podlesny committed
#include "factories/threeblocksfactory.hh"
podlesny's avatar
podlesny committed
//#include "io/hdf5-levelwriter.hh"
podlesny's avatar
podlesny committed
#include "io/hdf5/restart-io.hh"
#include "io/vtk.hh"

#include "multi-body-problem-data/bc.hh"
#include "multi-body-problem-data/mybody.hh"
podlesny's avatar
.  
podlesny committed
#include "multi-body-problem-data/grid/mygrids.hh"
podlesny's avatar
podlesny committed

podlesny's avatar
podlesny committed
#include "spatial-solving/tnnmg/functional.hh"
podlesny's avatar
.  
podlesny committed
#include "spatial-solving/preconditioners/supportpatchfactory.hh"
podlesny's avatar
podlesny committed
#include "spatial-solving/tnnmg/localbisectionsolver.hh"
podlesny's avatar
.  
podlesny committed
#include "spatial-solving/contact/nbodyassembler.hh"
podlesny's avatar
podlesny committed
#include "spatial-solving/solverfactory.hh"
podlesny's avatar
podlesny committed

podlesny's avatar
podlesny committed
#include "time-stepping/adaptivetimestepper.hh"
podlesny's avatar
.
podlesny committed
#include "time-stepping/rate.hh"
#include "time-stepping/state.hh"
podlesny's avatar
.  
podlesny committed
#include "time-stepping/updaters.hh"
podlesny's avatar
podlesny committed

#include "utils/debugutils.hh"
#include "utils/diameter.hh"
podlesny's avatar
.
podlesny committed

// for getcwd
#include <unistd.h>

podlesny's avatar
podlesny committed
//#include <tbb/tbb.h> //TODO multi threading preconditioner?
//#include <pthread.h>
podlesny's avatar
.
podlesny committed

size_t const dims = MY_DIM;

podlesny's avatar
.  
podlesny committed
template <class SupportPatchFactory>
void testSuite(const SupportPatchFactory& supportPatchFactory, const size_t bodyID, const int patchDepth = 0) {
/*    const auto& coarseContactNetwork = supportPatchFactory.coarseContactNetwork();
    const auto& gridView = coarseContactNetwork.body(bodyID)->gridView();

    for (const auto& e : elements(gridView)) {

    }

    using Patch = typename SupportPatchFactory::Patch;
    Patch patch0, patch1, patch2, patch3;

    // (const size_t bodyID, const Element& coarseElement, const size_t localVertex, Patch& patchDofs, const int patchDepth = 0)

    // interior patch inside of one body
    supportPatchFactory.build(0, const Element& coarseElement, const size_t localVertex, patch0, patchDepth);

    // patch at friction interface with two bodies in contact
    supportPatchFactory.build(0, const Element& coarseElement, const size_t localVertex, patch1 patchDepth);

    // patch at friction interface with two bodies in contact and with dirichlet boundary
    supportPatchFactory.build(0, const Element& coarseElement, const size_t localVertex, patch2, patchDepth);

    // crosspoint patch, where all 3 bodies are in contact
    supportPatchFactory.build(0, const Element& coarseElement, const size_t localVertex, patch3, patchDepth);*/
}


podlesny's avatar
.
podlesny committed
Dune::ParameterTree getParameters(int argc, char *argv[]) {
  Dune::ParameterTree parset;
  Dune::ParameterTreeParser::readINITree("/home/mi/podlesny/software/dune/dune-tectonic/src/multi-body-problem.cfg", parset);
  Dune::ParameterTreeParser::readINITree(
      Dune::Fufem::formatString("/home/mi/podlesny/software/dune/dune-tectonic/src/multi-body-problem-%dD.cfg", dims), parset);
  Dune::ParameterTreeParser::readOptions(argc, argv, parset);
  return parset;
}

static std::atomic<bool> terminationRequested(false);
void handleSignal(int signum) { terminationRequested = true; }

int main(int argc, char *argv[]) {
  try {
    Dune::MPIHelper::instance(argc, argv);

    char buffer[256];
    char *val = getcwd(buffer, sizeof(buffer));
    if (val) {
        std::cout << buffer << std::endl;
        std::cout << argv[0] << std::endl;
    }

podlesny's avatar
podlesny committed
    std::ofstream out("../log.txt");
    std::streambuf *coutbuf = std::cout.rdbuf(); //save old buffer
    std::cout.rdbuf(out.rdbuf()); //redirect std::cout to log.txt

podlesny's avatar
.
podlesny committed
    auto const parset = getParameters(argc, argv);

podlesny's avatar
.  
podlesny committed
    using Assembler = MyAssembler<DefLeafGridView, dims>;
podlesny's avatar
.
podlesny committed
    using field_type = Matrix::field_type;

podlesny's avatar
.  
podlesny committed

    // ----------------------
    // set up contact network
    // ----------------------
podlesny's avatar
.  
podlesny committed
    ThreeBlocksFactory<Grid, Vector> threeBlocksFactory(parset);
    using ContactNetwork = typename ThreeBlocksFactory<Grid, Vector>::ContactNetwork;
    threeBlocksFactory.build();
podlesny's avatar
.
podlesny committed

podlesny's avatar
.  
podlesny committed
    ContactNetwork& contactNetwork = threeBlocksFactory.contactNetwork();
    const size_t bodyCount = contactNetwork.nBodies();
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<bodyCount; i++) {
podlesny's avatar
.  
podlesny committed
       // printDofLocation(contactNetwork.body(i)->gridView());
     /* Vector def(contactNetwork.deformedGrids()[i]->size(dims));
      def = 1;
      deformedGridComplex.setDeformation(def, i);*/
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
        /*auto& levelViews = contactNetwork.levelViews(i);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
        for (size_t j=0; j<levelViews.size(); j++) {
            writeToVTK(*levelViews[j], "", "body_" + std::to_string(i) + "_level_" + std::to_string(j));
        }

podlesny's avatar
.  
podlesny committed
        writeToVTK(contactNetwork.leafView(i), "", "body_" + std::to_string(i) + "_leaf"); */
podlesny's avatar
.
podlesny committed
    }

    // ----------------------------
podlesny's avatar
.  
podlesny committed
    // assemble contactNetwork
    // ----------------------------
podlesny's avatar
.  
podlesny committed
    contactNetwork.assemble();

    const auto & coarseContactNetwork = *contactNetwork.level(0);
    const auto & fineContactNetwork = *contactNetwork.level(1);
    SupportPatchFactory<typename ContactNetwork::LevelContactNetwork> supportPatchFactory(coarseContactNetwork, fineContactNetwork);
podlesny's avatar
.  
podlesny committed
    size_t bodyID = 2;
podlesny's avatar
.  
podlesny committed
    size_t patchDepth = 0;

podlesny's avatar
.  
podlesny committed
    std::cout << std::endl;

    // print coarse dofs
    for (size_t i=0; i<bodyCount; i++) {
        std::cout << "Coarse dofs body " << i << std::endl;
        const auto& gv = coarseContactNetwork.body(i)->gridView();
        printDofLocation(gv);

        ScalarVector dofs(gv.size(dims));
        for (size_t j=0; j<dofs.size(); j++) {
            dofs[j] = j;
        }
        writeToVTK(gv, dofs, "", "body_" + std::to_string(i) + "_coarse");
    }

    // print fine dofs
    for (size_t i=0; i<bodyCount; i++) {
        std::cout << "Fine dofs body " << i << std::endl;
        const auto& gv = fineContactNetwork.body(i)->gridView();
        printDofLocation(gv);

        ScalarVector dofs(gv.size(dims));
        for (size_t j=0; j<dofs.size(); j++) {
            dofs[j] = j;
        }
        writeToVTK(gv, dofs, "", "body_" + std::to_string(i) + "_fine");
    }
podlesny's avatar
.  
podlesny committed

    using Patch = typename SupportPatchFactory<typename ContactNetwork::LevelContactNetwork>::Patch;
    Patch patch;

    const auto& gridView = coarseContactNetwork.body(bodyID)->gridView();

    Dune::PQkLocalFiniteElementCache<double, double, dims, 1> cache;
    Dune::BitSetVector<1> vertexVisited(gridView.size(dims));
    vertexVisited.unsetAll();
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    for (const auto& e: elements(gridView)) {
        const auto& refElement = Dune::ReferenceElements<double, dims>::general(e.type());

        for (size_t i=0; i<refElement.size(dims); i++) {
            auto localIdx = cache.get(e.type()).localCoefficients().localKey(i).subEntity();
            auto globalIdx = gridView.indexSet().subIndex(e, i, dims);

            if (!vertexVisited[globalIdx][0]) {
                vertexVisited[globalIdx][0] = true;
                supportPatchFactory.build(bodyID, e, i, patch, patchDepth);

                print(patch, "patch:");

                size_t c = 0;
                for (size_t j=0; j<bodyCount; j++) {
                    const auto& gv = fineContactNetwork.body(j)->gridView();

                    ScalarVector patchVec(gv.size(dims));
                    for (size_t l=0; l<patchVec.size(); l++) {
                        if (patch[c++][0]) {
                            patchVec[l][0] = 1;
                        }
                    }

                    print(patchVec, "patchVec");

                    // output patch
                    writeToVTK(gv, patchVec, "", "patch_" + std::to_string(globalIdx) + "_body_" + std::to_string(j));
                }
            }
        }
    }
podlesny's avatar
.  
podlesny committed

    std::cout << "Done! :)" << std::endl;
podlesny's avatar
.  
podlesny committed
    return 1;

    //printMortarBasis<Vector>(contactNetwork.nBodyAssembler());
podlesny's avatar
.
podlesny committed

podlesny's avatar
.  
podlesny committed
    // -----------------
    // init input/output
    // -----------------
podlesny's avatar
.  
podlesny committed
    std::vector<size_t> nVertices(bodyCount);
    for (size_t i=0; i<bodyCount; i++) {
        nVertices[i] = contactNetwork.body(i)->nVertices();
    }

podlesny's avatar
.
podlesny committed
    using MyProgramState = ProgramState<Vector, ScalarVector>;
podlesny's avatar
.  
podlesny committed
    MyProgramState programState(nVertices);
podlesny's avatar
.
podlesny committed
    auto const firstRestart = parset.get<size_t>("io.restarts.first");
    auto const restartSpacing = parset.get<size_t>("io.restarts.spacing");
    auto const writeRestarts = parset.get<bool>("io.restarts.write");
    auto const writeData = parset.get<bool>("io.data.write");
    bool const handleRestarts = writeRestarts or firstRestart > 0;


    auto dataFile =
        writeData ? std::make_unique<HDF5::File>("output.h5") : nullptr;

    auto restartFile = handleRestarts
                           ? std::make_unique<HDF5::File>(
                                 "restarts.h5",
                                 writeRestarts ? HDF5::Access::READWRITE
                                               : HDF5::Access::READONLY)
                           : nullptr;


podlesny's avatar
.  
podlesny committed
    auto restartIO = handleRestarts
podlesny's avatar
.
podlesny committed
                         ? std::make_unique<RestartIO<MyProgramState>>(
podlesny's avatar
.  
podlesny committed
                               *restartFile, nVertices)
podlesny's avatar
.  
podlesny committed
                         : nullptr;

podlesny's avatar
.
podlesny committed
    if (firstRestart > 0) // automatically adjusts the time and timestep
      restartIO->read(firstRestart, programState);
    else
podlesny's avatar
.  
podlesny committed
     programState.setupInitialConditions(parset, contactNetwork);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    auto& nBodyAssembler = contactNetwork.nBodyAssembler();
podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<bodyCount; i++) {
podlesny's avatar
.  
podlesny committed
      contactNetwork.body(i)->setDeformation(programState.u[i]);
podlesny's avatar
.  
podlesny committed
    }
    nBodyAssembler.assembleTransferOperator();
    nBodyAssembler.assembleObstacle();

    // ------------------------
    // assemble global friction
    // ------------------------
podlesny's avatar
.  
podlesny committed
    contactNetwork.assembleFriction(parset.get<Config::FrictionModel>("boundary.friction.frictionModel"), programState.weightedNormalStress);
podlesny's avatar
.
podlesny committed

podlesny's avatar
.  
podlesny committed
    auto& globalFriction = contactNetwork.globalFriction();
podlesny's avatar
.  
podlesny committed
    globalFriction.updateAlpha(programState.alpha);

podlesny's avatar
.  
podlesny committed
    using MyVertexBasis = typename Assembler::VertexBasis;
    using MyCellBasis = typename Assembler::CellBasis;
    std::vector<Vector> vertexCoordinates(bodyCount);
    std::vector<const MyVertexBasis* > vertexBases(bodyCount);
    std::vector<const MyCellBasis* > cellBases(bodyCount);
podlesny's avatar
.  
podlesny committed

    for (size_t i=0; i<bodyCount; i++) {
podlesny's avatar
.  
podlesny committed
      const auto& body = contactNetwork.body(i);
      vertexBases[i] = &(body->assembler()->vertexBasis);
      cellBases[i] = &(body->assembler()->cellBasis);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
      auto& vertexCoords = vertexCoordinates[i];
podlesny's avatar
.  
podlesny committed
      vertexCoords.resize(nVertices[i]);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.
podlesny committed
      Dune::MultipleCodimMultipleGeomTypeMapper<
podlesny's avatar
.  
podlesny committed
          DefLeafGridView, Dune::MCMGVertexLayout> const vertexMapper(body->gridView(), Dune::mcmgVertexLayout());
      for (auto &&v : vertices(body->gridView()))
podlesny's avatar
.  
podlesny committed
        vertexCoords[vertexMapper.index(v)] = geoToPoint(v.geometry());
podlesny's avatar
.
podlesny committed
    }

podlesny's avatar
.  
podlesny committed
    //typename contactNetwork::BoundaryPatches frictionBoundaries;
    //contactNetwork.boundaryPatches("friction", frictionBoundaries);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
podlesny committed
    /*
podlesny's avatar
.
podlesny committed
    auto dataWriter =
        writeData ? std::make_unique<
podlesny's avatar
.  
podlesny committed
                        HDF5Writer<MyProgramState, MyVertexBasis, DefLeafGridView>>(
                        *dataFile, vertexCoordinates, vertexBases,
podlesny's avatar
podlesny committed
                        frictionBoundaries) //, weakPatches)
                  : nullptr;*/

podlesny's avatar
.  
podlesny committed
    const MyVTKWriter<MyVertexBasis, MyCellBasis> vtkWriter(cellBases, vertexBases, "/storage/mi/podlesny/software/dune/dune-tectonic/body");
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.
podlesny committed
    IterationRegister iterationCount;
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.
podlesny committed
    auto const report = [&](bool initial = false) {
podlesny's avatar
.  
podlesny committed
      /*if (writeData) {
podlesny's avatar
.  
podlesny committed
        dataWriter->reportSolution(programState, contactNetwork.globalFriction());
podlesny's avatar
.
podlesny committed
        if (!initial)
          dataWriter->reportIterations(programState, iterationCount);
        dataFile->flush();
      }

      if (writeRestarts and !initial and
          programState.timeStep % restartSpacing == 0) {
        restartIO->write(programState);
        restartFile->flush();
podlesny's avatar
.  
podlesny committed
      }*/
podlesny's avatar
.
podlesny committed

      if (parset.get<bool>("io.printProgress"))
        std::cout << "timeStep = " << std::setw(6) << programState.timeStep
                  << ", time = " << std::setw(12) << programState.relativeTime
                  << ", tau = " << std::setw(12) << programState.relativeTau
                  << std::endl;
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.
podlesny committed
      if (parset.get<bool>("io.vtk.write")) {
        std::vector<ScalarVector> stress(bodyCount);
podlesny's avatar
.  
podlesny committed

        for (size_t i=0; i<bodyCount; i++) {
podlesny's avatar
.  
podlesny committed
          const auto& body = contactNetwork.body(i);
          body->assembler()->assembleVonMisesStress(body->data()->getYoungModulus(),
                                           body->data()->getPoissonRatio(),
podlesny's avatar
.  
podlesny committed
                                           programState.u[i], stress[i]);
podlesny's avatar
podlesny committed

podlesny's avatar
.  
podlesny committed
        }

podlesny's avatar
.
podlesny committed
        vtkWriter.write(programState.timeStep, programState.u, programState.v,
                        programState.alpha, stress);
      }
    };
    report(true);
podlesny's avatar
podlesny committed

podlesny's avatar
.  
podlesny committed
    // -------------------
podlesny's avatar
.
podlesny committed
    // Set up TNNMG solver
podlesny's avatar
.  
podlesny committed
    // -------------------
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    BitVector totalDirichletNodes;
podlesny's avatar
.  
podlesny committed
    contactNetwork.totalNodes("dirichlet", totalDirichletNodes);
podlesny's avatar
podlesny committed

podlesny's avatar
.  
podlesny committed
    /*for (size_t i=0; i<totalDirichletNodes.size(); i++) {
        bool val = false;
        for (size_t d=0; d<dims; d++) {
            val = val || totalDirichletNodes[i][d];
        }

        totalDirichletNodes[i] = val;
        for (size_t d=0; d<dims; d++) {
            totalDirichletNodes[i][d] = val;
        }
    }*/

podlesny's avatar
.  
podlesny committed
    print(totalDirichletNodes, "totalDirichletNodes:");
podlesny's avatar
.  
podlesny committed

podlesny's avatar
podlesny committed
    using Functional = Functional<Matrix&, Vector&, GlobalFriction<Matrix, Vector>&, Vector&, Vector&, field_type>;
    using NonlinearFactory = SolverFactory<Functional, BitVector>;
podlesny's avatar
.
podlesny committed

podlesny's avatar
.  
podlesny committed
    using BoundaryFunctions = typename ContactNetwork::BoundaryFunctions;
    using BoundaryNodes = typename ContactNetwork::BoundaryNodes;
podlesny's avatar
.  
podlesny committed
    using Updaters = Updaters<RateUpdater<Vector, Matrix, BoundaryFunctions, BoundaryNodes>,
podlesny's avatar
.
podlesny committed
                               StateUpdater<ScalarVector, Vector>>;
podlesny's avatar
.  
podlesny committed

    BoundaryFunctions velocityDirichletFunctions;
podlesny's avatar
.  
podlesny committed
    contactNetwork.boundaryFunctions("dirichlet", velocityDirichletFunctions);
podlesny's avatar
.  
podlesny committed

    BoundaryNodes dirichletNodes;
podlesny's avatar
.  
podlesny committed
    contactNetwork.boundaryNodes("dirichlet", dirichletNodes);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<dirichletNodes.size(); i++) {
        for (size_t j=0; j<dirichletNodes[i].size(); j++) {
        print(*dirichletNodes[i][j], "dirichletNodes_body_" + std::to_string(i) + "_boundary_" + std::to_string(j));
        }
    }

podlesny's avatar
.  
podlesny committed
    std::vector<const Dune::BitSetVector<1>*> frictionNodes;
podlesny's avatar
.  
podlesny committed
    contactNetwork.frictionNodes(frictionNodes);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<frictionNodes.size(); i++) {
        print(*frictionNodes[i], "frictionNodes_body_" + std::to_string(i));
    }

podlesny's avatar
.  
podlesny committed
    Updaters current(
        initRateUpdater(
            parset.get<Config::scheme>("timeSteps.scheme"),
            velocityDirichletFunctions,
            dirichletNodes,
podlesny's avatar
.  
podlesny committed
            contactNetwork.matrices(),
podlesny's avatar
.  
podlesny committed
            programState.u,
            programState.v,
            programState.a),
podlesny's avatar
.  
podlesny committed
        initStateUpdater<ScalarVector, Vector>(
podlesny's avatar
.
podlesny committed
            parset.get<Config::stateModel>("boundary.friction.stateModel"),
podlesny's avatar
.  
podlesny committed
            programState.alpha,
podlesny's avatar
.  
podlesny committed
            nBodyAssembler.getContactCouplings(),
podlesny's avatar
.  
podlesny committed
            contactNetwork.couplings())
podlesny's avatar
.  
podlesny committed
            );
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.
podlesny committed

podlesny's avatar
.  
podlesny committed
    auto const refinementTolerance = parset.get<double>("timeSteps.refinementTolerance");
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    const auto& stateEnergyNorms = contactNetwork.stateEnergyNorms();
podlesny's avatar
.  
podlesny committed

    auto const mustRefine = [&](Updaters &coarseUpdater,
                                Updaters &fineUpdater) {
podlesny's avatar
.  
podlesny committed

        //return false;
      std::cout << "Step 1" << std::endl;

podlesny's avatar
.  
podlesny committed
      std::vector<ScalarVector> coarseAlpha;
podlesny's avatar
.  
podlesny committed
      coarseAlpha.resize(bodyCount);
podlesny's avatar
.
podlesny committed
      coarseUpdater.state_->extractAlpha(coarseAlpha);

podlesny's avatar
.  
podlesny committed
      print(coarseAlpha, "coarseAlpha:");
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
      std::vector<ScalarVector> fineAlpha;
podlesny's avatar
.  
podlesny committed
      fineAlpha.resize(bodyCount);
podlesny's avatar
.
podlesny committed
      fineUpdater.state_->extractAlpha(fineAlpha);

podlesny's avatar
.  
podlesny committed
      print(fineAlpha, "fineAlpha:");

podlesny's avatar
.  
podlesny committed
      std::cout << "Step 3" << std::endl;

podlesny's avatar
.  
podlesny committed
      ScalarVector::field_type energyNorm = 0;
      for (size_t i=0; i<stateEnergyNorms.size(); i++) {
podlesny's avatar
.  
podlesny committed
          std::cout << "for " << i << std::endl;

          std::cout << not stateEnergyNorms[i] << std::endl;

          if (coarseAlpha[i].size()==0 || fineAlpha[i].size()==0)
              continue;
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
          energyNorm += stateEnergyNorms[i]->diff(fineAlpha[i], coarseAlpha[i]);
      }
podlesny's avatar
.  
podlesny committed
      std::cout << "energy norm: " << energyNorm << " tol: " << refinementTolerance <<  std::endl;
      std::cout << "must refine: " << (energyNorm > refinementTolerance) <<  std::endl;
podlesny's avatar
.  
podlesny committed
      return energyNorm > refinementTolerance;
podlesny's avatar
.
podlesny committed
    };

podlesny's avatar
.  
podlesny committed

podlesny's avatar
.
podlesny committed
    std::signal(SIGXCPU, handleSignal);
    std::signal(SIGINT, handleSignal);
    std::signal(SIGTERM, handleSignal);

podlesny's avatar
.  
podlesny committed
    typename ContactNetwork::ExternalForces externalForces;
    contactNetwork.externalForces(externalForces);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    AdaptiveTimeStepper<NonlinearFactory, std::decay_t<decltype(nBodyAssembler)>, Updaters, std::decay_t<decltype(stateEnergyNorms)>>
podlesny's avatar
.  
podlesny committed
        adaptiveTimeStepper(parset, nBodyAssembler, totalDirichletNodes, globalFriction, frictionNodes, current,
podlesny's avatar
.
podlesny committed
                            programState.relativeTime, programState.relativeTau,
podlesny's avatar
.  
podlesny committed
                            externalForces, stateEnergyNorms, mustRefine);
podlesny's avatar
podlesny committed

podlesny's avatar
.
podlesny committed
    while (!adaptiveTimeStepper.reachedEnd()) {
      programState.timeStep++;

      iterationCount = adaptiveTimeStepper.advance();

      programState.relativeTime = adaptiveTimeStepper.relativeTime_;
      programState.relativeTau = adaptiveTimeStepper.relativeTau_;
      current.rate_->extractDisplacement(programState.u);
      current.rate_->extractVelocity(programState.v);
      current.rate_->extractAcceleration(programState.a);
      current.state_->extractAlpha(programState.alpha);

podlesny's avatar
.  
podlesny committed
      print(programState.u, "current u:");
      print(programState.v, "current v:");
      print(programState.a, "current a:");
      print(programState.alpha, "current alpha:");

podlesny's avatar
.  
podlesny committed
      contactNetwork.setDeformation(programState.u);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
      report();
podlesny's avatar
.
podlesny committed

podlesny's avatar
.  
podlesny committed
      if (programState.timeStep==50) {
podlesny's avatar
.  
podlesny committed
        std::cout << "limit of timeSteps reached!" << std::endl;
        break; // TODO remove after debugging
      }

podlesny's avatar
.
podlesny committed
      if (terminationRequested) {
        std::cerr << "Terminating prematurely" << std::endl;
        break;
      }
    }
podlesny's avatar
podlesny committed

podlesny's avatar
podlesny committed
    std::cout.rdbuf(coutbuf); //reset to standard output again

podlesny's avatar
.
podlesny committed
  } catch (Dune::Exception &e) {
    Dune::derr << "Dune reported error: " << e << std::endl;
  } catch (std::exception &e) {
    std::cerr << "Standard exception: " << e.what() << std::endl;
  }
}