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

Public Member Functions

 ExodusOutputManager ()
 
void SpecifyOutputFields (nimble_kokkos::ModelData &model_data, std::string const &output_command_string)
 
void ComputeElementData (nimble::GenesisMesh &mesh, nimble_kokkos::ModelData &model_data, std::map< int, nimble_kokkos::Block > &blocks, std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > &gathered_reference_coordinate_d, std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > &gathered_displacement_d)
 
std::vector< std::string > GetNodeDataLabelsForOutput ()
 
std::vector< std::vector< double > > GetNodeDataForOutput (nimble_kokkos::ModelData &model_data)
 
std::map< int, std::vector< std::string > > GetElementDataLabelsForOutput ()
 
std::map< int, std::vector< std::vector< double > > > GetElementDataForOutput (nimble_kokkos::ModelData &model_data)
 

Constructor & Destructor Documentation

◆ ExodusOutputManager()

nimble_kokkos::ExodusOutputManager::ExodusOutputManager ( )
inline
62: output_element_volume_(false), volume_field_id_(0){};

Member Function Documentation

◆ ComputeElementData()

void nimble_kokkos::ExodusOutputManager::ComputeElementData ( nimble::GenesisMesh & mesh,
nimble_kokkos::ModelData & model_data,
std::map< int, nimble_kokkos::Block > & blocks,
std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > & gathered_reference_coordinate_d,
std::vector< nimble_kokkos::DeviceVectorNodeGatheredView > & gathered_displacement_d )
390{
391 int block_index;
392 std::map<int, nimble_kokkos::Block>::iterator block_it;
393
394 // Element volume
395 if (output_element_volume_) {
396 for (block_index = 0, block_it = blocks.begin(); block_it != blocks.end(); block_index++, block_it++) {
397 int block_id = block_it->first;
398 nimble_kokkos::Block& block = block_it->second;
399 nimble::Element* element_d = block.GetDeviceElement();
400 int num_elem_in_block = mesh.GetNumElementsInBlock(block_id);
401 int num_nodes_per_elem = mesh.GetNumNodesPerElement(block_id);
403 nimble_kokkos::DeviceVectorNodeGatheredView gathered_reference_coordinate_block_d =
404 gathered_reference_coordinate_d.at(block_index);
405 nimble_kokkos::DeviceVectorNodeGatheredView gathered_displacement_block_d =
406 gathered_displacement_d.at(block_index);
407 nimble_kokkos::DeviceScalarElemView volume_d = model_data.GetDeviceScalarElementData(block_id, volume_field_id_);
408 Kokkos::parallel_for(
409 "Element Volume", num_elem_in_block, KOKKOS_LAMBDA(const int i_elem) {
410 nimble_kokkos::DeviceVectorNodeGatheredSubView element_reference_coordinate_d =
411 Kokkos::subview(gathered_reference_coordinate_block_d, i_elem, Kokkos::ALL, Kokkos::ALL);
413 Kokkos::subview(gathered_displacement_block_d, i_elem, Kokkos::ALL, Kokkos::ALL);
414 nimble_kokkos::DeviceScalarElemSingleEntryView element_volume_d = Kokkos::subview(volume_d, i_elem);
415 element_d->ComputeVolume(element_reference_coordinate_d, element_displacement_d, element_volume_d);
416 });
417 nimble_kokkos::HostScalarElemView volume_h = model_data.GetHostScalarElementData(block_id, volume_field_id_);
418 deep_copy(volume_h, volume_d);
419 }
420 }
421
422 // Extract data for specific integration points
423 for (block_index = 0, block_it = blocks.begin(); block_it != blocks.end(); block_index++, block_it++) {
424 int block_id = block_it->first;
425 int num_elem_in_block = mesh.GetNumElementsInBlock(block_id);
426 for (unsigned int i_data = 0; i_data < elem_data_labels_.at(block_id).size(); ++i_data) {
427 int integration_point_index = elem_data_integration_point_index_.at(block_id).at(i_data);
428 if (integration_point_index != -1) {
429 int iptdata_field_id = elem_data_iptdata_field_ids_.at(block_id).at(i_data);
430 int edata_field_id = elem_data_edata_field_ids_.at(block_id).at(i_data);
431 FieldType field_type = elem_data_types_.at(block_id).at(i_data);
432 if (field_type == FieldType::HostSymTensorElem) {
433 nimble_kokkos::DeviceSymTensorIntPtView sym_tensor_data_step_np1_d =
434 model_data.GetDeviceSymTensorIntegrationPointData(block_id, iptdata_field_id, nimble::STEP_NP1);
435 nimble_kokkos::DeviceSymTensorElemView sym_tensor_data_single_int_pt_d =
436 model_data.GetDeviceSymTensorElementData(block_id, edata_field_id);
437 Kokkos::parallel_for(
438 "Extract Symmetric Tensor Integration Point Data for Output",
439 num_elem_in_block,
440 KOKKOS_LAMBDA(const int i_elem) {
441 nimble_kokkos::DeviceSymTensorIntPtSubView element_sym_tensor_step_np1_d =
442 Kokkos::subview(sym_tensor_data_step_np1_d, i_elem, Kokkos::ALL, Kokkos::ALL);
443 nimble_kokkos::DeviceSymTensorElemSingleEntryView element_sym_tensor_single_int_pt_d =
444 Kokkos::subview(sym_tensor_data_single_int_pt_d, i_elem, Kokkos::ALL);
445 for (int i = 0; i < element_sym_tensor_single_int_pt_d.extent(0); i++) {
446 element_sym_tensor_single_int_pt_d(i) = element_sym_tensor_step_np1_d(integration_point_index, i);
447 }
448 });
449 nimble_kokkos::HostSymTensorElemView sym_tensor_data_single_int_pt_h =
450 model_data.GetHostSymTensorElementData(block_id, edata_field_id);
451 deep_copy(sym_tensor_data_single_int_pt_h, sym_tensor_data_single_int_pt_d);
452
453 } else if (field_type == FieldType::HostFullTensorElem) {
454 nimble_kokkos::DeviceFullTensorIntPtView full_tensor_data_step_np1_d =
455 model_data.GetDeviceFullTensorIntegrationPointData(block_id, iptdata_field_id, nimble::STEP_NP1);
456 nimble_kokkos::DeviceFullTensorElemView full_tensor_data_single_int_pt_d =
457 model_data.GetDeviceFullTensorElementData(block_id, edata_field_id);
458 Kokkos::parallel_for(
459 "Extract Full Tensor Integration Point Data for Output",
460 num_elem_in_block,
461 KOKKOS_LAMBDA(const int i_elem) {
462 nimble_kokkos::DeviceFullTensorIntPtSubView element_full_tensor_step_np1_d =
463 Kokkos::subview(full_tensor_data_step_np1_d, i_elem, Kokkos::ALL, Kokkos::ALL);
464 nimble_kokkos::DeviceFullTensorElemSingleEntryView element_full_tensor_single_int_pt_d =
465 Kokkos::subview(full_tensor_data_single_int_pt_d, i_elem, Kokkos::ALL);
466 for (int i = 0; i < element_full_tensor_single_int_pt_d.extent(0); i++) {
467 element_full_tensor_single_int_pt_d(i) = element_full_tensor_step_np1_d(integration_point_index, i);
468 }
469 });
470 nimble_kokkos::HostFullTensorElemView full_tensor_data_single_int_pt_h =
471 model_data.GetHostFullTensorElementData(block_id, edata_field_id);
472 deep_copy(full_tensor_data_single_int_pt_h, full_tensor_data_single_int_pt_d);
473 }
474 }
475 }
476 }
477
478 // Volume averaging of symmetric and full tensors stored at integration points
479 for (block_index = 0, block_it = blocks.begin(); block_it != blocks.end(); block_index++, block_it++) {
480 int block_id = block_it->first;
481 nimble_kokkos::Block& block = block_it->second;
482 nimble::Element* element_d = block.GetDeviceElement();
483 int num_elem_in_block = mesh.GetNumElementsInBlock(block_id);
484 int num_nodes_per_elem = mesh.GetNumNodesPerElement(block_id);
486 nimble_kokkos::DeviceVectorNodeGatheredView gathered_reference_coordinate_block_d =
487 gathered_reference_coordinate_d.at(block_index);
488 nimble_kokkos::DeviceVectorNodeGatheredView gathered_displacement_block_d = gathered_displacement_d.at(block_index);
489 for (auto& field_id : sym_tensor_field_ids_requiring_volume_average_.at(block_id)) {
490 nimble_kokkos::DeviceSymTensorIntPtView sym_tensor_data_step_np1_d =
491 model_data.GetDeviceSymTensorIntegrationPointData(block_id, field_id, nimble::STEP_NP1);
492 nimble_kokkos::DeviceSymTensorElemView sym_tensor_data_vol_ave_d =
493 model_data.GetDeviceSymTensorElementData(block_id, field_id);
494 Kokkos::parallel_for(
495 "Volume Averaging Sym Tensor", num_elem_in_block, KOKKOS_LAMBDA(const int i_elem) {
496 nimble_kokkos::DeviceVectorNodeGatheredSubView element_reference_coordinate_d =
497 Kokkos::subview(gathered_reference_coordinate_block_d, i_elem, Kokkos::ALL, Kokkos::ALL);
499 Kokkos::subview(gathered_displacement_block_d, i_elem, Kokkos::ALL, Kokkos::ALL);
500 nimble_kokkos::DeviceSymTensorIntPtSubView element_sym_tensor_step_np1_d =
501 Kokkos::subview(sym_tensor_data_step_np1_d, i_elem, Kokkos::ALL, Kokkos::ALL);
502 nimble_kokkos::DeviceSymTensorElemSingleEntryView element_sym_tensor_vol_ave_d =
503 Kokkos::subview(sym_tensor_data_vol_ave_d, i_elem, Kokkos::ALL);
504 element_d->ComputeVolumeAverageSymTensor(
505 element_reference_coordinate_d,
506 element_displacement_d,
507 element_sym_tensor_step_np1_d,
508 element_sym_tensor_vol_ave_d);
509 });
510 nimble_kokkos::HostSymTensorElemView sym_tensor_data_vol_ave_h =
511 model_data.GetHostSymTensorElementData(block_id, field_id);
512 deep_copy(sym_tensor_data_vol_ave_h, sym_tensor_data_vol_ave_d);
513 }
514 for (auto& field_id : full_tensor_field_ids_requiring_volume_average_.at(block_id)) {
515 nimble_kokkos::DeviceFullTensorIntPtView full_tensor_data_step_np1_d =
516 model_data.GetDeviceFullTensorIntegrationPointData(block_id, field_id, nimble::STEP_NP1);
517 nimble_kokkos::DeviceFullTensorElemView full_tensor_data_vol_ave_d =
518 model_data.GetDeviceFullTensorElementData(block_id, field_id);
519 Kokkos::parallel_for(
520 "Volume Averaging Full Tensor", num_elem_in_block, KOKKOS_LAMBDA(const int i_elem) {
521 nimble_kokkos::DeviceVectorNodeGatheredSubView element_reference_coordinate_d =
522 Kokkos::subview(gathered_reference_coordinate_block_d, i_elem, Kokkos::ALL, Kokkos::ALL);
524 Kokkos::subview(gathered_displacement_block_d, i_elem, Kokkos::ALL, Kokkos::ALL);
525 nimble_kokkos::DeviceFullTensorIntPtSubView element_full_tensor_step_np1_d =
526 Kokkos::subview(full_tensor_data_step_np1_d, i_elem, Kokkos::ALL, Kokkos::ALL);
527 nimble_kokkos::DeviceFullTensorElemSingleEntryView element_full_tensor_vol_ave_d =
528 Kokkos::subview(full_tensor_data_vol_ave_d, i_elem, Kokkos::ALL);
529 element_d->ComputeVolumeAverageFullTensor(
530 element_reference_coordinate_d,
531 element_displacement_d,
532 element_full_tensor_step_np1_d,
533 element_full_tensor_vol_ave_d);
534 });
535 nimble_kokkos::HostFullTensorElemView full_tensor_data_vol_ave_h =
536 model_data.GetHostFullTensorElementData(block_id, field_id);
537 deep_copy(full_tensor_data_vol_ave_h, full_tensor_data_vol_ave_d);
538 }
539 }
540}
int GetNumNodesPerElement(int block_id) const
Definition nimble_genesis_mesh.h:168
int GetNumElementsInBlock(int block_id) const
Definition nimble_genesis_mesh.cc:460
DeviceElementConnectivityView & GetDeviceElementConnectivityView()
Definition nimble_kokkos_block.h:122
nimble::Element * GetDeviceElement()
Definition nimble_kokkos_block.h:104
DeviceFullTensorIntPtView GetDeviceFullTensorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1580
DeviceFullTensorElemView GetDeviceFullTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1610
HostScalarElemView GetHostScalarElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1466
DeviceScalarElemView GetDeviceScalarElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1598
DeviceSymTensorElemView GetDeviceSymTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1604
HostFullTensorElemView GetHostFullTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1518
HostSymTensorElemView GetHostSymTensorElementData(int block_id, int field_id)
Definition nimble_kokkos_model_data.cc:1507
DeviceSymTensorIntPtView GetDeviceSymTensorIntegrationPointData(int block_id, int field_id, nimble::Step step)
Definition nimble_kokkos_model_data.cc:1574
Field< FieldType::HostScalarElem >::View HostScalarElemView
Definition nimble_kokkos_defs.h:574
Field< FieldType::HostFullTensorElem >::View HostFullTensorElemView
Definition nimble_kokkos_defs.h:575
Field< FieldType::DeviceScalarElem >::SingleEntryView DeviceScalarElemSingleEntryView
Definition nimble_kokkos_defs.h:601
Field< FieldType::DeviceScalarElem >::View DeviceScalarElemView
Definition nimble_kokkos_defs.h:600
Field< FieldType::DeviceFullTensorIntPt >::SubView DeviceFullTensorIntPtSubView
Definition nimble_kokkos_defs.h:589
Field< FieldType::DeviceSymTensorElem >::SingleEntryView DeviceSymTensorElemSingleEntryView
Definition nimble_kokkos_defs.h:605
Field< FieldType::DeviceFullTensorElem >::SingleEntryView DeviceFullTensorElemSingleEntryView
Definition nimble_kokkos_defs.h:603
Field< FieldType::HostSymTensorElem >::View HostSymTensorElemView
Definition nimble_kokkos_defs.h:576
Field< FieldType::DeviceSymTensorIntPt >::View DeviceSymTensorIntPtView
Definition nimble_kokkos_defs.h:591
Kokkos::View< int *, kokkos_device > DeviceElementConnectivityView
Definition nimble_kokkos_defs.h:607
Field< FieldType::DeviceVectorNode >::GatheredSubView DeviceVectorNodeGatheredSubView
Definition nimble_kokkos_defs.h:587
Field< FieldType::DeviceFullTensorElem >::View DeviceFullTensorElemView
Definition nimble_kokkos_defs.h:602
Field< FieldType::DeviceSymTensorIntPt >::SubView DeviceSymTensorIntPtSubView
Definition nimble_kokkos_defs.h:592
Field< FieldType::DeviceSymTensorElem >::View DeviceSymTensorElemView
Definition nimble_kokkos_defs.h:604
FieldType
Definition nimble_kokkos_defs.h:89
@ HostSymTensorElem
Definition nimble_kokkos_defs.h:102
@ HostFullTensorElem
Definition nimble_kokkos_defs.h:104
Field< FieldType::DeviceVectorNode >::GatheredView DeviceVectorNodeGatheredView
Definition nimble_kokkos_defs.h:586
Field< FieldType::DeviceFullTensorIntPt >::View DeviceFullTensorIntPtView
Definition nimble_kokkos_defs.h:588
@ STEP_NP1
Definition nimble_data_utils.h:99

