NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble::BoundaryConditionManager Class Reference

#include <nimble_boundary_condition_manager.h>

Public Types

enum  Time_Integration_Scheme { EXPLICIT = 0 , QUASISTATIC = 1 , UNDEFINED = 2 }
 

Public Member Functions

 BoundaryConditionManager ()
 
void Initialize (std::map< int, std::string > const &node_set_names, std::map< int, std::vector< int > > const &node_sets, std::map< int, std::string > const &side_set_names, std::map< int, std::vector< int > > const &side_sets, std::vector< std::string > const &bc_strings, int dim, std::string time_integration_scheme)
 
virtual ~BoundaryConditionManager ()=default
 
template<typename ViewT>
void ApplyInitialConditions (const ViewT reference_coordinates, ViewT velocity, std::vector< ViewT > &offnom_velocities)
 
template<typename ViewT>
void ApplyInitialConditions (const ViewT reference_coordinates, ViewT velocity)
 
template<typename ViewT>
void ApplyKinematicBC (double time_current, double time_previous, const ViewT reference_coordinates, ViewT displacement, ViewT velocity, std::vector< ViewT > &offnom_velocities)
 
template<typename ViewT>
void ApplyKinematicBC (double time_current, double time_previous, const ViewT reference_coordinates, ViewT displacement, ViewT velocity)
 
template<typename MatT>
void ModifyTangentStiffnessMatrixForKinematicBC (int num_unknowns, const int *global_node_ids, double diagonal_entry, MatT &tangent_stiffness) const
 
void ModifyRHSForKinematicBC (const int *global_node_ids, double *rhs) const
 
template<typename ViewT>
void ApplyTractionBC (double time_current, const ViewT reference_coordinates, ViewT internal_force)
 

Member Enumeration Documentation

◆ Time_Integration_Scheme

Enumerator
EXPLICIT 
QUASISTATIC 
UNDEFINED 
63 {
64 EXPLICIT = 0,
65 QUASISTATIC = 1,
66 UNDEFINED = 2
67 };
@ UNDEFINED
Definition nimble_boundary_condition_manager.h:66
@ EXPLICIT
Definition nimble_boundary_condition_manager.h:64
@ QUASISTATIC
Definition nimble_boundary_condition_manager.h:65

Constructor & Destructor Documentation

◆ BoundaryConditionManager()

nimble::BoundaryConditionManager::BoundaryConditionManager ( )
inline
69{}

◆ ~BoundaryConditionManager()

virtual nimble::BoundaryConditionManager::~BoundaryConditionManager ( )
virtualdefault

Member Function Documentation

◆ ApplyInitialConditions() [1/2]

template<typename ViewT>
void nimble::BoundaryConditionManager::ApplyInitialConditions ( const ViewT reference_coordinates,
ViewT velocity )
inline
131 {
132 std::vector<ViewT> empty;
133 ApplyInitialConditions<ViewT>(reference_coordinates, velocity, empty);
134 }
void ApplyInitialConditions(const ViewT reference_coordinates, ViewT velocity, std::vector< ViewT > &offnom_velocities)
Definition nimble_boundary_condition_manager.h:95

◆ ApplyInitialConditions() [2/2]

template<typename ViewT>
void nimble::BoundaryConditionManager::ApplyInitialConditions ( const ViewT reference_coordinates,
ViewT velocity,
std::vector< ViewT > & offnom_velocities )
inline
96 {
97 for (auto& bc : boundary_conditions_) {
98 if (bc.bc_type_ == BoundaryCondition::INITIAL_VELOCITY) {
99 int node_set_id = bc.node_set_id_;
100 int coordinate = bc.coordinate_;
101 bool has_expression = bc.has_expression_;
102 std::vector<int> const& node_set = node_sets_[node_set_id];
103 if (!has_expression) {
104 double magnitude = bc.magnitude_;
105 for (int n : node_set) {
106 velocity(n, coordinate) = magnitude;
107 for (int nuq = 0; nuq < offnom_velocities.size(); nuq++) {
108 offnom_velocities[nuq](n, coordinate) = magnitude;
109 }
110 }
111 } else {
112 for (int n : node_set) {
113 bc.expression_.x = reference_coordinates(n, 0);
114 bc.expression_.y = reference_coordinates(n, 1);
115 bc.expression_.z = 0.0;
116 if (dim_ == 3) { bc.expression_.z = reference_coordinates(n, 2); }
117 bc.expression_.t = 0.0;
118 velocity(n, coordinate) = bc.expression_.eval();
119 for (int nuq = 0; nuq < offnom_velocities.size(); nuq++) {
120 offnom_velocities[nuq](n, coordinate) = bc.expression_.eval();
121 }
122 }
123 }
124 }
125 }
126 }
@ INITIAL_VELOCITY
Definition nimble_boundary_condition.h:65

