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

Public Member Functions

 ComputeInternalForceFunctor (std::shared_ptr< Element > element, std::shared_ptr< Material > material, const std::vector< int > &def_grad_offset, const std::vector< int > &stress_offset, const std::vector< int > &state_data_offset, const double *reference_coordinates_, const double *displacement_, const double *velocity_, double *internal_force_, double time_previous_, double time_current_, int num_elem_, const int *elem_conn_, const int *elem_global_ids_, int num_element_data_, const double *elem_data_n_, double *elem_data_np1_, DataManager &data_manager_, bool is_output_step_, bool compute_stress_only_)
 
void operator() (int elem) const
 

Public Attributes

std::shared_ptr< Elementelement_
 
std::shared_ptr< Materialmaterial_
 
const std::vector< int > & def_grad_offset_
 
const std::vector< int > & stress_offset_
 
const std::vector< int > & state_data_offset_
 
const double * reference_coordinates
 
const double * displacement
 
const double * velocity
 
double * internal_force
 
double time_previous
 
double time_current
 
int num_elem
 
const int * elem_conn
 
const int * elem_global_ids
 
int num_element_data
 
const double * elem_data_n
 
double * elem_data_np1
 
DataManagerdata_manager
 
bool is_output_step
 
bool compute_stress_only
 

Constructor & Destructor Documentation

◆ ComputeInternalForceFunctor()

nimble::ComputeInternalForceFunctor::ComputeInternalForceFunctor ( std::shared_ptr< Element > element,
std::shared_ptr< Material > material,
const std::vector< int > & def_grad_offset,
const std::vector< int > & stress_offset,
const std::vector< int > & state_data_offset,
const double * reference_coordinates_,
const double * displacement_,
const double * velocity_,
double * internal_force_,
double time_previous_,
double time_current_,
int num_elem_,
const int * elem_conn_,
const int * elem_global_ids_,
int num_element_data_,
const double * elem_data_n_,
double * elem_data_np1_,
DataManager & data_manager_,
bool is_output_step_,
bool compute_stress_only_ )
inline
255 : element_(element),
256 material_(material),
257 def_grad_offset_(def_grad_offset),
258 stress_offset_(stress_offset),
259 state_data_offset_(state_data_offset),
260 reference_coordinates(reference_coordinates_),
261 displacement(displacement_),
262 velocity(velocity_),
263 internal_force(internal_force_),
264 time_previous(time_previous_),
265 time_current(time_current_),
266 num_elem(num_elem_),
267 elem_conn(elem_conn_),
268 elem_global_ids(elem_global_ids_),
269 num_element_data(num_element_data_),
270 elem_data_n(elem_data_n_),
271 elem_data_np1(elem_data_np1_),
272 data_manager(data_manager_),
273 is_output_step(is_output_step_),
274 compute_stress_only(compute_stress_only_)
275 {
276 }
double * elem_data_np1
Definition nimble_block.cc:229
std::shared_ptr< Material > material_
Definition nimble_block.cc:212
const int * elem_conn
Definition nimble_block.cc:225
double time_current
Definition nimble_block.cc:223
const double * displacement
Definition nimble_block.cc:219
const std::vector< int > & state_data_offset_
Definition nimble_block.cc:216
const double * velocity
Definition nimble_block.cc:220
int num_element_data
Definition nimble_block.cc:227
const double * elem_data_n
Definition nimble_block.cc:228
DataManager & data_manager
Definition nimble_block.cc:230
const double * reference_coordinates
Definition nimble_block.cc:218
const std::vector< int > & def_grad_offset_
Definition nimble_block.cc:214
bool is_output_step
Definition nimble_block.cc:231
bool compute_stress_only
Definition nimble_block.cc:232
double time_previous
Definition nimble_block.cc:222
std::shared_ptr< Element > element_
Definition nimble_block.cc:211
const std::vector< int > & stress_offset_
Definition nimble_block.cc:215
int num_elem
Definition nimble_block.cc:224
const int * elem_global_ids
Definition nimble_block.cc:226
double * internal_force
Definition nimble_block.cc:221

