00001 #include "pprobdescc.h"
00002 #include "pglobalc.h"
00003 #include "pglobalt.h"
00004 #include "pglobal.h"
00005 #include "globalc.h"
00006 #include "genfile.h"
00007 #include <string.h>
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 #include "intools.h"
00011
00012 pprobdescc::pprobdescc (void)
00013 {
00014
00015 }
00016
00017 pprobdescc::~pprobdescc (void)
00018 {
00019
00020 }
00021
00022
00023
00024
00025
00026
00027
00028 void pprobdescc::shift_indices ()
00029 {
00030 long i,j,k,*nnarray,*nearray,*buff;
00031 MPI_Status stat;
00032
00033 buff = new long [2];
00034
00035 buff[0]=Gtm->nn;
00036 buff[1]=Gtm->ne;
00037
00038 if (Myrank==0){
00039 nnarray = new long [Nproc];
00040 nearray = new long [Nproc];
00041
00042
00043 j=Psolm->domproc[0];
00044 nnarray[j]=buff[0];
00045 nearray[j]=buff[1];
00046
00047
00048 for (i=1;i<Nproc;i++){
00049 MPI_Recv (buff,2,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00050 j=Psolm->domproc[stat.MPI_TAG];
00051 nnarray[j]=buff[0];
00052 nearray[j]=buff[1];
00053 }
00054
00055 j=nnarray[0];
00056 nnarray[0]=1;
00057 for (i=1;i<Nproc;i++){
00058 k=nnarray[i];
00059 nnarray[i]=nnarray[i-1]+j;
00060 j=k;
00061 }
00062 j=nearray[0];
00063 nearray[0]=1;
00064 for (i=1;i<Nproc;i++){
00065 k=nearray[i];
00066 nearray[i]=nearray[i-1]+j;
00067 j=k;
00068 }
00069
00070 for (i=1;i<Nproc;i++){
00071 buff[0]=nnarray[i];
00072 buff[1]=nearray[i];
00073 MPI_Send (buff,2,MPI_LONG,i,Myrank,MPI_COMM_WORLD);
00074 }
00075
00076 buff[0]=nnarray[0];
00077 buff[1]=nearray[0];
00078
00079 delete [] nnarray; delete [] nearray;
00080 }
00081 else{
00082 MPI_Send (buff,2,MPI_LONG,0,Myrank,MPI_COMM_WORLD);
00083 MPI_Recv (buff,2,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00084 }
00085
00086
00087 fnim = buff[0];
00088
00089 feim = buff[1];
00090
00091 delete [] buff;
00092
00093
00094 buff = new long [2];
00095
00096 buff[0]=Gtt->nn;
00097 buff[1]=Gtt->ne;
00098
00099 if (Myrank==0){
00100 nnarray = new long [Nproc];
00101 nearray = new long [Nproc];
00102
00103
00104 j=Psolt->domproc[0];
00105 nnarray[j]=buff[0];
00106 nearray[j]=buff[1];
00107
00108
00109 for (i=1;i<Nproc;i++){
00110 MPI_Recv (buff,2,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00111 j=Psolt->domproc[stat.MPI_TAG];
00112 nnarray[j]=buff[0];
00113 nearray[j]=buff[1];
00114 }
00115
00116 j=nnarray[0];
00117 nnarray[0]=1;
00118 for (i=1;i<Nproc;i++){
00119 k=nnarray[i];
00120 nnarray[i]=nnarray[i-1]+j;
00121 j=k;
00122 }
00123 j=nearray[0];
00124 nearray[0]=1;
00125 for (i=1;i<Nproc;i++){
00126 k=nearray[i];
00127 nearray[i]=nearray[i-1]+j;
00128 j=k;
00129 }
00130
00131 for (i=1;i<Nproc;i++){
00132 buff[0]=nnarray[i];
00133 buff[1]=nearray[i];
00134 MPI_Send (buff,2,MPI_LONG,i,Myrank,MPI_COMM_WORLD);
00135 }
00136
00137 buff[0]=nnarray[0];
00138 buff[1]=nearray[0];
00139
00140 delete [] nnarray; delete [] nearray;
00141 }
00142 else{
00143 MPI_Send (buff,2,MPI_LONG,0,Myrank,MPI_COMM_WORLD);
00144 MPI_Recv (buff,2,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00145 }
00146
00147
00148 fnit = buff[0];
00149
00150 feit = buff[1];
00151
00152 delete [] buff;
00153
00154
00155 }
00156