|
[Fortran] 纯文本查看 复制代码 002 | IMPLICIT REAL * 8 ( A - H , O - Z ) |
004 | PARAMETER ( KK = 20 , NN = 120 , MM = 160 , KM = 3 , NN 1 = NN -1 , MM 1 = MM -1 ) |
005 | PARAMETER ( JP = 2 , IP = 4 , N = NN / JP , M = MM / IP , NP = JP * IP ) |
006 | DIMENSION TT ( KM , NN , MM ) |
007 | DIMENSION U 1 ( KK , 0 : N +1 , 0 : M +1 ) , V 1 ( KK , 0 : N +1 , 0 : M +1 ) , PS 1 ( 0 : N +1 , 0 : M +1 ) |
008 | COMMON / BLK 4 / F 1 ( KM , 0 : N +1 , 0 : M +1 ) , F 2 ( KM , 0 : N +1 , 0 : M +1 ) , HXU ( 0 : N +1 , 0 : M +1 ) , HXV ( 0 : N +1 , 0 : M +1 ) , HMMX ( 0 : N +1 , 0 : M +1 ) , HMMY ( 0 : N +1 , 0 : M +1 ) |
009 | COMMON / BLK 5 / VECINV ( KK , KK ) , AM 7 ( KK ) |
010 | DIMENSION D 7 ( 0 : N +1 , 0 : M +1 ) , D 8 ( 0 : N +1 , 0 : M +1 ) , D 00 ( KK , 0 : N +1 , 0 : M +1 ) |
013 | INTEGER ISTATUS ( MPI_STATUS_SIZE ) , COMM 2 D , L_NBR , R_NBR , B_NBR , T_NBR , MY_CID , MY_COORD ( NDIM ) , VECT_ 2 D , VECT_ 3 D |
014 | COMMON / BLKMPI / MYID , NPROC , ISTATUS , L_NBR , R_NBR , B_NBR , T_NBR , MY_CID , STRIDE 2 D , STRIDE 3 D , ISTART , ISTART 2 , IEND , IEND 1 , ISTARTM 1 , IENDP 1 , JSTART , JSTART 2 , JEND , JEND 1 , JSTARTM 1 , JENDP 1 , ISTARTG ( 0 : NP ) , IENDG ( 0 : NP ) , JSTARTG ( 0 : NP ) , JENDG ( 0 : NP ) |
017 | CALL MPI_COMM_SIZE ( MPI_COMM_WORLD , NPROC , IERR ) |
019 | PRINT * , ' NPROC NOT EQUAL TO ' , NP , ' PROGRAM WILL STOP' |
022 | CALL MPI_COMM_RANK ( MPI_COMM_WORLD , MYID , IERR ) |
023 | CALL NBR 2 D ( COMM 2 D , MY_CID , MY_COORD , L_NBR , R_NBR , B_NBR , T_NBR , JP , IP ) |
025 | CALL MPI_BARRIER ( COMM 2 D , IERR ) |
027 | CALL STARTEND ( JP , 1 , NN , JSTARTG , JENDG , JCOUNTG ) |
028 | CALL STARTEND ( IP , 1 , MM , ISTARTG , IENDG , ICOUNTG ) |
037 | IF ( MY_COORD ( 2 ) .EQ. IP -1 ) IEND 1 = IEND 1 -1 |
038 | IF ( MY_COORD ( 1 ) .EQ. JP -1 ) JEND 1 = JEND 1 -1 . |
044 | IF ( MY_COORD ( 2 ) .EQ. 0 ) ISTART 2 = 2 |
045 | IF ( MY_COORD ( 1 ) .EQ. 0 ) JSTART 2 = 2 |
055 | II = I + ISTARTG ( MY_COORD ( 2 ) ) -1 |
058 | JJ = J + JSTARTG ( MY_COORD ( 1 ) ) -1 |
060 | U 1 ( K , J , I ) = 1 .D 0 / DFLOAT ( II ) +1 .D 0 / DFLOAT ( JJ ) +1 .D 0 / DFLOAT ( K ) |
064 | II = I + ISTARTG ( MY_COORD ( 2 ) ) -1 |
067 | JJ = J + JSTARTG ( MY_COORD ( 1 ) ) -1 |
069 | V 1 ( K , J , I ) = 2 .D 0 / DFLOAT ( II ) +1 .D 0 / DFLOAT ( JJ ) +1 .D 0 / DFLOAT ( K ) |
073 | II = I + ISTARTG ( MY_COORD ( 2 ) ) -1 |
076 | JJ = J + JSTARTG ( MY_COORD ( 1 ) ) -1 |
077 | PS 1 ( J , I ) = 1 .D 0 / DFLOAT ( II ) +1 .D 0 / DFLOAT ( JJ ) |
078 | HXU ( J , I ) = 2 .D 0 / DFLOAT ( II ) +1 .D 0 / DFLOAT ( JJ ) |
079 | HXV ( J , I ) = 1 .D 0 / DFLOAT ( II ) +2 .D 0 / DFLOAT ( JJ ) |
080 | HMMX ( J , I ) = 2 .D 0 / DFLOAT ( II ) +1 .D 0 / DFLOAT ( JJ ) |
081 | HMMY ( J , I ) = 1 .D 0 / DFLOAT ( II ) +2 .D 0 / DFLOAT ( JJ ) |
084 | AM 7 ( K ) = 1 .D 0 / DFLOAT ( K ) |
086 | VECINV ( KA , K ) = 1 .D 0 / DFLOAT ( KA ) +1 .D 0 / DFLOAT ( K ) |
091 | CALL MPI_TYPE_VECTOR ( M , KK , N 2 KK , MPI_REAL 8 , IVECT_ 3 D , IERR ) |
092 | CALL MPI_TYPE_COMMIT ( IVECT_ 3 D , MPI_ERR ) |
093 | CALL MPI_TYPE_VECTOR ( M , 1 , N 2 , MPI_REAL 8 , IVECT_ 2 D , IERR ) |
094 | CALL MPI_TYPE_COMMIT ( IVECT_ 2 D , IERR ) |
095 | CALL MPI_BARRIER ( COMM 2 D , IERR ) |
097 | CALL MPI_SENDRECV ( U 1 ( 1 , 1 , IEND ) , N 2 KK , MPI_REAL 8 , T_NBR , ITAG , U 1 ( 1 , 1 , ISTARTM 1 ) , N 2 KK , MPI_REAL 8 , B_NBR , ITAG , COMM 2 D , ISTATUS , IERR ) |
099 | CALL MPI_SENDRECV ( V 1 ( 1 , JEND , 1 ) , 1 , IVECT_ 3 D , R_NBR , ITAG , V 1 ( 1 , JSTARTM 1 , 1 ) , 1 , IVECT_ 3 D , L_NBR , ITAG , COMM 2 D , ISTATUS , IERR ) |
101 | CALL MPI_SENDRECV ( PS 1 ( 1 , ISTART ) , N , MPI_REAL 8 , B_NBR , ITAG , PS 1 ( 1 , IENDP 1 ) , N , MPI_REAL 8 , T_NBR , ITAG , COMM 2 D , ISTATUS , IERR ) |
103 | CALL MPI_SENDRECV ( PS 1 ( JSTART , 1 ) , 1 , IVECT_ 2 D , L_NBR , ITAG , PS 1 ( JENDP 1 , 1 ) , 1 , IVECT_ 2 D , R_NBR , ITAG , COMM 2 D , ISTATUS , IERR ) |
114 | DO 220 I = ISTART , IEND 1 |
115 | DO 220 J = JSTART 2 , JEND 1 |
116 | D 7 ( J , I ) = ( PS 1 ( J , I +1 ) + PS 1 ( J , I ) ) * 0.5D0 * HXU ( J , I ) |
120 | DO 230 I = ISTART 2 , IEND 1 |
121 | DO 230 J = JSTART , JEND 1 |
122 | D 8 ( J , I ) = ( PS 1 ( J +1 , I ) + PS 1 ( J , I ) ) * 0.5D0 * HXV ( J , I ) |
124 | CALL MPI_BARRIER ( COMM 2 D , MPIERROR ) |
126 | CALL MPI_SENDRECV ( D 7 ( 1 , IEND ) , N , MPI_REAL 8 , T_NBR , ITAG , D 7 ( 1 , ISTARTM 1 ) , N , MPI_REAL 8 , B_NBR , ITAG , COMM 2 D , ISTATUS , IERR ) |
128 | CALL MPI_SENDRECV ( D 8 ( JEND , 1 ) , 1 , IVECT_ 2 D , R_NBR , ITAG , D 8 ( JSTARTM 1 , 1 ) , 1 , IVECT_ 2 D , L_NBR , ITAG , COMM 2 D , ISTATUS , IERR ) |
131 | DO 240 I = ISTART 2 , IEND 1 |
132 | DO 240 J = JSTART 2 , JEND 1 |
134 | D 00 ( K , J , I ) = ( D 7 ( J , I ) * U 1 ( K , J , I ) - D 7 ( J , I -1 ) * U 1 ( K , J , I -1 ) ) * HMMX ( J , I ) + ( D 8 ( J , I ) * V 1 ( K , J , I ) - D 8 ( J -1 , I ) * V 1 ( K , J -1 , I ) ) * HMMY ( J , I ) |
137 | DO 260 I = ISTART 2 , IEND 1 |
140 | DO 260 J = JSTART 2 , JEND 1 |
142 | F 1 ( K , J , I ) = F 1 ( K , J , I ) - VECINV ( K , KA ) * D 00 ( KA , J , I ) |
147 | DO 270 I = ISTART 2 , IEND 1 |
149 | DO 270 J = JSTART 2 , JEND 1 |
151 | F 2 ( K , J , I ) = - AM 7 ( K ) * PS 1 ( J , I ) |
152 | SUMF 1 = SUMF 1 + F 1 ( K , J , I ) |
153 | SUMF 2 = SUMF 2 + F 2 ( K , J , I ) |
156 | CALL MPI_BARRIER ( COMM 2 D , IERR ) |
158 | CALL MPI_REDUCE ( SUMF 1 , GSUMF 1 , 1 , MPI_REAL 8 , MPI_SUM , IROOT , COMM 2 D , IERR ) |
159 | CALL MPI_REDUCE ( SUMF 2 , GSUMF 2 , 1 , MPI_REAL 8 , MPI_SUM , IROOT , COMM 2 D , IERR ) |
162 | IF ( MY_CID .NE. 0 ) THEN |
163 | CALL MPI_SEND ( F 2 , KOUNT , MPI_REAL 8 , IROOT , ITAG , COMM 2 D , IERR ) |
165 | CALL COPY 1 ( MY_CID , F 2 , TT , ISTARTG , JSTARTG ) |
167 | CALL MPI_RECV ( F 2 , KOUNT , MPI_REAL 8 , ISRC , ITAG , COMM 2 D , ISTATUS , IERR ) |
168 | CALL COPY 1 ( ISRC , F 2 , TT , ISTARTG , JSTARTG ) |
173 | PRINT * , 'SUMF1,SUMF2=' , GSUMF 1 , GSUMF 2 |
174 | PRINT * , ' F2(2,2,I),I=1, 160,5' |
175 | PRINT 301 , ( TT ( 2 , 2 , I ) , I = 1 , 160 , 5 ) |
177 | CLOCK = MPI_WTIME ( ) - CLOCK |
178 | PRINT * , ' MY_CID, CLOCK TIME=' , MY_CID , CLOCK |
179 | CALL MPI_FINALIZE ( IERR ) |
182 | SUBROUTINE NBR 2 D ( COMM 2 D , MY_CID , MY_COORD , L_NBR , R_NBR , |
183 | & B_NBR , T_NBR , JP , IP ) |
186 | INTEGER COMM 2 D , MY_CID , MY_COORD ( NDIM ) , L_NBR , R_NBR , |
187 | & B_NBR , T_NBR , JP , IP |
188 | INTEGER IPART ( 2 ) , SIDEWAYS , UPDOWN , RIGHT , UP |
189 | LOGICAL PERIODS ( 2 ) , REORDER |
200 | CALL MPI_CART_CREATE ( MPI_COMM_WORLD , NDIM , I PART , PERIODS , REORDER , COMM 2 d , MPI_ERR ) |
201 | CALL MPI_COMM_RANK ( COMM 2 D , MY_CID , MPI_ERR ) |
202 | CALL MPI_CART_COORDS ( COMM 2 D , MY_CID , NDIM , MY_COORD , MPI_ERR ) |
203 | CALL MPI_CART_SHIFT ( COMM 2 D , SIDEWAYS , RIGHT , L_NBR , R_NBR , MPI_ERR ) |
204 | CALL MPI_CART_SHIFT ( COMM 2 D , UPDOWN , UP , B_NBR , T_NBR , MPI_ERR ) |
205 | PRINT * , 'MY_CID=' , MY_CID , ', COORD=(' , MY_COORD ( 1 ) , ',' , MY_COORD ( 2 ) , ')' , ', L_,R_,T_,B_NBR=' , L_NBR , R_NBR , T_NBR , B_NBR |
208 | SUBROUTINE COPY 1 ( ISRC , FF , TT , ISTARTG , JSTARTG ) |
211 | PARAMETER ( KK = 20 , NN = 120 , MM = 160 , KM = 3 , MM 1 = MM -1 , NN 1 = NN -1 ) |
212 | PARAMETER ( JP = 2 , IP = 4 , N = NN / JP , M = MM / IP , NP = IP * JP ) |
213 | REAL * 8 FF ( KM , 0 : N +1 , 0 : M +1 ) , TT ( KM , NN , MM ) , ISTARTG ( 0 : NP ) , JSTARTG ( 0 : NP ) |
226 | TT ( K , JG , IG ) = FF ( K , J , I ) |
233 | SUBROUTINE STARTEND ( NPROC , IS 1 , IS 2 , GSTART , GEND , GCOUNT ) |
234 | INTEGER ID , NPROC , IS 1 , IS 2 , NP , GSTART ( 0 : 31 ) , GEND ( 0 : 31 ) , GCOUNT ( 0 : 31 ) |
245 | GSTART ( I ) = IS 1 + I * ( IBLOCK +1 ) |
246 | GEND ( I ) = GSTART ( I ) + IBLOCK |
248 | GSTART ( I ) = IS 1 + I * IBLOCK + IR |
249 | GEND ( I ) = GSTART ( I ) + IBLOCK -1 |
255 | GCOUNT ( I ) = GEND ( I ) - GSTART ( I ) +1 |
|
|