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

#include <nimble_block_base.h>

Inheritance diagram for nimble::BlockBase:
nimble::Block nimble_kokkos::Block

Public Member Functions

 BlockBase ()=default
 
virtual ~BlockBase ()=default
 
virtual void InstantiateElement ()=0
 
double GetDensity () const
 
double GetBulkModulus () const
 
double GetShearModulus () const
 
std::shared_ptr< MaterialGetMaterialPointer () const
 
std::shared_ptr< ElementGetElementPointer () const
 
virtual double ComputeCriticalTimeStep (const nimble::Viewify< 2 > &node_reference_coordinates, const nimble::Viewify< 2 > &node_displacements, int num_elem, const int *elem_conn) const
 
template<typename MatT>
void ComputeTangentStiffnessMatrix (int num_global_unknowns, const double *const reference_coordinates, const double *const displacement, int num_elem, const int *const elem_conn, const int *const global_node_ids, MatT &tangent_stiffness) const
 

Protected Attributes

std::string model_material_parameters_ = "none"
 
std::shared_ptr< Elementelement_ = nullptr
 
std::shared_ptr< Materialmaterial_ = nullptr
 

Constructor & Destructor Documentation

◆ BlockBase()

nimble::BlockBase::BlockBase ( )
default

◆ ~BlockBase()

virtual nimble::BlockBase::~BlockBase ( )
virtualdefault

Member Function Documentation

◆ ComputeCriticalTimeStep()

double nimble::BlockBase::ComputeCriticalTimeStep ( const nimble::Viewify< 2 > & node_reference_coordinates,
const nimble::Viewify< 2 > & node_displacements,
int num_elem,
const int * elem_conn ) const
virtual
57{
58 int dim = element_->Dim();
59 int num_node_per_elem = element_->NumNodesPerElement();
60 double sound_speed = std::sqrt(GetBulkModulus() / GetDensity());
61 double critical_time_step = std::numeric_limits<double>::max();
62
63 int vector_size = 0;
64 if (dim == 2) {
65 vector_size = 2;
66 } else if (dim == 3) {
67 vector_size = 3;
68 }
69 double node_coord[vector_size * num_node_per_elem];
70
71 for (int elem = 0; elem < num_elem; elem++) {
72 for (int node = 0; node < num_node_per_elem; node++) {
73 int node_id = elem_conn[elem * num_node_per_elem + node];
74 for (int i = 0; i < vector_size; i++) {
75 node_coord[node * vector_size + i] = node_reference_coordinates(node_id, i) + node_displacements(node_id, i);
76 }
77 }
78
79 double elem_critical_time_step = element_->ComputeCharacteristicLength(node_coord) / sound_speed;
80 if (elem_critical_time_step < critical_time_step) { critical_time_step = elem_critical_time_step; }
81 }
82
83 return critical_time_step;
84}
double GetBulkModulus() const
Definition nimble_block_base.h:74
double GetDensity() const
Definition nimble_block_base.h:68
std::shared_ptr< Element > element_
Definition nimble_block_base.h:117

◆ ComputeTangentStiffnessMatrix()

template<typename MatT>
template void nimble::BlockBase::ComputeTangentStiffnessMatrix< CRSMatrixContainer > ( int num_global_unknowns,
const double *const reference_coordinates,
const double *const displacement,
int num_elem,
const int *const elem_conn,
const int *const global_node_ids,
MatT & tangent_stiffness ) const
96{
97 int dim = element_->Dim();
98 int num_node_per_elem = element_->NumNodesPerElement();
99 int num_int_pt_per_elem = element_->NumIntegrationPointsPerElement();
100
101 int vector_size = LengthToInt(nimble::VECTOR, dim);
102 int full_tensor_size = LengthToInt(nimble::FULL_TENSOR, dim);
103 int sym_tensor_size = LengthToInt(nimble::SYMMETRIC_TENSOR, dim);
104
105 double cur_coord[vector_size * num_node_per_elem];
106 double material_tangent[6 * 6 * num_int_pt_per_elem]; // correct for 3D,
107 // overkill for 2D
108 double element_tangent[num_node_per_elem * vector_size * num_node_per_elem * vector_size];
109
110 for (int elem = 0; elem < num_elem; elem++) {
111 for (int node = 0; node < num_node_per_elem; node++) {
112 int node_id = elem_conn[elem * num_node_per_elem + node];
113 for (int i = 0; i < vector_size; i++) {
114 cur_coord[node * vector_size + i] =
115 reference_coordinates[vector_size * node_id + i] + displacement[vector_size * node_id + i];
116 }
117 }
118
119 material_->GetTangent(num_int_pt_per_elem, material_tangent);
120
121 element_->ComputeTangent(cur_coord, material_tangent, element_tangent);
122
123 for (int row = 0; row < num_node_per_elem; row++) {
124 int global_row_node = global_node_ids[elem_conn[elem * num_node_per_elem + row]];
125 for (int col = 0; col < num_node_per_elem; col++) {
126 int global_col_node = global_node_ids[elem_conn[elem * num_node_per_elem + col]];
127 for (int i = 0; i < vector_size; i++) {
128 for (int j = 0; j < vector_size; j++) {
129 int local_row_index = row * vector_size + i;
130 int local_col_index = col * vector_size + j;
131 int global_row_index = global_row_node * vector_size + i;
132 int global_col_index = global_col_node * vector_size + j;
133 double value = element_tangent[local_row_index * num_node_per_elem * vector_size + local_col_index];
134 tangent_stiffness(global_row_index, global_col_index) += value;
135 // tangent_stiffness.sumIntoValue(global_row_index,
136 // global_col_index, value);
137 }
138 }
139 }
140 }
141 }
142}
std::shared_ptr< Material > material_
Definition nimble_block_base.h:118
@ 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

◆ GetBulkModulus()

double nimble::BlockBase::GetBulkModulus ( ) const
inline
75 {
76 return material_->GetBulkModulus();
77 }

◆ GetDensity()

double nimble::BlockBase::GetDensity ( ) const
inline
69 {
70 return material_->GetDensity();
71 }

◆ GetElementPointer()

std::shared_ptr< Element > nimble::BlockBase::GetElementPointer ( ) const
inline
93 {
94 return element_;
95 }

◆ GetMaterialPointer()

std::shared_ptr< Material > nimble::BlockBase::GetMaterialPointer ( ) const
inline
87 {
88 return material_;
89 }

◆ GetShearModulus()

double nimble::BlockBase::GetShearModulus ( ) const
inline
81 {
82 return material_->GetShearModulus();
83 }

◆ InstantiateElement()

virtual void nimble::BlockBase::InstantiateElement ( )
pure virtual

Implemented in nimble::Block, and nimble_kokkos::Block.

Member Data Documentation

◆ element_

std::shared_ptr<Element> nimble::BlockBase::element_ = nullptr
protected

◆ material_

std::shared_ptr<Material> nimble::BlockBase::material_ = nullptr
protected

◆ model_material_parameters_

std::string nimble::BlockBase::model_material_parameters_ = "none"
protected

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