41 template <
int spatial_dim,
typename AppliedDisplacementFunction>
42 void setVectorBCs(
const Domain& domain, std::vector<int> components, AppliedDisplacementFunction applied_displacement)
44 int field_dim = space_.GetVDim();
45 for (
auto component : components) {
46 SLIC_ERROR_IF(component >= field_dim || component < 0,
47 std::format(
"Trying to set boundary conditions on a field with dim {}, using component {}",
48 field_dim, component));
49 auto mfem_coefficient_function = [applied_displacement, component](
const mfem::Vector& X_mfem,
double t) {
50 auto X = make_tensor<spatial_dim>([&X_mfem](
int k) {
return X_mfem[k]; });
51 return applied_displacement(t, X)[component];
54 auto dof_list = domain.
dof_list(&space_);
56 space_.DofsToVDofs(
static_cast<int>(component), dof_list);
58 auto component_disp_bdr_coef_ = std::make_shared<mfem::FunctionCoefficient>(mfem_coefficient_function);
59 bcs_.
addEssential(dof_list, component_disp_bdr_coef_, space_,
static_cast<int>(component));
64 template <
int spatial_dim,
typename AppliedDisplacementFunction>
67 const int field_dim = space_.GetVDim();
68 std::vector<int> components(
static_cast<size_t>(field_dim));
69 for (
int component = 0; component < field_dim; ++component) {
70 components[
static_cast<size_t>(component)] = component;
72 setVectorBCs<spatial_dim>(domain, components, applied_displacement);
80 template <
int spatial_dim,
typename AppliedDisplacementFunction>
83 auto mfem_coefficient_function = [applied_displacement](
const mfem::Vector& X_mfem,
double t) {
84 auto X = make_tensor<spatial_dim>([&X_mfem](
int k) {
return X_mfem[k]; });
85 return applied_displacement(t, X);
88 auto dof_list = domain.
dof_list(&space_);
89 space_.DofsToVDofs(
static_cast<int>(0), dof_list);
91 auto component_disp_bdr_coef_ = std::make_shared<mfem::FunctionCoefficient>(mfem_coefficient_function);
92 bcs_.
addEssential(dof_list, component_disp_bdr_coef_, space_, 0);
96 template <
int spatial_dim,
typename AppliedDisplacementFunction>
99 auto mfem_coefficient_function = [applied_displacement](
const mfem::Vector& X_mfem,
double t) {
100 auto X = make_tensor<spatial_dim>([&X_mfem](
int k) {
return X_mfem[k]; });
101 return applied_displacement(t, X);
104 auto component_disp_bdr_coef_ = std::make_shared<mfem::FunctionCoefficient>(mfem_coefficient_function);
105 bcs_.
addEssential(local_dofs, component_disp_bdr_coef_, space_, 0);
109 template <
int spatial_dim>
112 setScalarBCs<spatial_dim>(domain, [](
auto,
auto) {
return 0.0; });
116 template <
int spatial_dim>
119 setScalarBCsOnLocalDofs<spatial_dim>(local_dofs, [](
auto,
auto) {
return 0.0; });
123 template <
int spatial_dim,
int field_dim>
129 template <
int spatial_dim>
133 setFixedVectorBCs<spatial_dim, spatial_dim>(domain, components);
137 template <
int spatial_dim,
int field_dim>
140 std::vector<int> components{component};
141 setFixedVectorBCs<spatial_dim, field_dim>(domain, components);
145 template <
int spatial_dim>
148 setFixedVectorBCs<spatial_dim, spatial_dim>(domain, component);
152 template <
int spatial_dim,
int field_dim = spatial_dim>
155 SLIC_ERROR_IF(field_dim != space_.GetVDim(),
"Vector boundary condition field_dim does not match the fields vdim");
156 std::vector<int> components(
static_cast<size_t>(field_dim));
157 for (
int component = 0; component < field_dim; ++component) {
158 components[
static_cast<size_t>(component)] = component;
160 setFixedVectorBCs<spatial_dim, field_dim>(domain, components);
176 const mfem::ParMesh& mfem_mesh_;
178 mfem::ParFiniteElementSpace& space_;
180 mutable std::optional<BoundaryConditionManager> second_derivative_manager_;
This file contains the declaration of the boundary condition manager class.
A container for the boundary condition information relating to a specific physics module.
void addEssential(const std::set< int > &ess_bdr, smith::GeneralCoefficient ess_bdr_coef, mfem::ParFiniteElementSpace &space, const std::optional< int > component={})
Set the essential boundary conditions from a list of boundary markers and a coefficient.
A generic class for setting Dirichlet boundary conditions on arbitrary physics.
void setFixedVectorBCs(const Domain &domain, std::vector< int > components)
Constrain the vector dofs over a domain corresponding to a subset of the vector components.
void setScalarBCsOnLocalDofs(const mfem::Array< int > &local_dofs, AppliedDisplacementFunction applied_displacement)
Specify time and space varying Dirichlet boundary conditions over an explicit list of local scalar do...
void setFixedScalarBCs(const Domain &domain)
Constrain the dofs of a scalar field over a domain.
const smith::BoundaryConditionManager & getSecondDerivativeManager() const
Return the BC manager whose prescribed values are the second time derivative of the value-level BC,...
DirichletBoundaryConditions(const mfem::ParMesh &mfem_mesh, mfem::ParFiniteElementSpace &space)
Construct from mfem::ParMesh.
void setFixedVectorBCs(const Domain &domain)
Constrain all the vector dofs over a domain.
void setScalarBCs(const Domain &domain, AppliedDisplacementFunction applied_displacement)
Specify time and space varying Dirichlet boundary conditions over a domain.
void setFixedVectorBCs(const Domain &domain, std::vector< int > components)
Constrain selected vector components over a domain to zero.
void setVectorBCs(const Domain &domain, std::vector< int > components, AppliedDisplacementFunction applied_displacement)
Specify time and space varying Dirichlet boundary conditions over a domain.
void setVectorBCs(const Domain &domain, AppliedDisplacementFunction applied_displacement)
This is an overloaded member function, provided for convenience. It differs from the above function o...
void setFixedVectorBCs(const Domain &domain, int component)
Constrain one vector component over a domain to zero.
void setFixedScalarBCsOnLocalDofs(const mfem::Array< int > &local_dofs)
Constrain an explicit list of local scalar dofs.
const smith::BoundaryConditionManager & getBoundaryConditionManager() const
Return the value-level smith BoundaryConditionManager.
void setFixedVectorBCs(const Domain &domain, int component)
Constrain one vector component over a domain to zero.
Helper class for constructing a mesh consistent with Smith.
Accelerator functionality.
mfem::ParFiniteElementSpace & space(FieldState field)
Get the space from the primal field of a field states.
a class for representing a geometric region that can be used for integration
mfem::Array< int > dof_list(const fes_t *fes) const
get mfem degree of freedom list for a given FiniteElementSpace
Arbitrary-rank tensor class.