Forked from
ogs / ogs
16795 commits behind the upstream repository.
-
Dmitri Naumov authoredDmitri Naumov authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
BoundaryCondition.h 4.38 KiB
/**
* \copyright
* Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
*/
#pragma once
#include "NumLib/NumericsConfig.h"
namespace GeoLib
{
class GeoObject;
}
namespace MeshLib
{
class Element;
class Mesh;
}
namespace MeshGeoToolsLib
{
class SearchLength;
class MeshNodeSearcher;
class BoundaryElementsSearcher;
}
namespace NumLib
{
class LocalToGlobalIndexMap;
template <typename>
struct IndexValueVector;
}
namespace ProcessLib
{
struct BoundaryConditionConfig;
struct ParameterBase;
class BoundaryCondition
{
public:
//! Applies natural BCs (i.e. non-Dirichlet BCs) to the stiffness matrix
//! \c K and the vector \c b.
virtual void applyNaturalBC(const double /*t*/, GlobalVector const& /*x*/,
GlobalMatrix& /*K*/, GlobalVector& /*b*/)
{
// By default it is assumed that the BC is not a natural BC. Therefore
// there is nothing to do here.
}
//! Writes the values of essential BCs to \c bc_values.
virtual void getEssentialBCValues(
const double /*t*/,
NumLib::IndexValueVector<GlobalIndexType>& /*bc_values*/) const
{
// By default it is assumed that the BC is not an essential BC.
// Therefore there is nothing to do here.
}
virtual ~BoundaryCondition() = default;
};
class BoundaryConditionBuilder
{
public:
virtual ~BoundaryConditionBuilder() = default;
virtual std::unique_ptr<BoundaryCondition> createBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh,
const int variable_id, const unsigned integration_order,
const unsigned shapefunction_order,
const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>&
parameters);
protected:
virtual std::unique_ptr<BoundaryCondition> createDirichletBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh, const int variable_id,
const unsigned integration_order,
const unsigned shapefunction_order,
const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>&
parameters);
virtual std::unique_ptr<BoundaryCondition> createNeumannBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh, const int variable_id,
const unsigned integration_order, const unsigned shapefunction_order,
const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>&
parameters);
virtual std::unique_ptr<BoundaryCondition> createRobinBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh, const int variable_id,
const unsigned integration_order, const unsigned shapefunction_order,
const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>&
parameters);
virtual std::unique_ptr<BoundaryCondition>
createNonuniformDirichletBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh, const int variable_id);
virtual std::unique_ptr<BoundaryCondition>
createNonuniformNeumannBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh, const int variable_id,
const unsigned integration_order, const unsigned shapefunction_order);
virtual std::unique_ptr<BoundaryCondition> createPressureBoundaryCondition(
const BoundaryConditionConfig& config,
const NumLib::LocalToGlobalIndexMap& dof_table,
const MeshLib::Mesh& mesh, const int variable_id,
const unsigned integration_order, const unsigned shapefunction_order,
const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>&
parameters);
static std::vector<MeshLib::Element*> getClonedElements(
MeshGeoToolsLib::BoundaryElementsSearcher& boundary_element_searcher,
GeoLib::GeoObject const& geometry);
};
} // ProcessLib