Changeset 1784 in lmdz_wrf for trunk/tools


Ignore:
Timestamp:
Mar 1, 2018, 12:48:27 PM (7 years ago)
Author:
lfita
Message:

Adding:

  • `WRFzwind_log': extrapolate the wind at a given height following the 'logarithmic law' methodology
Location:
trunk/tools
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/diag_tools.py

    r1783 r1784  
    3434# Forcompute_zmla_gen: Function to compute the boundary layer height following a generic method with Fortran
    3535# Forcompute_zwind: Function to compute the wind at a given height following the power law method
     36# Forcompute_zwind_log: Function to compute the wind at a given height following the logarithmic law method
    3637# Forcompute_zwindMO: Function to compute the wind at a given height following the Monin-Obukhov theory
    3738# W_diagnostic: Class to compute WRF diagnostics variables
     
    948949          vas=vas.transpose(), sina=sina.transpose(), cosa=cosa.transpose(),         \
    949950          zextrap=zval, d1=dx, d2=dy, d3=dz, d4=dt)
     951        var1 = pvar1.transpose()
     952        var2 = pvar2.transpose()
     953    else:
     954        print errormsg
     955        print '  ' + fname + ': rank', len(ua.shape), 'not ready !!'
     956        print '  it only computes 4D [t,z,y,x] rank values'
     957        quit(-1)
     958
     959    return var1, var2, vardims, varvdims
     960
     961def Forcompute_zwind_log(ua, va, z, uas, vas, sina, cosa, zval, dimns, dimvns):
     962    """ Function to compute the wind at a given height following the logarithmic law method
     963    Forcompute_zwind(ua, va, zsl, uas, vas, hgt, sina, cosa, zval, dimns, dimvns)
     964      [ua]= x-component of unstaggered 3D wind (assuming [[t],z,y,x]) [ms-1]
     965      [va]= y-component of unstaggered 3D wind (assuming [[t],z,y,x]) [ms-1]
     966      [z]= height above surface [m]
     967      [uas]= x-component of unstaggered 10 m wind (assuming [[t],z,y,x]) [ms-1]
     968      [vas]= y-component of unstaggered 10 m wind (assuming [[t],z,y,x]) [ms-1]
     969      [sina]= local sine of map rotation [1.]
     970      [cosa]= local cosine of map rotation [1.]
     971      [zval]= desired height for winds [m]
     972      [dimns]= list of the name of the dimensions of [ua]
     973      [dimvns]= list of the name of the variables with the values of the
     974        dimensions of [ua]
     975    """
     976    fname = 'Forcompute_zwind_log'
     977
     978    vardims = dimns[:]
     979    varvdims = dimvns[:]
     980
     981    if len(ua.shape) == 4:
     982        var1= np.zeros((ua.shape[0],ua.shape[2],ua.shape[3]), dtype=np.float)
     983        var2= np.zeros((ua.shape[0],ua.shape[2],ua.shape[3]), dtype=np.float)
     984
     985        dx = ua.shape[3]
     986        dy = ua.shape[2]
     987        dz = ua.shape[1]
     988        dt = ua.shape[0]
     989        vardims.pop(1)
     990        varvdims.pop(1)
     991
     992        pvar1, pvar2= fdin.module_fordiagnostics.compute_zwind_log4d(                \
     993          ua=ua.transpose(), va=va[:].transpose(), z=z[:].transpose(),               \
     994          uas=uas.transpose(), vas=vas.transpose(), sina=sina.transpose(),           \
     995          cosa=cosa.transpose(), zextrap=zval, d1=dx, d2=dy, d3=dz, d4=dt)
    950996        var1 = pvar1.transpose()
    951997        var2 = pvar2.transpose()
  • trunk/tools/diagnostics.inf

    r1783 r1784  
    3535va, WRFva, U@V@SINALPHA@COSALPHA
    3636uavaz, WRFzwind, U@V@WRFz@U10@V10@SINALPHA@COSALPHA@z=100.
     37uavaz, WRFzwind_log, U@V@WRFz@U10@V10@SINALPHA@COSALPHA@z=100.
    3738uavaz, WRFzwindMO, UST@ZNT@RMOL@U10@V10@SINALPHA@COSALPHA@z=100.
    3839wa, OMEGAw, vitw@pres@temp
  • trunk/tools/diagnostics.py

    r1783 r1784  
    8181  'WRFmrso', 'WRFp',                                                                 \
    8282  'WRFpsl_ptarget', 'WRFrvors', 'WRFslw', 'ws', 'wds', 'wss', 'WRFheight',           \
    83   'WRFheightrel', 'WRFua', 'WRFva', 'WRFzwind', 'WRFzwindMO']
     83  'WRFheightrel', 'WRFua', 'WRFva', 'WRFzwind', 'WRFzwind_log', 'WRFzwindMO']
    8484
    8585methods = ['accum', 'deaccum']
     
    11461146        ncvar.insert_variable(ncobj, 'zmla', diagout, diagoutd, diagoutvd, newnc)
    11471147
    1148 # WRFzwind wind extrapolation at a given hieght computation from WRF U, V, WRFz,
    1149 #   U10, V10, SINALPHA, COSALPHA, z=[zval]
     1148# WRFzwind wind extrapolation at a given height using power law computation from WRF
     1149#   U, V, WRFz, U10, V10, SINALPHA, COSALPHA, z=[zval]
    11501150    elif diagn == 'WRFzwind':
    11511151        var0 = ncobj.variables[depvars[0]][:]
     
    11781178        ncvar.insert_variable(ncobj, 'vaz', diagout2, diagoutd, diagoutvd, newnc)
    11791179
     1180# WRFzwind wind extrapolation at a given hieght using logarithmic law computation
     1181#   from WRF U, V, WRFz, U10, V10, SINALPHA, COSALPHA, z=[zval]
     1182    elif diagn == 'WRFzwind_log':
     1183        var0 = ncobj.variables[depvars[0]][:]
     1184        var1 = ncobj.variables[depvars[1]][:]
     1185        var2 = WRFz
     1186        var3 = ncobj.variables[depvars[3]][:]
     1187        var4 = ncobj.variables[depvars[4]][:]
     1188        var5 = ncobj.variables[depvars[5]][0,:,:]
     1189        var6 = ncobj.variables[depvars[6]][0,:,:]
     1190        var7 = np.float(depvars[7].split('=')[1])
     1191
     1192        # un-staggering 3D winds
     1193        unstgdims = [var0.shape[0], var0.shape[1], var0.shape[2], var0.shape[3]-1]
     1194        va = np.zeros(tuple(unstgdims), dtype=np.float)
     1195        unvar0 = np.zeros(tuple(unstgdims), dtype=np.float)
     1196        unvar1 = np.zeros(tuple(unstgdims), dtype=np.float)
     1197        unvar0 = 0.5*(var0[:,:,:,0:var0.shape[3]-1] + var0[:,:,:,1:var0.shape[3]])
     1198        unvar1 = 0.5*(var1[:,:,0:var1.shape[2]-1,:] + var1[:,:,1:var1.shape[2],:])
     1199
     1200        diagout1, diagout2, diagoutd, diagoutvd = diag.Forcompute_zwind_log(unvar0,  \
     1201          unvar1, var2, var3, var4, var5, var6, var7, dnames, dvnames)
     1202
     1203        # Removing the nonChecking variable-dimensions from the initial list
     1204        varsadd = []
     1205        for nonvd in NONchkvardims:
     1206            if gen.searchInlist(dvnames,nonvd): diagoutvd.remove(nonvd)
     1207            varsadd.append(nonvd)
     1208
     1209        ncvar.insert_variable(ncobj, 'uaz', diagout1, diagoutd, diagoutvd, newnc)
     1210        ncvar.insert_variable(ncobj, 'vaz', diagout2, diagoutd, diagoutvd, newnc)
     1211
    11801212# WRFzwindMO wind extrapolation at a given height computation using Monin-Obukhow
    11811213#   theory from WRF UST, ZNT, RMOL, U10, V10, SINALPHA, COSALPHA, z=[zval]
     1214#   NOTE: only useful for [zval] < 80. m
    11821215    elif diagn == 'WRFzwindMO':
    11831216        var0 = ncobj.variables[depvars[0]][:]
  • trunk/tools/module_ForDiagnostics.f90

    r1783 r1784  
    2929! compute_zmla_generic4D: Subroutine to compute pbl-height following a generic method
    3030! compute_zwind4D: Subroutine to compute extrapolate the wind at a given height following the 'power law' methodology
     31! compute_zwind_log4D: Subroutine to compute extrapolate the wind at a given height following the 'logarithmic law' methodology
    3132! compute_zwindMCO3D: Subroutine to compute extrapolate the wind at a given height following the 'power law' methodolog
    3233
     
    681682  END SUBROUTINE compute_zwind4D
    682683
     684  SUBROUTINE compute_zwind_log4D(ua, va, z, uas, vas, sina, cosa, zextrap, uaz, vaz, d1, d2, d3, d4)
     685! Subroutine to compute extrapolate the wind at a given height following the 'logarithmic law' methodology
     686
     687    IMPLICIT NONE
     688
     689    INTEGER, INTENT(in)                                  :: d1, d2, d3, d4
     690    REAL(r_k), DIMENSION(d1,d2,d3,d4), INTENT(in)        :: ua, va, z
     691    REAL(r_k), DIMENSION(d1,d2,d4), INTENT(in)           :: uas, vas
     692    REAL(r_k), DIMENSION(d1,d2), INTENT(in)              :: sina, cosa
     693    REAL(r_k), INTENT(in)                                :: zextrap
     694    REAL(r_k), DIMENSION(d1,d2,d4), INTENT(out)          :: uaz, vaz
     695 
     696! Local
     697    INTEGER                                              :: i, j, it
     698
     699!!!!!!! Variables
     700! tpot: potential air temperature [K]
     701! qratio: water vapour mixing ratio [kgkg-1]
     702! z: height above surface [m]
     703! sina, cosa: local sine and cosine of map rotation [1.]
     704! zmla3D: boundary layer height from surface [m]
     705
     706    fname = 'compute_zwind_log4D'
     707
     708    DO i=1, d1
     709      DO j=1, d2
     710        DO it=1, d4
     711          CALL var_zwind_log(d3, ua(i,j,:,it), va(i,j,:,it), z(i,j,:,it), uas(i,j,it), vas(i,j,it),   &
     712            sina(i,j), cosa(i,j), zextrap, uaz(i,j,it), vaz(i,j,it))
     713        END DO
     714      END DO
     715    END DO
     716
     717    RETURN
     718
     719  END SUBROUTINE compute_zwind_log4D
     720
    683721  SUBROUTINE compute_zwindMO3D(d1, d2, d3, ust, znt, rmol, uas, vas, sina, cosa, newz, uznew, vznew)
    684722! Subroutine to compute extrapolate the wind at a given height following the 'power law' methodology
     723!   NOTE: only usefull for newz < 80. m
    685724
    686725    IMPLICIT NONE
  • trunk/tools/module_ForDiagnosticsVars.f90

    r1783 r1784  
    3030! var_zmla_generic: Subroutine to compute pbl-height following a generic method
    3131! var_zwind: Subroutine to extrapolate the wind at a given height following the 'power law' methodology
     32! var_zwind_log: Subroutine to extrapolate the wind at a given height following the 'logarithmic law' methodology
    3233! var_zwind_MOtheor: Subroutine of wind extrapolation following Moin-Obukhov theory
    3334! VirtualTemp1D: Function for 1D calculation of virtual temperaure
     
    11111112  END SUBROUTINE var_zwind
    11121113
     1114  SUBROUTINE var_zwind_log(d1, u, v, z, u10, v10, sa, ca, newz, unewz, vnewz)
     1115! Subroutine to extrapolate the wind at a given height following the 'logarithmic law' methodology
     1116!    wss[newz] = wss[z1]*(newz/z1)**alpha
     1117!    alpha = (ln(wss[z2])-ln(wss[z1]))/(ln(z2)-ln(z1))
     1118! AFTER: Phd Thesis:
     1119!   Benedicte Jourdier. Ressource eolienne en France metropolitaine : methodes d’evaluation du
     1120!   potentiel, variabilite et tendances. Climatologie. Ecole Doctorale Polytechnique, 2015. French
     1121!
     1122    IMPLICIT NONE
     1123
     1124    INTEGER, INTENT(in)                                  :: d1
     1125    REAL(r_k), DIMENSION(d1), INTENT(in)                 :: u,v,z
     1126    REAL(r_k), INTENT(in)                                :: u10, v10, sa, ca, newz
     1127    REAL(r_k), INTENT(out)                               :: unewz, vnewz
     1128
     1129! Local
     1130    INTEGER                                              :: inear
     1131    REAL(r_k)                                            :: zaground
     1132    REAL(r_k), DIMENSION(2)                              :: v1, v2, zz, logz0, uvnewz
     1133
     1134!!!!!!! Variables
     1135! u,v: vertical wind components [ms-1]
     1136! z: height above surface on half-mass levels [m]
     1137! u10,v10: 10-m wind components [ms-1]
     1138! sa, ca: local sine and cosine of map rotation [1.]
     1139! newz: desired height above grpund of extrapolation
     1140! unewz,vnewz: Wind compoonents at the given height [ms-1]
     1141
     1142    fname = 'var_zwind_log'
     1143
     1144    !PRINT *,' ilev zaground newz z[ilev+1] z[ilev+2] _______'
     1145    IF (z(1) < newz ) THEN
     1146      DO inear = 1,d1-2
     1147        ! L. Fita, CIMA. Feb. 2018
     1148        !! Choose between extra/inter-polate. Maybe better interpolate?
     1149        ! Here we extrapolate from two closest lower levels
     1150        !zaground = z(inear+2)
     1151        zaground = z(inear+1)
     1152        !PRINT *, inear, z(inear), newz, z(inear+1), z(inear+2)
     1153        IF ( zaground >= newz) EXIT
     1154      END DO
     1155    ELSE
     1156      !PRINT *, 1, z(1), newz, z(2), z(3), ' z(1) > newz'
     1157      inear = d1 - 2
     1158    END IF
     1159
     1160    IF (inear == d1-2) THEN
     1161    ! No vertical pair of levels is below newz, using 10m wind as first value and the first level as the second
     1162       v1(1) = u10
     1163       v1(2) = v10
     1164       v2(1) = u(1)
     1165       v2(2) = v(1)
     1166       zz(1) = 10.
     1167       zz(2) = z(1)
     1168    ELSE
     1169       v1(1) = u(inear)
     1170       v1(2) = v(inear)
     1171       v2(1) = u(inear+1)
     1172       v2(2) = v(inear+1)
     1173       zz(1) = z(inear)
     1174       zz(2) = z(inear+1)
     1175    END IF
     1176
     1177    ! Computing for each component
     1178    logz0 = (v2*LOG(zz(1))-v1*LOG(zz(2)))/(v2-v1)
     1179   
     1180    uvnewz = v2*(LOG(newz)-logz0)/(LOG(zz(2))-logz0)
     1181    ! Earth-rotation
     1182    unewz = uvnewz(1)*ca - uvnewz(2)*sa
     1183    vnewz = uvnewz(1)*sa + uvnewz(2)*ca
     1184
     1185    !PRINT *,'  result vz:', uvnewz
     1186
     1187    !STOP
     1188
     1189    RETURN
     1190
     1191  END SUBROUTINE var_zwind_log
     1192
    11131193  SUBROUTINE var_zwind_MOtheor(ust, znt, rmol, u10, v10, sa, ca, newz, uznew, vznew)
    11141194  ! Subroutine of wind extrapolation following Moin-Obukhov theory R. B. Stull, 1988,
    11151195  !   Springer (p376-383)
     1196  ! Only usefull for newz < 80. m
    11161197
    11171198    IMPLICIT NONE
Note: See TracChangeset for help on using the changeset viewer.