30 #include "libmesh/zero_function.h"
31 #include "libmesh/dirichlet_boundaries.h"
32 #include "libmesh/dof_map.h"
33 #include "libmesh/fem_system.h"
44 std::string var_str =
"Physics/"+
_physics_name+
"/bc_variables";
47 this->
read_bc_data( input, id_str, bc_str, var_str, val_str );
61 if( bc_type ==
"pinned" )
64 else if( bc_type ==
"constant_displacement" )
67 else if( bc_type ==
"roller_x" )
70 else if( bc_type ==
"roller_y" )
73 else if( bc_type ==
"roller_z" )
76 else if( bc_type ==
"yz_symmetry" )
79 else if( bc_type ==
"xz_symmetry" )
82 else if( bc_type ==
"xy_symmetry" )
85 else if( bc_type ==
"constant_traction" )
105 const std::string& bc_id_string,
107 const std::string& bc_vars,
108 const std::string& bc_value,
109 const GetPot& input )
123 int n_disp_comps = input.vector_variable_size(
"Physics/"+
_physics_name+
"/displacement_"+bc_id_string);
127 if( n_disp_comps < 2 )
129 std::cerr <<
"Error: Must specify at least 2 displacement components for 2-D problem." << std::endl;
136 if( n_disp_comps < 3 )
138 std::cerr <<
"Error: Must specify 3 displacement components for 3-D problem." << std::endl;
143 for(
int i = 0; i < n_disp_comps; i++ )
146 input(
"Physics/"+
_physics_name+
"/displacement_"+bc_id_string, 0.0, i ),
167 libMesh::Gradient t_in;
169 int num_t_components = input.vector_variable_size(
"Physics/"+
_physics_name+
"/traction_"+bc_id_string);
171 if( num_t_components < 3 )
173 std::cerr <<
"Error: Expecting 3 components when specifying traction!" << std::endl
174 <<
" Found " << num_t_components <<
" components." << std::endl;
178 for(
int i = 0; i < num_t_components; i++ )
180 t_in(i) = input(
"Physics/"+
_physics_name+
"/traction_"+bc_id_string, 0.0, i );
191 bc_vars, bc_value, input );
200 libMesh::DofMap& dof_map,
225 std::set<BoundaryID> dbc_ids;
226 dbc_ids.insert(bc_id);
228 std::vector<VariableIndex> dbc_vars;
229 dbc_vars.push_back(u_var);
232 dbc_vars.push_back(v_var);
235 dbc_vars.push_back(w_var);
237 libMesh::ZeroFunction<libMesh::Number> zero;
239 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
243 dof_map.add_dirichlet_boundary( no_slip_dbc );
249 std::set<BoundaryID> dbc_ids;
250 dbc_ids.insert(bc_id);
252 std::vector<VariableIndex> dbc_vars;
258 dbc_vars.push_back(u_var);
259 libMesh::ConstFunction<libMesh::Number>
262 libMesh::DirichletBoundary disp_dbc(dbc_ids,
266 dof_map.add_dirichlet_boundary( disp_dbc );
272 dbc_vars.push_back(v_var);
273 libMesh::ConstFunction<libMesh::Number>
276 libMesh::DirichletBoundary disp_dbc(dbc_ids,
280 dof_map.add_dirichlet_boundary( disp_dbc );
286 dbc_vars.push_back(w_var);
287 libMesh::ConstFunction<libMesh::Number>
290 libMesh::DirichletBoundary disp_dbc(dbc_ids,
294 dof_map.add_dirichlet_boundary( disp_dbc );
302 std::set<BoundaryID> dbc_ids;
303 dbc_ids.insert(bc_id);
305 std::vector<VariableIndex> dbc_vars;
308 dbc_vars.push_back(v_var);
311 dbc_vars.push_back(w_var);
313 libMesh::ZeroFunction<libMesh::Number> zero;
315 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
319 dof_map.add_dirichlet_boundary( no_slip_dbc );
326 std::set<BoundaryID> dbc_ids;
327 dbc_ids.insert(bc_id);
329 std::vector<VariableIndex> dbc_vars;
330 dbc_vars.push_back(u_var);
333 dbc_vars.push_back(w_var);
335 libMesh::ZeroFunction<libMesh::Number> zero;
337 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
341 dof_map.add_dirichlet_boundary( no_slip_dbc );
348 std::set<BoundaryID> dbc_ids;
349 dbc_ids.insert(bc_id);
351 std::vector<VariableIndex> dbc_vars;
352 dbc_vars.push_back(u_var);
353 dbc_vars.push_back(v_var);
355 libMesh::ZeroFunction<libMesh::Number> zero;
357 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
361 dof_map.add_dirichlet_boundary( no_slip_dbc );
368 std::set<BoundaryID> dbc_ids;
369 dbc_ids.insert(bc_id);
371 std::vector<VariableIndex> dbc_vars;
372 dbc_vars.push_back(u_var);
374 libMesh::ZeroFunction<libMesh::Number> zero;
376 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
380 dof_map.add_dirichlet_boundary( no_slip_dbc );
387 std::set<BoundaryID> dbc_ids;
388 dbc_ids.insert(bc_id);
390 std::vector<VariableIndex> dbc_vars;
391 dbc_vars.push_back(v_var);
393 libMesh::ZeroFunction<libMesh::Number> zero;
395 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
399 dof_map.add_dirichlet_boundary( no_slip_dbc );
406 std::set<BoundaryID> dbc_ids;
407 dbc_ids.insert(bc_id);
409 std::vector<VariableIndex> dbc_vars;
410 dbc_vars.push_back(w_var);
412 libMesh::ZeroFunction<libMesh::Number> zero;
414 libMesh::DirichletBoundary no_slip_dbc(dbc_ids,
418 dof_map.add_dirichlet_boundary( no_slip_dbc );
424 std::cerr <<
"Invalid BCType " << bc_type << std::endl;
437 const BCType bc_type )
const
457 std::cerr <<
"Error: Invalid Neumann BC type for " <<
_physics_name
virtual void user_init_dirichlet_bcs(libMesh::FEMSystem *system, libMesh::DofMap &dof_map, GRINS::BoundaryID bc_id, GRINS::BCType bc_type) const
unsigned int VariableIndex
More descriptive name of the type used for variable indices.
virtual void read_bc_data(const GetPot &input, const std::string &id_str, const std::string &bc_str, const std::string &var_str, const std::string &val_str)
void apply_neumann_normal(AssemblyContext &context, const VariableIndex var, const libMesh::Real sign, const FEShape &value) const
Applies Neumann boundary conditions for the constant case.
VariableIndex v_var() const
libMesh::boundary_id_type BoundaryID
More descriptive name of the type used for boundary ids.
void set_dirichlet_bc_value(GRINS::BoundaryID bc_id, libMesh::Real value, int component=0)
void set_neumann_bc_value(GRINS::BoundaryID bc_id, const libMesh::Point &q_in)
VariableIndex w_var() const
const libMesh::Point & get_neumann_bc_value(GRINS::BoundaryID bc_id) const
SolidMechanicsBCHandling()
virtual void init_bc_types(const GRINS::BoundaryID bc_id, const std::string &bc_id_string, const int bc_type, const std::string &bc_vars, const std::string &bc_value, const GetPot &input)
VariableIndex u_var() const
const std::string & w_var_name() const
void init(libMesh::FEMSystem *system)
Initialize System variables.
SolidMechanicsVariables _disp_vars
virtual int string_to_int(const std::string &bc_type_in) const
GRINS::BoundaryConditions _bound_conds
Object that stashes generic boundary condition types.
virtual void user_apply_neumann_bcs(AssemblyContext &context, const GRINS::CachedValues &cache, const bool request_jacobian, const GRINS::BoundaryID bc_id, const GRINS::BCType bc_type) const
Base class for reading and handling boundary conditions for physics classes.
virtual void init_bc_types(const GRINS::BoundaryID bc_id, const std::string &bc_id_string, const int bc_type, const std::string &bc_vars, const std::string &bc_value, const GetPot &input)
virtual void init_bc_data(const libMesh::FEMSystem &system)
Override this method to initialize any system-dependent data.
virtual int string_to_int(const std::string &bc_type_in) const
const std::string & v_var_name() const
void set_neumann_bc_type(GRINS::BoundaryID bc_id, int bc_type)
const std::string & u_var_name() const
virtual ~SolidMechanicsBCHandling()
void set_dirichlet_bc_type(GRINS::BoundaryID bc_id, int bc_type)
libMesh::Real get_dirichlet_bc_value(GRINS::BoundaryID bc_id, int component=0) const
std::string _physics_name