! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCU ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcu(nx,ny,nz,dtsml, & 7 u, udteb,udtwb,udtnb,udtsb, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for the u-velocity component. Please ! note that the values at the corner points may depend on the order ! that e-w, n-s and t-b boundary conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/04/92 (M. Xue and H. Jin) ! Further facelift. ! ! 6/07/92 (M. Xue) ! Modified to take in u at time tfuture only. ! ! 6/15/92 (M. Xue and H. Jin) ! Implemented open boundary condition ! ! 10/6/92 (MX) ! Assignment of the boundary conditions at corner columns moved to ! the front of the top/bottom condition assignment. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2/19/95 (K. Brewster) ! Separated the application of external and user-supplied BC ! processing from radiation BC. Added loops 1715 and 1725 to ! correctly apply mixed rigid wall and radiation to SW and SE ! corner points. ! ! 9/10/1995 (Y. Richardson) ! Fixed a bug with with the open boundary at the corner points. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtsml The small time step size (s) ! ! u Interior domain values of u-velocity at tfuture (m/s) ! ! udteb Time tendency of the u field at the east boundary ! udtwb Time tendency of the u field at the west boundary ! udtnb Time tendency of the u field at the north boundary ! udtsb Time tendency of the u field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! u The u-velocity over the entire domain at tfuture (m/s) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtsml ! The small time step size (s) REAL :: u (nx,ny,nz) ! Total u-velocity at tfuture (m/s) REAL :: udteb (ny,nz) ! Time tendency of u at east boundary REAL :: udtwb (ny,nz) ! Time tendency of u at west boundary REAL :: udtnb (nx,nz) ! Time tendency of u at north boundary REAL :: udtsb (nx,nz) ! Time tendency of u at south boundary ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny-1 u(1,j,k)=-u(3,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny-1 u(1,j,k)=u(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny-1 u(1,j,k)=u(3,j,k) END DO END DO ELSE IF(wbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-2 u(1,j,k)=u(1,j,k)+udtwb(j,k)*dtsml END DO END DO ELSE IF(wbc == 5 .OR. wbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny-1 u(1,j,k)=u(3,j,k) END DO END DO ELSE WRITE(6,900) 'BCU', wbc CALL arpsstop ("arpstop called from bcu west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny-1 u(nx,j,k)=-u(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny-1 u(nx,j,k)=u(3,j,k) END DO END DO END IF ELSE IF(ebc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny-1 u(nx,j,k)=u(nx-2,j,k) END DO END DO ELSE IF(ebc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-2 u(nx,j,k)=u(nx,j,k)+udteb(j,k)*dtsml END DO END DO ELSE IF(ebc == 5 .OR. ebc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny-1 u(nx,j,k)=u(nx-2,j,k) END DO END DO ELSE WRITE(6,900) 'BCU', ebc CALL arpsstop ("arpstop called from bcu east bc",1) END IF 5002 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx u(i,ny-1,k)=u(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx u(i,ny-1,k)=u(i,2,k) END DO END DO END IF ELSE IF(nbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx u(i,ny-1,k)=u(i,ny-2,k) END DO END DO ELSE IF(nbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-1 u(i,ny-1,k)=u(i,ny-1,k)+udtnb(i,k)*dtsml END DO END DO ELSE IF(nbc == 5 .OR. nbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx u(i,ny-1,k)=u(i,ny-2,k) END DO END DO ELSE WRITE(6,900) 'BCU', nbc CALL arpsstop ("arpstop called from bcu north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx u(i,1,k)=u(i,2,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx u(i,1,k)=u(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx u(i,1,k)=u(i,2,k) END DO END DO ELSE IF(sbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-1 u(i,1,k)=u(i,1,k)+udtsb(i,k)*dtsml END DO END DO ELSE IF(sbc == 5 .OR. sbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx u(i,1,k)=u(i,2,k) END DO END DO ELSE WRITE(6,900) 'BCU', sbc CALL arpsstop ("arpstop called from bcu south bc",1) END IF 5004 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southwest corner based on the ! boundary condition types on the south and west boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(sbc+wbc /= 0)) THEN DO k=2,nz-2 u(1,1,k)=u(1,1,k)+udtwb(1,k)*dtsml END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 u(1,1,k)=u(1,2,k) END DO ELSE IF(sbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(1,1,k)=u(1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.wbc == 1) THEN DO k=2,nz-2 u(1,1,k)=-u(3,1,k) END DO ELSE IF(sbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(1,1,k)=u(nx-2,1,k) END DO END IF ELSE IF(sbc == 4.AND.(wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 u(1,1,k)=u(3,1,k) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southeast corner based on the ! boundary condition types on the south and east boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(sbc+ebc /= 0)) THEN DO k=2,nz-2 u(nx,1,k)=u(nx,1,k)+udteb(1,k)*dtsml END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 u(nx,1,k)=u(nx,2,k) END DO ELSE IF(sbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(nx,1,k)=u(nx,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.ebc == 1) THEN DO k=2,nz-2 u(nx,1,k)=-u(nx-2,1,k) END DO ELSE IF(sbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(nx,1,k)=u(3,1,k) END DO END IF ELSE IF(sbc == 4.AND.(ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 u(nx,1,k)=u(nx-2,1,k) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northwest corner based on the ! boundary condition types on the north and west boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(nbc+wbc /= 0)) THEN DO k=2,nz-2 u(1,ny-1,k)=u(1,ny-1,k)+udtwb(ny-1,k)*dtsml END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 u(1,ny-1,k)=u(1,ny-2,k) END DO ELSE IF(nbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(1,ny-1,k)=u(1,2,k) END DO END IF ELSE IF(nbc == 4.AND.wbc == 1) THEN DO k=2,nz-2 u(1,ny-1,k)=-u(3,ny-1,k) END DO ELSE IF(nbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(1,ny-1,k)=u(nx-2,ny-1,k) END DO END IF ELSE IF(nbc == 4.AND.(wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 u(1,ny-1,k)=u(3,ny-1,k) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northeast corner based on the ! boundary condition types on the north and east boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(nbc+ebc /= 0)) THEN DO k=2,nz-2 u(nx,ny-1,k)=u(nx,ny-1,k)+udteb(ny-1,k)*dtsml END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 u(nx,ny-1,k)=u(nx,ny-2,k) END DO ELSE IF(nbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(nx,ny-1,k)=u(nx,2,k) END DO END IF ELSE IF(nbc == 4.AND.ebc == 1) THEN DO k=2,nz-2 u(nx,ny-1,k)=-u(nx-2,ny-1,k) END DO ELSE IF(nbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 u(nx,ny-1,k)=u(3,ny-1,k) END DO END IF ELSE IF(nbc == 4.AND.(ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 u(nx,ny-1,k)=u(nx-2,ny-1,k) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the top boundary conditions ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=1,ny-1 DO i=1,nx u(i,j,nz-1)=u(i,j,nz-2) END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx u(i,j,nz-1)=u(i,j,2) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx u(i,j,nz-1)=u(i,j,nz-2) END DO END DO ELSE WRITE(6,900) 'BCU', tbc CALL arpsstop ("arpstop called from bcu top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary conditions ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=1,ny-1 DO i=1,nx u(i,j,1)=u(i,j,2) END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx u(i,j,1)=u(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx u(i,j,1)=u(i,j,2) END DO END DO ELSE WRITE(6,900) 'BCU', bbc CALL arpsstop ("arpstop called from bcu bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcu ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCV ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcv(nx,ny,nz,dtsml, & 7 v, vdteb,vdtwb,vdtnb,vdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for the v-velocity component. Please note ! that the values at the corner points may depend on the order that e-w, ! n-s and t-b boundary conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/04/92 (M. Xue and H. Jin) ! Further facelift. ! ! 6/07/92 (M. Xue) ! Modified to take in v at time tfuture only. ! ! 6/15/92 (M. Xue and H. Jin) ! Implemented open boundary condition ! ! 10/6/92 (MX) ! Assignment of the boundary conditions at corner columns moved to ! the front of the top/bottom condition assignment. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2/19/95 (K. Brewster) ! Separated the application of external and user-supplied BC ! processing from radiation BC. ! ! 9/10/1995 (Y. Richardson) ! Fixed a bug with with the open boundary at the corner points. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtsml The small time step size (s) ! ! v Interior domain values of v-velocity at tfuture (m/s) ! ! vdteb Time tendency of the v field at the east boundary ! vdtwb Time tendency of the v field at the west boundary ! vdtnb Time tendency of the v field at the north boundary ! vdtsb Time tendency of the v field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! v The v-velocity over the entire domain at tfuture (m/s) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtsml ! The small time step size (s) REAL :: v (nx,ny,nz) ! Total v-velocity at tfuture (m/s) REAL :: vdteb (ny,nz) ! Time tendency of v at east boundary REAL :: vdtwb (ny,nz) ! Time tendency of v at west boundary REAL :: vdtnb (nx,nz) ! Time tendency of v at north boundary REAL :: vdtsb (nx,nz) ! Time tendency of v at south boundary ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny v(1,j,k)=v(2,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny v(1,j,k)=v(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny v(1,j,k)=v(2,j,k) END DO END DO ELSE IF(wbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-1 v(1,j,k)=v(1,j,k)+vdtwb(j,k)*dtsml END DO END DO ELSE IF(wbc == 5 .OR. wbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny v(1,j,k)=v(2,j,k) END DO END DO ELSE WRITE(6,900) 'BCV', wbc CALL arpsstop ("arpstop called from bcv west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny v(nx-1,j,k)=v(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny v(nx-1,j,k)=v(2,j,k) END DO END DO END IF ELSE IF(ebc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny v(nx-1,j,k)=v(nx-2,j,k) END DO END DO ELSE IF(ebc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-1 v(nx-1,j,k)=v(nx-1,j,k)+vdteb(j,k)*dtsml END DO END DO ELSE IF(ebc == 5 .OR. ebc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny v(nx-1,j,k)=v(nx-2,j,k) END DO END DO ELSE WRITE(6,900) 'BCV', ebc CALL arpsstop ("arpstop called from bcv east bc",1) END IF 5002 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx-1 v(i,ny,k)=-v(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx-1 v(i,ny,k)=v(i,3,k) END DO END DO END IF ELSE IF(nbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx-1 v(i,ny,k)=v(i,ny-2,k) END DO END DO ELSE IF(nbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-2 v(i,ny,k)=v(i,ny,k)+vdtnb(i,k)*dtsml END DO END DO ELSE IF(nbc == 5 .OR. nbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx-1 v(i,ny,k)=v(i,ny-2,k) END DO END DO ELSE WRITE(6,900) 'BCV', nbc CALL arpsstop ("arpstop called from bcv north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx-1 v(i,1,k)=-v(i,3,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx-1 v(i,1,k)=v(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx-1 v(i,1,k)=v(i,3,k) END DO END DO ELSE IF(sbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-2 v(i,1,k)=v(i,1,k)+vdtsb(i,k)*dtsml END DO END DO ELSE IF(sbc == 5 .OR. sbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx-1 v(i,1,k)=v(i,3,k) END DO END DO ELSE WRITE(6,900) 'BCV', sbc CALL arpsstop ("arpstop called from bcv south bc",1) END IF 5004 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southwest corner based on the ! boundary condition types on the south and west boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(sbc+wbc /= 0)) THEN DO k=2,nz-2 v(1,1,k)=v(1,1,k)+vdtsb(1,k)*dtsml END DO ELSE IF(sbc == 1.AND.wbc == 4) THEN DO k=2,nz-2 v(1,1,k)=-v(1,3,k) END DO ELSE IF(sbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(1,1,k)=v(1,ny-2,k) END DO END IF ELSE IF((sbc == 3.OR.sbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 v(1,1,k)=v(1,3,k) END DO ELSE IF(sbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 v(1,1,k)=v(2,1,k) END DO ELSE IF(sbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(1,1,k)=v(nx-2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southeast corner based on the ! boundary condition types on the south and east boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(sbc+ebc /= 0)) THEN DO k=2,nz-2 v(nx-1,1,k)=v(nx-1,1,k)+vdtsb(nx-1,k)*dtsml END DO ELSE IF(sbc == 1.AND.ebc == 4) THEN DO k=2,nz-2 v(nx-1,1,k)=-v(nx-1,3,k) END DO ELSE IF(sbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(nx-1,1,k)=v(nx-1,ny-2,k) END DO END IF ELSE IF((sbc == 3.OR.sbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 v(nx-1,1,k)=v(nx-1,3,k) END DO ELSE IF(sbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 v(nx-1,1,k)=v(nx-2,1,k) END DO ELSE IF(sbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(nx-1,1,k)=v(2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northwest corner based on the ! boundary condition types on the north and west boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(nbc+wbc /= 0)) THEN DO k=2,nz-2 v(1,ny,k)=v(1,ny,k)+vdtnb(1,k)*dtsml END DO ELSE IF(nbc == 1.AND.wbc == 4) THEN DO k=2,nz-2 v(1,ny,k)=-v(1,ny-2,k) END DO ELSE IF(nbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(1,ny,k)=v(1,3,k) END DO END IF ELSE IF((nbc == 3.OR.nbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 v(1,ny,k)=v(1,ny-2,k) END DO ELSE IF(nbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 v(1,ny,k)=v(2,ny,k) END DO ELSE IF(nbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(1,ny,k)=v(nx-2,ny,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northeast corner based on the ! boundary condition types on the north and east boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(nbc+ebc /= 0)) THEN DO k=2,nz-2 v(nx-1,ny,k)=v(nx-1,ny,k)+vdtnb(nx-1,k)*dtsml END DO ELSE IF(nbc == 1.AND.ebc == 4) THEN DO k=2,nz-2 v(nx-1,ny,k)=-v(nx-1,ny-2,k) END DO ELSE IF(nbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(nx-1,ny,k)=v(nx-1,3,k) END DO END IF ELSE IF((nbc == 3.OR.nbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 v(nx-1,ny,k)=v(nx-1,ny-2,k) END DO ELSE IF(nbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 v(nx-1,ny,k)=v(nx-2,ny,k) END DO ELSE IF(nbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 v(nx-1,ny,k)=v(2,ny,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the top boundary conditions ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=1,ny DO i=1,nx-1 v(i,j,nz-1)=v(i,j,nz-2) END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=1,ny DO i=1,nx-1 v(i,j,nz-1)=v(i,j,2) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=1,ny DO i=1,nx-1 v(i,j,nz-1)=v(i,j,nz-2) END DO END DO ELSE WRITE(6,900) 'BCV', tbc CALL arpsstop ("arpstop called from bcv top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary conditions ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=1,ny DO i=1,nx-1 v(i,j,1)=v(i,j,2) END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=1,ny DO i=1,nx-1 v(i,j,1)=v(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=1,ny DO i=1,nx-1 v(i,j,1)=v(i,j,2) END DO END DO ELSE WRITE(6,900) 'BCV', bbc CALL arpsstop ("arpstop called from bcv bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcv ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE LBCW ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE lbcw(nx,ny,nz,dtsml, & 10 w,wcont,wdteb,wdtwb,wdtnb,wdtsb, & ebc,wbc,nbc,sbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the lateral boundary conditions for the w-velocity component. ! Please note that the values at the corner points may depend on ! the order that e-w and n-s boundary conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/04/92 (M. Xue and H. Jin) ! Further facelift. ! ! 6/07/92 (M. Xue) ! Modified to take in w at time tfuture only. ! ! 6/15/92 (M. Xue and H. Jin) ! Implemented open boundary condition. ! ! 10/6/92 (MX) ! Assignment of the boundary conditions at corner columns moved to ! the front of the top/bottom condition assignment. ! ! Loop bounds of k for the lateral boundary conditions corrected ! to 2,nz-1. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2/19/95 (K. Brewster) ! Separated the application of external and user-supplied BC ! processing from radiation BC. Corrected application of ! rigid or zero-gradient conditions mixed with radiation ! conditions at SE corner. ! ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtsml The small time step size (s) ! ! w Interior domain values of w-velocity at tfuture (m/s) ! wcont Contravariant vertical velocity (m/s) ! ! wdteb Time tendency of the w field at the east boundary ! wdtwb Time tendency of the w field at the west boundary ! wdtnb Time tendency of the w field at the north boundary ! wdtsb Time tendency of the w field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! ! OUTPUT: ! ! w The w-velocity over the entire domain at tfuture (m/s) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtsml ! The small time step size (s) REAL :: w (nx,ny,nz) ! Total w-velocity at tfuture (m/s) REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s) REAL :: wdteb (ny,nz) ! Time tendency of w at east boundary REAL :: wdtwb (ny,nz) ! Time tendency of w at west boundary REAL :: wdtnb (nx,nz) ! Time tendency of w at north boundary REAL :: wdtsb (nx,nz) ! Time tendency of w at south boundary ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! 6 for nested grid. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-1 DO j=1,ny-1 w(1,j,k)=w(2,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-1 DO j=1,ny-1 w(1,j,k)=w(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-1 DO j=1,ny-1 w(1,j,k)=w(2,j,k) END DO END DO ELSE IF(wbc == 4) THEN ! Radiation condition. DO k=2,nz-1 DO j=2,ny-2 w(1,j,k)=w(1,j,k)+wdtwb(j,k)*dtsml END DO END DO ELSE IF(wbc == 5 .OR. wbc == 6) THEN ! External or user specified condition. DO k=2,nz-1 DO j=1,ny-1 w(1,j,k)=w(2,j,k) END DO END DO ELSE WRITE(6,900) 'BCW', wbc CALL arpsstop ("arpstop called from bcw west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-1 DO j=1,ny-1 w(nx-1,j,k)=w(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-1 DO j=1,ny-1 w(nx-1,j,k)=w(2,j,k) END DO END DO END IF ELSE IF(ebc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-1 DO j=1,ny-1 w(nx-1,j,k)=w(nx-2,j,k) END DO END DO ELSE IF(ebc == 4) THEN ! Radiation condition. DO k=2,nz-1 DO j=2,ny-2 w(nx-1,j,k)=w(nx-1,j,k)+wdteb(j,k)*dtsml END DO END DO ELSE IF(ebc == 5 .OR. ebc == 6) THEN ! External or user specified condition. DO k=2,nz-1 DO j=1,ny-1 w(nx-1,j,k)=w(nx-2,j,k) END DO END DO ELSE WRITE(6,900) 'BCW', ebc CALL arpsstop ("arpstop called from bcw east bc",1) END IF 5002 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-1 DO i=1,nx-1 w(i,ny-1,k)=w(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-1 DO i=1,nx-1 w(i,ny-1,k)=w(i,2,k) END DO END DO END IF ELSE IF(nbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-1 DO i=1,nx-1 w(i,ny-1,k)=w(i,ny-2,k) END DO END DO ELSE IF(nbc == 4) THEN ! Radiation condition. DO k=2,nz-1 DO i=2,nx-2 w(i,ny-1,k)=w(i,ny-1,k)+wdtnb(i,k)*dtsml END DO END DO ELSE IF(nbc == 5 .OR. nbc == 6) THEN ! External or user specified condition. DO k=2,nz-1 DO i=1,nx-1 w(i,ny-1,k)=w(i,ny-2,k) END DO END DO ELSE WRITE(6,900) 'BCW', nbc CALL arpsstop ("arpstop called from bcw north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-1 DO i=1,nx-1 w(i,1,k)=w(i,2,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-1 DO i=1,nx-1 w(i,1,k)=w(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-1 DO i=1,nx-1 w(i,1,k)=w(i,2,k) END DO END DO ELSE IF(sbc == 4) THEN ! Radiation condition. DO k=2,nz-1 DO i=2,nx-2 w(i,1,k)=w(i,1,k)+wdtsb(i,k)*dtsml END DO END DO ELSE IF(sbc == 5 .OR.sbc == 6) THEN ! External or user specified condition. DO k=2,nz-1 DO i=1,nx-1 w(i,1,k)=w(i,2,k) END DO END DO ELSE WRITE(6,900) 'BCW', sbc CALL arpsstop ("arpstop called from bcw south bc",1) END IF 5004 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southwest corner based on the ! boundary condition types on the south and west boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(sbc+wbc /= 0)) THEN DO k=2,nz-2 w(1,1,k)=w(1,1,k)+wdtwb(1,k)*dtsml END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 w(1,1,k)=w(1,2,k) END DO ELSE IF(sbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(1,1,k)=w(1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 w(1,1,k)=w(2,1,k) END DO ELSE IF(sbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(1,1,k)=w(nx-2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southeast corner based on the ! boundary condition types on the south and east boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(sbc+ebc /= 0)) THEN DO k=2,nz-2 w(nx-1,1,k)=w(nx-1,1,k)+wdteb(1,k)*dtsml END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 w(nx-1,1,k)=w(nx-1,2,k) END DO ELSE IF(sbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(nx-1,1,k)=w(nx-1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 w(nx-1,1,k)=w(nx-2,1,k) END DO ELSE IF(sbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(nx-1,1,k)=w(2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northwest corner based on the ! boundary condition types on the north and west boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(nbc+wbc /= 0)) THEN DO k=2,nz-2 w(1,ny-1,k)=w(1,ny-1,k)+wdtwb(ny-1,k)*dtsml END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 w(1,ny-1,k)=w(1,ny-2,k) END DO ELSE IF(nbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(1,ny-1,k)=w(1,2,k) END DO END IF ELSE IF(nbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 w(1,ny-1,k)=w(2,ny-1,k) END DO ELSE IF(nbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(1,ny-1,k)=w(nx-2,ny-1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northeast corner based on the ! boundary condition types on the north and east boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(nbc+ebc /= 0)) THEN DO k=2,nz-2 w(nx-1,ny-1,k)=w(nx-1,ny-1,k)+wdteb(ny-1,k)*dtsml END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 w(nx-1,ny-1,k)=w(nx-1,ny-2,k) END DO ELSE IF(nbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(nx-1,ny-1,k)=w(nx-1,2,k) END DO END IF ELSE IF(nbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 w(nx-1,ny-1,k)=w(nx-2,ny-1,k) END DO ELSE IF(nbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 w(nx-1,ny-1,k)=w(2,ny-1,k) END DO END IF END IF ! 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE lbcw ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE VBCW ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE vbcw(nx,ny,nz,w,wcont,tbc,bbc,u,v, & 9 rhostr,rhostru,rhostrv,rhostrw, & j1,j2,j3) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the top and bottom boundary conditions for w. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/04/92 (M. Xue and H. Jin) ! Further facelift. ! ! 6/07/92 (M. Xue) ! Modified to take in w at time tfuture only. ! ! 6/15/92 (M. Xue and H. Jin) ! Implemented open boundary condition ! ! 10/6/92 (MX) ! Assignment of the boundary conditions at corner columns moved to ! the front of the top/bottom condition assignment. ! ! Loop bounds of k for the lateral boundary conditions corrected ! to 2,nz-1. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2000/02/24 (Gene Bassett) ! Fixed minor bug in tbc=1. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! w Interior domain values of w-velocity at tfuture (m/s) ! wcont Contravariant vertical velocity (m/s) ! ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! u u-velocity at tfuture (m/s) ! v v-velocity at tfuture (m/s) ! ! rhostr j3 times base state density rhobar (kg/m**3). ! rhostru Average rhostr at u points (kg/m**3). ! rhostrv Average rhostr at v points (kg/m**3). ! rhostrw Average rhostr at w points (kg/m**3). ! j1 Coordinate transformation Jacobian defined as ! - d( zp )/d( x ). ! j2 Coordinate transformation Jacobian defined as ! - d( zp )/d( y ). ! j3 Coordinate transformation Jacobian defined as ! d( zp )/d( z ). ! ! OUTPUT: ! ! w The w-velocity over the entire domain at tfuture (m/s) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: w (nx,ny,nz) ! Total w-velocity at tfuture (m/s) REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s) REAL :: u (nx,ny,nz) ! u-velocity at tfuture (m/s) REAL :: v (nx,ny,nz) ! v-velocity at tfuture (m/s) REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3. REAL :: rhostru(nx,ny,nz) ! Averaged rhostr at u points (kg/m**3). REAL :: rhostrv(nx,ny,nz) ! Averaged rhostr at v points (kg/m**3). REAL :: rhostrw(nx,ny,nz) ! Averaged rhostr at w points (kg/m**3). REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as - d( zp )/d( x ). REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as - d( zp )/d( y ). REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as d( zp )/d( z ). ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! 6 for nested grid. ! !----------------------------------------------------------------------- ! INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: urho1,urho2,vrho1,vrho2,wrho1,tems ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the top boundary conditions ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=1,ny-1 DO i=1,nx-1 urho1=0.5*(u(i,j,nz-2)*rhostru(i,j,nz-2) & +u(i,j,nz-3)*rhostru(i,j,nz-3)) urho2=0.5*(u(i+1,j,nz-2)*rhostru(i+1,j,nz-2) & +u(i+1,j,nz-3)*rhostru(i+1,j,nz-3)) tems=0.5*(urho1*j1(i,j,nz-2)+urho2*j1(i+1,j,nz-2)) vrho1=0.5*(v(i,j,nz-2)*rhostrv(i,j,nz-2) & +v(i,j,nz-3)*rhostrv(i,j,nz-3)) vrho2=0.5*(v(i,j+1,nz-2)*rhostrv(i,j+1,nz-2) & +v(i,j+1,nz-3)*rhostrv(i,j+1,nz-3)) tems=tems+0.5*(vrho1*j2(i,j,nz-2)+vrho2*j2(i,j+1,nz-2)) wrho1=0.5*(j3(i,j,nz-2)+j3(i,j,nz-3))*rhostrw(i,j,nz-2) & *wcont(i,j,nz-2) !----------------------------------------------------------------------- ! ! Note wrho1 above is calculated for k=nz-2, wrho1(nz)=-wrho1(nz-2) ! based on rigid lid condition. ! !----------------------------------------------------------------------- w(i,j,nz)= (- wrho1 - tems)/rhostrw(i,j,nz-2) END DO END DO DO j=1,ny-1 DO i=1,nx-1 w(i,j,nz-1)= 0.0 END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 w(i,j,nz)=w(i,j,3) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 w(i,j,nz)=w(i,j,nz-1) END DO END DO ELSE WRITE(6,900) 'BCW', tbc CALL arpsstop ("arpstop called from bcw top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary conditions ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=1,ny-1 DO i=1,nx-1 urho1=0.5*(u(i,j,2)*rhostru(i,j,2)+u(i,j,3)*rhostru(i,j,3)) urho2=0.5*(u(i+1,j,2)*rhostru(i+1,j,2) & +u(i+1,j,3)*rhostru(i+1,j,3)) tems=0.5*(urho1*j1(i,j,3)+urho2*j1(i+1,j,3)) vrho1=0.5*(v(i,j,2)*rhostrv(i,j,2)+v(i,j,3)*rhostrv(i,j,3)) vrho2=0.5*(v(i,j+1,2)*rhostrv(i,j+1,2) & +v(i,j+1,3)*rhostrv(i,j+1,3)) tems=tems+0.5*(vrho1*j2(i,j,3)+vrho2*j2(i,j+1,3)) wrho1=0.5*(j3(i,j,2)+j3(i,j,3))*rhostrw(i,j,3)*wcont(i,j,3) !----------------------------------------------------------------------- ! ! Note wrho1 above is calculated for k=3, wrho1(1)=-wrho1(3) ! based on non-penetrative ground condition. ! !----------------------------------------------------------------------- w(i,j,1)= ( -wrho1 - tems )/rhostrw(i,j,3) END DO END DO DO j=1,ny-1 DO i=1,nx-1 w(i,j,2) =-((u(i ,j,2)+u(i ,j,1))*j1(i,j,2) & +(u(i+1,j,2)+u(i+1,j,1))*j1(i+1,j,2) & +(v(i,j ,2)+v(i,j ,1))*j2(i,j,2) & +(v(i,j+1,2)+v(i,j+1,1))*j2(i,j+1,2)) *0.25 END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 w(i,j,1)=w(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 w(i,j,1)=w(i,j,2) END DO END DO ELSE WRITE(6,900) 'BCW', bbc CALL arpsstop ("arpstop called from bcw bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE vbcw ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcp(nx,ny,nz,dtsml, & 11 pprt, pdteb,pdtwb,pdtnb,pdtsb,pprtk1, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for the perturbation pressure. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/07/92 (M. Xue) ! Modified to take in pprt at time tfuture only. ! ! 6/15/92 (M. Xue and H. Jin) ! Implemented open boundary condition ! ! 10/6/92 (MX) ! Assignment of the boundary conditions at corner columns moved to ! the front of the top/bottom condition assignment. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2/19/95 (K. Brewster) ! Separated the application of external and user-supplied BC ! processing from radiation BC. ! ! 5/10/95 (M. Xue) ! Changed lower BC for pprt to pprt(1)=2*pprt(2)=pprt(3). ! ! 11/05/97 (D. Weber) ! Added pprtk1 array for use in the bottom boundary condition for ! perturbation pressure (hydrostatic). ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtsml The small time step size (s) ! ! pprt Interior domain perturbation pressure at tfuture ! (Pascal) ! ! pdteb Time tendency of the pprt field at the east boundary ! pdtwb Time tendency of the pprt field at the west boundary ! pdtnb Time tendency of the pprt field at the north boundary ! pdtsb Time tendency of the pprt field at the south boundary ! ! pprtk1 Perturbation pressure at k=1 computed using the ! perturbation hydrostatic relation from the model ! w-equation. ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! pprt Purturbation pressure over the entire domain at tfuture ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtsml ! The small time step size (s) REAL :: pprt (nx,ny,nz) ! Perturbation presure at tfuture ! (Pascal) REAL :: pdteb (ny,nz) ! Time tendency of pprt field at east ! boundary REAL :: pdtwb (ny,nz) ! Time tendency of pprt field at west ! boundary REAL :: pdtnb (nx,nz) ! Time tendency of pprt field at north ! boundary REAL :: pdtsb (nx,nz) ! Time tendency of pprt field at south ! boundary REAL :: pprtk1(nx,ny) ! Perturbation pressure at k=1 computed ! using the perturbation hydrostatic ! relation from the model w-equation. ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! 6 for nested grid. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny-1 pprt(1,j,k)=pprt(2,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny-1 pprt(1,j,k)=pprt(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny-1 pprt(1,j,k)=pprt(2,j,k) END DO END DO ELSE IF(wbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-2 pprt(1,j,k)=pprt(1,j,k)+pdtwb(j,k)*dtsml END DO END DO ELSE IF(wbc == 5 .OR. wbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny-1 pprt(1,j,k)=pprt(2,j,k) END DO END DO ELSE WRITE(6,900) 'BCP', wbc CALL arpsstop ("arpstop called from bcp west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny-1 pprt(nx-1,j,k)=pprt(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny-1 pprt(nx-1,j,k)=pprt(2,j,k) END DO END DO END IF ELSE IF(ebc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny-1 pprt(nx-1,j,k)=pprt(nx-2,j,k) END DO END DO ELSE IF(ebc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-2 pprt(nx-1,j,k)=pprt(nx-1,j,k)+pdteb(j,k)*dtsml END DO END DO ELSE IF(ebc == 5 .OR. ebc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny-1 pprt(nx-1,j,k)=pprt(nx-2,j,k) END DO END DO ELSE WRITE(6,900) 'BCP', ebc CALL arpsstop ("arpstop called from bcp east bc",1) END IF 5002 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx-1 pprt(i,ny-1,k)=pprt(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx-1 pprt(i,ny-1,k)=pprt(i,2,k) END DO END DO END IF ELSE IF(nbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx-1 pprt(i,ny-1,k)=pprt(i,ny-2,k) END DO END DO ELSE IF(nbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-2 pprt(i,ny-1,k)=pprt(i,ny-1,k)+pdtnb(i,k)*dtsml END DO END DO ELSE IF(nbc == 5 .OR. nbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx-1 pprt(i,ny-1,k)=pprt(i,ny-2,k) END DO END DO ELSE WRITE(6,900) 'BCP', nbc CALL arpsstop ("arpstop called from bcp north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx-1 pprt(i,1,k)=pprt(i,2,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx-1 pprt(i,1,k)=pprt(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx-1 pprt(i,1,k)=pprt(i,2,k) END DO END DO ELSE IF(sbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-2 pprt(i,1,k)=pprt(i,1,k)+pdtsb(i,k)*dtsml END DO END DO ELSE IF(sbc == 5 .OR.sbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx-1 pprt(i,1,k)=pprt(i,2,k) END DO END DO ELSE WRITE(6,900) 'BCP', sbc CALL arpsstop ("arpstop called from bcp south bc",1) END IF 5004 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southwest corner based on the ! boundary condition types on the south and west boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(sbc+wbc /= 0)) THEN DO k=2,nz-2 pprt(1,1,k)=pprt(1,1,k)+pdtwb(1,k)*dtsml END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 pprt(1,1,k)=pprt(1,2,k) END DO ELSE IF(sbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(1,1,k)=pprt(1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 pprt(1,1,k)=pprt(2,1,k) END DO ELSE IF(sbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(1,1,k)=pprt(nx-2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southeast corner based on the ! boundary condition types on the south and east boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(sbc+ebc /= 0)) THEN DO k=2,nz-2 pprt(nx-1,1,k)=pprt(nx-1,1,k)+pdteb(1,k)*dtsml END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 pprt(nx-1,1,k)=pprt(nx-1,2,k) END DO ELSE IF(sbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(nx-1,1,k)=pprt(nx-1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 pprt(nx-1,1,k)=pprt(nx-2,1,k) END DO ELSE IF(sbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(nx-1,1,k)=pprt(2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northwest corner based on the ! boundary condition types on the north and west boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(nbc+wbc /= 0)) THEN DO k=2,nz-2 pprt(1,ny-1,k)=pprt(1,ny-1,k)+pdtwb(ny-1,k)*dtsml END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 pprt(1,ny-1,k)=pprt(1,ny-2,k) END DO ELSE IF(nbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(1,ny-1,k)=pprt(1,2,k) END DO END IF ELSE IF(nbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 pprt(1,ny-1,k)=pprt(2,ny-1,k) END DO ELSE IF(nbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(1,ny-1,k)=pprt(nx-2,ny-1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northeast corner based on the ! boundary condition types on the north and east boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(nbc+ebc /= 0)) THEN DO k=2,nz-2 pprt(nx-1,ny-1,k)=pprt(nx-1,ny-1,k)+pdteb(ny-1,k)*dtsml END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 pprt(nx-1,ny-1,k)=pprt(nx-1,ny-2,k) END DO ELSE IF(nbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(nx-1,ny-1,k)=pprt(nx-1,2,k) END DO END IF ELSE IF(nbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 pprt(nx-1,ny-1,k)=pprt(nx-2,ny-1,k) END DO ELSE IF(nbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 pprt(nx-1,ny-1,k)=pprt(2,ny-1,k) END DO END IF END IF !----------------------------------------------------------------------- ! ! Set the top boundary conditions ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,nz-1)=pprt(i,j,nz-2) END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,nz-1)=pprt(i,j,2) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,nz-1)=pprt(i,j,nz-2) END DO END DO ELSE WRITE(6,900) 'BCP', tbc CALL arpsstop ("arpstop called from bcp top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary conditions ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,1)=pprtk1(i,j) ! hydrostatic pprt. ! pprt(i,j,1)=2*pprt(i,j,2)-pprt(i,j,3) ! Cst gradient extrapolation END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,1)=pprt(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,1)=pprt(i,j,2) END DO END DO ELSE WRITE(6,900) 'BCP', bbc CALL arpsstop ("arpstop called from bcp bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcp ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCPT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcpt(nx,ny,nz,dtbig, & 1,1 ptprt, ptdteb,ptdtwb,ptdtnb,ptdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for the potential temperature perturbation. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/04/92 (M. Xue and H. Jin) ! Further facelift. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtbig The large time step size (s) ! ! ptprt Perturbation potential temperature at all time levels ! (K) ! ! ptdteb Time tendency of the ptprt field at the east boundary ! ptdtwb Time tendency of the ptprt field at the west boundary ! ptdtnb Time tendency of the ptprt field at the north boundary ! ptdtsb Time tendency of the ptprt field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! ptprt ptprt over the entire domain at tfuture (K) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtbig ! The big time step size (s) INCLUDE 'timelvls.inc' INCLUDE 'mp.inc' REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K) REAL :: ptdteb(ny,nz) ! Time tendency of ptprt at east ! boundary REAL :: ptdtwb(ny,nz) ! Time tendency of ptprt at west ! boundary REAL :: ptdtnb(nx,nz) ! Time tendency of ptprt at north ! boundary REAL :: ptdtsb(nx,nz) ! Time tendency of ptprt at south ! boundary ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. !----------------------------------------------------------------------- ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the boundary conditions for ptprt. ! !----------------------------------------------------------------------- ! CALL bcsclr(nx,ny,nz,dtbig, & ptprt(1,1,1,tpast),ptprt(1,1,1,tpresent), & ptprt(1,1,1,tfuture),ptdteb,ptdtwb,ptdtnb,ptdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) RETURN END SUBROUTINE bcpt ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCQ ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcq(nx,ny,nz,dtbig, & 8,1 q, qdteb,qdtwb,qdtnb,qdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for all of the water quantities ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 6/04/92 (M. Xue and H. Jin) ! Further facelift. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtbig The large time step size (s) ! ! q mixing ratio for one of the water variables at all ! time levels (kg/kg) ! ! qdteb Time tendency of the q field at the east boundary ! qdtwb Time tendency of the q field at the west boundary ! qdtnb Time tendency of the q field at the north boundary ! qdtsb Time tendency of the q field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! q Array q over the entire domain at tfuture (m/s) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtbig ! Big time step size (s) INCLUDE 'timelvls.inc' REAL :: q (nx,ny,nz,nt) ! mixing ratio for one of the water/ice ! variables (kg/kg) REAL :: qdteb(ny,nz) ! Time tendency of q at east boundary REAL :: qdtwb(ny,nz) ! Time tendency of q at west boundary REAL :: qdtnb(nx,nz) ! Time tendency of q at north boundary REAL :: qdtsb(nx,nz) ! Time tendency of q at south boundary ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the boundary conditions for q. ! !----------------------------------------------------------------------- ! CALL bcsclr(nx,ny,nz,dtbig, & q(1,1,1,tpast),q(1,1,1,tpresent),q(1,1,1,tfuture), & qdteb,qdtwb,qdtnb,qdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) RETURN END SUBROUTINE bcq ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCQV ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcqv(nx,ny,nz,dtbig, & 4,1 qv,qvbar,qdteb,qdtwb,qdtnb,qdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for qv. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 06/27/95 ! Created subroutine BCQV, based on BCQ. BCQV handles special ! top and bottom boundary conditions for qv. ! ! ! MODIFICATION HISTORY: ! ! 07/06/95 (Ming Xue) ! Changed the top and bottom BC for qvprt back to zero gradient. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtbig The large time step size (s) ! ! qv Water vapor mixing ratio (kg/kg) ! qvbar Base-state water vapor mixing ratio (kg/kg) ! ! qdteb Time tendency of the q field at the east boundary ! qdtwb Time tendency of the q field at the west boundary ! qdtnb Time tendency of the q field at the north boundary ! qdtsb Time tendency of the q field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! qv qv over the entire domain at tfuture (m/s) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtbig ! Big time step size (s) INCLUDE 'timelvls.inc' REAL :: qv (nx,ny,nz,nt) ! water vapor mixing ratio (kg/kg) REAL :: qvbar (nx,ny,nz) ! base-state water vapro mixing ratio (kg/kg) REAL :: qdteb(ny,nz) ! Time tendency of q at east boundary REAL :: qdtwb(ny,nz) ! Time tendency of q at west boundary REAL :: qdtnb(nx,nz) ! Time tendency of q at north boundary REAL :: qdtsb(nx,nz) ! Time tendency of q at south boundary ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the boundary conditions for qv. ! !----------------------------------------------------------------------- ! CALL bcsclr(nx,ny,nz,dtbig, & qv(1,1,1,tpast),qv(1,1,1,tpresent),qv(1,1,1,tfuture), & qdteb,qdtwb,qdtnb,qdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) RETURN END SUBROUTINE bcqv ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCSCLR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcsclr(nx,ny,nz,dtbig, & 18 s1,s2,s3,sdteb,sdtwb,sdtnb,sdtsb, & ebc,wbc,nbc,sbc,tbc,bbc) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a scalar s. Please note that the ! values at the corner points may depend on the order that the e-w, ! n-s and t-b boundary conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Ming Xue ! 10/10/91. ! ! MODIFICATION HISTORY: ! ! 5/01/92 (M. Xue) ! Added full documentation. ! ! 10/6/92 (MX) ! Assignment of the boundary conditions at corner columns moved to ! the front of the top/bottom condition assignment. ! ! 2/1/93 (Hao Jin) ! Assignment of the boundary conditions at corner columns modified ! to take care of all possible combination of options. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2/19/95 (K. Brewster) ! Separated the application of external and user-supplied BC ! processing from radiation BC. Corrected application of ! rigid or zero-gradient conditions mixed with radiation ! conditions at SE corner. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! dtbig The large time step size (s) ! ! s1 A scalar variable at time tpast ! s2 A scalar variable at time tpresent ! s3 A scalar variable at time tfuture ! ! sdteb Time tendency of the s field at the east boundary ! sdtwb Time tendency of the s field at the west boundary ! sdtnb Time tendency of the s field at the north boundary ! sdtsb Time tendency of the s field at the south boundary ! ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! s3 Scalar array s3 over the entire domain tfuture ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: dtbig ! The big time step size (s) REAL :: s1 (nx,ny,nz) ! A scalar variable at time tpast. REAL :: s2 (nx,ny,nz) ! A scalar variable at time tpresent. REAL :: s3 (nx,ny,nz) ! A scalar variable at time tfuture. REAL :: sdteb(ny,nz) ! Time tendency of s field at east ! boundary REAL :: sdtwb(ny,nz) ! Time tendency of s field at west ! boundary REAL :: sdtnb(nx,nz) ! Time tendency of s field at north ! boundary REAL :: sdtsb(nx,nz) ! Time tendency of s field at south ! boundary !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k INCLUDE 'mp.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny-1 s3(1,j,k)=s3(2,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny-1 s3(1,j,k)=s3(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny-1 s3(1,j,k)=s3(2,j,k) END DO END DO ELSE IF(wbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-2 s3(1,j,k)=s1(1,j,k)+sdtwb(j,k)*2.*dtbig END DO END DO ELSE IF(wbc == 5 .OR. wbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny-1 s3(1,j,k)=s3(2,j,k) END DO END DO ELSE WRITE(6,900) 'BCSCLR', wbc CALL arpsstop ("arpstop called from bcsclr west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO j=1,ny-1 s3(nx-1,j,k)=s3(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO j=1,ny-1 s3(nx-1,j,k)=s3(2,j,k) END DO END DO END IF ELSE IF(ebc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO j=1,ny-1 s3(nx-1,j,k)=s3(nx-2,j,k) END DO END DO ELSE IF(ebc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO j=2,ny-2 s3(nx-1,j,k)=s1(nx-1,j,k)+sdteb(j,k)*2.*dtbig END DO END DO ELSE IF(ebc == 5 .OR. ebc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO j=1,ny-1 s3(nx-1,j,k)=s3(nx-2,j,k) END DO END DO ELSE WRITE(6,900) 'BCSCLR', ebc CALL arpsstop ("arpstop called from bcsclr east bc",1) END IF 5002 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx-1 s3(i,ny-1,k)=s3(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx-1 s3(i,ny-1,k)=s3(i,2,k) END DO END DO END IF ELSE IF(nbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx-1 s3(i,ny-1,k)=s3(i,ny-2,k) END DO END DO ELSE IF(nbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-2 s3(i,ny-1,k)=s1(i,ny-1,k)+sdtnb(i,k)*2.*dtbig END DO END DO ELSE IF(nbc == 5 .OR. nbc == 6 ) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx-1 s3(i,ny-1,k)=s3(i,ny-2,k) END DO END DO ELSE WRITE(6,900) 'BCSCLR', nbc CALL arpsstop ("arpstop called from bcsclr north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=2,nz-2 DO i=1,nx-1 s3(i,1,k)=s3(i,2,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=2,nz-2 DO i=1,nx-1 s3(i,1,k)=s3(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3) THEN ! Zero normal gradient condition. DO k=2,nz-2 DO i=1,nx-1 s3(i,1,k)=s3(i,2,k) END DO END DO ELSE IF(sbc == 4) THEN ! Radiation condition. DO k=2,nz-2 DO i=2,nx-2 s3(i,1,k)=s1(i,1,k)+sdtsb(i,k)*2.*dtbig END DO END DO ELSE IF(sbc == 5 .OR. sbc == 6) THEN ! External or user specified condition. DO k=2,nz-2 DO i=1,nx-1 s3(i,1,k)=s3(i,2,k) END DO END DO ELSE WRITE(6,900) 'BCSCLR', sbc CALL arpsstop ("arpstop called from bcsclr south bc",1) END IF 5004 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southwest corner based on the ! boundary condition types on the south and west boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(sbc+wbc /= 0)) THEN DO k=2,nz-2 s3(1,1,k)=s1(1,1,k)+sdtwb(1,k)*2.*dtbig END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 s3(1,1,k)=s3(1,2,k) END DO ELSE IF(sbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(1,1,k)=s3(1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 s3(1,1,k)=s3(2,1,k) END DO ELSE IF(sbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(1,1,k)=s3(nx-2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the southeast corner based on the ! boundary condition types on the south and east boundaries. ! !----------------------------------------------------------------------- ! IF((sbc == 4.OR.sbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(sbc+ebc /= 0)) THEN DO k=2,nz-2 s3(nx-1,1,k)=s1(nx-1,1,k)+sdteb(1,k)*2.*dtbig END DO ELSE IF((sbc == 1.OR.sbc == 3.OR.sbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 s3(nx-1,1,k)=s3(nx-1,2,k) END DO ELSE IF(sbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(nx-1,1,k)=s3(nx-1,ny-2,k) END DO END IF ELSE IF(sbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 s3(nx-1,1,k)=s3(nx-2,1,k) END DO ELSE IF(sbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(nx-1,1,k)=s3(2,1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northwest corner based on the ! boundary condition types on the north and west boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(wbc == 4.OR.wbc == 0).AND.(nbc+wbc /= 0)) THEN DO k=2,nz-2 s3(1,ny-1,k)=s1(1,ny-1,k)+sdtwb(ny-1,k)*2.*dtbig END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.wbc == 4) THEN DO k=2,nz-2 s3(1,ny-1,k)=s3(1,ny-2,k) END DO ELSE IF(nbc == 2.AND.wbc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(1,ny-1,k)=s3(1,2,k) END DO END IF ELSE IF(nbc == 4.AND.(wbc == 1.OR.wbc == 3.OR.wbc == 5)) THEN DO k=2,nz-2 s3(1,ny-1,k)=s3(2,ny-1,k) END DO ELSE IF(nbc == 4.AND.wbc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(1,ny-1,k)=s3(nx-2,ny-1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the boundary conditions at the northeast corner based on the ! boundary condition types on the north and east boundaries. ! !----------------------------------------------------------------------- ! IF((nbc == 4.OR.nbc == 0).AND.(ebc == 4.OR.ebc == 0).AND.(nbc+ebc /= 0)) THEN DO k=2,nz-2 s3(nx-1,ny-1,k)=s1(nx-1,ny-1,k)+sdteb(ny-1,k)*2.*dtbig END DO ELSE IF((nbc == 1.OR.nbc == 3.OR.nbc == 5).AND.ebc == 4) THEN DO k=2,nz-2 s3(nx-1,ny-1,k)=s3(nx-1,ny-2,k) END DO ELSE IF(nbc == 2.AND.ebc == 4) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(nx-1,ny-1,k)=s3(nx-1,2,k) END DO END IF ELSE IF(nbc == 4.AND.(ebc == 1.OR.ebc == 3.OR.ebc == 5)) THEN DO k=2,nz-2 s3(nx-1,ny-1,k)=s3(nx-2,ny-1,k) END DO ELSE IF(nbc == 4.AND.ebc == 2) THEN IF (mp_opt == 0) THEN DO k=2,nz-2 s3(nx-1,ny-1,k)=s3(2,ny-1,k) END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Set the top boundary conditions ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=1,ny-1 DO i=1,nx-1 s3(i,j,nz-1)=s3(i,j,nz-2) END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 s3(i,j,nz-1)=s3(i,j,2) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 s3(i,j,nz-1)=s3(i,j,nz-2) END DO END DO ELSE WRITE(6,900) 'BCSCLR', tbc CALL arpsstop ("arpstop called from bcsclr top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary conditions ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=1,ny-1 DO i=1,nx-1 s3(i,j,1)=s3(i,j,2) END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 s3(i,j,1)=s3(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 s3(i,j,1)=s3(i,j,2) END DO END DO ELSE WRITE(6,900) 'BCSCLR', bbc CALL arpsstop ("arpstop called from bcsclr bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcsclr ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCSU ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcsu(nx,ny,nz,jbgn,jend,kbgn,kend,ebc,wbc,su) 9 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the x-boundary conditions for su, an array that has been averaged ! from scalar points to u-points. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 5/22/93 (D Weber & MX) ! Added index bounds into the argument list. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! jbgn Starting j index ! jend Ending j index ! kbgn Starting k index ! kend Ending k index ! ! OUTPUT: ! ! su Output array at u point ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions INTEGER :: jbgn,jend ! Domain for j computations INTEGER :: kbgn,kend ! Domain for k computations REAL :: su(nx,ny,nz) ! Averaged array INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: j,k ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO j=jbgn,jend su(1,j,k)=su(3,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO j=jbgn,jend su(1,j,k)=su(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3 .OR. wbc == 4 .OR. wbc == 5 .OR. wbc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO j=jbgn,jend su(1,j,k)=su(2,j,k) END DO END DO ELSE WRITE(6,900) 'BCSU', wbc CALL arpsstop ("arpstop called from bcsu west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO j=jbgn,jend su(nx,j,k)=su(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO j=jbgn,jend su(nx,j,k)=su(3,j,k) END DO END DO END IF ELSE IF(ebc == 3 .OR. ebc == 4 .OR. ebc == 5 .OR. ebc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO j=jbgn,jend su(nx,j,k)=su(nx-1,j,k) END DO END DO ELSE WRITE(6,900) 'BCSU', ebc CALL arpsstop ("arpstop called from bcsu east bc",1) END IF 5002 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcsu ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCSV ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcsv(nx,ny,nz,ibgn,iend,kbgn,kend,nbc,sbc,sv) 7 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the y-boundary conditions for sv, an array that has been averaged ! from scalar points to v-points. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 5/22/93 (D Weber & MX) ! Added index bounds into the argument list. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn Starting i index ! iend Ending i index ! kbgn Starting k index ! kend Ending k index ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! ! OUTPUT: ! ! sv Output array at u point ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions INTEGER :: ibgn,iend ! Domain for i computations INTEGER :: kbgn,kend ! Domain for k computations REAL :: sv(nx,ny,nz) ! Averaged array INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, k ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO i=ibgn,iend sv(i,ny,k)=sv(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO i=ibgn,iend sv(i,ny,k)=sv(i,3,k) END DO END DO END IF ELSE IF(nbc == 3 .OR. nbc == 4 .OR. nbc == 5 .OR. nbc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO i=ibgn,iend sv(i,ny,k)=sv(i,ny-1,k) END DO END DO ELSE WRITE(6,900) 'BCSV', nbc CALL arpsstop ("arpstop called from bcsv north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO i=ibgn,iend sv(i,1,k)=sv(i,3,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO i=ibgn,iend sv(i,1,k)=sv(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3 .OR. sbc == 4 .OR. sbc == 5 .OR. sbc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO i=ibgn,iend sv(i,1,k)=sv(i,2,k) END DO END DO ELSE WRITE(6,900) 'BCSV', sbc CALL arpsstop ("arpstop called from bcsv south bc",1) END IF 5004 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcsv ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCSW ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcsw(nx,ny,nz,ibgn,iend,jbgn,jend,tbc,bbc,sw) 11 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the top and bottom boundary condition for sw, an array that has ! been averaged from scalar points to w-points.. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 5/22/93 (D Weber & MX) ! Added index bounds into the argument list. ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn Starting i index ! iend Ending i index ! jbgn Starting j index ! jend Ending j index ! ! tbc Parameter defining top boundary condition type. ! bbc Parameter defining bottom boundary condition type. ! ! OUTPUT: ! ! sw Averaged array at w point ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions INTEGER :: ibgn,iend ! Domain for i computations INTEGER :: jbgn,jend ! Domain for j computations REAL :: sw(nx,ny,nz) ! Averaged array INTEGER :: tbc ! Parameter defining top boundary ! condition type. INTEGER :: bbc ! Parameter defining bottom boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the top boundary condition ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=jbgn,jend DO i=ibgn,iend sw(i,j,nz)=sw(i,j,nz-2) END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=jbgn,jend DO i=ibgn,iend sw(i,j,nz)=sw(i,j,3) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=jbgn,jend DO i=ibgn,iend sw(i,j,nz)=sw(i,j,nz-1) END DO END DO ELSE WRITE(6,900) 'BCSW', tbc CALL arpsstop ("arpstop called from bcsw top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary condition ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=jbgn,jend DO i=ibgn,iend sw(i,j,1)=sw(i,j,3) END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=jbgn,jend DO i=ibgn,iend sw(i,j,1)=sw(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=jbgn,jend DO i=ibgn,iend sw(i,j,1)=sw(i,j,2) END DO END DO ELSE WRITE(6,900) 'BCSW', bbc CALL arpsstop ("arpstop called from bcsw bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE bcsw ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE VBCWCONT ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE vbcwcont(nx,ny,nz,wcont) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the top and bottom boundary conditions for wcont. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! wcont Contravariant vertical velocity (m/s) ! ! OUTPUT: ! ! wcont Top and bottom values of wcont. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'bndry.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the top boundary condition ! !----------------------------------------------------------------------- ! IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=1,ny-1 DO i=1,nx-1 wcont(i,j,nz)=-wcont(i,j,nz-2) wcont(i,j,nz-1)=0.0 END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 wcont(i,j,nz)=wcont(i,j,3) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 wcont(i,j,nz)=wcont(i,j,nz-1) END DO END DO ELSE WRITE(6,900) 'VBCWCONT', tbc CALL arpsstop ("arpstop called from vbcwcont top bc",1) END IF ! !----------------------------------------------------------------------- ! ! Set the bottom boundary condition ! !----------------------------------------------------------------------- ! IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=1,ny-1 DO i=1,nx-1 wcont(i,j,1)=-wcont(i,j,3) wcont(i,j,2)=0.0 END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=1,ny-1 DO i=1,nx-1 wcont(i,j,1)=wcont(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=1,ny-1 DO i=1,nx-1 wcont(i,j,1)=wcont(i,j,2) END DO END DO ELSE WRITE(6,900) 'VBCWCONT', bbc CALL arpsstop ("arpstop called from vbcwcont bottom bc",1) END IF RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE vbcwcont ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCU2D ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcu2d(nx,ny,a, ebc,wbc,nbc,sbc ) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a 2-D variable at a u-velocity ! location. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2000/02/28 (Gene Bassett) ! Fixed bugs where scaler locations, not staggered locations, were ! used. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! s A 2-D scalar whose boundary values are to be set. ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! ! OUTPUT: ! ! s The boundary values of s. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny ! Number of grid points in x, y ! directions REAL :: a(nx,ny) ! A scalar variable INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 1) THEN ! Rigid wall boundary condition DO j=1,ny-1 a(1,j)=a(3,j) END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny-1 a(1,j)=a(nx-2,j) END DO END IF ELSE IF(wbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny-1 a(1,j)=a(3,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 1) THEN ! Rigid wall boundary condition DO j=1,ny-1 a(nx,j)=a(nx-2,j) END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny-1 a(nx,j)=a(3,j) END DO END IF ELSE IF(ebc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny-1 a(nx,j)=a(nx-2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx a(i,ny-1)=a(i,ny-2) END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx a(i,ny-1)=a(i,2) END DO END IF ELSE IF(nbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx a(i,ny-1)=a(i,ny-2) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx a(i,1)=a(i,2) END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx a(i,1)=a(i,ny-2) END DO END IF ELSE IF(sbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx a(i,1)=a(i,2) END DO END IF RETURN END SUBROUTINE bcu2d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCV2D ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcv2d(nx,ny,a, ebc,wbc,nbc,sbc ) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a 2-D variable at a v-velocity ! location. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! ! 2000/02/28 (Gene Bassett) ! Fixed bugs where scaler locations, not staggered locations, were ! used. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! s A 2-D scalar whose boundary values are to be set. ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! ! OUTPUT: ! ! s The boundary values of s. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny ! Number of grid points in x, y ! directions REAL :: a(nx,ny) ! A scalar variable INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 1) THEN ! Rigid wall boundary condition DO j=1,ny a(1,j)=a(2,j) END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny a(1,j)=a(nx-2,j) END DO END IF ELSE IF(wbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny a(1,j)=a(2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 1) THEN ! Rigid wall boundary condition DO j=1,ny a(nx-1,j)=a(nx-2,j) END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny a(nx-1,j)=a(2,j) END DO END IF ELSE IF(ebc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny a(nx-1,j)=a(nx-2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx-1 a(i,ny)=a(i,ny-2) END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx-1 a(i,ny)=a(i,3) END DO END IF ELSE IF(nbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx-1 a(i,ny)=a(i,ny-2) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx-1 a(i,1)=a(i,3) END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx-1 a(i,1)=a(i,ny-2) END DO END IF ELSE IF(sbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx-1 a(i,1)=a(i,3) END DO END IF RETURN END SUBROUTINE bcv2d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCS2D ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcs2d(nx,ny,s, ebc,wbc,nbc,sbc ) 17 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a 2-D scalar. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! s A 2-D scalar whose boundary values are to be set. ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! ! OUTPUT: ! ! s The boundary values of s. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny ! Number of grid points in x, y ! directions REAL :: s (nx,ny) ! A scalar variable INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary conditions ! !----------------------------------------------------------------------- ! IF(wbc == 1) THEN ! Rigid wall boundary condition DO j=1,ny-1 s(1,j)=s(2,j) END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny-1 s(1,j)=s(nx-2,j) END DO END IF ELSE IF(wbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny-1 s(1,j)=s(2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the east boundary conditions ! !----------------------------------------------------------------------- ! IF(ebc == 1) THEN ! Rigid wall boundary condition DO j=1,ny-1 s(nx-1,j)=s(nx-2,j) END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny-1 s(nx-1,j)=s(2,j) END DO END IF ELSE IF(ebc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny-1 s(nx-1,j)=s(nx-2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the north boundary conditions ! !----------------------------------------------------------------------- ! IF(nbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx-1 s(i,ny-1)=s(i,ny-2) END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx-1 s(i,ny-1)=s(i,2) END DO END IF ELSE IF(nbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx-1 s(i,ny-1)=s(i,ny-2) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the south boundary conditions ! !----------------------------------------------------------------------- ! IF(sbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx-1 s(i,1)=s(i,2) END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx-1 s(i,1)=s(i,ny-2) END DO END IF ELSE IF(sbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx-1 s(i,1)=s(i,2) END DO END IF RETURN END SUBROUTINE bcs2d ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BCIS2D ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bcis2d(nx,ny,is, ebc,wbc,nbc,sbc ) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a 2-D integer scalar array. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 2/15/93 (M. Xue and H. Jin) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! is A 2-D integer scalar whose boundary values are to be set. ! ebc Parameter defining east boundary condition type. ! wbc Parameter defining west boundary condition type. ! nbc Parameter defining north boundary condition type. ! sbc Parameter defining south boundary condition type. ! ! OUTPUT: ! ! is The boundary values of is. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny ! Number of grid points in x, y and z ! directions INTEGER :: is (nx,ny) ! A scalar variable INTEGER :: ebc ! Parameter defining east boundary ! condition type. INTEGER :: wbc ! Parameter defining west boundary ! condition type. INTEGER :: nbc ! Parameter defining north boundary ! condition type. INTEGER :: sbc ! Parameter defining south boundary ! condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! INCLUDE 'mp.inc' !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary condition ! !----------------------------------------------------------------------- ! IF(wbc == 1) THEN ! Rigid wall boundary condition DO j=1,ny-1 is(1,j)=is(2,j) END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny-1 is(1,j)=is(nx-2,j) END DO END IF ELSE IF(wbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny-1 is(1,j)=is(2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the east boundary condition ! !----------------------------------------------------------------------- ! IF(ebc == 1) THEN ! Rigid wall boundary condition DO j=1,ny-1 is(nx-1,j)=is(nx-2,j) END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO j=1,ny-1 is(nx-1,j)=is(2,j) END DO END IF ELSE IF(ebc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO j=1,ny-1 is(nx-1,j)=is(nx-2,j) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the north boundary condition ! !----------------------------------------------------------------------- ! IF(nbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx-1 is(i,ny-1)=is(i,ny-2) END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx-1 is(i,ny-1)=is(i,2) END DO END IF ELSE IF(nbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx-1 is(i,ny-1)=is(i,ny-2) END DO END IF ! !----------------------------------------------------------------------- ! ! Set the south boundary condition ! !----------------------------------------------------------------------- ! IF(sbc == 1) THEN ! Rigid wall boundary condition DO i=1,nx-1 is(i,1)=is(i,2) END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO i=1,nx-1 is(i,1)=is(i,ny-2) END DO END IF ELSE IF(sbc /= 0) THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO i=1,nx-1 is(i,1)=is(i,2) END DO END IF RETURN END SUBROUTINE bcis2d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BOUNDU ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE boundu(s,nx,ny,nz,jbgn,jend,kbgn,kend) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a quantity at the first and last u ! points in the x-direction. Please note that the values at the corner ! points may depend on the order that e-w, n-s and t-b boundary ! conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 5/13/93 (D. Weber) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! jbgn Index to start the j direction ! jend Index to end the j direction ! kbgn Index to start the k direction ! kend Index to end the k direction ! ! s Input array defined from i=2 to i=nx-1 ! ! OUTPUT: ! ! s Output array at u point for i=1 to i=nx ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions INTEGER :: jbgn,jend ! Bounds for computations in the y ! direction INTEGER :: kbgn,kend ! Bounds for computations in the z ! direction REAL :: s(nx,ny,nz) ! A scalar variable in the x direction ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: j, k ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'bndry.inc' INCLUDE 'mp.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the west boundary condition ! !----------------------------------------------------------------------- ! IF(wbc == 0) GO TO 5001 IF(wbc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO j=jbgn,jend s(1,j,k)=-s(3,j,k) END DO END DO ELSE IF(wbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO j=jbgn,jend s(1,j,k)=s(nx-2,j,k) END DO END DO END IF ELSE IF(wbc == 3 .OR. wbc == 4 .OR. wbc == 5 .OR. wbc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO j=jbgn,jend s(1,j,k)=s(2,j,k) END DO END DO ELSE WRITE(6,900) 'BOUNDU', wbc CALL arpsstop ("arpstop called from boundu west bc",1) END IF 5001 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the east boundary condition ! !----------------------------------------------------------------------- ! IF(ebc == 0) GO TO 5002 IF(ebc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO j=jbgn,jend s(nx,j,k)=-s(nx-2,j,k) END DO END DO ELSE IF(ebc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO j=jbgn,jend s(nx,j,k)=s(3,j,k) END DO END DO END IF ELSE IF(ebc == 3 .OR. ebc == 4 .OR. ebc == 5 .OR. ebc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO j=jbgn,jend s(nx,j,k)=s(nx-1,j,k) END DO END DO ELSE WRITE(6,900) 'BOUNDU', ebc CALL arpsstop ("arpstop called from boundu east bc",1) END IF 5002 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE boundu ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BOUNDV ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE boundv(s,nx,ny,nz,ibgn,iend,kbgn,kend) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a quantity at the first and last v ! points in the y-direction. Please note that the values at the corner ! points may depend on the order that e-w, n-s and t-b boundary ! conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 5/13/93 (D. Weber) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn Index to start the i direction ! iend Index to end the i direction ! kbgn Index to start the k direction ! kend Index to end the k direction ! ! s Input array defined from j=2 to j=ny-1 ! ! OUTPUT: ! ! s Output array at v point for j=1 to j=ny ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions INTEGER :: ibgn,iend ! Bounds for computations in the x ! direction INTEGER :: kbgn,kend ! Bounds for computations in the z ! direction REAL :: s(nx,ny,nz) ! A scalar variable in the y direction ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! 4 for open (radiation) boundary condition. ! 5 for user (externally) specified boundary condition. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,k ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'bndry.inc' INCLUDE 'mp.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the north boundary condition ! !----------------------------------------------------------------------- ! IF(nbc == 0) GO TO 5003 IF(nbc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO i=ibgn,iend s(i,ny,k)=-s(i,ny-2,k) END DO END DO ELSE IF(nbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO i=ibgn,iend s(i,ny,k)=s(i,3,k) END DO END DO END IF ELSE IF(nbc == 3 .OR. nbc == 4 .OR. nbc == 5 .OR. nbc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO i=ibgn,iend s(i,ny,k)=s(i,ny-1,k) END DO END DO ELSE WRITE(6,900) 'BOUNDV', nbc CALL arpsstop ("arpstop called from boundv north bc",1) END IF 5003 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the south boundary condition ! !----------------------------------------------------------------------- ! IF(sbc == 0) GO TO 5004 IF(sbc == 1) THEN ! Rigid wall boundary condition DO k=kbgn,kend DO i=ibgn,iend s(i,1,k)=-s(i,3,k) END DO END DO ELSE IF(sbc == 2) THEN ! Periodic boundary condition. IF (mp_opt == 0) THEN DO k=kbgn,kend DO i=ibgn,iend s(i,1,k)=s(i,ny-2,k) END DO END DO END IF ELSE IF(sbc == 3 .OR. sbc == 4 .OR. sbc == 5 .OR. sbc == 6)THEN ! Zero normal gradient condition or ! Radiation or user specified condition. DO k=kbgn,kend DO i=ibgn,iend s(i,1,k)=s(i,2,k) END DO END DO ELSE WRITE(6,900) 'BOUNDV', sbc CALL arpsstop ("arpstop called from boundv south bc",1) END IF 5004 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE boundv ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BOUNDW ###### !###### ###### !###### Developed by ###### !###### Center for the Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE boundw(s,nx,ny,nz,ibgn,iend,jbgn,jend) 4 !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Set the boundary conditions for a quantity at the first and last w ! points in the z-direction. Please note that the values at the corner ! points may depend on the order that e-w, n-s and t-b boundary ! conditions are applied. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: ! 5/13/93 (D. Weber) ! ! MODIFICATION HISTORY: ! ! 9/1/94 (D. Weber & Y. Lu) ! Cleaned up documentation ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn Index to start the i direction ! iend Index to end the i direction ! jbgn Index to start the j direction ! jend Index to end the j direction ! ! s Input array defined from k=2 to k=nz-1 ! ! OUTPUT: ! ! s Output array at w point for k=1 to k=nz ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! Force explicit declarations INTEGER :: nx,ny,nz ! Number of grid points in x, y and z ! directions INTEGER :: ibgn,iend ! Bounds for computations in the x ! direction INTEGER :: jbgn,jend ! Bounds for computations in the y ! direction REAL :: s(nx,ny,nz) ! A scalar variable in the z direction ! !----------------------------------------------------------------------- ! ! The following integer parameters define the type of condition ! at each boundary. ! ! 1 for rigid wall (mirror) type boundary condition. ! 2 for periodic boundary condition. ! 3 for zero normal gradient boundary condition. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'bndry.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the top boundary condition ! !----------------------------------------------------------------------- ! IF(tbc == 0) GO TO 5005 IF(tbc == 1) THEN ! Rigid lid boundary condition DO j=jbgn,jend DO i=ibgn,iend s(i,j,nz)=-s(i,j,nz-2) END DO END DO ELSE IF(tbc == 2) THEN ! Periodic boundary condition. DO j=jbgn,jend DO i=ibgn,iend s(i,j,nz)=s(i,j,3) END DO END DO ELSE IF(tbc == 3.OR.tbc == 4) THEN ! Zero normal gradient condition. DO j=jbgn,jend DO i=ibgn,iend s(i,j,nz)=s(i,j,nz-2) END DO END DO ELSE WRITE(6,900) 'BOUNDW', tbc CALL arpsstop ("arpstop called from boundw top bc",1) END IF 5005 CONTINUE ! !----------------------------------------------------------------------- ! ! Set the bottom boundary condition ! !----------------------------------------------------------------------- ! IF(bbc == 0) GO TO 5006 IF(bbc == 1) THEN ! Non-penetrative ground condition DO j=jbgn,jend DO i=ibgn,iend s(i,j,1)=-s(i,j,3) END DO END DO ELSE IF(bbc == 2) THEN ! Periodic boundary condition. DO j=jbgn,jend DO i=ibgn,iend s(i,j,1)=s(i,j,nz-2) END DO END DO ELSE IF(bbc == 3) THEN ! Zero normal gradient condition. DO j=jbgn,jend DO i=ibgn,iend s(i,j,1)=s(i,j,3) END DO END DO ELSE WRITE(6,900) 'BOUNDW', bbc CALL arpsstop ("arpstop called from boundw bottom bc",1) END IF 5006 CONTINUE RETURN 900 FORMAT(1X,'Invalid boundary condition option found in ',a, & /1X,'The option was ',i3,' Job stopped.') END SUBROUTINE boundw ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE EXTNDSBC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE extndsbc(a,nx,ny,nz,vartyp,ebc,wbc,nbc,sbc,tbc,bbc) 14,5 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Extend the values of variable a at scalar points to the extra ! fake zone on the boundary based on the boundary conditions. The ! variable can be either a scalar or vector. ! !----------------------------------------------------------------------- ! ! AUTHOR:Ming Xue ! 10/12/1996 ! ! MODIFICATIONS ! ! 12/17/1998 (Pengfei Zhang) ! Changed this routine in compatible with vector variable at scalar ! points such as fluxes on scalar grids. ! ! 2000/02/28 (Gene Bassett) ! Added message passing markers and moved to bc3d.f ! !----------------------------------------------------------------------- ! ! INPUT: ! ! a Variable whose boundary values will be set here ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! vartyp Type of the variable, 1 for vector and 0 for scalar ! ! OUTPUT: ! ! a Boundary values of variable a. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: a(0:nx,0:ny,0:nz) INTEGER :: vartyp INTEGER :: ebc ! Parameter defining east boundary condition type. INTEGER :: wbc ! Parameter defining west boundary condition type. INTEGER :: nbc ! Parameter defining north boundary condition type. INTEGER :: sbc ! Parameter defining south boundary condition type. INTEGER :: tbc ! Parameter defining top boundary condition type. INTEGER :: bbc ! Parameter defining bottom boundary condition type. ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k INTEGER :: mptag1 REAL :: mp_tem(MAX(nx+1,ny+1)*(nz+1)) ! Temporary message passing array. INCLUDE 'mp.inc' INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendextew(a,nx,ny,nz,ebc,wbc,mptag1,mp_tem) CALL mprecvextew(a,nx,ny,nz,ebc,wbc,mptag1,mp_tem) CALL mpsendextns(a,nx,ny,nz,nbc,sbc,mptag1,mp_tem) CALL mprecvextns(a,nx,ny,nz,nbc,sbc,mptag1,mp_tem) ENDIF IF (wbc == 0) THEN ! do nothing ELSE IF (wbc == 1) THEN IF (vartyp == 0 ) THEN DO k=0,nz DO j=0,ny a(0,j,k) = a(3,j,k) END DO END DO ELSE DO k=0,nz DO j=0,ny a(0,j,k) = -a(3,j,k) END DO END DO END IF ELSE IF (wbc == 2) THEN IF (mp_opt == 0) THEN DO k=0,nz DO j=0,ny a(0,j,k)= a(nx-3,j,k) END DO END DO END IF ELSE ! including options 3 and 4 DO k=0,nz DO j=0,ny a(0,j,k)=a(1,j,k) END DO END DO END IF IF (ebc == 0) THEN ! do nothing ELSE IF (ebc == 1) THEN IF (vartyp == 0 ) THEN DO k=0,nz DO j=0,ny a(nx,j,k)=a(nx-3,j,k) END DO END DO ELSE DO k=0,nz DO j=0,ny a(nx,j,k) = -a(nx-3,j,k) END DO END DO END IF ELSE IF (ebc == 2 ) THEN IF (mp_opt == 0) THEN DO k=0,nz DO j=0,ny a(nx,j,k)=a(3,j,k) END DO END DO END IF ELSE ! including options 3 and 4 DO k=0,nz DO j=0,ny a(nx,j,k)=a(nx-1,j,k) END DO END DO END IF ! IF ( sbc == 0) THEN ! do nothing ELSE IF (sbc == 1) THEN IF (vartyp == 0 ) THEN DO k=0,nz DO i=0,nx a(i,0,k)=a(i,3,k) END DO END DO ELSE DO k=0,nz DO i=0,nx a(i,0,k) = -a(i,3,k) END DO END DO END IF ELSE IF (sbc == 2 ) THEN IF (mp_opt == 0) THEN DO k=0,nz DO i=0,nx a(i,0,k)=a(i,ny-3,k) END DO END DO END IF ELSE ! including options 3 and 4 DO k=0,nz DO i=0,nx a(i,0,k)=a(i,1,k) END DO END DO END IF IF (nbc == 0) THEN ! do nothing ELSE IF (nbc == 1) THEN IF (vartyp == 0 ) THEN DO k=0,nz DO i=0,nx a(i,ny,k)=a(i,ny-3,k) END DO END DO ELSE DO k=0,nz DO i=0,nx a(i,ny,k) = -a(i,ny-3,k) END DO END DO END IF ELSE IF (nbc == 2 ) THEN IF (mp_opt == 0) THEN DO k=0,nz DO i=0,nx a(i,ny,k)=a(i,3,k) END DO END DO END IF ELSE ! including options 3 and 4 DO k=0,nz DO i=0,nx a(i,ny,k)=a(i,ny-1,k) END DO END DO END IF IF (bbc == 0) THEN ! do nothing ELSE IF (bbc == 1) THEN IF (vartyp == 0 ) THEN DO i=0,nx DO j=0,ny a(i,j,0)=a(i,j,3) END DO END DO ELSE DO i=0,nx DO j=0,ny a(i,j,0) = -a(i,j,3) END DO END DO END IF ELSE IF (bbc == 2) THEN DO i=0,nx-1 DO j=0,ny-1 a(i,j,0)=a(i,j,nz-3) END DO END DO ELSE ! including option 3 DO i=0,nx DO j=0,ny a(i,j,0)=a(i,j,1) END DO END DO END IF IF (tbc == 0) THEN ! do nothing ELSE IF (tbc == 1) THEN IF (vartyp == 0 ) THEN DO i=0,nx DO j=0,ny a(i,j,nz)=a(i,j,nz-3) END DO END DO ELSE DO i=0,nx DO j=0,ny a(i,j,nz) = -a(i,j,nz-3) END DO END DO END IF ELSE IF (tbc == 2) THEN DO i=0,nx DO j=0,ny a(i,j,nz)=a(i,j,3) END DO END DO ELSE ! including options 3 and 4 DO i=0,nx DO j=0,ny a(i,j,nz)=a(i,j,nz-1) END DO END DO END IF RETURN END SUBROUTINE extndsbc