96{
98 int num_node_per_elem =
element_->NumNodesPerElement();
99 int num_int_pt_per_elem =
element_->NumIntegrationPointsPerElement();
100
104
105 double cur_coord[vector_size * num_node_per_elem];
106 double material_tangent[6 * 6 * num_int_pt_per_elem];
107
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
136
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