! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtint( mptr, ivar ) ! INTEGER :: mptr,ivar INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' ! ! return pointer to the integer constants array ! ivar = point to i'th variable, if zero, point to the first. ! we start by checking whether value ivar is possible ! IF(ivar > nsint) THEN WRITE(6,*) ' error in igtint, ivar = ',ivar, & ' while nsint = ',nsint STOP END IF igtint = ipint(mptr) + MAX0(ivar,1) - 1 RETURN END FUNCTION igtint ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtrel( mptr, ivar ) ! INTEGER :: mptr,ivar INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' ! ! return pointer to the real constants array ! ivar = point to i'th variable, if zero, point to the first. ! we start by checking whether value ivar is possible ! IF(ivar > nsreal) THEN WRITE(6,*) ' error in igtrel, ivar = ',ivar, & ' while nsreal = ',nsreal STOP END IF igtrel = ipreal(mptr) + MAX0(ivar,1) - 1 RETURN END FUNCTION igtrel ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtns1( mptr, iptr, ilen ) ! INTEGER :: mptr,ivar,ilen INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' ! ! return pointer to the real constants array ! ivar = point to i'th variable, if zero, point to the first. ! we start by checking whether value ivar is possible ! IF( iptr+ilen > ns1d ) THEN WRITE(6,*) ' error in igtns1, iptr+ilen = ',iptr+ilen, & ' while ns1d = ',ns1d STOP END IF igtns1 = ips1d(mptr) + MAX0(iptr,1) - 1 RETURN END FUNCTION igtns1 ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtnx1( mptr, ivar ) ! INTEGER :: mptr,ivar INCLUDE 'nodal.inc' INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' ! ! return pointer to the 1-D in x storage arrays ! ivar = point to i'th array, if zero, point to the first. ! we start by checking whether value ivar is possible ! IF(ivar > nx1d) THEN WRITE(6,*) ' error in igtnx1, ivar = ',ivar, & ' while nx1d = ',nx1d STOP END IF igtnx1 = ipx(mptr) + (MAX0(ivar,1) - 1)*node(5,mptr) RETURN END FUNCTION igtnx1 ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtny1( mptr, ivar ) ! INTEGER :: mptr,ivar INCLUDE 'nodal.inc' INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' ! ! return pointer to the 1-D in y storage arrays ! ivar = point to i'th array, if zero, point to the first. ! we start by checking whether value ivar is possible ! IF(ivar > ny1d) THEN WRITE(6,*) ' error in igtny1, ivar = ',ivar, & ' while ny1d = ',ny1d STOP END IF igtny1 = ipy(mptr) + (MAX0(ivar,1) - 1)*node(6,mptr) RETURN END FUNCTION igtny1 ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtnz1( mptr, ivar ) ! INTEGER :: mptr,ivar INCLUDE 'nodal.inc' INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' ! ! return pointer to the 1-D in z storage arrays ! ivar = point to i'th array, if zero, point to the first. ! we start by checking whether value ivar is possible ! IF(ivar > nz1d) THEN WRITE(6,*) ' error in igtnz1, ivar = ',ivar, & ' while nz1d = ',nz1d STOP END IF igtnz1 = ipz(mptr) + (MAX0(ivar,1) - 1)*node(14,mptr) RETURN END FUNCTION igtnz1 ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtnxy( mptr, ivr, inum ),1 ! INTEGER :: mptr,ivar,inum INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: pck,nopck ! ! return pointer to the 2-D in xy storage arrays ! ivar = point to i'th array, if zero, point to the first. ! inum = number of arrays wanted. ! note: we may have to unpack some of this stuff. The present ! protocol is to see if any need unpacking. If none need unpacking ! we just pass back the pointer to the permanent storage location. ! if some need unpacking we get temp storage for all of them and then ! unpack as many as necessary. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in igtnxy, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nxy2d) THEN WRITE(6,*) ' error in igtnxy, ivar = ',ivar, & ' inum = ',inum, & ' while nxy2d = ',nxy2d STOP END IF ! ! now see if any are packed or if all are not packed ! pck = .false. nopck = .false. nx = node(5,mptr) ny = node(6,mptr) nxy = nx*ny DO i=ivar,ivar+inum-1 IF ( ipkxy(i) == 1 ) THEN nopck = .true. ELSE IF( ipkxy(i) > 1 .AND. ipkxy(i) <= 4 ) THEN pck = .true. ELSE PRINT*,'Wrong value of ipk. Job stopped in igtnxy.' PRINT*,' ipk=', ipkxy(i), i STOP END IF END DO ! ! now we do as needed to send pointer back. First, if ! nopacking, just send back the appropriate pointer ! IF ( nopck .AND. .NOT. pck ) THEN igtnxy = ipxy(ivar,mptr) RETURN END IF ! ! here we must unpack some of the stuff, ! this is the slow version that checks on one array at a ! time and unpacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! needsp = nx*ny*inum iptr = igetsp( needsp ) DO i=ivar,ivar+inum-1 npk = ipkxy(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retxyz.' PRINT*,' ipk=', npk , i STOP END IF iloc = (i-ivar)*nx*ny + iptr IF ( npk /= 1 ) THEN CALL rdlcm( a(iloc),a(ipxy(i,mptr)),nxy,npk ) ELSE IF( npk > 1 .AND. npk <= 4 ) THEN DO ij=1,nxy a(ij+iloc-1) = a(ij+ipxy(i,mptr)-1) END DO END IF END DO igtnxy = iptr ! ! we're finished here ! RETURN END FUNCTION igtnxy ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtnxz( mptr, ivr, inum ),1 ! INTEGER :: mptr,ivar,inum INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: pck,nopck ! ! return pointer to the 2-D in xz storage arrays ! ivar = point to i'th array, if zero, point to the first. ! inum = number of arrays wanted. ! note: we may have to unpack some of this stuff. The present ! protocol is to see if any need unpacking. If none need unpacking ! we just pass back the pointer to the permanent storage location. ! if some need unpacking we get temp storage for all of them and then ! unpack as many as necessary. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in igtnxz, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nxz2d) THEN WRITE(6,*) ' error in igtnxz, ivar = ',ivar, & ' inum = ',inum, & ' while nxz2d = ',nxz2d STOP END IF ! ! now see if any are packed or if all are not packed ! pck = .false. nopck = .false. nx = node( 5,mptr) nz = node(14,mptr) nxz = nx*nz DO i=ivar,ivar+inum-1 IF ( ipkxz(i) == 1 ) THEN nopck = .true. ELSE IF( ipkxz(i) > 1 .AND. ipkxz(i) <= 4 ) THEN pck = .true. ELSE PRINT*,'Wrong value of ipk. Job stopped in igtnxz.' PRINT*,' ipk=', ipkxz(i), i STOP END IF END DO ! ! now we do as needed to send pointer back. First, if ! nopacking, just send back the appropriate pointer ! IF ( nopck .AND. .NOT. pck ) THEN igtnxz = ipxz(ivar,mptr) RETURN END IF ! ! here we must unpack some of the stuff, ! this is the slow version that checks on one array at a ! time and unpacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! needsp = nx*nz*inum iptr = igetsp( needsp ) DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nx*nz + iptr npk = ipkxz(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retnxz.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL rdlcm( a(iloc),a(ipxz(i,mptr)),nxz,npk ) ELSE IF( npk > 1 .AND. npk <= 4 ) THEN DO ij=1,nxz a(ij+iloc-1) = a(ij+ipxz(i,mptr)-1) END DO END IF END DO igtnxz = iptr ! ! we're finished here ! RETURN END FUNCTION igtnxz ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtnyz( mptr, ivr, inum ),1 ! INTEGER :: mptr,ivar,inum INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: pck,nopck ! ! return pointer to the 2-D in yz storage arrays ! ivar = point to i'th array, if zero, point to the first. ! inum = number of arrays wanted. ! note: we may have to unpack some of this stuff. The present ! protocol is to see if any need unpacking. If none need unpacking ! we just pass back the pointer to the permanent storage location. ! if some need unpacking we get temp storage for all of them and then ! unpack as many as necessary. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in igtnyz, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nyz2d) THEN WRITE(6,*) ' error in igtnyz, ivar = ',ivar, & ' inum = ',inum, & ' while nyz2d = ',nyz2d STOP END IF ! ! now see if any are packed or if all are not packed ! pck = .false. nopck = .false. ny = node( 6,mptr) nz = node(14,mptr) nyz = ny*nz DO i=ivar,ivar+inum-1 IF ( ipkyz(i) == 1 ) THEN nopck = .true. ELSE IF( ipkyz(i) > 1 .AND. ipkyz(i) <= 4 ) THEN pck = .true. ELSE PRINT*,'Wrong value of ipk. Job stopped in igtnyz.' PRINT*,' ipk=', ipkyz(i), i STOP END IF END DO ! ! now we do as needed to send pointer back. First, if ! nopacking, just send back the appropriate pointer ! IF ( nopck .AND. .NOT. pck ) THEN igtnyz = ipyz(ivar,mptr) RETURN END IF ! ! here we must unpack some of the stuff, ! this is the slow version that checks on one array at a ! time and unpacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! needsp = ny*nz*inum iptr = igetsp( needsp ) DO i=ivar,ivar+inum-1 iloc = (i-ivar)*ny*nz + iptr npk = ipkyz(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retnyz.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL rdlcm( a(iloc),a(ipyz(i,mptr)),nyz,npk ) ELSE IF( npk > 1 .AND. npk <= 4 ) THEN DO ij=1,nyz a(ij+iloc-1) = a(ij+ipyz(i,mptr)-1) END DO END IF END DO igtnyz = iptr ! ! we're finished here ! RETURN END FUNCTION igtnyz ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtxyz( mptr, ivr, inum ),1 ! INTEGER :: mptr,ivar,inum INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: pck,nopck ! ! return pointer to the 3-D in xyz storage arrays ! ivar = point to i'th array, if zero, point to the first. ! inum = number of arrays wanted. ! note: we may have to unpack some of this stuff. The present ! protocol is to see if any need unpacking. If none need unpacking ! we just pass back the pointer to the permanent storage location. ! if some need unpacking we get temp storage for all of them and then ! unpack as many as necessary. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in igtxyz, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nxyz3d) THEN WRITE(6,*) ' error in igtxyz, ivar = ',ivar, & ' inum = ',inum, & ' while nxyz3d = ',nxyz3d STOP END IF ! ! now see if any are packed or if all are not packed ! pck = .false. nopck = .false. nx = node( 5,mptr) ny = node( 6,mptr) nz = node(14,mptr) nxy = nx*ny DO i=ivar,ivar+inum-1 IF ( ipkxyz(i) == 1 ) THEN nopck = .true. ELSE IF( ipkxyz(i) > 1 .AND. ipkxyz(i) <= 4 ) THEN pck = .true. ELSE PRINT*,'Wrong value of ipk. Job stopped in igtxyz.' PRINT*,' ipk=', ipkxyz(i), i STOP END IF END DO ! ! now we do as needed to send pointer back. First, if ! nopacking, just send back the appropriate pointer ! IF ( nopck .AND. .NOT. pck ) THEN igtxyz = ipxyz(ivar,mptr) RETURN END IF ! ! here we must unpack some of the stuff, ! this is the slow version that checks on one array at a ! time and unpacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors, ! and here it may be particularily for there's alot of work ! and we should be able to spread it out over the processors. ! all the loops in the "do 30" below are independent. ! needsp = nxy*nz*inum iptr = igetsp( needsp ) DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nxy*nz + iptr npk = ipkxyz(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retxyz.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN ! !fpp$ cncall ! DO k=1,nz ilocout = iloc+nxy*(k-1) ilocin = ipxyz(i,mptr) & + (k-1)*((nxy/npk)+3) CALL rdlcm( a(ilocout),a(ilocin),nxy,npk ) END DO ELSE DO ijk=1,nxy*nz a(ijk+iloc-1) = a(ijk+ipxyz(i,mptr)-1) END DO END IF END DO igtxyz = iptr ! ! we're finished here ! RETURN END FUNCTION igtxyz ! ! -------------------------------------------------------------------- ! INTEGER FUNCTION igtexbc( mptr, ivr, inum ),1 IMPLICIT NONE INTEGER :: mptr,ivr,inum INTEGER :: nx,ny,nz,nxy INTEGER :: npk,iptr,iloc,ilocin,ilocout INTEGER :: i,j,k,ijk,ivar INTEGER :: needsp INTEGER :: igetsp LOGICAL :: pck,nopck INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' ! ! return pointer to the 3-D in xyz storage arrays ! ivar = point to i'th array, if zero, point to the first. ! inum = number of arrays wanted. ! note: we may have to unpack some of this stuff. The present ! protocol is to see if any need unpacking. If none need unpacking ! we just pass back the pointer to the permanent storage location. ! if some need unpacking we get temp storage for all of them and then ! unpack as many as necessary. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in igtexbc, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nexbc3d) THEN WRITE(6,*) ' error in igtexbc, ivar = ',ivar, & ' inum = ',inum, & ' while nexbc3d = ',nexbc3d STOP END IF ! ! now see if any are packed or if all are not packed ! pck = .false. nopck = .false. nx = node( 5,mptr) ny = node( 6,mptr) nz = node(14,mptr) nxy = nx*ny DO i=ivar,ivar+inum-1 IF ( ipkexbc(i) == 1 ) THEN nopck = .true. ELSE IF( ipkexbc(i) > 1 .AND. ipkexbc(i) <= 4 ) THEN pck = .true. ELSE PRINT*,'Wrong value of ipk. Job stopped in igtexbc.' PRINT*,' ipk=', ipkexbc(i), i STOP END IF END DO ! ! now we do as needed to send pointer back. First, if ! nopacking, just send back the appropriate pointer ! IF ( nopck .AND. .NOT. pck ) THEN igtexbc = ipexbc(ivar,mptr) RETURN END IF ! ! here we must unpack some of the stuff, ! this is the slow version that checks on one array at a ! time and unpacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors, ! and here it may be particularily for there's alot of work ! and we should be able to spread it out over the processors. ! all the loops in the "do 30" below are independent. ! needsp = nxy*nz*inum iptr = igetsp( needsp ) DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nxy*nz + iptr npk = ipkexbc(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in igtexbc.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN ! !fpp$ cncall ! DO k=1,nz ilocout = iloc+nxy*(k-1) ilocin = ipexbc(i,mptr) & + (k-1)*((nxy/npk)+3) CALL rdlcm( a(ilocout),a(ilocin),nxy,npk ) END DO ELSE DO ijk=1,nxy*nz a(ijk+iloc-1) = a(ijk+ipexbc(i,mptr)-1) END DO END IF END DO igtexbc = iptr ! ! we're finished here ! RETURN END FUNCTION igtexbc ! ! -------------------------------------------------------------------- ! SUBROUTINE retnxy( mptr, ivr, inum, iptr, resetd ) 124,3 ! INTEGER :: mptr,ivar,inum,iptr INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: resetd ! ! this routine places data back into the permanent storage ! area if the data was previously unpacked into temp storage ! and if resetd is true. ! ! if reset d is false it just recovers the temp space, if any was used ! ! ivar = point to "ivar" xy 2-d array ! inum = number of arrays stored at iptr beginning with ivar. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in retnxy, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nxy2d) THEN WRITE(6,*) ' error in retnxy, ivar = ',ivar, & ' inum = ',inum, & ' while nxy2d = ',nxy2d STOP END IF ! ! simple check to see if temp space is used, ! if not, then just return ! IF( iptr == ipxy(ivar,mptr) ) RETURN ! ! at this point we can return the temp space for it ! won't be used before we leave ! nx = node(5,mptr) ny = node(6,mptr) isp = nx*ny*inum CALL reclam( iptr,isp ) ! ! return if we don't need to reset the permanent storage ! IF( .NOT. resetd ) RETURN ! ! here we must repack some of the stuff, ! this is the slow version that checks on one array at a ! time and repacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! nxy = nx*ny DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nx*ny + iptr npk = ipkxy(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retnxy.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL fillrw( a(iloc),nx,ny,idmxy(1,i),idmxy(2,i),1 ) CALL wrlcm( a(iloc),a(ipxy(i,mptr)),nxy,npk ) ELSE DO ij=1,nxy a(ij+ipxy(i,mptr)-1) = a(ij+iloc-1) END DO END IF END DO ! ! we're finished here ! RETURN END SUBROUTINE retnxy ! ! -------------------------------------------------------------------- ! SUBROUTINE retnxz( mptr, ivr, inum, iptr, resetd ) 24,3 ! INTEGER :: mptr,ivar,inum,iptr INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: resetd ! ! this routine places data back into the permanent storage ! area if the data was previously unpacked into temp storage ! and if resetd is true. ! ! if reset d is false it just recovers the temp space, if any was used ! ! ivar = point to "ivar" xz 2-d array ! inum = number of arrays stored at iptr beginning with ivar. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in retnxz, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nxz2d) THEN WRITE(6,*) ' error in retnxz, ivar = ',ivar, & ' inum = ',inum, & ' while nxz2d = ',nxz2d STOP END IF ! ! simple check to see if temp space is used, ! if not, then just return ! IF( iptr == ipxz(ivar,mptr) ) RETURN ! ! at this point, we can return the temp space, for it ! won't be used before we leave ! nx = node( 5,mptr) nz = node(14,mptr) isp = nx*nz*inum CALL reclam( iptr,isp ) ! ! return if we don't need to reset the permanent storage ! IF( .NOT. resetd ) RETURN ! ! here we must repack some of the stuff, ! this is the slow version that checks on one array at a ! time and repacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! nxz = nx*nz DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nx*nz + iptr npk = ipkxz(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retnxz.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL fillrw( a(iloc),nx,nz,idmxz(1,i),idmxz(2,i),1 ) CALL wrlcm( a(iloc),a(ipxz(i,mptr)),nxz,npk ) ELSE DO ij=1,nxz a(ij+ipxz(i,mptr)-1) = a(ij+iloc-1) END DO END IF END DO ! ! we're finished here ! RETURN END SUBROUTINE retnxz ! ! -------------------------------------------------------------------- ! SUBROUTINE retnyz( mptr, ivr, inum, iptr, resetd ) 24,3 ! INTEGER :: mptr,ivar,inum,iptr INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: resetd ! ! this routine places data back into the permanent storage ! area if the data was previously unpacked into temp storage ! and if resetd is true. ! ! if reset d is false it just recovers the temp space, if any was used ! ! ivar = point to "ivar" yz 2-d array ! inum = number of arrays stored at iptr beginning with ivar. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in retnyz, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nyz2d) THEN WRITE(6,*) ' error in retnyz, ivar = ',ivar, & ' inum = ',inum, & ' while nyz2d = ',nyz2d STOP END IF ! ! simple check to see if temp space is used, ! if not, then just return ! IF( iptr == ipyz(ivar,mptr) ) RETURN ! ! at this point, we can return the temp space, for it ! won't be used before we leave ! ny = node( 6,mptr) nz = node(14,mptr) isp = ny*nz*inum CALL reclam( iptr,isp ) ! ! return if we don't need to reset the permanent storage ! IF( .NOT. resetd ) RETURN ! ! here we must repack some of the stuff, ! this is the slow version that checks on one array at a ! time and repacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! nyz = ny*nz DO i=ivar,ivar+inum-1 iloc = (i-ivar)*ny*nz + iptr npk = ipkyz(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retnyz.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL fillrw( a(iloc),ny,nz,idmyz(1,i),idmyz(2,i),1 ) CALL wrlcm( a(iloc),a(ipyz(i,mptr)),nyz,npk ) ELSE DO ij=1,nyz a(ij+ipyz(i,mptr)-1) = a(ij+iloc-1) END DO END IF END DO ! ! we're finished here ! RETURN END SUBROUTINE retnyz ! ! -------------------------------------------------------------------- ! SUBROUTINE retxyz( mptr, ivr, inum, iptr, resetd ) 149,3 ! INTEGER :: mptr,ivar,inum,iptr INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: resetd ! ! this routine places data back into the permanent storage ! area if the data was previously unpacked into temp storage ! and if resetd is true. ! ! if resetd is false it just recovers the temp space, if any was used ! ! ivar = point to "ivar" xyz 3-d array ! inum = number of arrays stored at iptr beginning with ivar. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in retxyz, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nxyz3d) THEN WRITE(6,*) ' error in retnxyz, ivar = ',ivar, & ' inum = ',inum, & ' while nxyz3d = ',nxyz3d STOP END IF ! ! simple check to see if temp space is used, ! if not, then just return ! IF( iptr == ipxyz(ivar,mptr) ) RETURN ! ! at this point, we can return the temp space, for it ! won't be used before we leave ! nx = node( 5,mptr) ny = node( 6,mptr) nz = node(14,mptr) isp = nx*ny*nz*inum IF (.true.) THEN PRINT *, 'calling reclam from within retxyz...' PRINT *, ' variable number = ', ivr PRINT *, 'iptr , space = ', iptr, isp END IF CALL reclam( iptr,isp ) ! ! return if we don't need to reset the permanent storage ! IF( .NOT. resetd ) RETURN ! ! here we must repack some of the stuff, ! this is the slow version that checks on one array at a ! time and repacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! nxy = nx*ny DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nx*ny*nz + iptr npk = ipkxyz(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retxyz.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL fillrw( a(iloc),nx,ny,idmxyz(1,i),idmxyz(2,i),nz ) ! !fpp$ cncall ! DO k=1,nz ilocout = iloc+nx*ny*(k-1) ilocin = ipxyz(i,mptr) & + (k-1)*((nxy/npk)+3) CALL wrlcm( a(ilocout),a(ilocin),nxy,npk ) END DO ELSE DO ijk=1,nxy*nz a(ijk+ipxyz(i,mptr)-1) = a(ijk+iloc-1) END DO END IF END DO ! ! we're finished here ! RETURN END SUBROUTINE retxyz ! ! -------------------------------------------------------------------- ! SUBROUTINE retexbc( mptr, ivr, inum, iptr, resetd ) 11,3 ! INTEGER :: mptr,ivar,inum,iptr INCLUDE 'agrigrid.inc' INCLUDE 'nodal.inc' INCLUDE 'grddsc.inc' INCLUDE 'agrialloc.inc' LOGICAL :: resetd ! ! this routine places data back into the permanent storage ! area if the data was previously unpacked into temp storage ! and if resetd is true. ! ! if resetd is false it just recovers the temp space, if any was used ! ! ivar = point to "ivar" exbc 3-d array ! inum = number of arrays stored at iptr beginning with ivar. ! ! we start by checking whether value ivar and inum are possible ! ivar = MAX0(ivr,1) IF(inum < 1) THEN WRITE(6,*) ' error in retexbc, inum = ',inum STOP END IF ! IF(ivar+inum-1 > nexbc3d) THEN WRITE(6,*) ' error in retnexbc, ivar = ',ivar, & ' inum = ',inum, & ' while nexbc3d = ',nexbc3d STOP END IF ! ! simple check to see if temp space is used, ! if not, then just return ! IF( iptr == ipexbc(ivar,mptr) ) RETURN ! ! at this point, we can return the temp space, for it ! won't be used before we leave ! nx = node( 5,mptr) ny = node( 6,mptr) nz = node(14,mptr) isp = nx*ny*nz*inum IF (.true.) THEN PRINT *, 'calling reclam from within retexbc...' PRINT *, ' variable number = ', ivr PRINT *, 'iptr , space = ', iptr, isp END IF CALL reclam( iptr,isp ) ! ! return if we don't need to reset the permanent storage ! IF( .NOT. resetd ) RETURN ! ! here we must repack some of the stuff, ! this is the slow version that checks on one array at a ! time and repacks if necessary, else just does a copy. ! we'll have to see how fast it is on multiple processors ! nxy = nx*ny DO i=ivar,ivar+inum-1 iloc = (i-ivar)*nx*ny*nz + iptr npk = ipkexbc(i) IF( npk < 1 .OR. npk > 4 ) THEN PRINT*,'Wrong value of ipk. Job stopped in retexbc.' PRINT*,' ipk=', npk , i STOP END IF IF ( npk /= 1 ) THEN CALL fillrw( a(iloc),nx,ny,idmexbc(1,i),idmexbc(2,i),nz ) ! !fpp$ cncall ! DO k=1,nz ilocout = iloc+nx*ny*(k-1) ilocin = ipexbc(i,mptr) & + (k-1)*((nxy/npk)+3) CALL wrlcm( a(ilocout),a(ilocin),nxy,npk ) END DO ELSE DO ijk=1,nxy*nz a(ijk+ipexbc(i,mptr)-1) = a(ijk+iloc-1) END DO END IF END DO ! ! we're finished here ! RETURN END SUBROUTINE retexbc ! ! -------------------------------------------------------------------- ! SUBROUTINE fillrw( a,nx,ny,nxad,nyad,nz ) 5 INTEGER :: nx,ny,nxad,nyad,nz DIMENSION a(nx,ny,nz) ! ! this routine fills out the outer rows with values before packing. ! we do this so that the outer rows won't contain any spurious ! minima or maxima if the outer rows are not used for data. ! this allows us to retain the maximum precision in the packing and ! unpacking process. ! nxa = nx-nxad nya = ny-nyad IF( nxa < nx ) THEN DO i=nxa+1,nx DO k=1,nz DO j=1,ny a(i,j,k) = a(nxa,j,k) END DO END DO END DO END IF ! IF( nya < ny ) THEN DO j=nya+1,ny DO k=1,nz DO i=1,nx a(i,j,k) = a(i,nya,k) END DO END DO END DO END IF ! RETURN END SUBROUTINE fillrw