◆ ApplyKinematicBC() [1/2]

template<typename ViewT>
void nimble::BoundaryConditionManager::ApplyKinematicBC ( double time_current,
double time_previous,
const ViewT reference_coordinates,
ViewT displacement,
ViewT velocity )
inline
214 {
215 std::vector<ViewT> empty;
216 ApplyKinematicBC(time_current, time_previous, reference_coordinates, displacement, velocity, empty);
217 }
void ApplyKinematicBC(double time_current, double time_previous, const ViewT reference_coordinates, ViewT displacement, ViewT velocity, std::vector< ViewT > &offnom_velocities)
Definition nimble_boundary_condition_manager.h:138

◆ ApplyKinematicBC() [2/2]

template<typename ViewT>
void nimble::BoundaryConditionManager::ApplyKinematicBC ( double time_current,
double time_previous,
const ViewT reference_coordinates,
ViewT displacement,
ViewT velocity,
std::vector< ViewT > & offnom_velocities )
inline
145 {
146 double delta_t = time_current - time_previous;
147
148 for (auto& bc : boundary_conditions_) {
149 int node_set_id = bc.node_set_id_;
150 int coordinate = bc.coordinate_;
151 bool has_expression = bc.has_expression_;
152 std::vector<int> const& node_set = node_sets_[node_set_id];
153
154 if (bc.bc_type_ == BoundaryCondition::PRESCRIBED_VELOCITY) {
155 if (!has_expression) {
156 double velocity_magnitude = bc.magnitude_;
157 for (int n : node_set) {
158 velocity(n, coordinate) = velocity_magnitude;
159 for (int nuq = 0; nuq < offnom_velocities.size(); nuq++) {
160 offnom_velocities[nuq](n, coordinate) = velocity_magnitude;
161 }
162 if (time_integration_scheme_ == QUASISTATIC) {
163 displacement(n, coordinate) += velocity_magnitude * delta_t;
164 }
165 }
166 } else {
167 for (int n : node_set) {
168 bc.expression_.x = reference_coordinates(n, 0);
169 bc.expression_.y = reference_coordinates(n, 1);
170 bc.expression_.z = 0.0;
171 if (dim_ == 3) { bc.expression_.z = reference_coordinates(n, 2); }
172 bc.expression_.t = time_current;
173 double velocity_magnitude = bc.expression_.eval();
174 velocity(n, coordinate) = velocity_magnitude;
175 for (int nuq = 0; nuq < offnom_velocities.size(); nuq++) {
176 offnom_velocities[nuq](n, coordinate) = velocity_magnitude;
177 }
178 if (time_integration_scheme_ == QUASISTATIC) {
179 displacement(n, coordinate) += velocity_magnitude * delta_t;
180 }
181 }
182 }
183 } else if (bc.bc_type_ == BoundaryCondition::PRESCRIBED_DISPLACEMENT && delta_t > 0.0) {
184 if (!has_expression) {
185 double displacement_magnitude = bc.magnitude_;
186 for (int n : node_set) {
187 velocity(n, coordinate) = (displacement_magnitude - displacement(n, coordinate)) / delta_t;
188 if (time_integration_scheme_ == QUASISTATIC) { displacement(n, coordinate) = displacement_magnitude; }
189 }
190 } else {
191 for (int n : node_set) {
192 bc.expression_.x = reference_coordinates(n, 0);
193 bc.expression_.y = reference_coordinates(n, 1);
194 bc.expression_.z = 0.0;
195 if (dim_ == 3) { bc.expression_.z = reference_coordinates(n, 2); }
196 bc.expression_.t = time_current;
197 double displacement_magnitude = bc.expression_.eval();
198 velocity(n, coordinate) = (displacement_magnitude - displacement(n, coordinate)) / delta_t;
199 if (time_integration_scheme_ == QUASISTATIC) { displacement(n, coordinate) = displacement_magnitude; }
200 }
201 }
202 }
203 }
204 }
@ PRESCRIBED_VELOCITY
Definition nimble_boundary_condition.h:66
@ PRESCRIBED_DISPLACEMENT
Definition nimble_boundary_condition.h:67

