MVertex_ptr MVs_Merge_R3R4(MVertex_ptr v1, MVertex_ptr v2, int topoflag) { int idx, gdim, gid, nsets; MFace_ptr face; Mesh_ptr mesh; List_ptr vfaces2; MSet_ptr mset; mesh = MV_Mesh(v1); gid = MV_GEntID(v1); gdim = MV_GEntDim(v1); if (mesh != MF_Mesh(v2)) { MSTK_Report("MVs_Join","Vertices not from same mesh",MSTK_ERROR); return 0; } else if (topoflag) { /* Make sure model topology is not violated */ if (gid != MV_GEntID(v2) || gdim != MV_GEntDim(v2)) { MSTK_Report("MFs_Join","Faces not from same geometric entity",MSTK_ERROR); return 0; } } vfaces2 = MV_Faces(v2); if (vfaces2) { idx = 0; while ((face = List_Next_Entry(vfaces2,&idx))) MF_Replace_Vertex(face,v2,v1); List_Delete(vfaces2); } nsets = MESH_Num_MSets(mesh); if(nsets) { idx = 0; while ((mset = (MSet_ptr) MESH_Next_MSet(mesh,&idx))) { if (MSet_Contains(mset, v2)) { if(MSet_Contains(mset, v1)) MSet_Rem(mset, v2); else MSet_Replace(mset, v2, v1); } } } MV_Delete(v2,1); return v1; }
int MESH_Send_MSetMetaData(Mesh_ptr mesh, int torank, MSTK_Comm comm, int *numreq, int *maxreq, MPI_Request **requests, int *numptrs2free, int *maxptrs2free, void ***ptrs2free) { int i, nset, mtype; char msetname[256]; MSet_ptr mset; int *list_mset_num, *list_mset_types; char *list_mset_names; MPI_Request mpirequest; if (requests == NULL) MSTK_Report("MSTK_SendMSets","Invalid MPI request buffer",MSTK_FATAL); if (*maxreq == 0) { *maxreq = 25; *requests = (MPI_Request *) malloc(*maxreq*sizeof(MPI_Request)); *numreq = 0; } else if (*maxreq < (*numreq) + 3) { *maxreq = 2*(*maxreq) + 3; *requests = (MPI_Request *) realloc(*requests,*maxreq*sizeof(MPI_Request)); } if (ptrs2free == NULL) MSTK_Report("MSTK_SendMSets","Invalid ptrs2free buffer",MSTK_FATAL); if (*maxptrs2free == 0) { *maxptrs2free = 25; *ptrs2free = (void **) malloc(*maxptrs2free*sizeof(void *)); *numptrs2free = 0; } else if (*maxptrs2free < (*numptrs2free) + 3) { *maxptrs2free *= 2*(*maxptrs2free) + 3; *ptrs2free = (void **) realloc(*ptrs2free,(*maxptrs2free)*sizeof(void *)); } /* Send info about how many mesh sets there are, what kind and what there names are in a packed fashion */ nset = MESH_Num_MSets(mesh); list_mset_num = (int *) malloc(sizeof(int)); list_mset_num[0] = nset; MPI_Isend(list_mset_num,1,MPI_INT,torank,torank,comm,&mpirequest); (*requests)[*numreq] = mpirequest; (*numreq)++; (*ptrs2free)[(*numptrs2free)++] = list_mset_num; if (!nset) return 1; list_mset_types = (int *) malloc(nset*sizeof(int)); list_mset_names = (char *) malloc(nset*256*sizeof(char)); for(i = 0; i < nset; i++) { mset = MESH_MSet(mesh,i); MSet_Name(mset,msetname); mtype = MSet_EntDim(mset); list_mset_types[i] = mtype; strcpy(&(list_mset_names[i*256]),msetname); } MPI_Isend(list_mset_types,nset,MPI_INT,torank,torank,comm,&mpirequest); (*requests)[*numreq] = mpirequest; (*numreq)++; MPI_Isend(list_mset_names,nset*256,MPI_CHAR,torank,torank,comm, &mpirequest); (*requests)[*numreq] = mpirequest; (*numreq)++; (*ptrs2free)[(*numptrs2free)++] = list_mset_types; (*ptrs2free)[(*numptrs2free)++] = list_mset_names; return 1; }