00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <parmetis.h>
00016
00017
00018
00019
00020
00021
00022 MeshType *SetUpMesh(int *etype, int *ncon, idxtype *elmdist, idxtype *elements,
00023 idxtype *elmwgt, int *wgtflag, MPI_Comm *comm)
00024 {
00025 MeshType *mesh;
00026 int i, npes, mype;
00027 int esizes[5] = {-1, 3, 4, 8, 4};
00028 int maxnode, gmaxnode, minnode, gminnode;
00029
00030 MPI_Comm_size(*comm, &npes);
00031 MPI_Comm_rank(*comm, &mype);
00032
00033 mesh = CreateMesh();
00034 mesh->elmdist = elmdist;
00035 mesh->gnelms = elmdist[npes];
00036 mesh->nelms = elmdist[mype+1]-elmdist[mype];
00037 mesh->elements = elements;
00038 mesh->elmwgt = elmwgt;
00039 mesh->etype = *etype;
00040 mesh->ncon = *ncon;
00041 mesh->esize = esizes[*etype];
00042
00043 if (((*wgtflag)&1) == 0) {
00044 mesh->elmwgt = idxsmalloc(mesh->nelms*mesh->ncon, 1, "SetUpMesh: elmwgt");
00045 }
00046
00047 minnode = elements[idxamin(mesh->nelms*mesh->esize, elements)];
00048 MPI_Allreduce((void *)&minnode, (void *)&gminnode, 1, MPI_INT, MPI_MIN, *comm);
00049 for (i=0; i<mesh->nelms*mesh->esize; i++)
00050 elements[i] -= gminnode;
00051 mesh->gminnode = gminnode;
00052
00053 maxnode = elements[idxamax(mesh->nelms*mesh->esize, elements)];
00054 MPI_Allreduce((void *)&maxnode, (void *)&gmaxnode, 1, MPI_INT, MPI_MAX, *comm);
00055 mesh->gnns = gmaxnode+1;
00056
00057 return mesh;
00058 }
00059
00060
00061
00062
00063
00064 MeshType *CreateMesh(void)
00065 {
00066 MeshType *mesh;
00067
00068 mesh = (MeshType *)GKmalloc(sizeof(MeshType), "CreateMesh: mesh");
00069
00070 InitMesh(mesh);
00071
00072 return mesh;
00073 }
00074
00075
00076
00077
00078 void InitMesh(MeshType *mesh)
00079 {
00080
00081 mesh->etype = -1;
00082 mesh->gnelms = -1;
00083 mesh->gnns = -1;
00084 mesh->nelms = -1;
00085 mesh->nns = -1;
00086 mesh->ncon = -1;
00087 mesh->esize = -1;
00088 mesh->gminnode = 0;
00089 mesh->elmdist = NULL;
00090 mesh->elements = NULL;
00091 mesh->elmwgt = NULL;
00092
00093 return;
00094 }
00095