Changeset 2297 in lmdz_wrf


Ignore:
Timestamp:
Jan 29, 2019, 5:29:33 PM (6 years ago)
Author:
lfita
Message:

Implementing the calculation of the weighted statistics

Location:
trunk/tools
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/module_scientific.f90

    r2295 r2297  
    56345634  END SUBROUTINE spaceweightstats
    56355635
     5636  SUBROUTINE multi_spacewightstats_in3DRK3_slc3v(varin, rundim, Ngridsin, gridsin, percentages,       &
     5637    varout, di1, di2, di3, ds1, ds2, ds3, ds4, ds5, ds6, maxNgridsin, Lstats)
     5638  ! Subroutine to compute an spatial statistics value from a 3D RK matrix using 3rd dimension as
     5639  !   running one into a matrix of slices using spatial weights
     5640
     5641    IMPLICIT NONE
     5642
     5643    INTEGER, INTENT(in)                                  :: di1, di2, di3, ds1, ds2, ds3, ds4, ds5, ds6
     5644    INTEGER, INTENT(in)                                  :: rundim, maxNgridsin
     5645    CHARACTER(len=*), INTENT(in)                         :: stats
     5646    INTEGER, DIMENSION(ds1,ds2,ds3,ds4,ds5,ds6),                                                      &
     5647      INTENT(in)                                         :: Ngridsin
     5648    INTEGER, INTENT(in)                                                                               &
     5649      DIMENSION(ds1,ds2,ds3,ds4,ds5,ds6,maxNgridsin,2)   :: gridsin
     5650    REAL(r_k), DIMENSION(di1,di2,di3), INTENT(in)        :: varin
     5651    REAL(r_k), INTENT(in)                                                                             &
     5652      DIMENSION(ds1,ds2,ds3,ds4,ds5,ds6,maxNgridsin)     :: percentages
     5653    REAL(r_k), DIMENSION(ds1,ds2,ds3,ds4,ds5,ds6,di3,7),                                              &
     5654      INTENT(out)                                        :: varout
     5655
     5656! Local
     5657    INTEGER                                              :: i1, i2, i3, s1, s2, s3, s4, s5, s6
     5658    INTEGER                                              :: Ncounts, Nin
     5659    CHARACTER(len=3)                                     :: val1S, val2S
     5660    CHARACTER(len=30)                                    :: val3S
     5661    REAL(r_k)                                            :: val1, val2
     5662    REAL(r_k), DIMENSION(Lstats)                         :: icounts
     5663    INTEGER, DIMENSION(:), ALLOCATABLE                   :: pin
     5664    INTEGER, DIMENSION(:,:), ALLOCATABLE                 :: gin
     5665
     5666!!!!!!! Variables
     5667! di1, di2, di3: length of dimensions of the 3D matrix of values
     5668! ds[1-6]: length of dimensions of matrix with the slices
     5669! maxNgridsin: maximum number of grid points from the 3D matrix in any slice
     5670! varin: 3D RK variable to be used
     5671! Ngridsin: number of grids from 3D RK matrix for each slice
     5672! gridsin: coordinates of grids of the 3D RK matrix B to matrix of slices
     5673! percentages: weights as percentages of space of 3D RK matrix for each slice
     5674! stats: name of the spatial statistics to compute inside each slice using values from 3D RK matrix
     5675!   Avaialbe ones:
     5676!   'min': minimum value
     5677!   'max': maximum value
     5678!   'mean': space weighted mean value
     5679!   'mean2': space weighted quadratic mean value
     5680!   'stddev': space weighted standard deviation value
     5681!   'median': median value
     5682!   'count': percentage of the space of matrix A covered by each different value of matrix B
     5683! varout: output statistical variable
     5684
     5685    fname = 'multi_spacewightstats_in3DRK3_slc3v'
     5686
     5687    ! Let's be efficient?
     5688    varout = fillVal64
     5689    DO s1 =1, ds1
     5690      DO s2 =1, ds2
     5691        DO s3 =1, ds3
     5692          DO s4 =1, ds4
     5693            DO s5 =1, ds5
     5694              DO s5 =1, ds6
     5695                Nin = Ngridsin(s1,s2,s3,s4,s5,s6)
     5696                IF (ALLOCATED(gin)) DEALLOCATE(gin)
     5697                ALLOCATE(gin(Nin,2))
     5698                IF (ALLOCATED(pin)) DEALLOCATE(pin)
     5699                ALLOCATE(pin(Nin))
     5700                gin = gridsin(s1,s2,s3,s4,s5,s6,1:Nin,:)
     5701                pin = percentages(s1,s2,s3,s4,s5,s6,1:Nin)
     5702
     5703                DO i1=1, di1
     5704                  DO i2=1, di2
     5705
     5706        DO iv=1, Ngridsin(ix,iy)
     5707              ii = gridsin(ix,iy,iv,1)
     5708              jj = gridsin(ix,iy,iv,2)
     5709              IF (varin(ii,jj) < varout(ix,iy,Lstats)) varout(ix,iy,1) = varin(ii,jj)
     5710            END DO
     5711          END DO
     5712        END DO
     5713
     5714      CASE DEFAULT
     5715        msg = "statisitcs '" // TRIM(stats) // "' not ready !!" // CHAR(44) // " available ones: " // &
     5716          "'min', 'max', 'mean', 'mean2', 'stddev', 'count'"
     5717        CALL ErrMsg(msg, fname, -1)
     5718    END SELECT statn
     5719
     5720
     5721  END SUBROUTINE multi_spacewightstats_in3DRK3_slc3v
     5722
    56365723  SUBROUTINE multi_index_mat2DI(d1, d2, d12, mat, value, Nindices, indices)
    56375724  ! Subroutine to provide the indices of the different locations of a value inside a 2D integer matrix
  • trunk/tools/nc_var_tools.py

    r2296 r2297  
    2775927759    fname = 'compute_slices_stats_areaweighted'
    2776027760
     27761    # Statistics from values within final slice
     27762    statns = ['min', 'max', 'mean', 'mean2', 'stddev', 'median']
     27763    Lstatns = {'min': 'space minimum', 'max': 'space maximum', 'mean': 'space mean', \
     27764      'mean2': 'space quadratic mean', 'stddev': 'spcae standard deviation',         \
     27765      'median': 'median', 'count': 'amount of grids'}
     27766    ustatns = {'min': 'vu', 'max': 'vu', 'mean': 'vu', 'mean2': 'vu', 'stddev': 'vu',\
     27767      'median': 'vu', 'count': 'counts'}
     27768
    2776127769    if values == 'h':
    2776227770        print fname + '_____________________________________________________________'
     
    2852628534
    2852728535    # Remembering that it is python (C-like...)
    28528     iA = 1
    28529     jA = 4
    28530     iB = 0
    28531     jB = 0
    2853228536    inpointsA = inpointsA-1
    2853328537    inpointsB = inpointsB-1
     
    2859728601    for islc in range(2,Nnewslcs):
    2859828602        dn = dn + '_' + newslcvarns[iscl+1]
     28603
    2859928604        osliceNA = onewnc.variables[newslcvarns[0] + 'Ngrid']
    2860028605        osliceinA = onewnc.variables[newslcvarns[0] + 'gridin']
     
    2860528610        osliceaB = onewnc.variables[newslcvarns[1] + 'gridarea']
    2860628611        oslicepB = onewnc.variables[newslcvarns[1] + 'gridpercen']
    28607 
     28612   
    2860828613        sliceNA = osliceNA[:]
    2860928614        sliceinA = osliceinA[:]
     28615        sliceaA = osliceaA[:]
    2861028616        sliceNB = osliceNB[:]
    2861128617        sliceinB = osliceinB[:]
     28618        sliceaB = osliceaB[:]
    2861228619
    2861328620        dxA = osliceNA.shape[1]
     
    2861728624        dyB = osliceNB.shape[0]
    2861828625        dxyB = osliceinB.shape[1]
    28619 
    28620         Srgrid = list(osliceNA.dimensions) + list(osliceNB.dimensions)
     28626   
     28627        Srgrid = list(osliceNB.dimensions) + list(osliceNA.dimensions)
    2862128628        Sigrid = ['coord', dn+'gridin'] + Srgrid
    2862228629        Spgrid = [dn+'gridin'] + Srgrid
    28623 
     28630   
    2862428631        sliceNAt = sliceNA.transpose()
    2862528632        sliceinAt = sliceinA.transpose()
    2862628633        sliceNBt = sliceNB.transpose()
    2862728634        sliceinBt = sliceinB.transpose()
    28628 
     28635   
    2862928636        NpointsABt, pointsABt, inpA, inpB = fsci.module_scientific.coincident_gridsin2d( \
    2863028637          npointsa=sliceNAt, pointsa=sliceinAt, npointsb=sliceNBt, pointsb=sliceinBt,    \
     
    2863528642        inpointsB = inpB.transpose()
    2863628643
     28644        # Remembering that it is python (C-like...)
     28645        inpointsA = inpointsA-1
     28646        inpointsB = inpointsB-1
     28647
    2863728648        maxNpointsAB = np.max(NpointsAB)
     28649        print "  Joined slice '" + newslcvarns[0] + "' & '" + newslcvarns[1] + "':",     \
     28650          NpointsAB.shape, 'maxin:', maxNpointsAB
    2863828651
    2863928652        if not gen.searchInlist(onewnc.dimensions, dn+'gridin'):
     
    2865228665        innewvar.setncattr('coordinates',' '.join(Srgrid[::-1]))
    2865328666
     28667        aanewvar = onewnc.createVariable(dn+'area','f',tuple(Srgrid),                    \
     28668          fill_value=gen.fillValueF)
     28669        basicvardef(aanewvar ,dn+'area', "area of the join slice " + newslcvarns[0] +    \
     28670          " & " + newslcvarns[1], vu)
     28671        aanewvar.setncattr('coordinates',' '.join(Srgrid[::-1]))
     28672
    2865428673        anewvar = onewnc.createVariable(dn+'gridarea','f',tuple(Srgrid),                 \
    2865528674          fill_value=gen.fillValueF)
     
    2866128680          fill_value=gen.fillValueF)
    2866228681        basicvardef(pnewvar ,dn+'gridpercen', "percentages of the " +                    \
    28663           "grids cells from .get. laying within .ref.", '1')
     28682          "grids cells from " + newslcvarns[0] + " laying within " + newslcvarns[1], '1')
    2866428683        pnewvar.setncattr('coordinates',' '.join(Scgrid[::-1]))
    2866528684
     
    2867028689                        Nin = NpointsAB[jB,iB,jA,iA]
    2867128690                        innewvar[:,0:Nin,jB,iB,jA,iA] = pointsAB[:,0:Nin,jB,iB,jA,iA]
     28691                        slicearea = 0.
    2867228692                        for iv in range(Nin):
    28673                             pA = oslicepA[inpA[iv],jA,iA]
    28674                             pB = oslicepB[inpB[iv],jB,iB]
     28693                            pA = oslicepA[inpointsA[iv,jA,iA],jA,iA]
     28694                            pB = oslicepB[inpointsB[iv,jB,iB],jB,iB]
    2867528695                            pnewvar[iv,jB,iB,jA,iA]= pA*pB
    28676                             aA = osliceaA[inpA[iv],jA,iA]
    28677                             aB = osliceaB[inpB[iv],jB,iB]
    28678                             anewvar[iv,jB,iB,jA,iA]= aA*aB
     28696                            ixA = sliceinA[1,inpointsA[iv,jA,iA],jA,iA]
     28697                            iyA = sliceinA[0,inpointsA[iv,jA,iA],jA,iA]
     28698                            aA = osliceaA[iyA,ixA]
     28699                            ixB = sliceinB[1,inpointsB[iv,jB,iB],jB,iB]
     28700                            iyB = sliceinB[0,inpointsB[iv,jB,iB],jB,iB]
     28701                            aB = osliceaB[iyB,ixB]
     28702                            # I do not understand why this is needed !!
     28703                            if aA != gen.mamat[1] and aB != gen.mamat[1]:
     28704                                anewvar[jB,iB,jA,iA]= (aA*pA)*(aB*pB)
     28705                                slicearea = slicearea + (aA*pA)*(aB*pB)
     28706                            aanewvar[jB,iB,jA,iA]= slicearea
    2867928707
    2868028708        onewnc.sync()
    2868128709
    2868228710    slcvarns = slcvarns + newslcvarns
     28711
     28712    # Slicing with the final combined slice:', dn
     28713    print 'Slicing with the final combined slice:', dn
     28714    oNslice = onewnc.variables[dn+'Ngrid']
     28715    oslicein = onewnc.variables[dn+'gridin']
     28716    oslicearea = onewnc.variables[dn+'area']
     28717    oslicegridarea = onewnc.variables[dn+'gridarea']
     28718    oslicegridpercen = onewnc.variables[dn+'gridpercen']
     28719
     28720    sN = oNslice[:]
     28721    sin = oslicein[:]
     28722    sa = oslicearea[:]
     28723    sga = oslicegridarea[:]
     28724    sgp = oslicegridpercen[:]
     28725
     28726    dimsslice = list(oNslice.dimensions)
     28727    shapeslice = list(oNslice.shape)
    2868328728
    2868428729    for varn in varns:
     
    2869028735        vu = ovar.units
    2869128736
    28692         varbnds = []
    28693         for dn in vdimns:
    28694             if not gen.searchInlist(onewnc.dimensions,dn): add_dims(onc, onewnc, [dn])
    28695 
    28696             odn = variables[dn]
    28697             dv = odn[:]
    28698 
    28699             # Looking for boundaries
    28700             vdarattrs = odn.ncattrs()
    28701             if vdarattrs.has_key('bounds'):
    28702                 print '    ' + infmsg
    28703                 print '    ' +fname+ ": dimension variable '" +dn+ "' with bounds !!"
    28704                 print '      bounds found:', varattrs['bounds']
    28705                 print '      getting them to retrieve the slices'
    28706                 bndvarns = varattrs['bounds']
    28707                 varbnds.append(dn)
    28708                 ovarbnds = onc.variables[varbnds]
    28709 
    28710                 # Slicing following boundaries, dimensions are 1D thus expand to 2D
    28711                 #    filling as NW, NE, SE, SW
    28712                 if gen.searchInlist(slcvarns, dn) and not vardimbndslice.has_key(dn):
    28713                     print infmsg
    28714                     print '    ' + fname + ": slicing dimension '" + dn + "' ... "
    28715                     varslcv = slicesinf[dn]
    28716                     Nslices = varslcv[0]
    28717                     ovardims = varslcv[1]
    28718                     slcvar = varslcv[2]
    28719 
    28720                     # Shapping 2D slices
    28721                     reflat = np.zeros((Nslices), dtype=np.float)
    28722                     xslice2D = np.zeros((Nslices,4), dtype=np.float)
    28723                     xslice2D[:,0] = slcvar[1,:]
    28724                     xslice2D[:,1] = slcvar[1,:]
    28725                     xslice2D[:,2] = slcvar[0,:]
    28726                     xslice2D[:,3] = slcvar[0,:]
    28727                     yslice2D = np.zeros((Nslices,4), dtype=np.float)
    28728                     yslice2D[:,0] = -1.
    28729                     yslice2D[:,1] = 1.
    28730                     yslice2D[:,2] = 1.
    28731                     yslice2D[:,3] = -1.
    28732 
    28733                     dd = len(onc.dimensions[dn])
    28734                     getlat = np.zeros((dd), dtype=np.float)
    28735                     xdimvarbnds2D = np.zeros((dd,4), dtype=np.float)
    28736                     xdimvarbnds2D[:,0] = ovarbnds[1,:]
    28737                     xdimvarbnds2D[:,1] = ovarbnds[1,:]
    28738                     xdimvarbnds2D[:,2] = ovarbnds[0,:]
    28739                     xdimvarbnds2D[:,3] = ovarbnds[0,:]
    28740                     ydimvarbnds2D = np.zeros((dd,4), dtype=np.float)
    28741                     ydimvarbnds2D[:,0] = -1.
    28742                     ydimvarbnds2D[:,1] = 1.
    28743                     ydimvarbnds2D[:,2] = 1.
    28744                     ydimvarbnds2D[:,3] = -1.
    28745 
    28746                     reflont = slcvar.transpose()
    28747                     reflatt = reflat.transpose()
    28748                     refvarxbndst = xslice2D.transpose()
    28749                     refvarybndst = yslice2D.transpose()
    28750                     getlont = dv.transpose()
    28751                     getlatt = getlat.transpose()
    28752                     getvarxbndst = xdimvarbnds2D.transpose()
    28753                     getvarybndst = ydimvarbnds2D.transpose()
    28754 
    28755                     Ngridsint, gridsint, percenst =                                  \
    28756                       fsci.module_scientific.spacepercen(xcavals=reflont,            \
    28757                       ycavals=reflatt, xbavals=refvarxbndst, ybavals=refvarybndst,   \
    28758                       xcbvals=getlont, ycbvals=getlatt, xbbvals=getvarxbndst,        \
    28759                       ybbvals=getvarybndst, strict=strict, dxa=Nslices, dya=1,       \
    28760                       navertexmax=4, dxb=dd, dyb=1, dxyb=dd, nbvertexmax=4)
    28761 
    28762                     Ngridsin = Ngridsint.transpose()
    28763                     gridsin = gridsint.transpose()
    28764                     percens = percenst.transpose()
    28765 
    28766                     Ngridsinmax = np.max(Ngridsin)
    28767 
    28768                     # Let's avoid memory issues...
    28769                     lvalues = [Ngridsin, gridsin, percens]
    28770                     vardimbndslice[dn] = lvalues
    28771 
    28772                     # Writting it to the file variables space-weight
    28773                     if not gen.searchInlist(onewnc.dimensions, dn+'bnds'):
    28774                         newdim = onewnc.createDimension(dn+'bnds',4)
    28775                         newdim = onewnc.createDimension(dn+'gridin',Ngridsinmax)
    28776                     if not gen.searchInlist(onewnc.dimensions, 'coord'):
    28777                         newdim = onewnc.createDimension('coord',2)
    28778 
    28779                     newvar = onewnc.createVariable(dn + 'Ngrid','i',(dn))
    28780                     newvar[:] = Ngridsin[:]
    28781                     basicvardef(newvar, dn+'Ngrid', "number of grids cells from " +  \
    28782                       ".get. laying within .ref.", '-')
    28783                     newvar.setncattr('coordinates',dn)
    28784 
    28785                     innewvar = onewnc.createVariable(dn+'gridin', 'i', ('coord',     \
    28786                       'gridin',dn))
    28787                     basicvardef(innewvar, dn+'gridin', "coordinates of the grids " + \
    28788                       "cells from .get. laying within .ref.",'-')
    28789                     innewvar.setncattr('coordinates',dn)
    28790 
    28791                     pnewvar = onewnc.createVariable(dn+'gridpercen','f',('gridin',dn))
    28792                     basicvardef(pnewvar ,dn+'gridpercen', "percentages of the " +    \
    28793                       "grids cells from .get. laying within .ref.", '1')
    28794                     pnewvar.setncattr('coordinates',dn)
    28795 
    28796                     for j in range(1):
    28797                         for i in range(dd):
    28798                             innewvar[:,0:Ngridsin[j,i],j,i] =                        \
    28799                               gridsin[:,0:Ngridsin[j,i],j,i]
    28800                             pnewvar[0:Ngridsin[j,i],j,i]= percens[0:Ngridsin[j,i],j,i]
    28801                     onewnc.sync()
     28737        # Looking for possible new dimensions and dim-variables
     28738        vardims = []
     28739        varshape = []
     28740        for dnn in vdimns:
     28741            vdimn = dimvars[dnn]
     28742            if vdimn == 'WRFtime':
     28743                vdimn = 'time'
     28744                odimvar = onc.variables['Times']
     28745                timewrfv = odimvar[:]
     28746                tvals, urefvals = compute_WRFtime(timewrfv, refdate='19491201000000',\
     28747                  tunitsval='minutes')
     28748                tvals = np.array(tvals)
     28749                dimtwrf = len(tvals)
     28750                if gen.searchInlist(slicestatsdim, dnn):
     28751                    vardims.append(vdimn)
     28752                    varshape.append(dimtwrf)
     28753                if not gen.searchInlist(onewnc.dimensions,vdimn):
     28754                    newdim = onewnc.createDimension(vdimn, None)
     28755                if not gen.searchInlist(onewnc.variables,vdimn):
     28756                    newvar = onewnc.createVariable(vdimn, 'f', ('time'))
     28757                    newvar[:] = tvals
     28758                    basicvardef(newvar, 'time', 'Time', urefvals)
     28759                    newvar.setncattr('calendar','gregorian')
     28760
     28761            else:
     28762                if gen.searchInlist(slicestatsdim, dnn):
     28763                    vardims.append(vdimn)
     28764                    varshape.append(dimtwrf)
     28765                    if not gen.searchInlist(onewnc.dimensions,dnn):
     28766                        add_dims(onc, onewnc, [dnn])
     28767                        vardims.append(dn)
     28768                        varshape.append(len(onc.dimensions[dn]))
     28769                    if not gen.searchInlist(onewnc.variables,vdimn): add_vars(onc,   \
     28770                      onewnc, [vdimn])
     28771
     28772        newvardims = vardims + dimsslice
     28773        newvarshape = varshape + shapeslice
     28774
     28775        for statn in statns:
     28776            Lstn = Lstatns[statn]
     28777            if Ustatns[statn] == 'vu': vvu = vu
     28778            else:
     28779                if statn == 'stddev': vvu = vu + '2'
     28780                else: vvu = Ustatns[statn]
     28781            newvar= onewnc.createVariable(varn+'sliced'+statn,'f', tuple(newvardims),\
     28782              fill_value = gen.fillValueF)
     28783            basicvardef(newvar, varn+'sliced'+statn, Lstn + ' ' + varn +             \
     28784              ' within slice by '+ dn, vvu)
     28785            onewnc.sync()
     28786
     28787        # getting all the slices
     28788        allslices = gen.provide_slices(dimsslice, shapeslice, dimsslice)
     28789        print allslices
     28790
     28791        quit()
    2880228792
    2880328793        # mask in var slice
Note: See TracChangeset for help on using the changeset viewer.