@@ -80,6 +80,7 @@ namespace {
8080 const std ::vector < INT > & local_node_map , SystemInterface & interFace );
8181 void process_nset_omissions (RegionVector & part_mesh , const Omissions & omit );
8282 void process_sset_omissions (RegionVector & part_mesh , const Omissions & omit );
83+ void process_assembly_omissions (RegionVector & part_mesh , const Omissions & omit );
8384
8485 int count_omissions (Ioss ::Region * region )
8586 {
@@ -123,7 +124,9 @@ namespace {
123124} // namespace
124125
125126namespace {
126- void transfer_elementblock (Ioss ::Region & region , Ioss ::Region & output_region , bool debug );
127+ void transfer_elementblock (Ioss ::Region & region , Ioss ::Region & output_region ,
128+ bool create_assemblies , bool debug );
129+ void transfer_assembly (Ioss ::Region & region , Ioss ::Region & output_region , bool debug );
127130 void transfer_nodesets (Ioss ::Region & region , Ioss ::Region & output_region , bool debug );
128131 void transfer_sidesets (Ioss ::Region & region , Ioss ::Region & output_region , bool debug );
129132 void create_nodal_nodeset (Ioss ::Region & region , Ioss ::Region & output_region , bool debug );
@@ -240,6 +243,7 @@ int main(int argc, char *argv[])
240243
241244 process_nset_omissions (part_mesh , interFace .nset_omissions ());
242245 process_sset_omissions (part_mesh , interFace .sset_omissions ());
246+ process_assembly_omissions (part_mesh , interFace .assembly_omissions ());
243247
244248 double time = 0.0 ;
245249
@@ -404,7 +408,7 @@ double ejoin(SystemInterface &interFace, std::vector<Ioss::Region *> &part_mesh,
404408
405409 // Add element blocks, nodesets, sidesets
406410 for (size_t p = 0 ; p < part_count ; p ++ ) {
407- transfer_elementblock (* part_mesh [p ], output_region , false);
411+ transfer_elementblock (* part_mesh [p ], output_region , interFace . create_assemblies (), false);
408412 if (interFace .convert_nodes_to_nodesets (p + 1 )) {
409413 create_nodal_nodeset (* part_mesh [p ], output_region , false);
410414 }
@@ -414,6 +418,7 @@ double ejoin(SystemInterface &interFace, std::vector<Ioss::Region *> &part_mesh,
414418 if (!interFace .omit_sidesets ()) {
415419 transfer_sidesets (* part_mesh [p ], output_region , false);
416420 }
421+ transfer_assembly (* part_mesh [p ], output_region , false);
417422 }
418423
419424 if (!interFace .information_record_parts ().empty ()) {
@@ -565,11 +570,19 @@ namespace {
565570 return omitted ;
566571 }
567572
568- void transfer_elementblock (Ioss ::Region & region , Ioss ::Region & output_region , bool debug )
573+ void transfer_elementblock (Ioss ::Region & region , Ioss ::Region & output_region ,
574+ bool create_assemblies , bool debug )
569575 {
570576 static int used_blocks = 0 ;
571577 const std ::string & prefix = region .name ();
572578
579+ Ioss ::Assembly * assem = nullptr ;
580+ if (create_assemblies ) {
581+ assem = new Ioss ::Assembly (output_region .get_database (), region .name ());
582+ output_region .add (assem );
583+ assem -> property_add (Ioss ::Property ("name_in_output" , region .name ()));
584+ }
585+
573586 const Ioss ::ElementBlockContainer & ebs = region .get_element_blocks ();
574587 for (const auto & eb : ebs ) {
575588 if (!entity_is_omitted (eb )) {
@@ -581,6 +594,8 @@ namespace {
581594 exit (EXIT_FAILURE );
582595 }
583596 }
597+ eb -> property_add (Ioss ::Property ("name_in_output" , name ));
598+
584599 if (debug ) {
585600 fmt ::print (stderr , "{}, " , name );
586601 }
@@ -601,6 +616,54 @@ namespace {
601616 // Set the new property
602617 ebn -> property_add (Ioss ::Property ("original_topology_type" , oes ));
603618 }
619+
620+ if (create_assemblies ) {
621+ assem -> add (ebn );
622+ }
623+ }
624+ }
625+ }
626+ }
627+
628+ void transfer_assembly (Ioss ::Region & region , Ioss ::Region & output_region , bool debug )
629+ {
630+ // All assemblies on the input parts will be transferred to the output mesh
631+ // Possibly renamed if a name conflict
632+ // Also need to update names of the entities in the assembly since they were possibly
633+ // renamed on the output...
634+ // TODO: handle renamed nested assemblies...
635+ const std ::string & prefix = region .name ();
636+
637+ const Ioss ::AssemblyContainer & assems = region .get_assemblies ();
638+ for (const auto & as : assems ) {
639+ if (!entity_is_omitted (as )) {
640+ std ::string name = as -> name ();
641+ if (output_region .get_assembly (name ) != nullptr ) {
642+ name = prefix + "_" + as -> name ();
643+ if (output_region .get_assembly (name ) != nullptr ) {
644+ fmt ::print (stderr , "ERROR: Duplicate assemblies named '{}'\n" , name );
645+ exit (EXIT_FAILURE );
646+ }
647+ }
648+ as -> property_add (Ioss ::Property ("name_in_output" , name ));
649+
650+ if (debug ) {
651+ fmt ::print (stderr , "{}, " , name );
652+ }
653+ size_t num_members = as -> entity_count ();
654+ if (num_members > 0 ) {
655+ auto member_type = as -> get_member_type ();
656+ auto asn = new Ioss ::Assembly (output_region .get_database (), name );
657+ output_region .add (asn );
658+
659+ const auto & members = as -> get_members ();
660+ for (const auto & member : members ) {
661+ auto output_name = member -> get_property ("name_in_output" ).get_string ();
662+
663+ auto * entity = output_region .get_entity (output_name , member_type );
664+ assert (entity != nullptr );
665+ asn -> add (entity );
666+ }
604667 }
605668 }
606669 }
@@ -621,6 +684,7 @@ namespace {
621684 exit (EXIT_FAILURE );
622685 }
623686 }
687+ fs -> property_add (Ioss ::Property ("name_in_output" , name ));
624688 if (debug ) {
625689 fmt ::print (stderr , "{}, " , name );
626690 }
@@ -633,6 +697,7 @@ namespace {
633697 if (debug ) {
634698 fmt ::print (stderr , "{}, " , fbname );
635699 }
700+ fb -> property_add (Ioss ::Property ("name_in_output" , fbname ));
636701 std ::string fbtype = fb -> topology ()-> name ();
637702 std ::string partype = fb -> parent_element_topology ()-> name ();
638703 size_t num_side = fb -> entity_count ();
@@ -747,6 +812,7 @@ namespace {
747812 exit (EXIT_FAILURE );
748813 }
749814 }
815+ ns -> property_add (Ioss ::Property ("name_in_output" , name ));
750816 if (debug ) {
751817 fmt ::print (stderr , "{}, " , name );
752818 }
@@ -1493,4 +1559,28 @@ namespace {
14931559 }
14941560 }
14951561 }
1562+
1563+ void process_assembly_omissions (RegionVector & part_mesh , const Omissions & omit )
1564+ {
1565+ size_t part_count = part_mesh .size ();
1566+ for (size_t p = 0 ; p < part_count ; p ++ ) {
1567+ if (!omit [p ].empty ()) {
1568+ // Get the assemblies for this part and set the "omitted" property on the assembly
1569+ if (omit [p ][0 ] == "ALL" ) {
1570+ const auto & assemblies = part_mesh [p ]-> get_assemblies ();
1571+ for (auto & as : assemblies ) {
1572+ as -> property_add (Ioss ::Property (std ::string ("omitted" ), 1 ));
1573+ }
1574+ }
1575+ else {
1576+ for (const auto & omitted : omit [p ]) {
1577+ auto * as = part_mesh [p ]-> get_assembly (omitted );
1578+ if (as != nullptr ) {
1579+ as -> property_add (Ioss ::Property (std ::string ("omitted" ), 1 ));
1580+ }
1581+ }
1582+ }
1583+ }
1584+ }
1585+ }
14961586} // namespace
0 commit comments