SUBROUTINE BUPDAT3D(U,INX,INY,INZ) C C Name: Boundaries UPDATe in 3D C Author: Anthony Leboissetier (10/01) C Objective: To update the process borders. C Called by: time_step, swp, momentum, rstrct, interp, addint, C relax & resid C It calls: PACKER3D C Modifications : C include "undefined.h" INCLUDE 'mpif.h' INTEGER INX,INY,INZ,IERR00,MLPACK, & INDI01,INDI02,NPRANK,NUMFAC,ISTART, & SEQFAC,SEQCOR DOUBLE PRECISION PCOORS(10),SPACKN(INY*INZ), & SPACKS(INY*INZ), & RPACKN(INY*INZ),RPACKS(INY*INZ) DOUBLE PRECISION U(INX,INY,INZ) INTEGER STAT00(MPI_STATUS_SIZE) LOGICAL PCKDIR CHARACTER*6 NAMSUB C C.... Preliminaries NAMSUB = 'BUPDAT' NUMFAC = 6 MLPACK = INY*INZ CALL MPI_TYPE_CONTIGUOUS(MLPACK,MPI_DOUBLE_PRECISION,SEQFAC, & IERR00) CALL MPI_TYPE_COMMIT(SEQFAC,IERR00) C DO INDI01 = 1,MLPACK SPACKN(INDI01) = 0.D0 SPACKS(INDI01) = 0.D0 RPACKN(INDI01) = 0.D0 RPACKS(INDI01) = 0.D0 ENDDO C C Packing before sending (Faces order: N, S). C PCKDIR = .TRUE. CALL PACKER3D(PCKDIR,U,SPACKN,1,INX,INY,INZ) CALL PACKER3D(PCKDIR,U,SPACKS,2,INX,INY,INZ) C C Main neighbours at X coordinate. C IF(NEIGHB(1).GE.0) THEN CALL MPI_SENDRECV(SPACKS(1),1,SEQFAC,NEIGHB(1), & 100,RPACKS(1),1,SEQFAC,NEIGHB(1),200,COMM2D,STAT00,IERR00) ENDIF IF(NEIGHB(2).GE.0) THEN CALL MPI_SENDRECV(SPACKN(1),1,SEQFAC,NEIGHB(2), & 200,RPACKN(1),1,SEQFAC,NEIGHB(2),100,COMM2D,STAT00,IERR00) ENDIF C C.... Unpacking after receiving. C PCKDIR = .FALSE. IF(NEIGHB(1).GE.0) THEN CALL PACKER3D(PCKDIR,U,RPACKS,2,INX,INY,INZ) ENDIF IF(NEIGHB(2).GE.0) THEN CALL PACKER3D(PCKDIR,U,RPACKN,1,INX,INY,INZ) ENDIF C C... Freeing the SEQFAC type C CALL MPI_Type_free(SEQFAC,IERR00) C RETURN END C SUBROUTINE PACKER3D(PCKDIR,U,AARRAY,INDFAC,INX,INY,INZ) C C Name: Self-explained C Author: Anthony Leboissetier (10/01) C Objective: To pack and unpack shared data. C Called by: BUPDAT3D C It calls: None C Modifications : C IMPLICIT NONE INTEGER INDFAC,INX,INY,INZ,INDIX,INDIY,INDIZ,IND DOUBLE PRECISION U(INX,INY,INZ),AARRAY(INY*INZ) LOGICAL PCKDIR CHARACTER*6 NAMSUB C NAMSUB = 'PACKER' C.... Testing c WRITE(6,*)'-',NAMSUB,' PCKDIR ',PCKDIR IF(INDFAC.EQ.1) THEN INDIX = INX-1 IF(.NOT.PCKDIR) INDIX = INX ELSEIF(INDFAC.EQ.2) THEN INDIX = 2 IF(.NOT.PCKDIR) INDIX= 1 ENDIF c WRITE(*,*)'INDIX=',INDIX,' INDFAC=',INDFAC,' INX=',INX IND=1 DO INDIZ = 1,INZ DO INDIY = 1,INY IF(PCKDIR) THEN AARRAY( IND) = U(INDIX,INDIY,INDIZ) c write(*,*)INDIX,INDIY,INDIZ,U(INDIX,INDIY,INDIZ),IND,AARRAY(IND) ELSE U(INDIX,INDIY,INDIZ) = AARRAY(IND) ENDIF IND = IND + 1 ENDDO ENDDO C RETURN END