Changeset 2098 in lmdz_wrf


Ignore:
Timestamp:
Aug 25, 2018, 5:10:51 PM (6 years ago)
Author:
lfita
Message:

Adding:

  • `WRF_percenlevels': Function to compute eta-levels for WRF following a percentage distribution
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/generic_tools.py

    r2085 r2098  
    173173# vals_around: Function to provide the 3x3 values around a given j,i point
    174174# xtrm_nx: Function to provide the extreme (a percentage above min,max) of a series of values
     175# WRF_percenlevels: Function to compute eta-levels for WRF following a percentage distribution
    175176# WRFsetup: Function to check the set-up of a WRF model namelist or from any other model
    176177
     
    1375013751    return       
    1375113752
     13753def WRF_percenlevels(Nlevs=38, ps=1000., pt=20.):
     13754    """ Function to compute eta-levels for WRF following a percentage distribution
     13755      Nlevs: number of levels
     13756      pt: p_top pressure [hPa]
     13757      ps: p_sfc pressure [hPa]
     13758        p_sfc - 975 hPa:  4 %
     13759          975 - 900 hPa: 28 %
     13760          900 - 850 hPa: 10 %
     13761          850 - 600 hPa: 25 %
     13762          600 - 450 hPa: 12 %
     13763          450 - 250 hPa: 12 %
     13764          250 - p_top:    9 %
     13765    """
     13766    fname = 'WRF_percenlevels'
     13767
     13768    # 72 numbers
     13769    #dps = {900.:5., 850.: 10., 700.: 15., 600.: 20., 450.: 10., 250.: 20., 50.: 30.}
     13770    #Nlevp: {450.0: 15, 900.0: 20, 50.0: 6, 850.0: 5, 600.0: 5, 250.0: 10, 700.0: 10} %
     13771    #900.0 : 27.7777777778
     13772    #850.0 : 6.94444444444
     13773    #700.0 : 13.8888888889
     13774    #600.0 : 6.94444444444
     13775    #450.0 : 20.8333333333
     13776    #250.0 : 13.8888888889
     13777    #50.0 : 8.33333333333
     13778
     13779    # Assigning percentage of levels per interval
     13780    # Computing dps
     13781    #dppsperce = {900.: 29., 850.: 6., 700.: 15., 600.: 7., 450.:21., 250.:14., 50.: 8.}
     13782    dppsperce = {990: 4., 900.: 28., 850.: 10., 600.: 25., 450.:12., 250.:12., pt: 9.}
     13783    dpps0 = dppsperce.keys()
     13784    dpps0.sort(reverse=True)
     13785
     13786    dps = {}
     13787
     13788    # Assigning number of levels
     13789    nplevs = {}
     13790    percen = 0
     13791    Ntotlev = 0
     13792    # Removing 1st and last levels
     13793    Nlevs1 = Nlevs - 2
     13794    for dpp in dpps0:
     13795        nlev = int(Nlevs1*dppsperce[dpp]/100.)
     13796        nplevs[dpp] = nlev
     13797        Ntotlev = Ntotlev + nlev
     13798
     13799    print '  ' + fname + ' final total number of levels:', Ntotlev,                  \
     13800      'of initial Nlevs:', Nlevs, 'TOT %:', np.sum(dppsperce.values())
     13801
     13802    # Re-distributing rest of levels on first intervals
     13803    if Ntotlev < Nlevs1:
     13804        Nextralevs = Nlevs1 - Ntotlev
     13805        print '  ' + fname + ': Ntotlev:', Ntotlev, 're-distributing:', Nextralevs,  \
     13806          'extra levels !!'
     13807        for i in range(Nextralevs): nplevs[dpps0[i]] = nplevs[dpps0[i]] + 1
     13808    else:
     13809        Nextralevs = 0
     13810
     13811    print '  ' + fname + ' final number of levels:', nplevs, 'sum:',                 \
     13812      np.sum(nplevs.values()) + 2
     13813
     13814    # Assigning pressure-differenctials
     13815    pp0 = ps
     13816    print '  uppper_limit_section [hPa] dp [hPa] _______'
     13817    for dpp in dpps0:
     13818        nlev = nplevs[dpp]
     13819        # Adding an extra level to meet final pt
     13820        if dpp == dpps0[len(dpps0)-1]: nlev = nlev + 1
     13821        dp = pp0 - dpp
     13822        ddp = dp / nlev
     13823        dps[dpp] = ddp
     13824        percen = percen + dppsperce[dpp]
     13825        print '      ', '{:.2f}'.format(dpp), '                ', ddp
     13826        pp0 = dpp
     13827
     13828    p = [ps]
     13829    dpps = list(dps.keys())
     13830    dpps.sort(reverse=True)
     13831    iiz = 1
     13832    Ntotlevs = 0
     13833    for dpp in dpps:
     13834        dp = dps[dpp]
     13835        Ntotlevs = Ntotlevs + nplevs[dpp]
     13836        for iz in range(nplevs[dpp]):
     13837            p.append(p[iiz-1] - dp)
     13838            iiz = iiz + 1
     13839            #print 'iz:', iz, p[iz], dp, pt
     13840    p.append(pt)
     13841    p = np.array(p)
     13842    eta = (p-pt)/(ps-pt)
     13843    dz=p.shape[0]
     13844
     13845    ofilen = 'WRFpercen_p' + str(Nlevs) + 'lev.dat'
     13846    of = open(ofilen, 'w')
     13847    of.write('# ' + str(Nlevs) + ' i-lev[1] pressure[2] eta[3] dp[4]__________\n')
     13848    for i in range(dz-1):
     13849       of.write(str(i) + ' ' + str(p[i]) + ' ' + str(eta[i]) + ' ' + str(p[i]-p[i+1]) + '\n')
     13850    i = dz-1
     13851    of.write(str(i) + ' ' + str(pt) + ' ' + str(eta[i]) + ' 0.\n')
     13852
     13853    of.close()
     13854    print fname + ": succesfull written of file '" + ofilen + "' !!"
     13855
     13856    return
     13857
     13858print WRF_percenlevels()
     13859
    1375213860#quit()
    1375313861
    13754 
    13755 
Note: See TracChangeset for help on using the changeset viewer.