SUBROUTINE MEMSLP(TPRES,QPRES,FIPRES) ! !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBROUTINE: MEMSLP MEMBRANE SLP REDUCTION ! ! ABSTRACT: THIS ROUTINE COMPUTES THE SEA LEVEL PRESSURE ! REDUCTION USING THE MESINGER RELAXATION ! METHOD FOR SIGMA COORDINATES. ! A BY-PRODUCT IS THE ! SET OF VALUES FOR THE UNDERGROUND TEMPERATURES ! ON THE SPECIFIED PRESSURE LEVELS ! ! PROGRAM HISTORY LOG: ! 99-09-23 T BLACK - REWRITTEN FROM ROUTINE SLP (ETA ! COORDINATES) ! 02-07-26 H CHUANG - PARALLIZE AND MODIFIED FOR WRF A/C GRIDS ! ALSO REDUCE S.O.R. COEFF FROM 1.75 to 1.25 ! BECAUSE THERE WAS NUMERICAL INSTABILITY ! 02-08-21 H CHUANG - MODIFIED TO ALWAYS USE OLD TTV FOR RELAXATION ! SO THAT THERE WAS BIT REPRODUCIBILITY BETWEEN ! USING ONE AND MULTIPLE TASKS ! 11-04-29 H CHUANG - FIX GFS GIBSING BY USING LM-1 STATE VARIABLES ! TO DERIVE SLP HYDROSTATICALLY ! 13-12-06 H CHUANG - REMOVE EXTRA SMOOTHING OF SLP ITSELF ! CHANGES TO AVOID RELAXATION FOR ABOVE G GIBSING ! ARE COMMENTED OUT FOR NOW ! 19-10-30 Bo CUI - REMOVE "GOTO" STATEMENT ! 21-07-26 W Meng - Restrict computation from undefined grids ! 21-07-07 J Meng - 2D DECOMPOSITION ! 21-09-25 W Meng - Further modification for restricting computation ! from undefined grids. ! ! USAGE: CALL SLPSIG FROM SUBROUITNE ETA2P ! ! INPUT ARGUMENT LIST: ! PD - SFC PRESSURE MINUS PTOP ! FIS - SURFACE GEOPOTENTIAL ! T - TEMPERATURE ! Q - SPECIFIC HUMIDITY ! FI - GEOPOTENTIAL ! PT - TOP PRESSURE OF DOMAIN ! ! OUTPUT ARGUMENT LIST: ! PSLP - THE FINAL REDUCED SEA LEVEL PRESSURE ARRAY ! ! SUBPROGRAMS CALLED: ! UNIQUE: ! NONE ! !----------------------------------------------------------------------- use vrbls3d, only: pint, zint, t, q use vrbls2d, only: pslp, fis use masks, only: lmh use params_mod, only: overrc, ad05, cft0, g, rd, d608, h1, kslpd use ctlblk_mod, only: jend, jsta, spval, spl, num_procs, mpi_comm_comp, lsmp1, & jsta_m, jend_m, lm, im, jsta_2l, jend_2u, lsm, jm,& im_jm, iend, ista, ista_m, iend_m, ista_2l, iend_2u !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - implicit none ! INCLUDE "mpif.h" !----------------------------------------------------------------------- integer,PARAMETER :: NFILL=0,NRLX1=500,NRLX2=100 real,parameter:: def_of_mountain=2.0 !----------------------------------------------------------------------- real,dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U,LSM),intent(in) :: QPRES real,dimension(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U,LSM),intent(inout) :: TPRES,FIPRES REAL :: TTV(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),TNEW(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U) & , P1(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U),HTM2D(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U) REAL :: HTMO(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U,LSM) real :: P2,TLYR,GZ1,GZ2,SPLL,PSFC,PCHK,SLOPE,TVRTC,DIS,TVRT,tem !----------------------------------------------------------------------- !----------------------------------------------------------------------- INTEGER :: KMNTM(LSM),IMNT(IM_JM,LSM),JMNT(IM_JM,LSM) & , LMHO(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U) INTEGER :: IHE(JM),IHW(JM),IVE(JM),IVW(JM),IHS(JM),IHN(JM) integer ii,jj,I,J,L,N,LLMH,KM,KS,IHH2,KOUNT,KMN,NRLX,LHMNT, & LMHIJ,LMAP1,KMM,LP,LXXX,IERR ! dong real a1,a2,a3,a4,a5,a6,a7,a8 !----------------------------------------------------------------------- LOGICAL :: DONE(ISTA_2L:IEND_2U,JSTA_2L:JEND_2U) !----------------------------------------------------------------------- !*** !*** CALCULATE THE I-INDEX EAST-WEST INCREMENTS !*** ! ii = (IEND-ISTA)/2 jj = (JEND-JSTA)/2 DO J=1,JM IHE(J) = 1 IHW(J) = -1 IHS(J) = -1 IHN(J) = 1 IVE(J) = MOD(J,2) IVW(J) = IVE(J)-1 ENDDO ! print*,'relaxation coeff= ',OVERRC !----------------------------------------------------------------------- !*** !*** INITIALIZE ARRAYS. LOAD SLP ARRAY WITH SURFACE PRESSURE. !*** !$omp parallel do private(i,j,llmh) DO J=JSTA,JEND DO I=ISTA,IEND LLMH = NINT(LMH(I,J)) PSLP(I,J) = PINT(I,J,LLMH+1) ! dong ! TTV(I,J) = 0. TTV(I,J) = spval TNEW(I,J) = spval LMHO(I,J) = LSM DONE(I,J) = .FALSE. ENDDO ENDDO ! !-------------------------------------------------------------------- !*** !*** CREATE A 3-D "HEIGHT MASK" FOR THE SPECIFIED PRESSURE LEVELS !*** (1 => ABOVE GROUND) AND A 2-D INDICATOR ARRAY THAT SAYS !*** WHICH PRESSURE LEVEL IS THE LOWEST ONE ABOVE THE GROUND !*** DO L=1,LSM SPLL = SPL(L) ! !$omp parallel do private(j,i,psfc,pchk) DO J=JSTA,JEND DO I=ISTA,IEND HTMO(I,J,L)=1. if(PSLP(I,J) 0) THEN PCHK = PINT(I,J,NINT(LMH(I,J))+1-NFILL) ENDIF IF(FIS(I,J) < 1.) PCHK = PSFC ! IF(SPLL < PCHK) THEN HTMO(I,J,L) = 1. ELSE HTMO(I,J,L) = 0. IF(L > 1 .AND. HTMO(I,J,L-1) > 0.5) LMHO(I,J) = L-1 ENDIF IF(L == LSM .AND. HTMO(I,J,L) > 0.5) LMHO(I,J) = LSM ! ! test new idea of filtering above-ground pressure levels for Gibsing ! IF(L==LSM.AND.HTMO(I,J,L)>0.5)THEN ! IF(FIS(I,J)>0.)THEN ! LMHO(I,J)=LSM ! ELSE ! LMHO(I,J)=LSM-2 ! HTMO(I,J,LSM)=0. ! HTMO(I,J,LSM-1)=0. ! END IF ! END IF ! if(i==ii.and.j==jj)print*,'Debug: HTMO= ',HTMO(I,J,L) endif !if pslp ENDDO ENDDO ! ENDDO ! if(jj>=jsta.and.jj<=jend) print*,'Debug: LMHO=',LMHO(ii,jj) !-------------------------------------------------------------------- !*** !*** WE REACH THIS LINE IF WE WANT THE MESINGER ETA SLP REDUCTION !*** BASED ON RELAXATION TEMPERATURES. THE FIRST STEP IS TO !*** FIND THE HIGHEST LAYER CONTAINING MOUNTAINS. !*** LHMNT = LSM LOOP210: DO L=LSM,1,-1 DO J=JSTA,JEND DO I=ISTA,IEND if(PSLP(I,J)0.5.AND. !HC 1 HTM2D(I+IHW(J),J-1,L)*HTM2D(I+IHE(J),J-1,L) !HC 2 *HTM2D(I+IHW(J),J+1,L)*HTM2D(I+IHE(J),J+1,L) !HC 3 *HTM2D(I-1 ,J ,L)*HTM2D(I+1 ,J ,L) !HC 4 *HTM2D(I ,J-2,L)*HTM2D(I ,J+2,L)<0.5)THEN !HC MODIFICATION FOR C AND A GRIDS tem = HTM2D(I-1,J)*HTM2D(I+1,J)*HTM2D(I,J-1)*HTM2D(I,J+1) & * HTM2D(I-1,J-1)*HTM2D(I+1,J-1)*HTM2D(I-1,J+1)*HTM2D(I+1,J+1) IF(HTM2D(I,J) > 0.5 .AND. tem < 0.5) then TTV(I,J) = TPRES(I,J,L)*(1.+0.608*QPRES(I,J,L)) ENDIF ! if(i==ii.and.j==jj)print*,'Debug:L,TTV B SMOO= ',l,TTV(I,J) end if ! spval ENDDO ENDDO ! KMM = KMNTM(L) ! print*,'Debug:L,KMM=',L,KMM ! DO N=1,NRLX CALL EXCH(TTV(ISTA_2L,JSTA_2L)) !!$omp parallel do private(i,j,km,a1,a2,a3,a4,a5,a6,a7,a8) DO KM=1,KMM I = IMNT(KM,L) J = JMNT(KM,L) if(PSLP(I,J) SPL(LP))THEN LLMH = NINT(LMH(I,J)) IF(T(I,J,LLMH)