7#include "iotm_export.h"
21#include <unordered_map>
39 using ErrorHandler = std::function<void(
const std::ostringstream &)>;
125 std::transform(str.begin(), str.end(), str.begin(), ::toupper);
175 if (!parameters.empty()) {
176 std::vector<std::string> optionGroups =
get_tokens(parameters,
"|");
189 m_data.partIds.finalize_parse();
191 m_data.nodesets.finalize_parse();
192 m_data.assemblies.finalize_parse();
210 std::ostringstream errmsg;
235 std::ostringstream errmsg;
236 errmsg <<
"Spatial dimension has already been parsed! Check syntax.";
240 if (option.size() == 2) {
243 std::ostringstream errmsg;
245 <<
" not defined to be 2 or 3.";
252 std::ostringstream errmsg;
253 errmsg <<
"Error! Invalid spatial dimension syntax.";
260 std::vector<double> swapVectorForDeallocation;
277 std::ostringstream errmsg;
278 errmsg <<
"Coordinates have already been parsed! Check syntax.";
282 if (coordinatesOptionGroup.size() > 1) {
283 const std::vector<std::string> &coordinateTokens =
286 for (
const auto &token : coordinateTokens) {
287 double coord = std::stod(token);
295 template <
typename DataType>
297 const std::string &entityType,
298 const std::set<std::string> &entitySetNames)
300 std::string groupName = groupData.
name;
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.";
312 template <
typename SrcDataGroup,
typename DestDataGroup>
314 const DestDataGroup &destGroup)
316 std::set<std::string> groupNames =
transform_to_set(destGroup.get_part_names());
318 for (
const auto &srcGroupData : srcGroup.get_group_data()) {
327 m_data.sidesets.get_group_data()) {
328 for (
const std::pair<EntityId, int> &elemSidePair : sidesetData.data) {
330 if (!std::binary_search(
m_data.elementDataVec.begin(),
m_data.elementDataVec.end(),
332 std::ostringstream errmsg;
333 errmsg <<
"Error! Sideset with id: " << sidesetData.id
334 <<
" and name: " << sidesetData.name <<
" has reference to invalid element '"
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 '"
383 template <
typename T>
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 <<
"'.";
401 const AssemblyType assemblyType = assemblyData.get_assembly_type();
403 switch (assemblyType) {
404 case AssemblyType::BLOCK:
407 case AssemblyType::SIDESET:
410 case AssemblyType::NODESET:
413 case AssemblyType::ASSEMBLY:
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 <<
"'.";
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.";
453 if (sidesetOptionGroup.size() > 1) {
456 parser.
parse(sidesetOptionGroup[1]);
469 if (nodesetOptionGroup.size() > 1) {
472 parser.
parse(nodesetOptionGroup[1]);
481 if (assemblyOptionGroup.size() > 1) {
484 parser.
parse(assemblyOptionGroup[1]);
496 out <<
"\nValid Options for TextMesh parameter string:\n"
497 "\tPROC_ID,ELEM_ID,TOPOLOGY,{NODE CONNECTIVITY LIST}[,PART_NAME[,PART_ID]] "
499 "element list .. first "
501 "\t|coordinates:x_1,y_1[,z_1], x_2,y_2[,z_2], ...., x_n,y_n[,z_n] (specifies "
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";
515 std::ostringstream errmsg;
516 errmsg <<
"ERROR: Unrecognized option '" << optionType <<
"'. It will be ignored.\n";
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];
527 if (optionType ==
"coordinates") {
530 else if (optionType ==
"dimension") {
533 else if (optionType ==
"sideset") {
536 else if (optionType ==
"nodeset") {
539 else if (optionType ==
"assembly") {
542 else if (optionType ==
"help") {
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);
600 ErrorHandler errorHandler = [](
const std::ostringstream &errmsg) {
609 m_lexer.set_input_string(meshDescription);
626 m_data.add_element(elemData);
632 std::sort(
m_data.elementDataVec.begin(),
m_data.elementDataVec.end(),
672 std::vector<EntityId> nodeIds;
682 std::string partName;
688 partName =
"block_" + topology.name();
693 m_data.partIds.register_part_name_with_id(partName, partId);
696 m_data.partIds.register_part_name(partName);
714 if (!hasNextRequiredField) {
715 std::ostringstream errmsg;
717 <<
"Error! Each line must contain the following fields (with at least one node): "
718 "Processor, GlobalId, Element Topology, NodeIds. Error on line "
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 "
731 "Processor, GlobalId, Element Topology, NodeIds, Part Name, PartId. "
741 std::ostringstream errmsg;
742 errmsg <<
"Error! Topology = >>" << providedName <<
"<< is invalid from line "
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.";
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
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 ¶meters)
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