Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • podlesny/dune-tectonic
  • agnumpde/dune-tectonic
2 results
Show changes
Commits on Source (33)
Showing
with 107 additions and 271 deletions
...@@ -18,8 +18,7 @@ include(DuneMacros) ...@@ -18,8 +18,7 @@ include(DuneMacros)
# start a dune project with information from dune.module # start a dune project with information from dune.module
dune_project() dune_project()
find_package(Boost REQUIRED system filesystem) find_package(HDF5 COMPONENTS C REQUIRED)
find_package(HDF5 REQUIRED)
add_subdirectory("src") add_subdirectory("src")
add_subdirectory("dune") add_subdirectory("dune")
......
...@@ -10,6 +10,6 @@ Name: @PACKAGE_NAME@ ...@@ -10,6 +10,6 @@ Name: @PACKAGE_NAME@
Version: @VERSION@ Version: @VERSION@
Description: dune-tectonic module Description: dune-tectonic module
URL: http://dune-project.org/ URL: http://dune-project.org/
Requires: dune-common dune-fufem dune-tnnmg Requires: dune-common dune-fufem dune-grid dune-istl dune-solvers dune-tnnmg dune-uggrid
Libs: -L${libdir} Libs: -L${libdir}
Cflags: -I${includedir} Cflags: -I${includedir}
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
################################ ################################
Module: dune-tectonic Module: dune-tectonic
Version: 2.4-1 Version: 2.5-1
Maintainer: elias.pipping@fu-berlin.de Maintainer: elias.pipping@fu-berlin.de
Depends: dune-common dune-fufem dune-geometry dune-grid dune-istl dune-solvers dune-tnnmg Depends: dune-common dune-fufem dune-grid dune-istl dune-solvers dune-tnnmg dune-uggrid
...@@ -10,7 +10,6 @@ install(FILES ...@@ -10,7 +10,6 @@ install(FILES
minimisation.hh minimisation.hh
myblockproblem.hh myblockproblem.hh
mydirectionalconvexfunction.hh mydirectionalconvexfunction.hh
pointtractionboundaryassembler.hh
quadraticenergy.hh quadraticenergy.hh
tectonic.hh tectonic.hh
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tectonic) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/tectonic)
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
// Based on dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh // Based on dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh
#include <dune/common/bitsetvector.hh> #include <dune/common/bitsetvector.hh>
#include <dune/common/nullptr.hh>
#include <dune/common/parametertree.hh> #include <dune/common/parametertree.hh>
#include <dune/common/fmatrixev.hh> #include <dune/common/fmatrixev.hh>
......
#ifndef DUNE_TECTONIC_POINTTRACTIONBOUNDARYASSEMBLER_HH
#define DUNE_TECTONIC_POINTTRACTIONBOUNDARYASSEMBLER_HH
// Based on
// dune/fufem/assemblers/localassemblers/normalstressboundaryassembler.hh
#include <dune/common/fvector.hh>
#include <dune/geometry/quadraturerules.hh>
#include <dune/istl/bvector.hh>
#include <dune/fufem/assemblers/localboundaryassembler.hh>
#include <dune/fufem/symmetrictensor.hh>
#include <dune/fufem/functions/virtualgridfunction.hh>
#include <dune/fufem/quadraturerules/quadraturerulecache.hh>
/** \brief Computes the surface traction of a linear elastic material,
pointwise. This is done in such a manner that the sum over all
vertices equals the (approximate) integral */
template <class GridType>
class PointTractionBoundaryAssembler
: public LocalBoundaryAssembler<
GridType,
Dune::FieldVector<typename GridType::ctype, GridType::dimension>> {
static const int dim = GridType::dimension;
typedef typename GridType::ctype ctype;
typedef typename Dune::FieldVector<ctype, dim> T;
public:
typedef typename LocalBoundaryAssembler<GridType, T>::LocalVector LocalVector;
typedef VirtualGridFunction<
GridType, Dune::FieldVector<ctype, GridType::dimension>> GridFunction;
//! Create assembler for grid
PointTractionBoundaryAssembler(double E, double nu,
const GridFunction* displacement, int order)
: E_(E), nu_(nu), displacement_(displacement), order_(order) {}
/** \brief Assemble the normal stress at a boundary face.*/
template <class TrialLocalFE, class BoundaryIterator>
void assemble(const BoundaryIterator& it, LocalVector& localVector,
const TrialLocalFE& tFE) {
localVector = 0.0;
// geometry of the boundary face
const typename BoundaryIterator::Intersection::Geometry segmentGeometry =
it->geometry();
// get quadrature rule
const int order = (it->inside()->type().isSimplex())
? 2 * (order_ - 1)
: 2 * (order_ * dim - 1);
// get quadrature rule
const Dune::QuadratureRule<ctype, dim - 1>& quad =
QuadratureRuleCache<ctype, dim - 1>::rule(segmentGeometry.type(), order,
false);
// loop over quadrature points
for (size_t pt = 0; pt < quad.size(); ++pt) {
// get quadrature point
const Dune::FieldVector<ctype, dim - 1>& quadPos = quad[pt].position();
// get integration factor
const ctype integrationElement =
segmentGeometry.integrationElement(quadPos);
// get outer unit normal at quad pos
Dune::FieldVector<ctype, dim> normalAtQuadPos =
it->unitOuterNormal(quadPos);
// position of the quadrature point within the element
const Dune::FieldVector<ctype, dim> elementQuadPos =
it->geometryInInside().global(quadPos);
// evaluate the displacement gradient at quad point of the element
typename GridFunction::DerivativeType localDispGradient;
if (displacement_->isDefinedOn(*it->inside()))
displacement_->evaluateDerivativeLocal(*it->inside(), elementQuadPos,
localDispGradient);
else
displacement_->evaluateDerivative(segmentGeometry.global(quadPos),
localDispGradient);
// Compute strain tensor from the displacement gradient
SymmetricTensor<dim> strain;
computeStrain(localDispGradient, strain);
// and the stress
SymmetricTensor<dim> stress = hookeTimesStrain(strain);
normalAtQuadPos *= quad[pt].weight() * integrationElement;
typename LocalVector::block_type tractionAtQuadPos;
stress.umv(normalAtQuadPos, tractionAtQuadPos);
// Divide the traction
tractionAtQuadPos /= segmentGeometry.corners();
for (size_t k = 0; k < localVector.size(); k++)
localVector[k] += tractionAtQuadPos;
}
}
~PointTractionBoundaryAssembler() {}
private:
/** \brief Young's modulus */
double E_;
/** \brief The Poisson ratio */
double nu_;
/** \brief The displacement.*/
const GridFunction* displacement_;
/** \brief The gridfunction is usually corresponding to some finite element
* solution. This is its order.*/
int order_;
/** \brief Compute linear strain tensor from the deformation gradient. */
void computeStrain(const Dune::FieldMatrix<double, dim, dim>& grad,
SymmetricTensor<dim>& strain) const {
for (int i = 0; i < dim; ++i) {
strain(i, i) = grad[i][i];
for (int j = i + 1; j < dim; ++j)
strain(i, j) = 0.5 * (grad[i][j] + grad[j][i]);
}
}
/** \brief Compute the stress tensor from strain tensor. */
SymmetricTensor<dim> hookeTimesStrain(
const SymmetricTensor<dim>& strain) const {
SymmetricTensor<dim> stress = strain;
stress *= E_ / (1 + nu_);
double f = E_ * nu_ / ((1 + nu_) * (1 - 2 * nu_)) * strain.trace();
for (int i = 0; i < dim; i++)
stress[i] += f;
return stress;
}
};
#endif
set(SOURCE_FILES set(SW_SOURCE_FILES
assemblers.cc assemblers.cc
enumparser.cc enumparser.cc
hdf5/frictionalboundary-writer.cc hdf5/frictionalboundary-writer.cc
...@@ -7,9 +7,9 @@ set(SOURCE_FILES ...@@ -7,9 +7,9 @@ set(SOURCE_FILES
hdf5/restart-io.cc hdf5/restart-io.cc
hdf5/surface-writer.cc hdf5/surface-writer.cc
hdf5/time-writer.cc hdf5/time-writer.cc
sand-wedge-data/mygeometry.cc one-body-problem-data/mygeometry.cc
sand-wedge-data/mygrid.cc one-body-problem-data/mygrid.cc
sand-wedge.cc one-body-problem.cc
spatial-solving/fixedpointiterator.cc spatial-solving/fixedpointiterator.cc
spatial-solving/solverfactory.cc spatial-solving/solverfactory.cc
time-stepping/adaptivetimestepper.cc time-stepping/adaptivetimestepper.cc
...@@ -19,30 +19,24 @@ set(SOURCE_FILES ...@@ -19,30 +19,24 @@ set(SOURCE_FILES
time-stepping/state.cc time-stepping/state.cc
vtk.cc vtk.cc
) )
set(UGW_SOURCE_FILES
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/sand-wedge-data") assemblers.cc # FIXME
dune_symlink_to_source_files("sand-wedge-data/boundaryconditions.py") one-body-problem-data/mygrid.cc
dune_symlink_to_source_files("sand-wedge-data/parset.cfg") uniform-grid-writer.cc
dune_symlink_to_source_files("sand-wedge-data/parset-2D.cfg") vtk.cc
dune_symlink_to_source_files("sand-wedge-data/parset-3D.cfg") )
foreach(_dim 2 3) foreach(_dim 2 3)
set(_target sand-wedge-${_dim}D) set(_sw_target one-body-problem-${_dim}D)
add_executable(${_target} ${SOURCE_FILES}) set(_ugw_target uniform-grid-writer-${_dim}D)
add_dune_pythonlibs_flags(${_target})
add_dune_ug_flags(${_target})
set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIRS}) add_executable(${_sw_target} ${SW_SOURCE_FILES})
add_executable(${_ugw_target} ${UGW_SOURCE_FILES})
add_dune_ug_flags(${_sw_target})
add_dune_ug_flags(${_ugw_target})
target_link_libraries(${_target} ${Boost_FILESYSTEM_LIBRARY}) add_dune_hdf5_flags(${_sw_target})
target_link_libraries(${_target} ${Boost_SYSTEM_LIBRARY})
set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${HDF5_INCLUDE_DIR}) set_property(TARGET ${_sw_target} APPEND PROPERTY COMPILE_DEFINITIONS "MY_DIM=${_dim}")
target_link_libraries(${_target} ${HDF5_LIBRARIES}) set_property(TARGET ${_ugw_target} APPEND PROPERTY COMPILE_DEFINITIONS "MY_DIM=${_dim}")
target_link_libraries(${_target} "dl") # FIXME: missing from HDF5_LIBRARIES
set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS "MY_DIM=${_dim}")
endforeach() endforeach()
# Mark UG as required
find_package(UG REQUIRED)
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <dune/fufem/assemblers/localassemblers/boundarymassassembler.hh> #include <dune/fufem/assemblers/localassemblers/boundarymassassembler.hh>
#include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh> #include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh>
#include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh> #include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
#include <dune/fufem/assemblers/localassemblers/normalstressboundaryassembler.hh>
#include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh> #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh>
#include <dune/fufem/assemblers/localassemblers/variablecoefficientviscosityassembler.hh> #include <dune/fufem/assemblers/localassemblers/variablecoefficientviscosityassembler.hh>
#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh> #include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh>
...@@ -14,11 +15,11 @@ ...@@ -14,11 +15,11 @@
#include <dune/fufem/boundarypatch.hh> #include <dune/fufem/boundarypatch.hh>
#include <dune/fufem/functions/basisgridfunction.hh> #include <dune/fufem/functions/basisgridfunction.hh>
#include <dune/fufem/functions/constantfunction.hh> #include <dune/fufem/functions/constantfunction.hh>
#include <dune/fufem/functiontools/p0p1interpolation.hh>
#include <dune/fufem/quadraturerules/quadraturerulecache.hh> #include <dune/fufem/quadraturerules/quadraturerulecache.hh>
#include <dune/tectonic/frictionpotential.hh> #include <dune/tectonic/frictionpotential.hh>
#include <dune/tectonic/globalratestatefriction.hh> #include <dune/tectonic/globalratestatefriction.hh>
#include <dune/tectonic/pointtractionboundaryassembler.hh>
#include "assemblers.hh" #include "assemblers.hh"
...@@ -111,24 +112,28 @@ void MyAssembler<GridView, dimension>::assembleWeightedNormalStress( ...@@ -111,24 +112,28 @@ void MyAssembler<GridView, dimension>::assembleWeightedNormalStress(
BasisGridFunction<VertexBasis, Vector> displacementFunction(vertexBasis, BasisGridFunction<VertexBasis, Vector> displacementFunction(vertexBasis,
displacement); displacement);
Vector traction; Vector traction(cellBasis.size());
// Note: We assume v = 0 here so that there is no viscous NormalStressBoundaryAssembler<Grid> tractionBoundaryAssembler(
// contribution to the stress.
PointTractionBoundaryAssembler<Grid> weightedTractionBoundaryAssembler(
youngModulus, poissonRatio, &displacementFunction, 1); youngModulus, poissonRatio, &displacementFunction, 1);
vertexAssembler.assembleBoundaryFunctional(weightedTractionBoundaryAssembler, cellAssembler.assembleBoundaryFunctional(tractionBoundaryAssembler, traction,
traction, frictionalBoundary); frictionalBoundary);
std::vector<typename Vector::block_type> normals; auto const nodalTractionAverage =
frictionalBoundary.getNormals(normals); interpolateP0ToP1(frictionalBoundary, traction);
for (size_t i = 0; i < traction.size(); ++i) {
weightedNormalStress[i] = normals[i] * traction[i]; ScalarVector weights;
if (weightedNormalStress[i] > 0.0) { {
weightedNormalStress[i] = 0.0; NeumannBoundaryAssembler<Grid, typename ScalarVector::block_type>
std::cout << "Warning: Manually reducing positive normal stress to zero." frictionalBoundaryAssembler(
<< std::endl; std::make_shared<ConstantFunction<
} LocalVector, typename ScalarVector::block_type>>(1));
vertexAssembler.assembleBoundaryFunctional(frictionalBoundaryAssembler,
weights, frictionalBoundary);
} }
auto const normals = frictionalBoundary.getNormals();
for (size_t i = 0; i < vertexBasis.size(); ++i)
weightedNormalStress[i] =
std::fmin(normals[i] * nodalTractionAverage[i], 0) * weights[i];
} }
template <class GridView, int dimension> template <class GridView, int dimension>
......
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
#include "enumparser.hh" #include "enumparser.hh"
template <class Enum> template <class Enum>
typename Dune::enable_if< typename std::enable_if<
!Dune::IsBaseOf<Dune::NotImplemented, StringToEnum<Enum>>::value, !std::is_base_of<Dune::NotImplemented, StringToEnum<Enum>>::value,
std::istream &>::type std::istream &>::type
operator>>(std::istream &lhs, Enum &e) { operator>>(std::istream &lhs, Enum &e) {
std::string s; std::string s;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// Copyright Carsten Graeser 2012 // Copyright Carsten Graeser 2012
#include <dune/common/typetraits.hh> #include <type_traits>
#include <dune/solvers/solvers/solver.hh> #include <dune/solvers/solvers/solver.hh>
...@@ -28,8 +28,8 @@ template <> struct StringToEnum<Config::PatchType> { ...@@ -28,8 +28,8 @@ template <> struct StringToEnum<Config::PatchType> {
}; };
template <class Enum> template <class Enum>
typename Dune::enable_if< typename std::enable_if<
!Dune::IsBaseOf<Dune::NotImplemented, StringToEnum<Enum>>::value, !std::is_base_of<Dune::NotImplemented, StringToEnum<Enum>>::value,
std::istream &>::type std::istream &>::type
operator>>(std::istream &lhs, Enum &e); operator>>(std::istream &lhs, Enum &e);
#endif #endif
...@@ -12,10 +12,7 @@ ...@@ -12,10 +12,7 @@
#if !HAVE_ALUGRID #if !HAVE_ALUGRID
#error ALUGRID was requested but not found #error ALUGRID was requested but not found
#endif #endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wignored-qualifiers"
#include <dune/grid/alugrid.hh> #include <dune/grid/alugrid.hh>
#pragma clang diagnostic pop
using Grid = Dune::ALUGrid<MY_DIM, MY_DIM, Dune::simplex, Dune::nonconforming>; using Grid = Dune::ALUGrid<MY_DIM, MY_DIM, Dune::simplex, Dune::nonconforming>;
#elif WANT_GRID == WANT_UG #elif WANT_GRID == WANT_UG
......
...@@ -3,12 +3,11 @@ ...@@ -3,12 +3,11 @@
#include <dune/fufem/functions/basisgridfunction.hh> #include <dune/fufem/functions/basisgridfunction.hh>
#include <dune/fufem/geometry/convexpolyhedron.hh> #include <dune/fufem/geometry/convexpolyhedron.hh>
#include <dune/fufem/hdf5/hdf5file.hh> #include <dune/fufem/hdf5/file.hh>
#include "hdf5/frictionalboundary-writer.hh" #include "hdf5/frictionalboundary-writer.hh"
#include "hdf5/iteration-writer.hh" #include "hdf5/iteration-writer.hh"
#include "hdf5/patchinfo-writer.hh" #include "hdf5/patchinfo-writer.hh"
#include "hdf5/restart-io.hh"
#include "hdf5/surface-writer.hh" #include "hdf5/surface-writer.hh"
#include "hdf5/time-writer.hh" #include "hdf5/time-writer.hh"
...@@ -21,7 +20,7 @@ class HDF5Writer { ...@@ -21,7 +20,7 @@ class HDF5Writer {
using LocalVector = typename Vector::block_type; using LocalVector = typename Vector::block_type;
public: public:
HDF5Writer(HDF5Grouplike &file, Vector const &vertexCoordinates, HDF5Writer(HDF5::Grouplike &file, Vector const &vertexCoordinates,
VertexBasis const &vertexBasis, Patch const &surface, VertexBasis const &vertexBasis, Patch const &surface,
Patch const &frictionalBoundary, Patch const &frictionalBoundary,
ConvexPolyhedron<LocalVector> const &weakPatch) ConvexPolyhedron<LocalVector> const &weakPatch)
...@@ -32,8 +31,8 @@ class HDF5Writer { ...@@ -32,8 +31,8 @@ class HDF5Writer {
patchInfoWriter_(file_, vertexBasis, frictionalBoundary, weakPatch), patchInfoWriter_(file_, vertexBasis, frictionalBoundary, weakPatch),
#endif #endif
surfaceWriter_(file_, vertexCoordinates, surface), surfaceWriter_(file_, vertexCoordinates, surface),
frictionalBoundaryWriter_(file_, vertexCoordinates, frictionalBoundary), frictionalBoundaryWriter_(file_, vertexCoordinates,
restartWriter_(file_, vertexCoordinates.size()) { frictionalBoundary) {
} }
template <class Friction> template <class Friction>
...@@ -53,12 +52,8 @@ class HDF5Writer { ...@@ -53,12 +52,8 @@ class HDF5Writer {
iterationWriter_.write(programState.timeStep, iterationCount); iterationWriter_.write(programState.timeStep, iterationCount);
} }
void writeRestart(ProgramState const &programState) {
restartWriter_.write(programState);
}
private: private:
HDF5Grouplike &file_; HDF5::Grouplike &file_;
IterationWriter iterationWriter_; IterationWriter iterationWriter_;
TimeWriter<ProgramState> timeWriter_; TimeWriter<ProgramState> timeWriter_;
...@@ -67,7 +62,5 @@ class HDF5Writer { ...@@ -67,7 +62,5 @@ class HDF5Writer {
#endif #endif
SurfaceWriter<ProgramState, GridView> surfaceWriter_; SurfaceWriter<ProgramState, GridView> surfaceWriter_;
FrictionalBoundaryWriter<ProgramState, GridView> frictionalBoundaryWriter_; FrictionalBoundaryWriter<ProgramState, GridView> frictionalBoundaryWriter_;
RestartIO<ProgramState> restartWriter_;
}; };
#endif #endif
...@@ -2,12 +2,14 @@ ...@@ -2,12 +2,14 @@
#include "config.h" #include "config.h"
#endif #endif
#include <dune/fufem/hdf5/singletonwriter.hh>
#include "frictionalboundary-writer.hh" #include "frictionalboundary-writer.hh"
#include "restrict.hh" #include "restrict.hh"
template <class ProgramState, class GridView> template <class ProgramState, class GridView>
FrictionalBoundaryWriter<ProgramState, GridView>::FrictionalBoundaryWriter( FrictionalBoundaryWriter<ProgramState, GridView>::FrictionalBoundaryWriter(
HDF5Grouplike &file, Vector const &vertexCoordinates, HDF5::Grouplike &file, Vector const &vertexCoordinates,
Patch const &frictionalBoundary) Patch const &frictionalBoundary)
: group_(file, "frictionalBoundary"), : group_(file, "frictionalBoundary"),
frictionalBoundary_(frictionalBoundary), frictionalBoundary_(frictionalBoundary),
...@@ -23,7 +25,7 @@ FrictionalBoundaryWriter<ProgramState, GridView>::FrictionalBoundaryWriter( ...@@ -23,7 +25,7 @@ FrictionalBoundaryWriter<ProgramState, GridView>::FrictionalBoundaryWriter(
frictionalBoundary.numVertices()) { frictionalBoundary.numVertices()) {
auto const frictionalBoundaryCoordinates = auto const frictionalBoundaryCoordinates =
restrictToSurface(vertexCoordinates, frictionalBoundary); restrictToSurface(vertexCoordinates, frictionalBoundary);
HDF5SingletonWriter<2> frictionalBoundaryCoordinateWriter( HDF5::SingletonWriter<2> frictionalBoundaryCoordinateWriter(
group_, "coordinates", frictionalBoundaryCoordinates.size(), group_, "coordinates", frictionalBoundaryCoordinates.size(),
Vector::block_type::dimension); Vector::block_type::dimension);
setEntry(frictionalBoundaryCoordinateWriter, frictionalBoundaryCoordinates); setEntry(frictionalBoundaryCoordinateWriter, frictionalBoundaryCoordinates);
......
...@@ -3,8 +3,7 @@ ...@@ -3,8 +3,7 @@
#include <dune/fufem/boundarypatch.hh> #include <dune/fufem/boundarypatch.hh>
#include <dune/fufem/hdf5/hdf5-sequence-io.hh> #include <dune/fufem/hdf5/sequenceio.hh>
#include <dune/fufem/hdf5/hdf5-singleton-writer.hh>
template <class ProgramState, class GridView> class FrictionalBoundaryWriter { template <class ProgramState, class GridView> class FrictionalBoundaryWriter {
using ScalarVector = typename ProgramState::ScalarVector; using ScalarVector = typename ProgramState::ScalarVector;
...@@ -12,20 +11,20 @@ template <class ProgramState, class GridView> class FrictionalBoundaryWriter { ...@@ -12,20 +11,20 @@ template <class ProgramState, class GridView> class FrictionalBoundaryWriter {
using Patch = BoundaryPatch<GridView>; using Patch = BoundaryPatch<GridView>;
public: public:
FrictionalBoundaryWriter(HDF5Grouplike &file, Vector const &vertexCoordinates, FrictionalBoundaryWriter(HDF5::Grouplike &file, Vector const &vertexCoordinates,
Patch const &frictionalBoundary); Patch const &frictionalBoundary);
template <class Friction> template <class Friction>
void write(ProgramState const &programState, Friction &friction); void write(ProgramState const &programState, Friction &friction);
private: private:
HDF5Group group_; HDF5::Group group_;
Patch const &frictionalBoundary_; Patch const &frictionalBoundary_;
HDF5SequenceIO<2> frictionalBoundaryDisplacementWriter_; HDF5::SequenceIO<2> frictionalBoundaryDisplacementWriter_;
HDF5SequenceIO<2> frictionalBoundaryVelocityWriter_; HDF5::SequenceIO<2> frictionalBoundaryVelocityWriter_;
HDF5SequenceIO<1> frictionalBoundaryStateWriter_; HDF5::SequenceIO<1> frictionalBoundaryStateWriter_;
HDF5SequenceIO<1> frictionalBoundaryCoefficientWriter_; HDF5::SequenceIO<1> frictionalBoundaryCoefficientWriter_;
}; };
#endif #endif
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "iteration-writer.hh" #include "iteration-writer.hh"
IterationWriter::IterationWriter(HDF5Grouplike &file) IterationWriter::IterationWriter(HDF5::Grouplike &file)
: group_(file, "iterations"), : group_(file, "iterations"),
fpiSubGroup_(group_, "fixedPoint"), fpiSubGroup_(group_, "fixedPoint"),
mgSubGroup_(group_, "multiGrid"), mgSubGroup_(group_, "multiGrid"),
......
#ifndef SRC_HDF_ITERATION_WRITER_HH #ifndef SRC_HDF_ITERATION_WRITER_HH
#define SRC_HDF_ITERATION_WRITER_HH #define SRC_HDF_ITERATION_WRITER_HH
#include <dune/fufem/hdf5/hdf5-sequence-io.hh> #include <dune/fufem/hdf5/sequenceio.hh>
#include "../time-stepping/adaptivetimestepper.hh" #include "../time-stepping/adaptivetimestepper.hh"
class IterationWriter { class IterationWriter {
public: public:
IterationWriter(HDF5Grouplike &file); IterationWriter(HDF5::Grouplike &file);
void write(size_t timeStep, IterationRegister const &iterationCount); void write(size_t timeStep, IterationRegister const &iterationCount);
private: private:
HDF5Group group_; HDF5::Group group_;
HDF5Group fpiSubGroup_; HDF5::Group fpiSubGroup_;
HDF5Group mgSubGroup_; HDF5::Group mgSubGroup_;
HDF5SequenceIO<0, size_t> finalMGIterationWriter_; HDF5::SequenceIO<0, size_t> finalMGIterationWriter_;
HDF5SequenceIO<0, size_t> finalFPIIterationWriter_; HDF5::SequenceIO<0, size_t> finalFPIIterationWriter_;
HDF5SequenceIO<0, size_t> totalMGIterationWriter_; HDF5::SequenceIO<0, size_t> totalMGIterationWriter_;
HDF5SequenceIO<0, size_t> totalFPIIterationWriter_; HDF5::SequenceIO<0, size_t> totalFPIIterationWriter_;
}; };
#endif #endif
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#endif #endif
#include <dune/fufem/grid/hierarchic-approximation.hh> #include <dune/fufem/grid/hierarchic-approximation.hh>
#include <dune/fufem/hdf5/singletonwriter.hh>
#include "patchinfo-writer.hh" #include "patchinfo-writer.hh"
...@@ -42,7 +43,7 @@ GridEvaluator<LocalVector, GridView>::GridEvaluator( ...@@ -42,7 +43,7 @@ GridEvaluator<LocalVector, GridView>::GridEvaluator(
global[2] = zCoordinates[zi]; global[2] = zCoordinates[zi];
auto const element = hApproximation.findEntity(global); auto const element = hApproximation.findEntity(global);
localInfo[xi][zi] = localInfo[xi][zi] =
std::make_pair(element, element->geometry().local(global)); std::make_pair(element, element.geometry().local(global));
} }
} }
} }
...@@ -65,7 +66,7 @@ GridEvaluator<LocalVector, GridView>::evaluate(Function const &f) const { ...@@ -65,7 +66,7 @@ GridEvaluator<LocalVector, GridView>::evaluate(Function const &f) const {
template <class ProgramState, class VertexBasis, class GridView> template <class ProgramState, class VertexBasis, class GridView>
PatchInfoWriter<ProgramState, VertexBasis, GridView>::PatchInfoWriter( PatchInfoWriter<ProgramState, VertexBasis, GridView>::PatchInfoWriter(
HDF5Grouplike &file, VertexBasis const &vertexBasis, HDF5::Grouplike &file, VertexBasis const &vertexBasis,
Patch const &frictionalBoundary, Patch const &frictionalBoundary,
ConvexPolyhedron<LocalVector> const &weakPatch) ConvexPolyhedron<LocalVector> const &weakPatch)
: group_(file, "weakPatchGrid"), : group_(file, "weakPatchGrid"),
...@@ -74,11 +75,11 @@ PatchInfoWriter<ProgramState, VertexBasis, GridView>::PatchInfoWriter( ...@@ -74,11 +75,11 @@ PatchInfoWriter<ProgramState, VertexBasis, GridView>::PatchInfoWriter(
weakPatchGridVelocityWriter_( weakPatchGridVelocityWriter_(
group_, "velocity", gridEvaluator_.xCoordinates.size(), group_, "velocity", gridEvaluator_.xCoordinates.size(),
gridEvaluator_.zCoordinates.size(), Vector::block_type::dimension) { gridEvaluator_.zCoordinates.size(), Vector::block_type::dimension) {
HDF5SingletonWriter<1> weakPatchGridXCoordinateWriter( HDF5::SingletonWriter<1> weakPatchGridXCoordinateWriter(
group_, "xCoordinates", gridEvaluator_.xCoordinates.size()); group_, "xCoordinates", gridEvaluator_.xCoordinates.size());
setEntry(weakPatchGridXCoordinateWriter, gridEvaluator_.xCoordinates); setEntry(weakPatchGridXCoordinateWriter, gridEvaluator_.xCoordinates);
HDF5SingletonWriter<1> weakPatchGridZCoordinateWriter( HDF5::SingletonWriter<1> weakPatchGridZCoordinateWriter(
group_, "zCoordinates", gridEvaluator_.zCoordinates.size()); group_, "zCoordinates", gridEvaluator_.zCoordinates.size());
setEntry(weakPatchGridZCoordinateWriter, gridEvaluator_.zCoordinates); setEntry(weakPatchGridZCoordinateWriter, gridEvaluator_.zCoordinates);
} }
......
...@@ -6,15 +6,12 @@ ...@@ -6,15 +6,12 @@
#include <dune/fufem/boundarypatch.hh> #include <dune/fufem/boundarypatch.hh>
#include <dune/fufem/functions/basisgridfunction.hh> #include <dune/fufem/functions/basisgridfunction.hh>
#include <dune/fufem/geometry/convexpolyhedron.hh> #include <dune/fufem/geometry/convexpolyhedron.hh>
#include <dune/fufem/hdf5/hdf5-sequence-io.hh> #include <dune/fufem/hdf5/sequenceio.hh>
#include <dune/fufem/hdf5/hdf5-singleton-writer.hh>
#include "../sand-wedge-data/mygeometry.hh" #include "../one-body-problem-data/mygeometry.hh"
template <class LocalVector, class GridView> class GridEvaluator { template <class LocalVector, class GridView> class GridEvaluator {
using Element = typename GridView::Grid::template Codim<0>::Entity; using Element = typename GridView::Grid::template Codim<0>::Entity;
using ElementPointer =
typename GridView::Grid::template Codim<0>::EntityPointer;
public: public:
GridEvaluator(ConvexPolyhedron<LocalVector> const &weakPatch, GridEvaluator(ConvexPolyhedron<LocalVector> const &weakPatch,
...@@ -27,7 +24,7 @@ template <class LocalVector, class GridView> class GridEvaluator { ...@@ -27,7 +24,7 @@ template <class LocalVector, class GridView> class GridEvaluator {
Dune::BlockVector<Dune::FieldVector<double, 1>> zCoordinates; Dune::BlockVector<Dune::FieldVector<double, 1>> zCoordinates;
private: private:
std::vector<std::vector<std::pair<ElementPointer, LocalVector>>> localInfo; std::vector<std::vector<std::pair<Element, LocalVector>>> localInfo;
}; };
template <class ProgramState, class VertexBasis, class GridView> template <class ProgramState, class VertexBasis, class GridView>
...@@ -37,18 +34,18 @@ class PatchInfoWriter { ...@@ -37,18 +34,18 @@ class PatchInfoWriter {
using Patch = BoundaryPatch<GridView>; using Patch = BoundaryPatch<GridView>;
public: public:
PatchInfoWriter(HDF5Grouplike &file, VertexBasis const &vertexBasis, PatchInfoWriter(HDF5::Grouplike &file, VertexBasis const &vertexBasis,
Patch const &frictionalBoundary, Patch const &frictionalBoundary,
ConvexPolyhedron<LocalVector> const &weakPatch); ConvexPolyhedron<LocalVector> const &weakPatch);
void write(ProgramState const &programState); void write(ProgramState const &programState);
private: private:
HDF5Group group_; HDF5::Group group_;
VertexBasis const &vertexBasis_; VertexBasis const &vertexBasis_;
GridEvaluator<LocalVector, GridView> const gridEvaluator_; GridEvaluator<LocalVector, GridView> const gridEvaluator_;
HDF5SequenceIO<3> weakPatchGridVelocityWriter_; HDF5::SequenceIO<3> weakPatchGridVelocityWriter_;
}; };
#endif #endif
...@@ -5,24 +5,23 @@ ...@@ -5,24 +5,23 @@
#include "restart-io.hh" #include "restart-io.hh"
template <class ProgramState> template <class ProgramState>
RestartIO<ProgramState>::RestartIO(HDF5Grouplike &file, size_t vertexCount) RestartIO<ProgramState>::RestartIO(HDF5::Grouplike &group, size_t vertexCount)
: group_(file, "restarts"), : displacementWriter_(group, "displacement", vertexCount,
displacementWriter_(group_, "displacement", vertexCount,
Vector::block_type::dimension), Vector::block_type::dimension),
velocityWriter_(group_, "velocity", vertexCount, velocityWriter_(group, "velocity", vertexCount,
Vector::block_type::dimension), Vector::block_type::dimension),
accelerationWriter_(group_, "acceleration", vertexCount, accelerationWriter_(group, "acceleration", vertexCount,
Vector::block_type::dimension), Vector::block_type::dimension),
stateWriter_(group_, "state", vertexCount), stateWriter_(group, "state", vertexCount),
weightedNormalStressWriter_(group_, "weightedNormalStress", vertexCount), weightedNormalStressWriter_(group, "weightedNormalStress", vertexCount),
relativeTimeWriter_(group_, "relativeTime"), relativeTimeWriter_(group, "relativeTime"),
relativeTimeIncrementWriter_(group_, "relativeTimeIncrement") {} relativeTimeIncrementWriter_(group, "relativeTimeIncrement") {}
template <class ProgramState> template <class ProgramState>
void RestartIO<ProgramState>::write(ProgramState const &programState) { void RestartIO<ProgramState>::write(ProgramState const &programState) {
addEntry(displacementWriter_, programState.timeStep, programState.u); addEntry(displacementWriter_, programState.timeStep, programState.u);
addEntry(velocityWriter_, programState.timeStep, programState.v); addEntry(velocityWriter_, programState.timeStep, programState.v);
addEntry(accelerationWriter_, programState.timeStep, programState.u); addEntry(accelerationWriter_, programState.timeStep, programState.a);
addEntry(stateWriter_, programState.timeStep, programState.alpha); addEntry(stateWriter_, programState.timeStep, programState.alpha);
addEntry(weightedNormalStressWriter_, programState.timeStep, addEntry(weightedNormalStressWriter_, programState.timeStep,
programState.weightedNormalStress); programState.weightedNormalStress);
...@@ -38,7 +37,7 @@ void RestartIO<ProgramState>::read(size_t timeStep, ...@@ -38,7 +37,7 @@ void RestartIO<ProgramState>::read(size_t timeStep,
programState.timeStep = timeStep; programState.timeStep = timeStep;
readEntry(displacementWriter_, timeStep, programState.u); readEntry(displacementWriter_, timeStep, programState.u);
readEntry(velocityWriter_, timeStep, programState.v); readEntry(velocityWriter_, timeStep, programState.v);
readEntry(accelerationWriter_, timeStep, programState.u); readEntry(accelerationWriter_, timeStep, programState.a);
readEntry(stateWriter_, timeStep, programState.alpha); readEntry(stateWriter_, timeStep, programState.alpha);
readEntry(weightedNormalStressWriter_, timeStep, readEntry(weightedNormalStressWriter_, timeStep,
programState.weightedNormalStress); programState.weightedNormalStress);
......
#ifndef SRC_HDF_RESTART_HDF_HH #ifndef SRC_HDF_RESTART_HDF_HH
#define SRC_HDF_RESTART_HDF_HH #define SRC_HDF_RESTART_HDF_HH
#include <dune/fufem/hdf5/hdf5file.hh> #include <dune/fufem/hdf5/file.hh>
#include <dune/fufem/hdf5/hdf5-sequence-io.hh> #include <dune/fufem/hdf5/sequenceio.hh>
template <class ProgramState> class RestartIO { template <class ProgramState> class RestartIO {
using ScalarVector = typename ProgramState::ScalarVector; using ScalarVector = typename ProgramState::ScalarVector;
using Vector = typename ProgramState::Vector; using Vector = typename ProgramState::Vector;
public: public:
RestartIO(HDF5Grouplike &file, size_t vertexCount); RestartIO(HDF5::Grouplike &group, size_t vertexCount);
void write(ProgramState const &programState); void write(ProgramState const &programState);
void read(size_t timeStep, ProgramState &programState); void read(size_t timeStep, ProgramState &programState);
private: private:
HDF5Group group_; HDF5::SequenceIO<2> displacementWriter_;
HDF5::SequenceIO<2> velocityWriter_;
HDF5SequenceIO<2> displacementWriter_; HDF5::SequenceIO<2> accelerationWriter_;
HDF5SequenceIO<2> velocityWriter_; HDF5::SequenceIO<1> stateWriter_;
HDF5SequenceIO<2> accelerationWriter_; HDF5::SequenceIO<1> weightedNormalStressWriter_;
HDF5SequenceIO<1> stateWriter_; HDF5::SequenceIO<0> relativeTimeWriter_;
HDF5SequenceIO<1> weightedNormalStressWriter_; HDF5::SequenceIO<0> relativeTimeIncrementWriter_;
HDF5SequenceIO<0> relativeTimeWriter_;
HDF5SequenceIO<0> relativeTimeIncrementWriter_;
}; };
#endif #endif