Changeset 1776 in lmdz_wrf for trunk


Ignore:
Timestamp:
Feb 15, 2018, 7:18:41 PM (7 years ago)
Author:
lfita
Message:

Adding `zwind': wind at a given height following power-law methodology

Location:
trunk/tools
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/diag_tools.py

    r1773 r1776  
    910910    return zmla, zmladims, zmlavdims
    911911
     912
     913def Forcompute_zwind(ua, va, zsl, uas, vas, hgt, sina, cosa, zval, dimns, dimvns):
     914    """ Function to compute the wind at a given height following the power law method
     915    Forcompute_zwind(ua, va, zsl, uas, vas, hgt, sina, cosa, zval, dimns, dimvns)
     916      [ua]= x-component of unstaggered 3D wind (assuming [[t],z,y,x]) [ms-1]
     917      [va]= y-component of unstaggered 3D wind (assuming [[t],z,y,x]) [ms-1]
     918      [zsl]= height above sea level [m]
     919      [uas]= x-component of unstaggered 10 m wind (assuming [[t],z,y,x]) [ms-1]
     920      [vas]= y-component of unstaggered 10 m wind (assuming [[t],z,y,x]) [ms-1]
     921      [hgt]= topographical height (assuming [m]
     922      [sina]= local sine of map rotation [1.]
     923      [cosa]= local cosine of map rotation [1.]
     924      [zval]= desired height for winds [m]
     925      [dimns]= list of the name of the dimensions of [ua]
     926      [dimvns]= list of the name of the variables with the values of the
     927        dimensions of [ua]
     928    """
     929    fname = 'Forcompute_zwind'
     930
     931    vardims = dimns[:]
     932    varvdims = dimvns[:]
     933
     934    if len(ua.shape) == 4:
     935        var1= np.zeros((ua.shape[0],ua.shape[2],ua.shape[3]), dtype=np.float)
     936        var2= np.zeros((ua.shape[0],ua.shape[2],ua.shape[3]), dtype=np.float)
     937
     938        dx = ua.shape[3]
     939        dy = ua.shape[2]
     940        dz = ua.shape[1]
     941        dt = ua.shape[0]
     942        vardims.pop(1)
     943        varvdims.pop(1)
     944
     945        pvar1, pvar2= fdin.module_fordiagnostics.compute_zwind4d(ua=ua.transpose(),  \
     946          va=va[:].transpose(), zsl=zsl[:].transpose(), uas=uas.transpose(),         \
     947          vas=vas.transpose(), hgt=hgt.transpose(), sina=sina.transpose(),           \
     948          cosa=cosa.transpose(), zextrap=zval, d1=dx, d2=dy, d3=dz, d4=dt)
     949        var1 = pvar1.transpose()
     950        var2 = pvar2.transpose()
     951    else:
     952        print errormsg
     953        print '  ' + fname + ': rank', len(ua.shape), 'not ready !!'
     954        print '  it only computes 4D [t,z,y,x] rank values'
     955        quit(-1)
     956
     957    return var1, var2, vardims, varvdims
    912958
    913959def compute_OMEGAw(omega, p, t, dimns, dimvns):
  • trunk/tools/diagnostics.inf

    r1773 r1776  
    3434ua, WRFua, U@V@SINALPHA@COSALPHA
    3535va, WRFva, U@V@SINALPHA@COSALPHA
     36uavaz, WRFzwind, U@V@WRFgeop@U10@V10@HGT@SINALPHA@COSALPHA@z=100.
    3637wa, OMEGAw, vitw@pres@temp
    3738wds, TSwds, u@v
     
    4546zg, WRFght, PH@PHB
    4647zmla, WRFzmlagen, T@QVAPOR@WRFgeop@HGT
    47 
  • trunk/tools/diagnostics.py

    r1773 r1776  
    8181  'WRFmrso', 'WRFp',                                                                 \
    8282  'WRFpsl_ptarget', 'WRFrvors', 'WRFslw', 'ws', 'wds', 'wss', 'WRFheight',           \
    83   'WRFheightrel', 'WRFua', 'WRFva']
     83  'WRFheightrel', 'WRFua', 'WRFva', 'WRzwind']
    8484
    8585methods = ['accum', 'deaccum']
     
    344344              gen.searchInlist(NONcheckingvars, depv) and                            \
    345345              not gen.searchInlist(methods, depv) and not depvars[0] == 'deaccum'    \
    346               and not depvars[0] == 'accum':
     346              and not depvars[0] == 'accum' and not depv[0:2] == 'z=':
    347347                print errormsg
    348348                print '  ' + main + ": file '" + opts.ncfile +                       \
     
    11231123        ncvar.insert_variable(ncobj, 'zmla', diagout, diagoutd, diagoutvd, newnc)
    11241124
     1125# WRFzwind wind extrapolation at a given hieght computation from WRF U, V, WRFgeop,
     1126#   U10, V10, HGT, SINALPHA, COSALPHA, z=[zval]
     1127    elif diagn == 'WRFzwind':
     1128        var0 = ncobj.variables[depvars[0]][:]
     1129        var1 = ncobj.variables[depvars[1]][:]
     1130        dimz = var0.shape[1]
     1131        var2 = WRFgeop[:,1:dimz+1,:,:]/9.8
     1132        var3 = ncobj.variables[depvars[3]][:]
     1133        var4 = ncobj.variables[depvars[4]][:]
     1134        var5 = ncobj.variables[depvars[5]][0,:,:]
     1135        var6 = ncobj.variables[depvars[6]][0,:,:]
     1136        var7 = ncobj.variables[depvars[7]][0,:,:]
     1137        var8 = np.float(depvars[8].split('=')[1])
     1138
     1139        # un-staggering 3D winds
     1140        unstgdims = [var0.shape[0], var0.shape[1], var0.shape[2], var0.shape[3]-1]
     1141        va = np.zeros(tuple(unstgdims), dtype=np.float)
     1142        unvar0 = np.zeros(tuple(unstgdims), dtype=np.float)
     1143        unvar1 = np.zeros(tuple(unstgdims), dtype=np.float)
     1144        unvar0 = 0.5*(var0[:,:,:,0:var0.shape[3]-1] + var0[:,:,:,1:var0.shape[3]])
     1145        unvar1 = 0.5*(var1[:,:,0:var1.shape[2]-1,:] + var1[:,:,1:var1.shape[2],:])
     1146
     1147        diagout1, diagout2, diagoutd, diagoutvd = diag.Forcompute_zwind(unvar0,      \
     1148          unvar1, var2, var3, var4, var5, var6, var7, var8, dnames, dvnames)
     1149
     1150        # Removing the nonChecking variable-dimensions from the initial list
     1151        varsadd = []
     1152        for nonvd in NONchkvardims:
     1153            if gen.searchInlist(dvnames,nonvd): diagoutvd.remove(nonvd)
     1154            varsadd.append(nonvd)
     1155
     1156        ncvar.insert_variable(ncobj, 'uaz', diagout1, diagoutd, diagoutvd, newnc)
     1157        ncvar.insert_variable(ncobj, 'vaz', diagout2, diagoutd, diagoutvd, newnc)
     1158
    11251159    else:
    11261160        print errormsg
  • trunk/tools/module_ForDiagnostics.f90

    r1773 r1776  
    2828! compute_zint4D: Subroutine to vertically integrate a 4D variable in any vertical coordinates
    2929! compute_zmla_generic4D: Subroutine to compute pbl-height following a generic method
     30! compute_zwind4D: Subroutine to compute extrapolate the wind at a given height following the 'power law' methodology
    3031
    3132!!!
     
    642643  END SUBROUTINE compute_zmla_generic4D
    643644
     645  SUBROUTINE compute_zwind4D(ua, va, zsl, uas, vas, hgt, sina, cosa, zextrap, uaz, vaz, d1, d2, d3, d4)
     646! Subroutine to compute extrapolate the wind at a given height following the 'power law' methodology
     647
     648    IMPLICIT NONE
     649
     650    INTEGER, INTENT(in)                                  :: d1, d2, d3, d4
     651    REAL(r_k), DIMENSION(d1,d2,d3,d4), INTENT(in)        :: ua, va, zsl
     652    REAL(r_k), DIMENSION(d1,d2,d4), INTENT(in)           :: uas, vas
     653    REAL(r_k), DIMENSION(d1,d2), INTENT(in)              :: hgt, sina, cosa
     654    REAL(r_k), INTENT(in)                                :: zextrap
     655    REAL(r_k), DIMENSION(d1,d2,d4), INTENT(out)          :: uaz, vaz
     656 
     657! Local
     658    INTEGER                                              :: i, j, it
     659
     660!!!!!!! Variables
     661! tpot: potential air temperature [K]
     662! qratio: water vapour mixing ratio [kgkg-1]
     663! z: height above sea level [m]
     664! hgt: terrain height [m]
     665! sina, cosa: local sine and cosine of map rotation [1.]
     666! zmla3D: boundary layer height from surface [m]
     667
     668    fname = 'compute_zwind4D'
     669
     670    DO i=1, d1
     671      DO j=1, d2
     672        DO it=1, d4
     673          CALL var_zwind(d3, ua(i,j,:,it), va(i,j,:,it), zsl(i,j,:,it), uas(i,j,it), vas(i,j,it),    &
     674            hgt(i,j), sina(i,j), cosa(i,j), zextrap, uaz(i,j,it), vaz(i,j,it))
     675        END DO
     676      END DO
     677    END DO
     678
     679    RETURN
     680
     681  END SUBROUTINE compute_zwind4D
    644682
    645683END MODULE module_ForDiagnostics
  • trunk/tools/module_ForDiagnosticsVars.f90

    r1773 r1776  
    2929! var_clt: total cloudiness [0,1]
    3030! var_zmla_generic: Subroutine to compute pbl-height following a generic method
     31! var_zwind: Subroutine to extrapolate the wind at a given height following the 'power law' methodology
    3132! VirtualTemp1D: Function for 1D calculation of virtual temperaure
    3233! VirtualTemperature: WRF's AFWA method to compute virtual temperature
     
    10261027  END SUBROUTINE var_zmla_generic
    10271028
     1029  SUBROUTINE var_zwind(d1, u, v, z, u10, v10, sa, ca, topo, newz, unewz, vnewz)
     1030! Subroutine to extrapolate the wind at a given height following the 'power law' methodology
     1031!    wss[newz] = wss[z1]*(newz/z1)**alpha
     1032!    alpha = (ln(wss[z2])-ln(wss[z1]))/(ln(z2)-ln(z1))
     1033! AFTER: Phd Thesis:
     1034!   Benedicte Jourdier. Ressource eolienne en France metropolitaine : methodes d’evaluation du
     1035!   potentiel, variabilite et tendances. Climatologie. Ecole Doctorale Polytechnique, 2015. French
     1036!
     1037    IMPLICIT NONE
     1038
     1039    INTEGER, INTENT(in)                                  :: d1
     1040    REAL(r_k), DIMENSION(d1), INTENT(in)                 :: u,v,z
     1041    REAL(r_k), INTENT(in)                                :: u10, v10, topo, sa, ca, newz
     1042    REAL(r_k), INTENT(out)                               :: unewz, vnewz
     1043
     1044! Local
     1045    INTEGER                                              :: inear
     1046    REAL(r_k)                                            :: zaground
     1047    REAL(r_k), DIMENSION(2)                              :: v1, v2, zz, alpha, uvnewz
     1048
     1049!!!!!!! Variables
     1050! u,v: vertical wind components [ms-1]
     1051! z: height above surface [m]
     1052! u10,v10: 10-m wind components [ms-1]
     1053! topo: topographical height [m]
     1054! sa, ca: local sine and cosine of map rotation [1.]
     1055! newz: desired height above grpund of extrapolation
     1056! unewz,vnewz: Wind compoonents at the given height [ms-1]
     1057
     1058    fname = 'var_zwind'
     1059
     1060    PRINT *,' ilev zaground newz z[ilev+1] z[ilev+2] _______'
     1061    IF (z(1) < newz ) THEN
     1062      DO inear = 1,d1-2
     1063        zaground = z(inear+2)
     1064        PRINT *, inear, z(inear), newz, z(inear+1), z(inear+2)
     1065        IF ( zaground >= newz) EXIT
     1066      END DO
     1067    ELSE
     1068      PRINT *, 1, z(1), newz, z(2), z(3), ' z(1) > newz'
     1069      inear = d1 - 2
     1070    END IF
     1071
     1072    IF (inear == d1-2) THEN
     1073    ! No vertical pair of levels is below newz, using 10m wind as first value and the first level as the second
     1074       v1(1) = u10
     1075       v1(2) = v10
     1076       v2(1) = u(1)
     1077       v2(2) = v(1)
     1078       zz(1) = 10.
     1079       zz(2) = z(1)
     1080    ELSE
     1081       v1(1) = u(inear)
     1082       v1(2) = v(inear)
     1083       v2(1) = u(inear+1)
     1084       v2(2) = v(inear+1)
     1085       zz(1) = z(inear) - topo
     1086       zz(2) = z(inear+1) - topo
     1087    END IF
     1088
     1089    ! Computing for each component
     1090    alpha = (LOG(ABS(v2))-LOG(ABS(v1)))/(LOG(zz(2))-LOG(zz(1)))
     1091    PRINT *,' Computing with v1:', v1, ' ms-1 v2:', v2, ' ms-1'
     1092    PRINT *,' z1:', zz(1), 'm z2:', zz(2), ' m'
     1093    PRINT *,' alhpa u:', alpha(1), ' alpha 2:', alpha(2)
     1094   
     1095    uvnewz = v1*(newz/zz(1))**alpha
     1096    ! Earth-rotation
     1097    unewz = uvnewz(1)*ca - uvnewz(2)*sa
     1098    vnewz = uvnewz(1)*sa + uvnewz(2)*ca
     1099
     1100    PRINT *,'  result vz:', uvnewz
     1101
     1102    !STOP
     1103
     1104    RETURN
     1105
     1106  END SUBROUTINE var_zwind
     1107
    10281108END MODULE module_ForDiagnosticsVars
  • trunk/tools/variables_values.dat

    r1762 r1776  
    462462U10, uas, eastward_wind, -30., 30., eastward|10m|wind, ms-1, seismic
    463463Vent zonal 10m, uas, eastward_wind, -30., 30., eastward|10m|wind, ms-1, seismic
     464uaz, uaz, eastward_wind, -30., 30., eastward|wind|at|z|value, ms-1, seismic
    464465va, va, northward_wind, -30., 30., northward|wind, ms-1, seismic
    465466vitv, va, northward_wind, -30., 30., northward|wind, ms-1, seismic
     
    472473V10, vas, northward_wind, -30., 30., northward|10m|wind, ms-1, seismic
    473474Vent meridien 10m, vas, northward_wind, -30., 30., northward|10m|wind, ms-1, seismic
     475vaz, vaz, northward_wind, -30., 30., northward|wind|at|z|value, ms-1, seismic
    474476veget, veget, vegetation_type, 1, 13, type|of|plant|functional|type, 1, Reds
    475477wakedeltaq, wakedeltaq, wake_delta_vapor, -0.003, 0.003, wake|delta|mixing|ratio, kgkg-1s-1, seismic
Note: See TracChangeset for help on using the changeset viewer.