512 logEvent(
"Starting to update material arrays",4);
514 apf::ModelEntity* geomEnt;
515 apf::MeshIterator* it;
526 apf::Field* nodeMaterials = apf::createLagrangeField(m,
"nodeMaterials", apf::SCALAR, 1);
528 PCU_Comm_Begin(PCUObj);
529 while(
f = m->iterate(it))
531 geomEnt = m->toModel(
f);
533 if(m->getModelType(geomEnt) == m->getDimension())
535 apf::setScalar(nodeMaterials,
f,0,0);
539 apf::Adjacent vert_adjFace;
540 m->getAdjacent(
f,m->getDimension()-1,vert_adjFace);
541 apf::MeshEntity* face;
542 for(
int i =0; i<vert_adjFace.getSize();i++)
544 face=vert_adjFace[i];
545 geomEnt = m->toModel(face);
548 if(m->getModelType(geomEnt) == m->getDimension()-1)
550 geomTag = m->getModelTag(geomEnt);
551 apf::setScalar(nodeMaterials,
f,0,geomTag);
555 m->getRemotes(
f,remotes);
556 for(apf::Copies::iterator iter = remotes.begin(); iter != remotes.end(); ++iter)
558 PCU_COMM_PACK(PCUObj, iter->first,iter->second);
559 PCU_COMM_PACK(PCUObj, iter->first,geomTag);
564 if(i == vert_adjFace.getSize()-1 )
565 apf::setScalar(nodeMaterials,
f,0,-1);
570 PCU_Comm_Send(PCUObj);
571 while(PCU_Comm_Receive(PCUObj))
573 PCU_COMM_UNPACK(PCUObj,
f);
574 PCU_COMM_UNPACK(PCUObj, geomTag);
575 int currentTag = apf::getScalar(nodeMaterials,
f,0);
576 int newTag = std::min(currentTag,geomTag);
580 apf::setScalar(nodeMaterials,
f,0,geomTag);
582 apf::setScalar(nodeMaterials,
f,0,newTag);
585 apf::synchronize(nodeMaterials);
587 while(
f=m->iterate(it))
595 int dim = m->getDimension()-1;
597 while(
f = m->iterate(it))
600 geomEnt = m->toModel(
f);
601 geomTag = m->getModelTag(geomEnt);
602 if(m->getModelType(geomEnt) == dim)
609 apf::destroyField(nodeMaterials);
612 dim = m->getDimension();
614 while(
f = m->iterate(it)){
616 geomEnt = m->toModel(
f);
617 geomTag = m->getModelTag(geomEnt);
618 if(m->getModelType(geomEnt) == dim){
643 static void constructVerts(
644 Mesh2* m,
int nverts,
645 int* local2globalMap,
646 GlobalToVert& result)
648 ModelEntity* interior = m->findModelEntity(m->getDimension(), 0);
649 for (
int i = 0; i < nverts; ++i)
650 result[local2globalMap[i]] = m->createVert_(interior);
654 static void constructBoundaryElements(
655 Mesh2* m,
const apf::Gid* conn_b,
int nelem_b,
int etype_b,
656 GlobalToVert& globalToVert)
658 ModelEntity* interior = m->findModelEntity(m->getDimension(), 0);
659 int nev = apf::Mesh::adjacentCount[etype_b][0];
660 for (
int i = 0; i < nelem_b; ++i) {
662 int offset = i * nev;
663 for (
int j = 0; j < nev; ++j){
664 verts[j] = globalToVert[conn_b[j + offset]];
668 if(m->getDimension()==2)
669 m->createEntity(etype_b,interior,verts);
671 apf::buildElement(m,interior,2,verts);
674 static void constructElements(
675 Mesh2* m,
const Gid* conn,
int nelem,
int etype,
676 GlobalToVert& globalToVert)
678 ModelEntity* interior = m->findModelEntity(m->getDimension(), 0);
679 int nev = apf::Mesh::adjacentCount[etype][0];
680 for (
int i = 0; i < nelem; ++i) {
682 int offset = i * nev;
683 for (
int j = 0; j < nev; ++j)
684 verts[j] = globalToVert[conn[j + offset]];
685 buildElement(m, interior, etype, verts);
689 static apf::Gid getMax(
const GlobalToVert& globalToVert, PCU_t PCUObj)
692 APF_CONST_ITERATE(GlobalToVert, globalToVert, it)
693 max = std::max(
max, it->first);
694 return PCU_Max_Int(PCUObj,
max);
702 static void constructResidence(Mesh2* m, GlobalToVert& globalToVert, PCU_t PCUObj)
704 Gid
max = getMax(globalToVert, PCUObj);
706 int peers = PCU_Comm_Peers(PCUObj);
707 int quotient = total / peers;
708 int remainder = total % peers;
709 int mySize = quotient;
710 int self = PCU_Comm_Self(PCUObj);
711 if (self == (peers - 1))
713 typedef std::vector< std::vector<int> > TmpParts;
714 TmpParts tmpParts(mySize);
717 PCU_Comm_Begin(PCUObj);
718 APF_ITERATE(GlobalToVert, globalToVert, it) {
720 int to = std::min(peers - 1, gid / quotient);
721 PCU_COMM_PACK(PCUObj, to, gid);
723 PCU_Comm_Send(PCUObj);
724 int myOffset = self * quotient;
727 while (PCU_Comm_Receive(PCUObj)) {
729 PCU_COMM_UNPACK(PCUObj, gid);
730 int from = PCU_Comm_Sender(PCUObj);
731 tmpParts.at(gid - myOffset).push_back(from);
735 PCU_Comm_Begin(PCUObj);
736 for (
int i = 0; i < mySize; ++i) {
737 std::vector<int>& parts = tmpParts[i];
738 for (
size_t j = 0; j < parts.size(); ++j) {
740 int gid = i + myOffset;
741 int nparts = parts.size();
742 PCU_COMM_PACK(PCUObj, to, gid);
743 PCU_COMM_PACK(PCUObj, to, nparts);
744 for (
size_t k = 0; k < parts.size(); ++k)
745 PCU_COMM_PACK(PCUObj, to, parts[k]);
748 PCU_Comm_Send(PCUObj);
752 while (PCU_Comm_Receive(PCUObj)) {
754 PCU_COMM_UNPACK(PCUObj, gid);
756 PCU_COMM_UNPACK(PCUObj, nparts);
758 for (
int i = 0; i < nparts; ++i) {
760 PCU_COMM_UNPACK(PCUObj, part);
761 residence.insert(part);
763 MeshEntity* vert = globalToVert[gid];
764 m->setResidence(vert, residence);
771 static void constructRemotes(Mesh2* m, GlobalToVert& globalToVert, PCU_t PCUObj)
773 int self = PCU_Comm_Self(PCUObj);
774 PCU_Comm_Begin(PCUObj);
775 APF_ITERATE(GlobalToVert, globalToVert, it) {
777 MeshEntity* vert = it->second;
779 m->getResidence(vert, residence);
780 APF_ITERATE(Parts, residence, rit)
782 PCU_COMM_PACK(PCUObj, *rit, gid);
783 PCU_COMM_PACK(PCUObj, *rit, vert);
786 PCU_Comm_Send(PCUObj);
787 while (PCU_Comm_Receive(PCUObj)) {
789 PCU_COMM_UNPACK(PCUObj, gid);
791 PCU_COMM_UNPACK(PCUObj, remote);
792 int from = PCU_Comm_Sender(PCUObj);
793 MeshEntity* vert = globalToVert[gid];
794 m->addRemote(vert, from, remote);
798 void construct(Mesh2* m,
const Gid* conn,
const Gid* conn_b,
int nelem,
799 int nelem_b,
int nverts,
int etype,
int etype_b,
int* local2globalMap,
800 GlobalToVert& globalToVert, PCU_t PCUObj)
802 constructVerts(m, nverts,local2globalMap,globalToVert);
803 constructBoundaryElements(m, conn_b, nelem_b, etype_b, globalToVert);
804 constructElements(m, conn, nelem, etype, globalToVert);
805 constructResidence(m, globalToVert, PCUObj);
806 constructRemotes(m, globalToVert, PCUObj);
874 if(PCU_Comm_Self(PCUObj)==0)
875 std::cout<<
"STARTING RECONSTRUCTION\n";
879 comm_size = PCU_Comm_Peers(PCUObj);
880 comm_rank = PCU_Comm_Self(PCUObj);
884 int numModelBoundaries;
887 int nBoundaryNodes=0;
911 numModelBoundaries = numModelEdges;
915 numModelNodes = nBoundaryNodes;
921 assert(numModelRegions>0);
936 struct gmi_base* gMod_base;
937 gMod_base = (gmi_base*)malloc(
sizeof(*gMod_base));
938 gMod_base->model.ops = &gmi_base_ops;
939 gmi_base_init(gMod_base);
954 gmi_base_reserve(gMod_base,AGM_REGION,0);
965 gMod = &gMod_base->model;
972 m = apf::makeEmptyMdsMesh(gMod,numDim,
false,&pcuObj_);
975 int boundaryDim = numDim-1;
976 apf::GlobalToVert outMap;
978 etype = apf::Mesh::TRIANGLE;
979 etype_b = apf::Mesh::EDGE;
982 etype = apf::Mesh::TET;
983 etype_b = apf::Mesh::TRIANGLE;
988 apf::Gid* local2global_elementBoundaryNodes;
989 local2global_elementBoundaryNodes = (apf::Gid*) malloc(
sizeof(apf::Gid)*mesh.
nElementBoundaries_global*apf::Mesh::adjacentCount[etype_b][0]);
993 apf::Gid* local2global_elementNodes;
994 local2global_elementNodes = (apf::Gid*) malloc(
sizeof(apf::Gid)*mesh.
nElements_global*apf::Mesh::adjacentCount[etype][0]);
995 for(
int i=0;i<mesh.
nElements_global*apf::Mesh::adjacentCount[etype][0];i++){
1000 apf::construct(m,local2global_elementNodes,local2global_elementBoundaryNodes,
1010 apf::MeshIterator* entIter=m->begin(0);
1011 apf::MeshEntity* ent;
1013 while((ent=m->iterate(entIter))){
1014 if(m->isOwned(ent)){
1022 entIter=m->begin(boundaryDim);
1024 int nExteriorElementBoundaries_owned = 0;
1025 while((ent=m->iterate(entIter))){
1026 if(m->isOwned(ent)){
1028 nExteriorElementBoundaries_owned++;
1040 numModelBoundaries = numModelEdges;
1044 numModelNodes = nBoundaryNodes;
1046 numModelBoundaries = nExteriorElementBoundaries_owned;
1061 entIter = m->begin(numDim);
1062 int regStartMaterial = 100;
1064 while(ent = m->iterate(entIter)){
1081 apf::ModelEntity* g_vertEnt;
1082 apf::ModelEntity* g_edgeEnt;
1083 apf::ModelEntity* g_faceEnt;
1084 apf::MeshEntity* vertEnt;
1093 gmi_unfreeze_lookups(gMod_base->lookup);
1095 e = agm_add_ent(gMod_base->topo, AGM_VERTEX);
1096 gmi_set_lookup(gMod_base->lookup, e, i);
1098 gmi_freeze_lookup(gMod_base->lookup, (agm_ent_type)0);
1102 e = agm_add_ent(gMod_base->topo, AGM_EDGE);
1104 e = agm_add_ent(gMod_base->topo, AGM_FACE);
1105 gmi_set_lookup(gMod_base->lookup, e, i);
1107 gmi_freeze_lookup(gMod_base->lookup, (agm_ent_type)boundaryDim);
1109 for(
int i=0;i<numModelRegions;i++){
1111 e = agm_add_ent(gMod_base->topo, AGM_FACE);
1113 e = agm_add_ent(gMod_base->topo, AGM_REGION);
1116 gmi_set_lookup(gMod_base->lookup, e, i+regStartMaterial);
1118 b = agm_add_bdry(gMod_base->topo, e);
1123 agm_add_use(gMod_base->topo,b,d);
1128 gmi_freeze_lookup(gMod_base->lookup, (agm_ent_type)numDim);
1132 e = agm_add_ent(gMod_base->topo, AGM_EDGE);
1133 gmi_set_lookup(gMod_base->lookup, e, i);
1135 gmi_freeze_lookup(gMod_base->lookup, (agm_ent_type)1);
1139 apf::ModelEntity* gEnt;
1144 entIter = m->begin(0);
1145 PCU_Comm_Begin(PCUObj);
1146 while(ent = m->iterate(entIter)){
1150 m->setPoint(ent,0,pt);
1151 if(m->isOwned(ent)){
1163 gEnt = m->findModelEntity(numDim,matTag);
1167 gEnt = m->findModelEntity(0,vertCounter);
1172 m->setModelEntity(ent,gEnt);
1174 if(m->isShared(ent)){
1175 apf::Copies remotes;
1176 m->getRemotes(ent,remotes);
1177 for(apf::Copies::iterator it = remotes.begin(); it != remotes.end(); ++it){
1178 PCU_COMM_PACK(PCUObj, it->first,it->second);
1179 PCU_COMM_PACK(PCUObj, it->first,gEnt);
1186 PCU_Comm_Send(PCUObj);
1188 while(PCU_Comm_Receive(PCUObj)){
1189 PCU_COMM_UNPACK(PCUObj, ent);
1190 PCU_COMM_UNPACK(PCUObj, gEnt);
1191 m->setModelEntity(ent,gEnt);
1193 PCU_Barrier(PCUObj);
1202 int boundaryCounter = 0;
1205 apf::ModelEntity* edg_gEnt;
1206 entIter=m->begin(boundaryDim);
1207 PCU_Comm_Begin(PCUObj);
1208 while(ent = m->iterate(entIter)){
1217 gEnt = m->findModelEntity(boundaryDim,boundaryMaterialCounter);
1220 boundaryMaterialCounter++;
1224 apf::Adjacent adj_edges;
1225 m->getAdjacent(ent,1,adj_edges);
1226 for(
int i=0;i<adj_edges.getSize();i++){
1228 if(m->getModelType(m->toModel(adj_edges[i]))>m->getModelType(gEnt) || (m->getModelType(m->toModel(adj_edges[i]))==0)){
1229 edg_gEnt = m->findModelEntity(1,edgCounter);
1230 m->setModelEntity(adj_edges[i],edg_gEnt);
1233 if(m->isOwned(adj_edges[i]) && m->isShared(adj_edges[i])){
1234 apf::Copies remotes;
1235 m->getRemotes(ent,remotes);
1236 for(apf::Copies::iterator it = remotes.begin(); it != remotes.end(); ++it){
1237 PCU_COMM_PACK(PCUObj, it->first,it->second);
1238 PCU_COMM_PACK(PCUObj, it->first,edg_gEnt);
1256 gEnt = m->findModelEntity(numDim,matTag);
1259 apf::Adjacent adj_edges;
1260 m->getAdjacent(ent,1,adj_edges);
1261 for(
int i=0;i<adj_edges.getSize();i++){
1263 if(m->getModelType(m->toModel(adj_edges[i]))>m->getModelType(gEnt) || (m->getModelType(m->toModel(adj_edges[i]))==0)){
1264 m->setModelEntity(adj_edges[i],gEnt);
1266 if(m->isOwned(adj_edges[i]) && m->isShared(adj_edges[i])){
1267 apf::Copies remotes;
1268 m->getRemotes(ent,remotes);
1269 for(apf::Copies::iterator it = remotes.begin(); it != remotes.end(); ++it){
1270 PCU_COMM_PACK(PCUObj, it->first,it->second);
1271 PCU_COMM_PACK(PCUObj, it->first,gEnt);
1280 m->setModelEntity(ent,gEnt);
1283 PCU_Comm_Send(PCUObj);
1285 while(PCU_Comm_Receive(PCUObj)){
1286 PCU_COMM_UNPACK(PCUObj, ent);
1287 PCU_COMM_UNPACK(PCUObj, gEnt);
1288 m->setModelEntity(ent,gEnt);
1290 PCU_Barrier(PCUObj);
1298 for(
int i=0;i<numModelRegions;i++)
1302 entIter = m->begin(numDim);
1303 while(ent = m->iterate(entIter)){
1305 m->setModelEntity(ent,gEnt);
1319 apf::alignMdsRemotes(m);
1327 free(local2global_elementBoundaryNodes);
1328 free(local2global_elementNodes);
1330 if(PCU_Comm_Self(PCUObj)==0)
1331 std::cout<<
"FINISHING RECONSTRUCTION\n";
1342 elementType = apf::Mesh::TRIANGLE;
1346 elementType = apf::Mesh::TET;
1353 isModelVert_bool[i] = isModelVert[i] != 0;
1355 static int numEntries = 2+dim;
1357 int bEdges_1D[nBFaces][4];
1358 int bFaces_2D[nBFaces][5];
1361 for(
int i=0;i<nBFaces;i++){
1362 int idx = i*numEntries;
1363 for(
int j=0;j<numEntries;j++)
1364 bEdges_1D[i][j] = bFaces[idx+j];
1368 for(
int i=0;i<nBFaces;i++){
1369 int idx = i*numEntries;
1370 for(
int j=0;j<numEntries;j++)
1371 bFaces_2D[i][j] = bFaces[idx+j];
1383 apf::GlobalToVert outMap;
1385 gmi_model* tempModel = gmi_load(
".null");
1386 m = apf::makeEmptyMdsMesh(tempModel,dim,
false,&pcuObj_);
1387 std::valarray<apf::Gid> elementNodesArray(mesh.
nElements_global*apf::Mesh::adjacentCount[elementType][0]);
1388 for(
int i=0;i<mesh.
nElements_global*apf::Mesh::adjacentCount[elementType][0];i++){
1395 std::map<int,apf::MeshEntity*> globalToRegion;
1396 apf::MeshIterator* it = m->begin(dim);
1397 apf::MeshEntity* ent;
1399 while( ent = m->iterate(it) ){
1400 globalToRegion.insert(std::pair<int,apf::MeshEntity*> (counter,ent ));
1405 apf::derive2DMdlFromManifold(m,isModelVert_bool,nBFaces,bEdges_1D,outMap,globalToRegion);
1407 apf::deriveMdlFromManifold(m,isModelVert_bool,nBFaces,bFaces_2D,outMap,globalToRegion);
1408 m->writeNative(
"Reconstructed.smb");
1409 gmi_write_dmg(m->getModel(),
"Reconstructed.dmg");
1410 std::cout<<
"Finished Reconstruction, terminating program. Rerun with PUMI workflow\n";