IOSS 2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Iotm_TextMeshUtils.h
Go to the documentation of this file.
1// Copyright(C) 1999-2020, 2022, 2023 National Technology & Engineering Solutions
2// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3// NTESS, the U.S. Government retains certain rights in this software.
4
5#pragma once
6
7#include "iotm_export.h"
8
9// ####################### Start Clang Header Tool Managed Headers ########################
10// clang-format off
11#include <cctype> // for toupper, isspace, isdigit
12#include <stddef.h> // for size_t
13#include <algorithm> // for remove, etc
14#include <iterator> // for insert_iterator
15#include <map>
16#include <set> // for set
17#include <sstream> // for operator<<, etc
18#include <string> // for basic_string, etc
19#include <utility> // for pair
20#include <vector> // for vector
21#include <unordered_map>
22#include <sstream> // for ostringstream
23#include <iostream>
24#include <functional>
25#include <stdexcept>
26#include <numeric>
27
28#include "Iotm_TextMeshFuncs.h"
34
35// clang-format on
36// ####################### End Clang Header Tool Managed Headers ########################
37namespace Iotm {
38 namespace text_mesh {
39 using ErrorHandler = std::function<void(const std::ostringstream &)>;
40
41 class IOTM_EXPORT TextMeshLexer
42 {
43 public:
45
46 void set_input_string(const std::string &input)
47 {
48 m_input = input;
51 }
52
53 int get_int()
54 {
56 return std::stoi(m_oldToken);
57 }
58
59 unsigned get_unsigned()
60 {
62 return std::stoul(m_oldToken);
63 }
64
65 std::string get_string()
66 {
69 }
70
72
73 bool has_token() const { return !m_token.empty(); }
74 bool has_newline() const { return m_token == "\n"; }
75 bool has_number() const { return has_token() && m_isNumber; }
76 bool has_string() const { return has_token() && !has_number() && !has_newline(); }
77
78 private:
80 {
82
83 if (char_is_newline()) {
84 m_isNumber = false;
85 m_token = "\n";
87 return;
88 }
89
90 m_token = "";
91 m_isNumber = true;
92
93 while (has_more_input()) {
94 if (char_is_whitespace()) {
96 continue;
97 }
98
99 if (char_is_comma()) {
101 break;
102 }
103
104 if (char_is_newline()) {
105 break;
106 }
107
111 }
112 }
113
114 bool has_more_input() { return m_currentIndex < m_input.size(); }
115
116 bool char_is_whitespace() { return current_char() == ' '; }
117 bool char_is_comma() { return current_char() == ','; }
118 bool char_is_newline() { return current_char() == '\n'; }
119 bool char_is_digit() { return std::isdigit(static_cast<unsigned char>(current_char())); }
120
122
123 std::string make_uppercase(std::string str)
124 {
125 std::transform(str.begin(), str.end(), str.begin(), ::toupper);
126 return str;
127 }
128
129 std::string m_input{};
130 unsigned m_currentIndex{0};
131
132 std::string m_oldToken{};
133 std::string m_token{};
134
135 bool m_isNumber{false};
136 };
137
138 template <typename EntityId, typename Topology> class TextMeshOptionParser
139 {
140 private:
141 static constexpr int INVALID_DIMENSION = -1;
142 static constexpr int DEFAULT_DIMENSION = 3;
143
152
153 public:
159
165
166 void set_error_handler(ErrorHandler errorHandler) { m_errorHandler = errorHandler; }
167
169 {
171 }
172
173 void initialize_parse(const std::string &parameters)
174 {
175 if (!parameters.empty()) {
176 std::vector<std::string> optionGroups = get_tokens(parameters, "|");
177 parse_options(optionGroups);
178
179 m_meshConnectivityDescription = optionGroups[0];
180 }
181
184 }
185
187 {
189 m_data.partIds.finalize_parse();
190 m_data.sidesets.finalize_parse(m_data);
191 m_data.nodesets.finalize_parse();
192 m_data.assemblies.finalize_parse();
196 }
197
198 private:
200
205
207 {
210 std::ostringstream errmsg;
211 errmsg << "Error! An enforced dimension of " << m_constructorEnforcedDimension
212 << " was provided but does not match the parsed value of " << m_parsedDimension
213 << ".";
214 m_errorHandler(errmsg);
215 }
216 }
217 }
218
220 {
223 }
224 else if (parsed_dimension_provided()) {
225 m_data.spatialDim = m_parsedDimension;
226 }
227 else {
228 m_data.spatialDim = DEFAULT_DIMENSION;
229 }
230 }
231
232 void parse_dimension_option(const std::vector<std::string> &option)
233 {
235 std::ostringstream errmsg;
236 errmsg << "Spatial dimension has already been parsed! Check syntax.";
237 m_errorHandler(errmsg);
238 }
239
240 if (option.size() == 2) {
241 m_parsedDimension = std::stoull(option[1]);
242 if (m_parsedDimension != 2 && m_parsedDimension != 3) {
243 std::ostringstream errmsg;
244 errmsg << "Error! Parsed spatial dimension (" << m_parsedDimension
245 << " not defined to be 2 or 3.";
246 m_errorHandler(errmsg);
247 }
248
250 }
251 else {
252 std::ostringstream errmsg;
253 errmsg << "Error! Invalid spatial dimension syntax.";
254 m_errorHandler(errmsg);
255 }
256 }
257
259 {
260 std::vector<double> swapVectorForDeallocation;
261 m_rawCoordinates.swap(swapVectorForDeallocation);
262 }
263
265 {
267 m_data.coords.set_coordinate_data(m_data.spatialDim, m_data.nodeIds, m_rawCoordinates);
269 }
270 }
271
273
274 void parse_coordinates_option(const std::vector<std::string> &coordinatesOptionGroup)
275 {
277 std::ostringstream errmsg;
278 errmsg << "Coordinates have already been parsed! Check syntax.";
279 m_errorHandler(errmsg);
280 }
281
282 if (coordinatesOptionGroup.size() > 1) {
283 const std::vector<std::string> &coordinateTokens =
284 get_tokens(coordinatesOptionGroup[1], ",");
285 m_rawCoordinates.reserve(coordinateTokens.size());
286 for (const auto &token : coordinateTokens) {
287 double coord = std::stod(token);
288 m_rawCoordinates.push_back(coord);
289 }
290
292 }
293 }
294
295 template <typename DataType>
297 const std::string &entityType,
298 const std::set<std::string> &entitySetNames)
299 {
300 std::string groupName = groupData.name;
301 convert_to_uppercase(groupName);
302
303 if (entitySetNames.count(groupName) > 0) {
304 std::ostringstream errmsg;
305 errmsg << "Error! " << groupData.type << " with id: " << groupData.id
306 << " and name: " << groupData.name << " is referencing " << entityType
307 << " with same name.";
308 m_errorHandler(errmsg);
309 }
310 }
311
312 template <typename SrcDataGroup, typename DestDataGroup>
313 void check_name_collision_with_group(const SrcDataGroup &srcGroup,
314 const DestDataGroup &destGroup)
315 {
316 std::set<std::string> groupNames = transform_to_set(destGroup.get_part_names());
317
318 for (const auto &srcGroupData : srcGroup.get_group_data()) {
319 check_name_collision_with_entity_sets(srcGroupData, destGroup.get_group_type(),
320 groupNames);
321 }
322 }
323
325 {
326 for (const SidesetData<EntityId, Topology> &sidesetData :
327 m_data.sidesets.get_group_data()) {
328 for (const std::pair<EntityId, int> &elemSidePair : sidesetData.data) {
329 EntityId id = elemSidePair.first;
330 if (!std::binary_search(m_data.elementDataVec.begin(), m_data.elementDataVec.end(),
331 id)) {
332 std::ostringstream errmsg;
333 errmsg << "Error! Sideset with id: " << sidesetData.id
334 << " and name: " << sidesetData.name << " has reference to invalid element '"
335 << id << "'.";
336 m_errorHandler(errmsg);
337 }
338 }
339 }
340 }
341
348
354
356 {
357 for (const NodesetData<EntityId> &nodesetData : m_data.nodesets.get_group_data()) {
358 for (const EntityId nodeId : nodesetData.data) {
359 if (m_data.nodeIds.count(nodeId) == 0) {
360 std::ostringstream errmsg;
361 errmsg << "Error! Nodeset with id: " << nodesetData.id
362 << " and name: " << nodesetData.name << " has reference to invalid node '"
363 << nodeId << "'.";
364 m_errorHandler(errmsg);
365 }
366 }
367 }
368 }
369
376
382
383 template <typename T>
385 const T &group)
386 {
387 for (const std::string &entry : assemblyData.data) {
388 if (!group.is_registered(entry)) {
389 std::ostringstream errmsg;
390 errmsg << "Error! Assembly with id: " << assemblyData.id
391 << " and name: " << assemblyData.name << " has reference to invalid "
392 << group.get_group_type() << " '" << entry << "'.";
393 m_errorHandler(errmsg);
394 }
395 }
396 }
397
399 {
400 for (const AssemblyData &assemblyData : m_data.assemblies.get_group_data()) {
401 const AssemblyType assemblyType = assemblyData.get_assembly_type();
402
403 switch (assemblyType) {
404 case AssemblyType::BLOCK:
406 break;
407 case AssemblyType::SIDESET:
408 check_assembly_member_reference_in_group(assemblyData, m_data.sidesets);
409 break;
410 case AssemblyType::NODESET:
411 check_assembly_member_reference_in_group(assemblyData, m_data.nodesets);
412 break;
413 case AssemblyType::ASSEMBLY:
414 check_assembly_member_reference_in_group(assemblyData, m_data.assemblies);
415 break;
416 default:
417 std::ostringstream errmsg;
418 errmsg << "Error! Assembly with id: " << assemblyData.id
419 << " and name: " << assemblyData.name << " does not have a valid assembly type '"
420 << assemblyType << "'.";
421 m_errorHandler(errmsg);
422 }
423 }
424 }
425
427 {
428 check_name_collision_with_group(m_data.assemblies, m_data.partIds);
429 check_name_collision_with_group(m_data.assemblies, m_data.sidesets);
430 check_name_collision_with_group(m_data.assemblies, m_data.nodesets);
431 }
432
434 {
435 for (const std::string &assembly : m_data.assemblies.get_part_names()) {
436 if (m_data.assemblies.is_cyclic(assembly)) {
437 std::ostringstream errmsg;
438 errmsg << "Error! Assembly with name: '" << assembly << "' has a cyclic dependency.";
439 m_errorHandler(errmsg);
440 }
441 }
442 }
443
450
451 void parse_sideset_option(const std::vector<std::string> &sidesetOptionGroup)
452 {
453 if (sidesetOptionGroup.size() > 1) {
456 parser.parse(sidesetOptionGroup[1]);
457 parser.verify_parse();
458
460 m_data.sidesets.add_group_data(parser.get_name(), parser.get_sideset_data());
461 sideset->set_split_type(parser.get_split_type());
462 sideset->set_skin_blocks(parser.get_skin_blocks());
464 }
465 }
466
467 void parse_nodeset_option(const std::vector<std::string> &nodesetOptionGroup)
468 {
469 if (nodesetOptionGroup.size() > 1) {
472 parser.parse(nodesetOptionGroup[1]);
473
474 m_data.nodesets.add_group_data(parser.get_name(), parser.get_nodeset_data());
476 }
477 }
478
479 void parse_assembly_option(const std::vector<std::string> &assemblyOptionGroup)
480 {
481 if (assemblyOptionGroup.size() > 1) {
482 AssemblyParser parser;
484 parser.parse(assemblyOptionGroup[1]);
485 parser.verify_parse();
486
487 AssemblyData *assembly =
488 m_data.assemblies.add_group_data(parser.get_name(), parser.get_assembly_data());
489 assembly->set_assembly_type(parser.get_assembly_type());
491 }
492 }
493
494 void print_help_message(std::ostream &out = std::cout)
495 {
496 out << "\nValid Options for TextMesh parameter string:\n"
497 "\tPROC_ID,ELEM_ID,TOPOLOGY,{NODE CONNECTIVITY LIST}[,PART_NAME[,PART_ID]] "
498 "(specifies "
499 "element list .. first "
500 "argument)\n"
501 "\t|coordinates:x_1,y_1[,z_1], x_2,y_2[,z_2], ...., x_n,y_n[,z_n] (specifies "
502 "coordinate data)\n"
503 "\t|sideset:[name=<name>;] data=elem_1,side_1,elem_2,side_2,....,elem_n,side_n; "
504 "[split=<block|topology|none>;] [skin=<block list|all>;]"
505 "(specifies sideset data)\n"
506 "\t|nodeset:[name=<name>;] data=node_1,node_2,....,node_n (specifies nodeset data)\n"
507 "\t|assembly:[name=<name>;] type=<assembly|block|sideset|nodeset>; "
508 "member=member_1,...,member_n (specifies assembly hierarchy)\n"
509 "\t|dimension:spatialDimension (specifies spatial dimension .. default is 3)\n"
510 "\t|help -- show this list\n\n";
511 }
512
513 void handle_unrecognized_option(const std::string &optionType)
514 {
515 std::ostringstream errmsg;
516 errmsg << "ERROR: Unrecognized option '" << optionType << "'. It will be ignored.\n";
517 m_errorHandler(errmsg);
518 }
519
520 void parse_options(const std::vector<std::string> &optionGroups)
521 {
522 for (size_t i = 1; i < optionGroups.size(); i++) {
523 std::vector<std::string> optionGroup = get_tokens(optionGroups[i], ":");
524 std::string optionType = optionGroup[0];
525 convert_to_lowercase(optionType);
526
527 if (optionType == "coordinates") {
528 parse_coordinates_option(optionGroup);
529 }
530 else if (optionType == "dimension") {
531 parse_dimension_option(optionGroup);
532 }
533 else if (optionType == "sideset") {
534 parse_sideset_option(optionGroup);
535 }
536 else if (optionType == "nodeset") {
537 parse_nodeset_option(optionGroup);
538 }
539 else if (optionType == "assembly") {
540 parse_assembly_option(optionGroup);
541 }
542 else if (optionType == "help") {
544 }
545 else {
546 handle_unrecognized_option(optionType);
547 }
548 }
549 }
550
552
555
557
558 std::vector<double> m_rawCoordinates{};
560
562 };
563
564 template <typename EntityId, typename TopologyMapping> class TextMeshParser
565 {
566 private:
568
569 public:
570 explicit TextMeshParser(unsigned enforcedDimension)
571 : m_optionParser(m_data, enforcedDimension)
572 {
574 }
575
577
578 TextMeshData<EntityId, Topology> parse(const std::string &meshDescription)
579 {
580 initialize_parse(meshDescription);
583 return m_data;
584 }
585
587 {
588 m_errorHandler = errorHandler;
589 m_data.partIds.set_error_handler(errorHandler);
590 m_data.coords.set_error_handler(errorHandler);
591 m_data.sidesets.set_error_handler(errorHandler);
592 m_data.nodesets.set_error_handler(errorHandler);
593 m_data.assemblies.set_error_handler(errorHandler);
594 m_optionParser.set_error_handler(errorHandler);
595 }
596
597 private:
599 {
600 ErrorHandler errorHandler = [](const std::ostringstream &errmsg) {
601 default_error_handler(errmsg);
602 };
603 set_error_handler(errorHandler);
604 m_topologyMapping.initialize_topology_map();
605 }
606
607 void initialize_connectivity_parse(const std::string &meshDescription)
608 {
609 m_lexer.set_input_string(meshDescription);
610 m_lineNumber = 1;
611 validate_required_field(m_lexer.has_token());
612 }
613
614 void initialize_parse(const std::string &meshDescription)
615 {
616 m_optionParser.initialize_parse(meshDescription);
617 initialize_connectivity_parse(m_optionParser.get_mesh_connectivity_description());
618 }
619
620 void finalize_parse() { m_optionParser.finalize_parse(); }
621
623 {
624 while (m_lexer.has_token()) {
626 m_data.add_element(elemData);
627
630 }
631
632 std::sort(m_data.elementDataVec.begin(), m_data.elementDataVec.end(),
634 }
635
637 {
639 elem.proc = parse_proc_id();
640 elem.identifier = parse_elem_id();
641 elem.topology = parse_topology();
642 elem.nodeIds = parse_node_ids(elem.topology);
643 elem.partName = parse_part(elem.topology);
644 return elem;
645 }
646
648 {
649 validate_required_field(m_lexer.has_number());
650 return parse_int();
651 }
652
654 {
655 validate_required_field(m_lexer.has_number());
656 return parse_unsigned();
657 }
658
660 {
661 validate_required_field(m_lexer.has_string());
662 std::string topologyName = parse_string();
663
664 Topology topology = m_topologyMapping.topology(topologyName);
665 validate_topology(topology, topologyName);
666
667 return topology;
668 }
669
670 std::vector<EntityId> parse_node_ids(const Topology &topology)
671 {
672 std::vector<EntityId> nodeIds;
673 while (m_lexer.has_number()) {
674 nodeIds.push_back(parse_unsigned());
675 }
676 validate_node_count(topology, nodeIds.size());
677 return nodeIds;
678 }
679
680 std::string parse_part(const Topology &topology)
681 {
682 std::string partName;
683
684 if (m_lexer.has_string()) {
685 partName = parse_string();
686 }
687 else {
688 partName = "block_" + topology.name();
689 }
690
691 if (m_lexer.has_number()) {
692 unsigned partId = parse_unsigned();
693 m_data.partIds.register_part_name_with_id(partName, partId);
694 }
695 else {
696 m_data.partIds.register_part_name(partName);
697 }
698
699 return partName;
700 }
701
702 int parse_int() { return m_lexer.get_int(); }
703 unsigned parse_unsigned() { return m_lexer.get_unsigned(); }
704 std::string parse_string() { return m_lexer.get_string(); }
705
707 {
708 m_lexer.get_newline();
709 m_lineNumber++;
710 }
711
712 void validate_required_field(bool hasNextRequiredField)
713 {
714 if (!hasNextRequiredField) {
715 std::ostringstream errmsg;
716 errmsg
717 << "Error! Each line must contain the following fields (with at least one node): "
718 "Processor, GlobalId, Element Topology, NodeIds. Error on line "
719 << m_lineNumber << ".";
720 m_errorHandler(errmsg);
721 }
722 }
723
725 {
726 bool requiredCondition = !m_lexer.has_token() || m_lexer.has_newline();
727 if (!requiredCondition) {
728 std::ostringstream errmsg;
729 errmsg << "Error! Each line should not contain more than the following fields (with at "
730 "least one node): "
731 "Processor, GlobalId, Element Topology, NodeIds, Part Name, PartId. "
732 "Error on line "
733 << m_lineNumber << ".";
734 m_errorHandler(errmsg);
735 }
736 }
737
738 void validate_topology(const Topology &topology, const std::string &providedName)
739 {
740 if (topology == m_topologyMapping.invalid_topology()) {
741 std::ostringstream errmsg;
742 errmsg << "Error! Topology = >>" << providedName << "<< is invalid from line "
743 << m_lineNumber << ".";
744 m_errorHandler(errmsg);
745 }
746
747 if (!topology.defined_on_spatial_dimension(m_data.spatialDim)) {
748 std::ostringstream errmsg;
749 errmsg << "Error on input line " << m_lineNumber << ". Topology = " << topology
750 << " is not defined on spatial dimension = " << m_data.spatialDim
751 << " set in parser.";
752 m_errorHandler(errmsg);
753 }
754 }
755
756 void validate_node_count(const Topology &topology, size_t numNodes)
757 {
758 size_t numTopologyNodes = topology.num_nodes();
759 if (numNodes != numTopologyNodes) {
760 std::ostringstream errmsg;
761 errmsg << "Error! The input line appears to contain " << numNodes
762 << " nodes, but the topology " << topology << " needs " << numTopologyNodes
763 << " nodes on line " << m_lineNumber << ".";
764 m_errorHandler(errmsg);
765 }
766 }
767
768 unsigned m_lineNumber{0};
772
774
776 };
777
778 } // namespace text_mesh
779} // namespace Iotm
Definition Iotm_TextMeshAssembly.h:163
void parse(const std::string &parseData)
Definition Iotm_TextMeshAssembly.h:184
AssemblyType get_assembly_type() const
Definition Iotm_TextMeshAssembly.h:177
const std::vector< std::string > & get_assembly_data()
Definition Iotm_TextMeshAssembly.h:179
std::string get_name()
Definition Iotm_TextMeshAssembly.h:175
void verify_parse() const
Definition Iotm_TextMeshAssembly.h:193
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshAssembly.h:173
Definition Iotm_TextMeshNodeset.h:55
const std::vector< EntityId > & get_nodeset_data()
Definition Iotm_TextMeshNodeset.h:69
std::string get_name()
Definition Iotm_TextMeshNodeset.h:67
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshNodeset.h:65
void parse(const std::string &parseData)
Definition Iotm_TextMeshNodeset.h:74
Definition Iotm_TextMeshSideset.h:130
void verify_parse() const
Definition Iotm_TextMeshSideset.h:163
const std::vector< std::string > & get_skin_blocks() const
Definition Iotm_TextMeshSideset.h:148
void parse(const std::string &parseData)
Definition Iotm_TextMeshSideset.h:154
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshSideset.h:140
std::string get_name()
Definition Iotm_TextMeshSideset.h:142
const std::vector< std::pair< EntityId, int > > & get_sideset_data()
Definition Iotm_TextMeshSideset.h:144
SplitType get_split_type()
Definition Iotm_TextMeshSideset.h:146
Definition Iotm_TextMeshUtils.h:42
std::string get_string()
Definition Iotm_TextMeshUtils.h:65
std::string make_uppercase(std::string str)
Definition Iotm_TextMeshUtils.h:123
int get_int()
Definition Iotm_TextMeshUtils.h:53
bool has_string() const
Definition Iotm_TextMeshUtils.h:76
unsigned get_unsigned()
Definition Iotm_TextMeshUtils.h:59
void set_input_string(const std::string &input)
Definition Iotm_TextMeshUtils.h:46
unsigned m_currentIndex
Definition Iotm_TextMeshUtils.h:130
bool m_isNumber
Definition Iotm_TextMeshUtils.h:135
bool has_token() const
Definition Iotm_TextMeshUtils.h:73
std::string m_input
Definition Iotm_TextMeshUtils.h:129
bool has_newline() const
Definition Iotm_TextMeshUtils.h:74
bool char_is_comma()
Definition Iotm_TextMeshUtils.h:117
std::string m_token
Definition Iotm_TextMeshUtils.h:133
std::string m_oldToken
Definition Iotm_TextMeshUtils.h:132
TextMeshLexer()
Definition Iotm_TextMeshUtils.h:44
bool char_is_whitespace()
Definition Iotm_TextMeshUtils.h:116
bool has_more_input()
Definition Iotm_TextMeshUtils.h:114
void read_next_token()
Definition Iotm_TextMeshUtils.h:79
char current_char()
Definition Iotm_TextMeshUtils.h:121
bool has_number() const
Definition Iotm_TextMeshUtils.h:75
bool char_is_digit()
Definition Iotm_TextMeshUtils.h:119
void get_newline()
Definition Iotm_TextMeshUtils.h:71
bool char_is_newline()
Definition Iotm_TextMeshUtils.h:118
Definition Iotm_TextMeshUtils.h:139
void validate_dimension()
Definition Iotm_TextMeshUtils.h:206
int m_constructorEnforcedDimension
Definition Iotm_TextMeshUtils.h:554
std::vector< double > m_rawCoordinates
Definition Iotm_TextMeshUtils.h:558
void initialize_parse(const std::string &parameters)
Definition Iotm_TextMeshUtils.h:173
void check_assembly_member_reference()
Definition Iotm_TextMeshUtils.h:398
bool enforced_dimension_provided()
Definition Iotm_TextMeshUtils.h:201
void finalize_parse()
Definition Iotm_TextMeshUtils.h:186
TextMeshOptionParser(TextMeshData< EntityId, Topology > &data)
Definition Iotm_TextMeshUtils.h:160
ErrorHandler m_errorHandler
Definition Iotm_TextMeshUtils.h:559
unsigned long m_parsedOptionMask
Definition Iotm_TextMeshUtils.h:551
TextMeshData< EntityId, Topology > & m_data
Definition Iotm_TextMeshUtils.h:561
void check_sideset_name_collision()
Definition Iotm_TextMeshUtils.h:342
void parse_coordinates_option(const std::vector< std::string > &coordinatesOptionGroup)
Definition Iotm_TextMeshUtils.h:274
void set_dimension()
Definition Iotm_TextMeshUtils.h:219
void validate_assemblies()
Definition Iotm_TextMeshUtils.h:444
void parse_sideset_option(const std::vector< std::string > &sidesetOptionGroup)
Definition Iotm_TextMeshUtils.h:451
void set_coordinates()
Definition Iotm_TextMeshUtils.h:264
int m_parsedDimension
Definition Iotm_TextMeshUtils.h:553
void check_assembly_name_collision()
Definition Iotm_TextMeshUtils.h:426
void check_assembly_cyclic_dependency()
Definition Iotm_TextMeshUtils.h:433
void validate_sidesets()
Definition Iotm_TextMeshUtils.h:349
bool parsed_dimension_provided()
Definition Iotm_TextMeshUtils.h:199
void check_nodeset_node_reference()
Definition Iotm_TextMeshUtils.h:355
TextMeshOptionParser(TextMeshData< EntityId, Topology > &data, unsigned enforcedDimension)
Definition Iotm_TextMeshUtils.h:154
void parse_nodeset_option(const std::vector< std::string > &nodesetOptionGroup)
Definition Iotm_TextMeshUtils.h:467
void parse_dimension_option(const std::vector< std::string > &option)
Definition Iotm_TextMeshUtils.h:232
void parse_assembly_option(const std::vector< std::string > &assemblyOptionGroup)
Definition Iotm_TextMeshUtils.h:479
std::string get_mesh_connectivity_description() const
Definition Iotm_TextMeshUtils.h:168
void check_sideset_element_reference()
Definition Iotm_TextMeshUtils.h:324
static constexpr int DEFAULT_DIMENSION
Definition Iotm_TextMeshUtils.h:142
void validate_nodesets()
Definition Iotm_TextMeshUtils.h:377
void parse_options(const std::vector< std::string > &optionGroups)
Definition Iotm_TextMeshUtils.h:520
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshUtils.h:166
void check_nodeset_name_collision()
Definition Iotm_TextMeshUtils.h:370
void deallocate_raw_coordinates()
Definition Iotm_TextMeshUtils.h:258
void check_name_collision_with_entity_sets(const EntityGroupData< DataType > &groupData, const std::string &entityType, const std::set< std::string > &entitySetNames)
Definition Iotm_TextMeshUtils.h:296
static constexpr int INVALID_DIMENSION
Definition Iotm_TextMeshUtils.h:141
void handle_unrecognized_option(const std::string &optionType)
Definition Iotm_TextMeshUtils.h:513
ParsedOptions
Definition Iotm_TextMeshUtils.h:144
@ PARSED_COORDINATES
Definition Iotm_TextMeshUtils.h:147
@ PARSED_NONE
Definition Iotm_TextMeshUtils.h:145
@ PARSED_ASSEMBLY
Definition Iotm_TextMeshUtils.h:150
@ PARSED_NODESET
Definition Iotm_TextMeshUtils.h:149
@ PARSED_DIMENSION
Definition Iotm_TextMeshUtils.h:146
@ PARSED_SIDESET
Definition Iotm_TextMeshUtils.h:148
bool parsed_coordinates_provided()
Definition Iotm_TextMeshUtils.h:272
void check_name_collision_with_group(const SrcDataGroup &srcGroup, const DestDataGroup &destGroup)
Definition Iotm_TextMeshUtils.h:313
std::string m_meshConnectivityDescription
Definition Iotm_TextMeshUtils.h:556
void check_assembly_member_reference_in_group(const AssemblyData &assemblyData, const T &group)
Definition Iotm_TextMeshUtils.h:384
void print_help_message(std::ostream &out=std::cout)
Definition Iotm_TextMeshUtils.h:494
typename IossTopologyMapping::Topology Topology
Definition Iotm_TextMeshUtils.h:567
void initialize_parse(const std::string &meshDescription)
Definition Iotm_TextMeshUtils.h:614
std::string parse_string()
Definition Iotm_TextMeshUtils.h:704
EntityId parse_elem_id()
Definition Iotm_TextMeshUtils.h:653
TextMeshLexer m_lexer
Definition Iotm_TextMeshUtils.h:770
TextMeshData< EntityId, Topology > parse(const std::string &meshDescription)
Definition Iotm_TextMeshUtils.h:578
IossTopologyMapping m_topologyMapping
Definition Iotm_TextMeshUtils.h:771
void initialize_constructor()
Definition Iotm_TextMeshUtils.h:598
Topology parse_topology()
Definition Iotm_TextMeshUtils.h:659
TextMeshData< EntityId, Topology > m_data
Definition Iotm_TextMeshUtils.h:769
void validate_no_extra_fields()
Definition Iotm_TextMeshUtils.h:724
ErrorHandler m_errorHandler
Definition Iotm_TextMeshUtils.h:773
std::string parse_part(const Topology &topology)
Definition Iotm_TextMeshUtils.h:680
void parse_newline()
Definition Iotm_TextMeshUtils.h:706
ElementData< EntityId, Topology > parse_element()
Definition Iotm_TextMeshUtils.h:636
unsigned m_lineNumber
Definition Iotm_TextMeshUtils.h:768
int parse_proc_id()
Definition Iotm_TextMeshUtils.h:647
void initialize_connectivity_parse(const std::string &meshDescription)
Definition Iotm_TextMeshUtils.h:607
void validate_required_field(bool hasNextRequiredField)
Definition Iotm_TextMeshUtils.h:712
void validate_topology(const Topology &topology, const std::string &providedName)
Definition Iotm_TextMeshUtils.h:738
void validate_node_count(const Topology &topology, size_t numNodes)
Definition Iotm_TextMeshUtils.h:756
TextMeshOptionParser< EntityId, Topology > m_optionParser
Definition Iotm_TextMeshUtils.h:775
void finalize_parse()
Definition Iotm_TextMeshUtils.h:620
void parse_description()
Definition Iotm_TextMeshUtils.h:622
unsigned parse_unsigned()
Definition Iotm_TextMeshUtils.h:703
void set_error_handler(ErrorHandler errorHandler)
Definition Iotm_TextMeshUtils.h:586
int parse_int()
Definition Iotm_TextMeshUtils.h:702
TextMeshParser()
Definition Iotm_TextMeshUtils.h:576
std::vector< EntityId > parse_node_ids(const Topology &topology)
Definition Iotm_TextMeshUtils.h:670
TextMeshParser(unsigned enforcedDimension)
Definition Iotm_TextMeshUtils.h:570
Definition Iotm_TextMeshDataTypes.h:38
TopologyMapEntry Topology
Definition Iotm_TextMeshDataTypes.h:40
Definition Iotm_TextMeshAdjacencyGraph.h:39
void convert_to_uppercase(std::string &str)
Definition Iotm_TextMeshFuncs.h:96
std::function< void(const std::ostringstream &)> ErrorHandler
Definition Iotm_TextMeshAdjacencyGraph.h:41
void convert_to_lowercase(std::string &str)
Definition Iotm_TextMeshFuncs.h:101
AssemblyType
Definition Iotm_TextMeshAssembly.h:38
std::vector< std::string > get_tokens(const std::string &str, const std::string &separators)
Definition Iotm_TextMeshFuncs.h:76
void default_error_handler(const std::ostringstream &message)
Definition Iotm_TextMeshFuncs.h:40
std::set< T > transform_to_set(const std::vector< T > &dataAsVector)
Definition Iotm_TextMeshFuncs.h:115
A namespace for the textmesh database format.
Definition Iotm_DatabaseIO.C:95
int64_t EntityId
Definition Iotm_TextMesh.h:33
Definition Iotm_TextMeshAssembly.h:55
void set_assembly_type(AssemblyType type_)
Definition Iotm_TextMeshAssembly.h:58
Definition Iotm_TextMeshDataTypes.h:287
Definition Iotm_TextMeshDataTypes.h:276
Topology topology
Definition Iotm_TextMeshDataTypes.h:279
std::string partName
Definition Iotm_TextMeshDataTypes.h:281
int proc
Definition Iotm_TextMeshDataTypes.h:277
EntityId identifier
Definition Iotm_TextMeshDataTypes.h:278
std::vector< EntityId > nodeIds
Definition Iotm_TextMeshDataTypes.h:280
Definition Iotm_TextMeshEntityGroup.h:43
std::string name
Definition Iotm_TextMeshEntityGroup.h:49
std::string type
Definition Iotm_TextMeshEntityGroup.h:50
unsigned id
Definition Iotm_TextMeshEntityGroup.h:48
std::vector< DataType > data
Definition Iotm_TextMeshEntityGroup.h:51
Definition Iotm_TextMeshNodeset.h:40
Definition Iotm_TextMeshSideset.h:43
void set_split_type(SplitType splitType)
Definition Iotm_TextMeshSideset.h:47
void set_skin_blocks(const std::vector< std::string > &skinBlocks)
Definition Iotm_TextMeshSideset.h:50
Definition Iotm_TextMeshDataTypes.h:314