Member Function Documentation

◆ operator()()

void nimble::ComputeInternalForceFunctor::operator() ( int elem) const
inline
280 {
281 int dim = element_->Dim();
282 int num_node_per_elem = element_->NumNodesPerElement();
283 int num_int_pt_per_elem = element_->NumIntegrationPointsPerElement();
284
285 int vector_size = LengthToInt(VECTOR, dim);
286 int full_tensor_size = LengthToInt(FULL_TENSOR, dim);
287 int sym_tensor_size = LengthToInt(SYMMETRIC_TENSOR, dim);
288
289 double ref_coord[vector_size * num_node_per_elem];
290 double cur_coord[vector_size * num_node_per_elem];
291 double def_grad_n[full_tensor_size * num_int_pt_per_elem];
292 double def_grad_np1[full_tensor_size * num_int_pt_per_elem];
293 double cauchy_stress_n[sym_tensor_size * num_int_pt_per_elem];
294 double cauchy_stress_np1[sym_tensor_size * num_int_pt_per_elem];
295 double force[vector_size * num_node_per_elem];
296
297 double* state_data_n = nullptr;
298 double* state_data_np1 = nullptr;
299 std::vector<double> state_data_n_vec;
300 std::vector<double> state_data_np1_vec;
301 int num_state_data = material_->NumStateVariables();
302 if (num_state_data > 0) {
303 state_data_n_vec.resize(num_state_data * num_int_pt_per_elem);
304 state_data_np1_vec.resize(num_state_data * num_int_pt_per_elem);
305 state_data_n = state_data_n_vec.data();
306 state_data_np1 = state_data_np1_vec.data();
307 }
308
309 for (int node = 0; node < num_node_per_elem; node++) {
310 int node_id = elem_conn[elem * num_node_per_elem + node];
311 for (int i = 0; i < vector_size; i++) {
312 ref_coord[node * vector_size + i] = reference_coordinates[vector_size * node_id + i];
313 cur_coord[node * vector_size + i] =
314 reference_coordinates[vector_size * node_id + i] + displacement[vector_size * node_id + i];
315 }
316 }
317
318 element_->ComputeDeformationGradients(ref_coord, cur_coord, def_grad_np1);
319
320 const double* my_elem_data_n = &elem_data_n[elem * num_element_data];
321 double* my_elem_data_np1 = &elem_data_np1[elem * num_element_data];
322
323 // Copy data from the global data containers
324 for (int i_ipt = 0; i_ipt < num_int_pt_per_elem; i_ipt++) {
325 for (int i_component = 0; i_component < full_tensor_size; i_component++) {
326 int def_grad_offset = def_grad_offset_.at(i_ipt * full_tensor_size + i_component);
327 def_grad_n[i_ipt * full_tensor_size + i_component] = my_elem_data_n[def_grad_offset];
328 }
329 for (int i_component = 0; i_component < sym_tensor_size; i_component++) {
330 int stress_offset = stress_offset_.at(i_ipt * sym_tensor_size + i_component);
331 cauchy_stress_n[i_ipt * sym_tensor_size + i_component] = my_elem_data_n[stress_offset];
332 }
333 for (int i_component = 0; i_component < num_state_data; i_component++) {
334 int state_data_offset = state_data_offset_.at(i_ipt * num_state_data + i_component);
335 state_data_n[i_ipt * num_state_data + i_component] = my_elem_data_n[state_data_offset];
336 }
337 }
338
339 // DJL todo properly handle state data
340 material_->GetStress(
341 elem_global_ids[elem],
342 num_int_pt_per_elem,
345 def_grad_n,
346 def_grad_np1,
347 cauchy_stress_n,
348 cauchy_stress_np1,
349 state_data_n,
350 state_data_np1,
353
354 // Copy data to the global containers
355 for (int i_ipt = 0; i_ipt < num_int_pt_per_elem; i_ipt++) {
356 for (int i_component = 0; i_component < full_tensor_size; i_component++) {
357 int def_grad_offset = def_grad_offset_.at(i_ipt * full_tensor_size + i_component);
358 my_elem_data_np1[def_grad_offset] = def_grad_np1[i_ipt * full_tensor_size + i_component];
359 }
360 for (int i_component = 0; i_component < sym_tensor_size; i_component++) {
361 int stress_offset = stress_offset_.at(i_ipt * sym_tensor_size + i_component);
362 my_elem_data_np1[stress_offset] = cauchy_stress_np1[i_ipt * sym_tensor_size + i_component];
363 }
364 for (int i_component = 0; i_component < num_state_data; i_component++) {
365 int state_data_offset = state_data_offset_.at(i_ipt * num_state_data + i_component);
366 my_elem_data_np1[state_data_offset] = state_data_np1[i_ipt * num_state_data + i_component];
367 }
368 }
369
370 if (!compute_stress_only) {
371 element_->ComputeNodalForces(cur_coord, cauchy_stress_np1, force);
372
373 // Copy internal force to global containers
374 for (int node = 0; node < num_node_per_elem; node++) {
375 int node_id = elem_conn[elem * num_node_per_elem + node];
376 for (int i = 0; i < vector_size; i++) {
377#ifdef NIMBLE_HAVE_KOKKOS
378 Kokkos::atomic_add(&internal_force[vector_size * node_id + i], force[node * vector_size + i]);
379#else
380 internal_force[vector_size * node_id + i] += force[node * vector_size + i];
381#endif
382 }
383 }
384 }
385 }
@ VECTOR
Definition nimble_data_utils.h:89
@ SYMMETRIC_TENSOR
Definition nimble_data_utils.h:90
@ FULL_TENSOR
Definition nimble_data_utils.h:91
int LengthToInt(Length length, int dim)
Definition nimble_data_utils.cc:57

Member Data Documentation

◆ compute_stress_only

bool nimble::ComputeInternalForceFunctor::compute_stress_only

◆ data_manager

DataManager& nimble::ComputeInternalForceFunctor::data_manager

◆ def_grad_offset_

const std::vector<int>& nimble::ComputeInternalForceFunctor::def_grad_offset_

◆ displacement

const double* nimble::ComputeInternalForceFunctor::displacement

◆ elem_conn

const int* nimble::ComputeInternalForceFunctor::elem_conn

◆ elem_data_n

const double* nimble::ComputeInternalForceFunctor::elem_data_n

◆ elem_data_np1

double* nimble::ComputeInternalForceFunctor::elem_data_np1

◆ elem_global_ids

const int* nimble::ComputeInternalForceFunctor::elem_global_ids

◆ element_

std::shared_ptr<Element> nimble::ComputeInternalForceFunctor::element_

◆ internal_force

double* nimble::ComputeInternalForceFunctor::internal_force

◆ is_output_step

bool nimble::ComputeInternalForceFunctor::is_output_step

◆ material_

std::shared_ptr<Material> nimble::ComputeInternalForceFunctor::material_

◆ num_elem

int nimble::ComputeInternalForceFunctor::num_elem

◆ num_element_data

int nimble::ComputeInternalForceFunctor::num_element_data

◆ reference_coordinates

const double* nimble::ComputeInternalForceFunctor::reference_coordinates

◆ state_data_offset_

const std::vector<int>& nimble::ComputeInternalForceFunctor::state_data_offset_

◆ stress_offset_

const std::vector<int>& nimble::ComputeInternalForceFunctor::stress_offset_

◆ time_current

double nimble::ComputeInternalForceFunctor::time_current

◆ time_previous

double nimble::ComputeInternalForceFunctor::time_previous

◆ velocity

const double* nimble::ComputeInternalForceFunctor::velocity

The documentation for this struct was generated from the following file: