#include "mpi.h" #include "fem.h" typedef struct foob { int p1, k1, f1, p2, k2, f2; int va, vb, vc, g; }face3d; int compare_pairs3d(const void *obj1, const void *obj2){ face3d *e1 = (face3d*) obj1; face3d *e2 = (face3d*) obj2; int a1 = e1->va, b1 = e1->vb, c1 = e1->vc; int a2 = e2->va, b2 = e2->vb, c2 = e2->vc; int va1, vb1, vc1, va2, vb2, vc2; va1 = min(a1, min(b1, c1)); vc1 = max(a1, max(b1, c1)); if(va1!=a1 && vc1!=a1) vb1=a1; if(va1!=b1 && vc1!=b1) vb1=b1; if(va1!=c1 && vc1!=c1) vb1=c1; va2 = min(a2, min(b2, c2)); vc2 = max(a2, max(b2, c2)); if(va2!=a2 && vc2!=a2) vb2=a2; if(va2!=b2 && vc2!=b2) vb2=b2; if(va2!=c2 && vc2!=c2) vb2=c2; if(vc1vc2) return 1; else if(vb1vb2) return 1; else if(va1va2) return 1; return 0; } int pairprocget3d(const void *obj1){ face3d *e1 = (face3d*) obj1; return (e1->p1); } int pairnumget3d(const void *obj1){ face3d *e1 = (face3d*) obj1; return (e1->g); } void pairnumset3d(const void *obj1, int g){ face3d *e1 = (face3d*) obj1; e1->g = g; } void pairmarry3d(const void *obj1, const void *obj2){ face3d *e1 = (face3d*) obj1; face3d *e2 = (face3d*) obj2; e1->p2 = e2->p1; e1->k2 = e2->k1; e1->f2 = e2->f1; e2->p2 = e1->p1; e2->k2 = e1->k1; e2->f2 = e1->f1; } void FacePair3d(Mesh *mesh, int *maxNv){ int procid = mesh->procid; int nprocs = mesh->nprocs; int Klocal = mesh->K; int Nfaces = mesh->Nfaces; int Nverts = mesh->Nverts; int **EToV = mesh->EToV; const int vnum[4][3] = { {0,1,2}, {0,1,3}, {1,2,3}, {0,2,3} }; int n, k, e, sk, v; face3d *myfaces = (face3d*) calloc(Klocal*Nfaces, sizeof(face3d)); /* find maximum local vertex number */ int localmaxgnum = 0; for(k=0;kNpar = BuildIntVector(nprocs); mesh->EToE = BuildIntMatrix(Klocal, Nfaces); mesh->EToF = BuildIntMatrix(Klocal, Nfaces); mesh->EToP = BuildIntMatrix(Klocal, Nfaces); int id, k1, k2, f1, f2, p1, p2; sk = 0; for(n=0;nEToE[k1][f1] = k2; mesh->EToF[k1][f1] = f2; mesh->EToP[k1][f1] = p2; if(p1!=p2){ /* increment number of links */ ++mesh->Npar[p2]; } } #if 0 char fname[BUFSIZ]; sprintf(fname, "proc%d.dat", mesh->procid); FILE *fp = fopen(fname, "w"); for(k1=0;k1K;++k1){ for(f1=0;f1Nfaces;++f1){ fprintf(fp, "p: (%d,%d,%d)->(%d,%d,%d)\n", k1,f1,mesh->procid, mesh->EToE[k1][f1], mesh->EToF[k1][f1], mesh->EToP[k1][f1]); } } fclose(fp); #endif mesh->parK = (int**) calloc(nprocs, sizeof(int*)); mesh->parF = (int**) calloc(nprocs, sizeof(int*)); for(p2=0;p2parK[p2] = BuildIntVector(mesh->Npar[p2]); mesh->parF[p2] = BuildIntVector(mesh->Npar[p2]); mesh->Npar[p2] = 0; for(n=0;nparK[p2][mesh->Npar[p2] ] = k1; mesh->parF[p2][mesh->Npar[p2]++] = f1; } } printf("proc: %d sends %d to proc: %d\n", mesh->procid, mesh->Npar[p2], p2); } free(myfaces); }