◆ GetElementDataForOutput()

std::map< int, std::vector< std::vector< double > > > nimble_kokkos::ExodusOutputManager::GetElementDataForOutput ( nimble_kokkos::ModelData & model_data)
562{
563 std::vector<int> block_ids = model_data.GetBlockIds();
564 for (auto const& block_id : block_ids) {
565 for (unsigned int i_data = 0; i_data < elem_data_labels_.at(block_id).size(); ++i_data) {
566 int edata_field_id = elem_data_edata_field_ids_.at(block_id).at(i_data);
567 FieldType field_type = elem_data_types_.at(block_id).at(i_data);
568 if (field_type == FieldType::HostScalarElem) {
569 HostScalarElemView data = model_data.GetHostScalarElementData(block_id, edata_field_id);
570 for (unsigned int i = 0; i < elem_data_.at(block_id)[i_data].size(); i++) {
571 elem_data_.at(block_id)[i_data][i] = data(i);
572 }
573 } else if (field_type == FieldType::HostSymTensorElem) {
574 HostSymTensorElemView data = model_data.GetHostSymTensorElementData(block_id, edata_field_id);
575 int component = elem_data_components_.at(block_id).at(i_data);
576 for (unsigned int i = 0; i < elem_data_.at(block_id)[i_data].size(); i++) {
577 elem_data_.at(block_id)[i_data][i] = data(i, component);
578 }
579 } else if (field_type == FieldType::HostFullTensorElem) {
580 HostFullTensorElemView data = model_data.GetHostFullTensorElementData(block_id, edata_field_id);
581 int component = elem_data_components_.at(block_id).at(i_data);
582 for (unsigned int i = 0; i < elem_data_.at(block_id)[i_data].size(); i++) {
583 elem_data_.at(block_id)[i_data][i] = data(i, component);
584 }
585 }
586 }
587 }
588 return elem_data_;
589}
std::vector< int > GetBlockIds() const
Definition nimble_kokkos_model_data.cc:886
@ HostScalarElem
Definition nimble_kokkos_defs.h:100