◆ ApplyTractionBC()

template<typename ViewT>
void nimble::BoundaryConditionManager::ApplyTractionBC ( double time_current,
const ViewT reference_coordinates,
ViewT internal_force )
inline
233 {
234 for (auto& bc : boundary_conditions_) {
235 int side_set_id = bc.side_set_id_;
236 int coordinate = bc.coordinate_;
237 bool has_expression = bc.has_expression_;
238 std::vector<int> const& side_set = side_sets_[side_set_id];
239 if (bc.bc_type_ == BoundaryCondition::PRESCRIBED_TRACTION) {
240 if (has_expression == true) {
241 for (int ss : side_set) {}
242 } else {
243 for (int ss : side_set) {}
244 }
245 }
246 }
247 }
@ PRESCRIBED_TRACTION
Definition nimble_boundary_condition.h:68

◆ Initialize()

void nimble::BoundaryConditionManager::Initialize ( std::map< int, std::string > const & node_set_names,
std::map< int, std::vector< int > > const & node_sets,
std::map< int, std::string > const & side_set_names,
std::map< int, std::vector< int > > const & side_sets,
std::vector< std::string > const & bc_strings,
int dim,
std::string time_integration_scheme )
59{
60 node_set_names_ = node_set_names;
61 node_sets_ = node_sets;
62 side_set_names_ = side_set_names;
63 side_sets_ = side_sets;
64 dim_ = dim;
65
66 if (time_integration_scheme == "explicit") {
67 time_integration_scheme_ = EXPLICIT;
68 } else if (time_integration_scheme == "quasistatic") {
69 time_integration_scheme_ = QUASISTATIC;
70 }
71
72 for (int i = 0; i < bc_strings.size(); i++) {
73 BoundaryCondition bc;
74 bool is_valid = bc.Initialize(dim_, bc_strings[i], node_set_names, side_set_names);
75 if (is_valid) { boundary_conditions_.push_back(bc); }
76 }
77}

◆ ModifyRHSForKinematicBC()

void nimble::BoundaryConditionManager::ModifyRHSForKinematicBC ( const int * global_node_ids,
double * rhs ) const
122{
123 for (unsigned int i_bc = 0; i_bc < boundary_conditions_.size(); i_bc++) {
124 BoundaryCondition const& bc = boundary_conditions_[i_bc];
125 int node_set_id = bc.node_set_id_;
126 int coordinate = bc.coordinate_;
127 std::vector<int> const& node_set = node_sets_.at(node_set_id);
128
131 for (unsigned int n = 0; n < node_set.size(); n++) {
132 rhs[global_node_ids[node_set[n]] * dim_ + coordinate] = 0.0;
133 }
134 }
135 }
136}

◆ ModifyTangentStiffnessMatrixForKinematicBC()

template<typename MatT>
template void nimble::BoundaryConditionManager::ModifyTangentStiffnessMatrixForKinematicBC< CRSMatrixContainer > ( int num_unknowns,
const int * global_node_ids,
double diagonal_entry,
MatT & tangent_stiffness ) const
86{
87 for (unsigned int i_bc = 0; i_bc < boundary_conditions_.size(); i_bc++) {
88 BoundaryCondition const& bc = boundary_conditions_[i_bc];
89 int node_set_id = bc.node_set_id_;
90 int coordinate = bc.coordinate_;
91 std::vector<int> const& node_set = node_sets_.at(node_set_id);
92
95 for (unsigned int n = 0; n < node_set.size(); n++) {
96 int index = global_node_ids[node_set[n]] * dim_ + coordinate;
97 tangent_stiffness.SetRowValues(index, 0.0);
98 tangent_stiffness.SetColumnValues(index, 0.0);
99 tangent_stiffness(index, index) = diagonal_entry;
100 }
101 }
102 }
103}

The documentation for this class was generated from the following files: