Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
  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;
  }