◆ GetElementDataLabelsForOutput()

std::map< int, std::vector< std::string > > nimble_kokkos::ExodusOutputManager::GetElementDataLabelsForOutput ( )
inline
86 {
87 return elem_data_labels_;
88 }

◆ GetNodeDataForOutput()

std::vector< std::vector< double > > nimble_kokkos::ExodusOutputManager::GetNodeDataForOutput ( nimble_kokkos::ModelData & model_data)
544{
545 for (unsigned int i_data = 0; i_data < node_data_labels_.size(); ++i_data) {
546 int field_id = node_data_field_ids_.at(i_data);
547 FieldType field_type = node_data_types_.at(i_data);
548 if (field_type == FieldType::HostScalarNode) {
549 HostScalarNodeView data = model_data.GetHostScalarNodeData(field_id);
550 for (unsigned int i = 0; i < node_data_[i_data].size(); i++) { node_data_[i_data][i] = data(i); }
551 } else if (field_type == FieldType::HostVectorNode) {
552 HostVectorNodeView data = model_data.GetHostVectorNodeData(field_id);
553 int component = node_data_components_[i_data];
554 for (unsigned int i = 0; i < node_data_[i_data].size(); i++) { node_data_[i_data][i] = data(i, component); }
555 }
556 }
557 return node_data_;
558}
HostVectorNodeView GetHostVectorNodeData(int field_id)
Definition nimble_kokkos_model_data.cc:1457
HostScalarNodeView GetHostScalarNodeData(int field_id)
Definition nimble_kokkos_model_data.cc:1448
Field< FieldType::HostScalarNode >::View HostScalarNodeView
Definition nimble_kokkos_defs.h:570
Field< FieldType::HostVectorNode >::View HostVectorNodeView
Definition nimble_kokkos_defs.h:571
@ HostScalarNode
Definition nimble_kokkos_defs.h:90
@ HostVectorNode
Definition nimble_kokkos_defs.h:92

