Skip to content
Snippets Groups Projects
body.cc 9.91 KiB
Newer Older
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

podlesny's avatar
.  
podlesny committed
#include <dune/common/hybridutilities.hh>
#include <dune/tectonic/utils/debugutils.hh>

podlesny's avatar
.  
podlesny committed
// -------------------------------
// --- LeafBody Implementation ---
// -------------------------------
template <class GridTEMPLATE, class VectorType>
LeafBody<GridTEMPLATE, VectorType>::LeafBody(
        const std::shared_ptr<BodyData<dim>>& bodyData,
        const std::shared_ptr<GridTEMPLATE>& hostGrid) :
    bodyData_(bodyData),
podlesny's avatar
.  
podlesny committed
    hostGrid_(hostGrid),
    deformation_(std::make_shared<DeformationFunction>(hostGrid_->leafGridView())),
    grid_(std::make_shared<GridType>(*hostGrid_, *deformation_)),
    gridView_(grid_->leafGridView()),
    assembler_(std::make_shared<Assembler>(gridView_)),
podlesny's avatar
.  
podlesny committed
    boundaryConditions_.resize(0);
podlesny's avatar
.  
podlesny committed

    externalForce_ = [&](double relativeTime, VectorType &ell) {
        // Problem formulation: right-hand side
podlesny's avatar
.  
podlesny committed
        std::vector<std::shared_ptr<BoundaryCondition>> leafNeumannConditions;
        boundaryConditions("neumann", leafNeumannConditions);
podlesny's avatar
.  
podlesny committed
        ell.resize(gravityFunctional_.size());
        ell = gravityFunctional_;

        for (size_t i=0; i<leafNeumannConditions.size(); i++) {
            const auto& leafNeumannCondition = leafNeumannConditions[i];

            VectorType b;
podlesny's avatar
podlesny committed
            assembler_->assembleNeumann(*leafNeumannCondition->boundaryPatch(),
                                        *leafNeumannCondition->boundaryNodes(),
                                        b,
                                        *leafNeumannCondition->boundaryFunction(),
                                        relativeTime);
podlesny's avatar
.  
podlesny committed
            ell += b;
        }
    };
podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::assemble() {

    // assemble matrices
    assembler_->assembleElasticity(bodyData_->getYoungModulus(), bodyData_->getPoissonRatio(), *matrices_.elasticity);
    //print(*matrices_.elasticity, "elasticity");

    assembler_->assembleViscosity(bodyData_->getShearViscosityField(), bodyData_->getBulkViscosityField(), *matrices_.damping);
    //print(*matrices_.damping, "viscosity");

    assembler_->assembleMass(bodyData_->getDensityField(), *matrices_.mass);
    //print(*matrices_.mass, "mass");

    // assemble forces
    assembler_->assembleBodyForce(bodyData_->getGravityField(), gravityFunctional_);
    //print(gravityFunctional_, "gravity");
podlesny's avatar
.  
podlesny committed
// setter and getter

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::data() const
-> const std::shared_ptr<BodyData<dim>>& {
podlesny's avatar
.  
podlesny committed

    return bodyData_;
}


podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::setDeformation(const VectorType& def) {
podlesny's avatar
.  
podlesny committed
    deformation_->setDeformation(def);
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::deformation() const
podlesny's avatar
.  
podlesny committed
-> DeformationFunction& {

    return *deformation_;
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::grid() const
-> std::shared_ptr<GridType> {
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    return grid_;
podlesny's avatar
.  
podlesny committed
}

podlesny's avatar
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::hostGrid() const
-> std::shared_ptr<GridTEMPLATE> {

    return hostGrid_;
}
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::gridView() const
-> const GridView& {
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    return gridView_;
podlesny's avatar
.  
podlesny committed
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::nVertices() const
-> size_t {
    return gridView_.size(dim);
podlesny's avatar
.  
podlesny committed
}


podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::assembler() const
podlesny's avatar
.  
podlesny committed
-> const std::shared_ptr<Assembler>& {

    return assembler_;
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::matrices() const
podlesny's avatar
.  
podlesny committed
-> const Matrices<Matrix,1>& {

    return matrices_;
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::externalForce() const
podlesny's avatar
.  
podlesny committed
-> const ExternalForce& {

    return externalForce_;
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::addBoundaryCondition(std::shared_ptr<BoundaryCondition> boundaryCondition) {
    boundaryConditions_.emplace_back(boundaryCondition);
podlesny's avatar
.  
podlesny committed
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::boundaryConditions(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
podlesny's avatar
.  
podlesny committed
        std::vector<std::shared_ptr<BoundaryCondition>>& selectedConditions) const {
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    selectedConditions.resize(0);
podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<boundaryConditions_.size(); i++) {
        if (boundaryConditions_[i]->tag() == tag)
            selectedConditions.emplace_back(boundaryConditions_[i]);
podlesny's avatar
.  
podlesny committed
    }
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
auto LeafBody<GridTEMPLATE, VectorType>::boundaryConditions() const
-> const std::vector<std::shared_ptr<BoundaryCondition>>& {
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    return boundaryConditions_;
podlesny's avatar
.  
podlesny committed
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::boundaryPatchNodes(
        const std::string& tag,
        BoundaryPatchNodes& nodes) const {

    std::vector<std::shared_ptr<typename LeafBody::BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    nodes.resize(_boundaryConditions.size());
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<nodes.size(); i++) {
        nodes[i] = _boundaryConditions[i]->boundaryPatch()->getVertices();
    }
podlesny's avatar
.  
podlesny committed
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::boundaryNodes(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
podlesny's avatar
.  
podlesny committed
        BoundaryNodes& nodes) const {

    std::vector<std::shared_ptr<typename LeafBody::BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);

    nodes.resize(_boundaryConditions.size());

    for (size_t i=0; i<nodes.size(); i++) {
        nodes[i] = _boundaryConditions[i]->boundaryNodes().get();
podlesny's avatar
.  
podlesny committed
    }
}

podlesny's avatar
.  
podlesny committed
template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::boundaryFunctions(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
podlesny's avatar
.  
podlesny committed
        BoundaryFunctions& functions) const {
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    std::vector<std::shared_ptr<typename LeafBody::BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);

    functions.resize(_boundaryConditions.size());

    for (size_t i=0; i<functions.size(); i++) {
        functions[i] = _boundaryConditions[i]->boundaryFunction().get();
    }
}

template <class GridTEMPLATE, class VectorType>
void LeafBody<GridTEMPLATE, VectorType>::boundaryPatches(
        const std::string& tag,
        BoundaryPatches& patches) const {

    std::vector<std::shared_ptr<typename LeafBody::BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);

    patches.resize(_boundaryConditions.size());

    for (size_t i=0; i<patches.size(); i++) {
        patches[i] = _boundaryConditions[i]->boundaryPatch().get();
podlesny's avatar
.  
podlesny committed
    }
}


podlesny's avatar
.  
podlesny committed
// ---------------------------
// --- Body Implementation ---
// ---------------------------

// setter and getter

template <class GridView>
auto Body<GridView>::data() const
-> const std::shared_ptr<BodyData<dim>>& {

    return bodyData_;
}


template <class GridView>
auto Body<GridView>::grid() const
-> std::shared_ptr<GridType> {

    return grid_;
podlesny's avatar
.  
podlesny committed
}

podlesny's avatar
.  
podlesny committed
template <class GridView>
auto Body<GridView>::gridView() const
-> const GridView& {

    return gridView_;
}

template <class GridView>
auto Body<GridView>::nVertices() const
-> size_t {
    return gridView_.size(dim);
}


template <class GridView>
void Body<GridView>::addBoundaryCondition(std::shared_ptr<BoundaryCondition> boundaryCondition) {

    boundaryConditions_.push_back(boundaryCondition);
}


template <class GridView>
void Body<GridView>::boundaryConditions(
        const std::string& tag,
        std::vector<std::shared_ptr<BoundaryCondition>>& selectedConditions) const {

    selectedConditions.resize(0);
    for (size_t i=0; i<boundaryConditions_.size(); i++) {
        if (boundaryConditions_[i]->tag() == tag)
            selectedConditions.push_back(boundaryConditions_[i]);
    }
}


template <class GridView>
auto Body<GridView>::boundaryConditions() const
-> const std::vector<std::shared_ptr<BoundaryCondition>>& {
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    return boundaryConditions_;
podlesny's avatar
.  
podlesny committed
}


podlesny's avatar
.  
podlesny committed
template <class GridView>
void Body<GridView>::boundaryPatchNodes(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
        BoundaryPatchNodes& nodes) const {

podlesny's avatar
.  
podlesny committed
    std::vector<std::shared_ptr<BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    nodes.resize(_boundaryConditions.size());
podlesny's avatar
.  
podlesny committed

    for (size_t i=0; i<nodes.size(); i++) {
podlesny's avatar
.  
podlesny committed
        nodes[i] = _boundaryConditions[i]->boundaryPatch()->getVertices();
podlesny's avatar
.  
podlesny committed
    }
}

podlesny's avatar
.  
podlesny committed
template <class GridView>
void Body<GridView>::boundaryNodes(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
        BoundaryNodes& nodes) const {

podlesny's avatar
.  
podlesny committed
    std::vector<std::shared_ptr<BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    nodes.resize(_boundaryConditions.size());
podlesny's avatar
.  
podlesny committed

    for (size_t i=0; i<nodes.size(); i++) {
podlesny's avatar
.  
podlesny committed
        nodes[i] = _boundaryConditions[i]->boundaryNodes().get();
podlesny's avatar
.  
podlesny committed
    }
}

podlesny's avatar
.  
podlesny committed
template <class GridView>
void Body<GridView>::boundaryFunctions(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
        BoundaryFunctions& functions) const {

podlesny's avatar
.  
podlesny committed
    std::vector<std::shared_ptr<BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);
podlesny's avatar
.  
podlesny committed

podlesny's avatar
.  
podlesny committed
    functions.resize(_boundaryConditions.size());
podlesny's avatar
.  
podlesny committed

    for (size_t i=0; i<functions.size(); i++) {
podlesny's avatar
.  
podlesny committed
        functions[i] = _boundaryConditions[i]->boundaryFunction().get();
podlesny's avatar
.  
podlesny committed
    }
}

podlesny's avatar
.  
podlesny committed
template <class GridView>
void Body<GridView>::boundaryPatches(
podlesny's avatar
.  
podlesny committed
        const std::string& tag,
        BoundaryPatches& patches) const {

podlesny's avatar
.  
podlesny committed
    std::vector<std::shared_ptr<BoundaryCondition>> _boundaryConditions;
    this->boundaryConditions(tag, _boundaryConditions);
podlesny's avatar
.  
podlesny committed
    patches.resize(_boundaryConditions.size());
podlesny's avatar
.  
podlesny committed
    for (size_t i=0; i<patches.size(); i++) {
podlesny's avatar
.  
podlesny committed
        patches[i] = _boundaryConditions[i]->boundaryPatch().get();