Changeset 1795 in lmdz_wrf


Ignore:
Timestamp:
Mar 12, 2018, 3:37:19 PM (7 years ago)
Author:
lfita
Message:

Adding:

`psl_ecmwf': sea-level pressure computation following ECMWF

Location:
trunk/tools
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/diag_tools.py

    r1784 r1795  
    833833
    834834    return mslpv, mslpdims, mslpvdims
     835
     836def Forcompute_psl_ecmwf(ps, hgt, ta1, pa2, unpa1, dimns, dimvns):
     837    """ Function to compute the sea-level pressure following Mats Hamrud and Philippe Courtier [Pa]
     838    Forcompute_psl_ptarget(ps, hgt, ta1, pa2, unpa1, dimns, dimvns)
     839      [ps]= surface pressure values (assuming [[t],y,x]) [Pa]
     840      [hgt]= opography (assuming [y,x]) [m]
     841      [ta1]= air-temperature values at first half-mass level (assuming [[t],y,x]) [K]
     842      [pa2]= pressure values at second full-mass levels (assuming [[t],y,x]) [Pa]
     843      [unpa1]= pressure values at first half-mass levels (assuming [[t],y,x]) [Pa]
     844      [dimns]= list of the name of the dimensions of [pa]
     845      [dimvns]= list of the name of the variables with the values of the
     846        dimensions of [pa]
     847    """
     848    fname = 'Forcompute_psl_ecmwf'
     849
     850    vardims = dimns[:]
     851    varvdims = dimvns[:]
     852
     853    if len(pa2.shape) == 3:
     854        psl = np.zeros((pa2.shape[0],pa2.shape[1],pa2.shape[2]), dtype=np.float)
     855        dx = pa2.shape[2]
     856        dy = pa2.shape[1]
     857        dt = pa2.shape[0]
     858        pslt= fdin.module_fordiagnostics.compute_psl_ecmwf( ps=ps[:].transpose(),    \
     859          hgt=hgt[:].transpose(), t=ta1[:].transpose(), press=pa2[:].transpose(),    \
     860          unpress=unpa1[:].transpose(), d1=dx, d2=dy, d4=dt)
     861        psl = pslt.transpose()
     862    else:
     863        print errormsg
     864        print '  ' + fname + ': rank', len(pa2.shape), 'not ready !!'
     865        print '  it only computes 3D [t,y,x] rank values'
     866        quit(-1)
     867
     868    return psl, vardims, varvdims
    835869
    836870def Forcompute_psl_ptarget(pa, ps, ta, hgt, qv, target_pressure, dimns, dimvns):
  • trunk/tools/diagnostics.inf

    r1784 r1795  
    2424prw, WRFprw, WRFdens@QVAPOR
    2525psl, WRFmslp, WRFp@PSFC@HGT@WRFt@QVAPOR
     26psl, WRFpsl_ecmwf, PSFC@HGT@WRFt@WRFp@ZNU@ZNW
    2627psl, WRFpsl_ptarget, WRFp@PSFC@WRFt@HGT@QVAPOR
    2728rvor, rvor, U@V
  • trunk/tools/diagnostics.py

    r1784 r1795  
    7979  'OMEGAw', 'RAINTOT',                                                               \
    8080  'rvors', 'td', 'turbulence', 'WRFcape_afwa', 'WRFclivi', 'WRFclwvl', 'WRFgeop',    \
    81   'WRFmrso', 'WRFp',                                                                 \
     81  'WRFmrso', 'WRFp', 'WRFpsl_ecmwf',                                                 \
    8282  'WRFpsl_ptarget', 'WRFrvors', 'WRFslw', 'ws', 'wds', 'wss', 'WRFheight',           \
    8383  'WRFheightrel', 'WRFua', 'WRFva', 'WRFzwind', 'WRFzwind_log', 'WRFzwindMO']
     
    871871        ncvar.insert_variable(ncobj, 'zg', diagout, dnames, diagoutvd, newnc)
    872872
     873# WRFmslp_ptarget sea-level pressure following ECMWF method as PSFC, HGT, WRFt, WRFp, ZNU, ZNW
     874    elif diagn == 'WRFpsl_ecmwf':
     875        var0 = ncobj.variables[depvars[0]][:]
     876        var1 = ncobj.variables[depvars[1]][0,:,:]
     877        var2 = WRFt[:,0,:,:]
     878        var4 = WRFp[:,0,:,:]
     879        var5 = ncobj.variables[depvars[4]][0,:]
     880        var6 = ncobj.variables[depvars[5]][0,:]
     881
     882        # This is quite too appriximate!! passing pressure at half-levels to 2nd full
     883        #   level, using eta values at full (ZNW) and half (ZNU) mass levels
     884        var3 = WRFp[:,0,:,:] + (var6[1] - var5[0])*(WRFp[:,1,:,:] - WRFp[:,0,:,:])/  \
     885          (var5[1]-var5[0])
     886
     887        dnamesvar = list(ncobj.variables[depvars[0]].dimensions)
     888        dvnamesvar = ncvar.var_dim_dimv(dnamesvar,dnames,dvnames)
     889
     890        diagout = np.zeros(var0.shape, dtype=np.float)
     891        diagout, diagoutd, diagoutvd = diag.Forcompute_psl_ecmwf(var0, var1, var2,   \
     892          var3, var4, dnamesvar, dvnamesvar)
     893
     894        # Removing the nonChecking variable-dimensions from the initial list
     895        varsadd = []
     896        for nonvd in NONchkvardims:
     897            if gen.searchInlist(dvnames,nonvd): diagoutvd.remove(nonvd)
     898            varsadd.append(nonvd)
     899
     900        ncvar.insert_variable(ncobj, 'psl', diagout, diagoutd, diagoutvd, newnc)
     901
    873902# WRFmslp_ptarget sea-level pressure following ptarget method as WRFp, PSFC, WRFt, HGT, QVAPOR
    874903    elif diagn == 'WRFpsl_ptarget':
  • trunk/tools/module_ForDiagnostics.f90

    r1784 r1795  
    2424! compute_clt3D3: Computation of total cloudiness from a 3D CLDFRA being 3rd dimension the z-dim
    2525! compute_clt: Computation of total cloudiness
     26! compute_psl_ecmwf: Compute sea level pressure using ECMWF method following Mats Hamrud and Philippe Courtier [Pa]
    2627! compute_massvertint1D: Subroutine to vertically integrate a 1D variable in eta vertical coordinates
    2728! compute_vertint1D: Subroutine to vertically integrate a 1D variable in any vertical coordinates
     
    602603  END SUBROUTINE compute_cape_afwa4D
    603604
     605  SUBROUTINE compute_psl_ecmwf(ps, hgt, T, press, unpress, psl, d1, d2, d4)
     606! Subroutine to compute sea level pressure using ECMWF method following Mats Hamrud and Philippe Courtier [Pa]
     607
     608    IMPLICIT NONE
     609
     610    INTEGER, INTENT(in)                                  :: d1, d2, d4
     611    REAL(r_k), DIMENSION(d1,d2,d4), INTENT(in)           :: ps, T, press, unpress
     612    REAL(r_k), DIMENSION(d1,d2), INTENT(in)              :: hgt
     613    REAL(r_k), DIMENSION(d1,d2,d4), INTENT(out)          :: psl
     614 
     615! Local
     616    INTEGER                                              :: i, j, it
     617
     618!!!!!!! Variables
     619! ps: surface pressure [Pa]
     620! hgt: terrain height [m]
     621! T: temperature at first half-mass level [K]
     622! press: pressure at first full levels [Pa]
     623! unpress: pressure at first mass (half) levels [Pa]
     624! psl: sea-level pressure [Pa]
     625
     626    fname = 'compute_psl_ecmwf'
     627
     628    DO i=1, d1
     629      DO j=1, d2
     630        DO it=1, d4
     631          CALL var_psl_ecmwf(ps(i,j,it), hgt(i,j), T(i,j,it), unpress(i,j,it), press(i,j,it),         &
     632            psl(i,j,it))
     633        END DO
     634      END DO
     635    END DO
     636
     637    RETURN
     638
     639  END SUBROUTINE compute_psl_ecmwf
     640
    604641  SUBROUTINE compute_zmla_generic4D(tpot, qratio, z, hgt, zmla3D, d1, d2, d3, d4)
    605642! Subroutine to compute pbl-height following a generic method
  • trunk/tools/module_ForDiagnosticsVars.f90

    r1785 r1795  
    2828! var_cllmh: low, medium, high-cloud [0,1]
    2929! var_clt: total cloudiness [0,1]
     30! var_psl_ecmwf: sea level pressure using ECMWF method following Mats Hamrud and Philippe Courtier [Pa]
    3031! var_zmla_generic: Subroutine to compute pbl-height following a generic method
    3132! var_zwind: Subroutine to extrapolate the wind at a given height following the 'power law' methodology
     
    127128  END FUNCTION var_clt
    128129
     130  SUBROUTINE var_psl_ecmwf(PRPRESS, hgt, PTB, PRESBH, PRESBF, psl)
     131    ! Subroutine to compute sea level pressure using ECMWF method following Mats Hamrud and Philippe Courtier
     132    !   method found in LMDZ in phylmd/pppmer.F90 in combination with phylmd/ctsar.F90
     133
     134!        IMPLICIT ARGUMENTS :  CONSTANTS FROM YOMCST,YOMGEM,YOMSTA.
     135!        --------------------
     136
     137    IMPLICIT NONE
     138
     139    REAL, INTENT(in)                                     :: PRPRESS, hgt, PTB, PRESBH, PRESBF
     140    REAL, INTENT(out)                                    :: psl
     141
     142! Local
     143    REAL                                                 :: ghgt, PTSTAR, PT0, ZTSTAR
     144    REAL                                                 :: ZALPHA, POROG
     145    REAL                                                 :: ZDTDZSG, ZOROG, ZT0, ZTX, ZTY, ZX, ZY, ZY2
     146    REAL, PARAMETER                                      :: RDTDZ1 = -gammav
     147
     148!!!!!!! Variables
     149! PRPRESS: Surface pressure [Pa]
     150! hgt: Terrain height [m]
     151! PTB: Temperature first half-level [K]
     152! PRESBH: Pressure first half-level [Pa]
     153! PRESBF: Pressure second full-level [Pa]
     154! psl: sea-level pressure
     155
     156    fname = 'var_psl_ecmwf'
     157   
     158    ! Height by gravity
     159    POROG = hgt*g
     160
     161    !* 1. COMPUTES SURFACE TEMPERATURE
     162    !*   THEN STANDARD SURFACE TEMPERATURE.
     163
     164    ZDTDZSG=-RDTDZ1/g
     165    ZALPHA=ZDTDZSG*r_d
     166
     167    PTSTAR=PTB*(1.0+ZALPHA*(PRESBH/PRESBF-1.0))
     168    PT0=PTSTAR+ZDTDZSG*POROG
     169
     170    !* 2.    POST-PROCESS MSL PRESSURE.
     171    !  --------------------------
     172
     173    !* 2.1   COMPUTATION OF MODIFIED ALPHA AND TSTAR.
     174
     175    ZTX=290.5
     176    ZTY=255.0
     177
     178    IF (PTSTAR < ZTY) THEN
     179      ZTSTAR=0.5*(ZTY+PTSTAR)
     180    ELSEIF (PTSTAR < ZTX) THEN
     181      ZTSTAR=PTSTAR
     182    ELSE
     183      ZTSTAR=0.5*(ZTX+PTSTAR)
     184    ENDIF
     185
     186    ZT0=ZTSTAR+ZDTDZSG*POROG
     187    IF (ZTX > ZTSTAR .AND. ZT0 > ZTX) THEN
     188      ZT0=ZTX
     189    ELSEIF (ZTX <= ZTSTAR .AND. ZT0 > ZTSTAR) THEN
     190      ZT0=ZTSTAR
     191    ELSE
     192      ZT0=PT0
     193    ENDIF
     194
     195    ZOROG=SIGN(MAX(1.0,ABS(POROG)),POROG)
     196    ZALPHA=r_d*(ZT0-ZTSTAR)/ZOROG
     197
     198    !* 2.2   COMPUTATION OF MSL PRESSURE.
     199
     200    IF (ABS(POROG) >= 0.001) THEN
     201      ZX=POROG/(r_d*ZTSTAR)
     202      ZY=ZALPHA*ZX
     203      ZY2=ZY*ZY
     204
     205      psl=PRPRESS*EXP(ZX*(1.0-0.5*ZY+1.0/3.*ZY2))
     206    ELSE
     207      psl=PRPRESS
     208    ENDIF
     209
     210    RETURN
     211
     212  END SUBROUTINE var_psl_ecmwf
    129213
    130214  SUBROUTINE compute_psl_ptarget4d2(press, ps, hgt, ta, qv, ptarget, psl, d1, d2, d3, d4)
Note: See TracChangeset for help on using the changeset viewer.