00001 #include "pprobdesc.h"
00002 #include "pglobal.h"
00003 #include "genfile.h"
00004 #include <string.h>
00005 #include "mpi.h"
00006
00007 pprobdesc::pprobdesc (void)
00008 {
00009
00010 }
00011
00012 pprobdesc::~pprobdesc (void)
00013 {
00014 }
00015
00016
00017
00018
00019
00020
00021 void pprobdesc::shift_indices ()
00022 {
00023 long i,j,k,*nnarray,*nearray,*buff;
00024 MPI_Status stat;
00025
00026 buff = new long [2];
00027
00028 buff[0]=Gtm->nn;
00029 buff[1]=Gtm->ne;
00030
00031 if (Myrank==0){
00032 nnarray = new long [Nproc];
00033 nearray = new long [Nproc];
00034 memset (nnarray,0,sizeof(*nnarray)*Nproc);
00035 memset (nearray,0,sizeof(*nearray)*Nproc);
00036
00037
00038 j=Psolm->domproc[0];
00039 nnarray[j]=buff[0];
00040 nearray[j]=buff[1];
00041
00042
00043 for (i=1;i<Nproc;i++){
00044 MPI_Recv (buff,2,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00045 j=Psolm->domproc[stat.MPI_TAG];
00046 nnarray[j]=buff[0];
00047 nearray[j]=buff[1];
00048 }
00049
00050 j=nnarray[0];
00051 nnarray[0]=1;
00052 for (i=1;i<Nproc;i++){
00053 k=nnarray[i];
00054 nnarray[i]=nnarray[i-1]+j;
00055 j=k;
00056 }
00057 j=nearray[0];
00058 nearray[0]=1;
00059 for (i=1;i<Nproc;i++){
00060 k=nearray[i];
00061 nearray[i]=nearray[i-1]+j;
00062 j=k;
00063 }
00064
00065 for (i=1;i<Nproc;i++){
00066 buff[0]=nnarray[i];
00067 buff[1]=nearray[i];
00068 MPI_Send (buff,2,MPI_LONG,i,Myrank,MPI_COMM_WORLD);
00069 }
00070
00071 buff[0]=nnarray[0];
00072 buff[1]=nearray[0];
00073
00074 delete [] nnarray; delete [] nearray;
00075 }
00076 else{
00077 MPI_Send (buff,2,MPI_LONG,0,Myrank,MPI_COMM_WORLD);
00078 MPI_Recv (buff,2,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00079 }
00080
00081
00082 fni = buff[0];
00083
00084 fei = buff[1];
00085
00086 delete [] buff;
00087 }
00088