◆ GetNodeDataLabelsForOutput()

std::vector< std::string > nimble_kokkos::ExodusOutputManager::GetNodeDataLabelsForOutput ( )
inline
77 {
78 return node_data_labels_;
79 }

◆ SpecifyOutputFields()

void nimble_kokkos::ExodusOutputManager::SpecifyOutputFields ( nimble_kokkos::ModelData & model_data,
std::string const & output_command_string )
117{
118 // Parse the string into individual field labels
119 std::vector<std::string> requested_labels;
120 std::stringstream ss(output_command_string);
121 std::string entry;
122 while (std::getline(ss, entry, ' ')) { requested_labels.push_back(entry); }
123
124 std::vector<std::string> scalar_node_data_labels = model_data.GetScalarNodeDataLabels();
125 for (auto const& requested_label : requested_labels) {
126 for (auto& node_label : scalar_node_data_labels) {
127 if (requested_label == node_label) {
128 int field_id = model_data.GetFieldId(node_label);
129 int num_nodes = model_data.GetHostScalarNodeData(field_id).extent(0);
130 node_data_labels_.push_back(node_label);
131 node_data_field_ids_.push_back(field_id);
132 node_data_types_.push_back(FieldType::HostScalarNode);
133 node_data_components_.push_back(0);
134 node_data_.push_back(std::vector<double>(num_nodes, 0.0));
135 }
136 }
137 }
138
139 std::vector<std::string> vector_node_data_labels = model_data.GetVectorNodeDataLabels();
140 for (auto const& requested_label : requested_labels) {
141 for (auto& node_label : vector_node_data_labels) {
142 if (requested_label == node_label) {
143 int field_id = model_data.GetFieldId(node_label);
144 int num_nodes = model_data.GetHostVectorNodeData(field_id).extent(0);
145 // x component
146 node_data_labels_.push_back(node_label + "_x");
147 node_data_field_ids_.push_back(field_id);
148 node_data_types_.push_back(FieldType::HostVectorNode);
149 node_data_components_.push_back(K_X);
150 node_data_.push_back(std::vector<double>(num_nodes, 0.0));
151 // y component
152 node_data_labels_.push_back(node_label + "_y");
153 node_data_field_ids_.push_back(field_id);
154 node_data_types_.push_back(FieldType::HostVectorNode);
155 node_data_components_.push_back(K_Y);
156 node_data_.push_back(std::vector<double>(num_nodes, 0.0));
157 // z component
158 node_data_labels_.push_back(node_label + "_z");
159 node_data_field_ids_.push_back(field_id);
160 node_data_types_.push_back(FieldType::HostVectorNode);
161 node_data_components_.push_back(K_Z);
162 node_data_.push_back(std::vector<double>(num_nodes, 0.0));
163 }
164 }
165 }
166
167 std::vector<int> block_ids = model_data.GetBlockIds();
168 for (auto const& block_id : block_ids) {
169 elem_data_labels_[block_id] = std::vector<std::string>();
170 elem_data_iptdata_field_ids_[block_id] = std::vector<int>();
171 elem_data_edata_field_ids_[block_id] = std::vector<int>();
172 elem_data_types_[block_id] = std::vector<FieldType>();
173 elem_data_integration_point_index_[block_id] = std::vector<int>();
174 elem_data_components_[block_id] = std::vector<int>();
175 elem_data_[block_id] = std::vector<std::vector<double>>();
176 sym_tensor_field_ids_requiring_volume_average_[block_id] = std::vector<int>();
177 full_tensor_field_ids_requiring_volume_average_[block_id] = std::vector<int>();
178 }
179
180 for (unsigned int i_block = 0; i_block < block_ids.size(); ++i_block) {
181 int block_id = block_ids[i_block];
182
183 // volume is special, it is not tied to integration point data
184 for (auto const& requested_label : requested_labels) {
185 if (requested_label == "volume") {
186 output_element_volume_ = true;
187 volume_field_id_ = model_data.GetFieldId(requested_label);
188 int num_elem = model_data.GetDeviceScalarElementData(block_id, volume_field_id_).extent(0);
189 elem_data_labels_[block_id].push_back(requested_label);
190 elem_data_iptdata_field_ids_[block_id].push_back(volume_field_id_);
191 elem_data_edata_field_ids_[block_id].push_back(volume_field_id_);
192 elem_data_types_[block_id].push_back(FieldType::HostScalarElem);
193 elem_data_integration_point_index_[block_id].push_back(-1);
194 elem_data_components_[block_id].push_back(0);
195 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
196 }
197 }
198
199 std::vector<std::string> symmetric_tensor_integration_point_data_labels =
201 for (auto const& requested_label : requested_labels) {
202 for (auto& ipt_label : symmetric_tensor_integration_point_data_labels) {
203 std::string field_label = requested_label;
204 bool single_integration_point = false;
205 bool require_volume_average = true;
206 int integration_point_index = -1;
207 if (requested_label.substr(0, 3) == "ipt") {
208 field_label = requested_label.substr(6, requested_label.size() - 6);
209 single_integration_point = true;
210 require_volume_average = false;
211 integration_point_index = atoi(requested_label.substr(4, 2).c_str()) - 1;
212 }
213 if (field_label == ipt_label) {
214 int iptdata_field_id = model_data.GetFieldId(ipt_label);
215 int edata_field_id = iptdata_field_id;
216 if (require_volume_average) {
217 sym_tensor_field_ids_requiring_volume_average_[block_id].push_back(iptdata_field_id);
218 }
219 int num_elem =
220 model_data.GetDeviceSymTensorIntegrationPointData(block_id, iptdata_field_id, nimble::STEP_NP1).extent(0);
221 if (single_integration_point) {
222 edata_field_id =
223 model_data.AllocateElementData(block_id, nimble::SYMMETRIC_TENSOR, requested_label, num_elem);
224 }
225 // xx component
226 elem_data_labels_[block_id].push_back(requested_label + "_xx");
227 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
228 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
229 elem_data_types_[block_id].push_back(FieldType::HostSymTensorElem);
230 elem_data_components_[block_id].push_back(K_S_XX);
231 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
232 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
233 // yy component
234 elem_data_labels_[block_id].push_back(requested_label + "_yy");
235 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
236 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
237 elem_data_types_[block_id].push_back(FieldType::HostSymTensorElem);
238 elem_data_components_[block_id].push_back(K_S_YY);
239 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
240 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
241 // zz component
242 elem_data_labels_[block_id].push_back(requested_label + "_zz");
243 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
244 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
245 elem_data_types_[block_id].push_back(FieldType::HostSymTensorElem);
246 elem_data_components_[block_id].push_back(K_S_ZZ);
247 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
248 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
249 // xy component
250 elem_data_labels_[block_id].push_back(requested_label + "_xy");
251 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
252 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
253 elem_data_types_[block_id].push_back(FieldType::HostSymTensorElem);
254 elem_data_components_[block_id].push_back(K_S_XY);
255 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
256 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
257 // yz component
258 elem_data_labels_[block_id].push_back(requested_label + "_yz");
259 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
260 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
261 elem_data_types_[block_id].push_back(FieldType::HostSymTensorElem);
262 elem_data_components_[block_id].push_back(K_S_YZ);
263 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
264 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
265 // zx component
266 elem_data_labels_[block_id].push_back(requested_label + "_zx");
267 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
268 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
269 elem_data_types_[block_id].push_back(FieldType::HostSymTensorElem);
270 elem_data_components_[block_id].push_back(K_S_ZX);
271 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
272 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
273 }
274 }
275 }
276
277 std::vector<std::string> full_tensor_integration_point_data_labels =
278 model_data.GetFullTensorIntegrationPointDataLabels(block_id);
279 for (auto const& requested_label : requested_labels) {
280 // Handle case where user has requested output for a specific integration
281 // point
282 std::string field_label = requested_label;
283 bool single_integration_point = false;
284 bool require_volume_average = true;
285 int integration_point_index = -1;
286 if (requested_label.substr(0, 3) == "ipt") {
287 field_label = requested_label.substr(6, requested_label.size() - 6);
288 single_integration_point = true;
289 require_volume_average = false;
290 integration_point_index = atoi(requested_label.substr(4, 2).c_str()) - 1;
291 }
292 for (auto& ipt_label : full_tensor_integration_point_data_labels) {
293 if (field_label == ipt_label) {
294 int iptdata_field_id = model_data.GetFieldId(ipt_label);
295 int edata_field_id = iptdata_field_id;
296 if (require_volume_average) {
297 full_tensor_field_ids_requiring_volume_average_[block_id].push_back(iptdata_field_id);
298 }
299 int num_elem =
300 model_data.GetDeviceFullTensorIntegrationPointData(block_id, iptdata_field_id, nimble::STEP_NP1)
301 .extent(0);
302 if (single_integration_point) {
303 edata_field_id = model_data.AllocateElementData(block_id, nimble::FULL_TENSOR, requested_label, num_elem);
304 }
305 // xx component
306 elem_data_labels_[block_id].push_back(requested_label + "_xx");
307 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
308 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
309 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
310 elem_data_components_[block_id].push_back(K_F_XX);
311 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
312 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
313 // yy component
314 elem_data_labels_[block_id].push_back(requested_label + "_yy");
315 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
316 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
317 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
318 elem_data_components_[block_id].push_back(K_F_YY);
319 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
320 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
321 // zz component
322 elem_data_labels_[block_id].push_back(requested_label + "_zz");
323 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
324 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
325 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
326 elem_data_components_[block_id].push_back(K_F_ZZ);
327 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
328 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
329 // xy component
330 elem_data_labels_[block_id].push_back(requested_label + "_xy");
331 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
332 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
333 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
334 elem_data_components_[block_id].push_back(K_F_XY);
335 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
336 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
337 // yz component
338 elem_data_labels_[block_id].push_back(requested_label + "_yz");
339 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
340 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
341 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
342 elem_data_components_[block_id].push_back(K_F_YZ);
343 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
344 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
345 // zx component
346 elem_data_labels_[block_id].push_back(requested_label + "_zx");
347 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
348 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
349 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
350 elem_data_components_[block_id].push_back(K_F_ZX);
351 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
352 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
353 // yx component
354 elem_data_labels_[block_id].push_back(requested_label + "_yx");
355 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
356 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
357 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
358 elem_data_components_[block_id].push_back(K_F_YX);
359 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
360 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
361 // zy component
362 elem_data_labels_[block_id].push_back(requested_label + "_zy");
363 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
364 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
365 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
366 elem_data_components_[block_id].push_back(K_F_ZY);
367 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
368 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
369 // xz component
370 elem_data_labels_[block_id].push_back(requested_label + "_xz");
371 elem_data_iptdata_field_ids_[block_id].push_back(iptdata_field_id);
372 elem_data_edata_field_ids_[block_id].push_back(edata_field_id);
373 elem_data_types_[block_id].push_back(FieldType::HostFullTensorElem);
374 elem_data_components_[block_id].push_back(K_F_XZ);
375 elem_data_integration_point_index_[block_id].push_back(integration_point_index);
376 elem_data_[block_id].push_back(std::vector<double>(num_elem, 0.0));
377 }
378 }
379 }
380 }
381}
int AllocateElementData(int block_id, nimble::Length length, std::string label, int num_objects)
Definition nimble_kokkos_model_data.cc:645
std::vector< std::string > GetVectorNodeDataLabels() const
Definition nimble_kokkos_model_data.cc:1380
int GetFieldId(const std::string &field_label) const override
Returns the field ID for a specific label.
Definition nimble_kokkos_model_data.h:94
std::vector< std::string > GetFullTensorIntegrationPointDataLabels(int block_id) const
Definition nimble_kokkos_model_data.cc:1424
std::vector< std::string > GetScalarNodeDataLabels() const
Definition nimble_kokkos_model_data.cc:1361
std::vector< std::string > GetSymmetricTensorIntegrationPointDataLabels(int block_id) const
Definition nimble_kokkos_model_data.cc:1399
@ SYMMETRIC_TENSOR
Definition nimble_data_utils.h:90
@ FULL_TENSOR
Definition nimble_data_utils.h:91

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