Changeset 2297 in lmdz_wrf
- Timestamp:
- Jan 29, 2019, 5:29:33 PM (6 years ago)
- Location:
- trunk/tools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/module_scientific.f90
r2295 r2297 5634 5634 END SUBROUTINE spaceweightstats 5635 5635 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 5636 5723 SUBROUTINE multi_index_mat2DI(d1, d2, d12, mat, value, Nindices, indices) 5637 5724 ! 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 27759 27759 fname = 'compute_slices_stats_areaweighted' 27760 27760 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 27761 27769 if values == 'h': 27762 27770 print fname + '_____________________________________________________________' … … 28526 28534 28527 28535 # Remembering that it is python (C-like...) 28528 iA = 128529 jA = 428530 iB = 028531 jB = 028532 28536 inpointsA = inpointsA-1 28533 28537 inpointsB = inpointsB-1 … … 28597 28601 for islc in range(2,Nnewslcs): 28598 28602 dn = dn + '_' + newslcvarns[iscl+1] 28603 28599 28604 osliceNA = onewnc.variables[newslcvarns[0] + 'Ngrid'] 28600 28605 osliceinA = onewnc.variables[newslcvarns[0] + 'gridin'] … … 28605 28610 osliceaB = onewnc.variables[newslcvarns[1] + 'gridarea'] 28606 28611 oslicepB = onewnc.variables[newslcvarns[1] + 'gridpercen'] 28607 28612 28608 28613 sliceNA = osliceNA[:] 28609 28614 sliceinA = osliceinA[:] 28615 sliceaA = osliceaA[:] 28610 28616 sliceNB = osliceNB[:] 28611 28617 sliceinB = osliceinB[:] 28618 sliceaB = osliceaB[:] 28612 28619 28613 28620 dxA = osliceNA.shape[1] … … 28617 28624 dyB = osliceNB.shape[0] 28618 28625 dxyB = osliceinB.shape[1] 28619 28620 Srgrid = list(osliceN A.dimensions) + list(osliceNB.dimensions)28626 28627 Srgrid = list(osliceNB.dimensions) + list(osliceNA.dimensions) 28621 28628 Sigrid = ['coord', dn+'gridin'] + Srgrid 28622 28629 Spgrid = [dn+'gridin'] + Srgrid 28623 28630 28624 28631 sliceNAt = sliceNA.transpose() 28625 28632 sliceinAt = sliceinA.transpose() 28626 28633 sliceNBt = sliceNB.transpose() 28627 28634 sliceinBt = sliceinB.transpose() 28628 28635 28629 28636 NpointsABt, pointsABt, inpA, inpB = fsci.module_scientific.coincident_gridsin2d( \ 28630 28637 npointsa=sliceNAt, pointsa=sliceinAt, npointsb=sliceNBt, pointsb=sliceinBt, \ … … 28635 28642 inpointsB = inpB.transpose() 28636 28643 28644 # Remembering that it is python (C-like...) 28645 inpointsA = inpointsA-1 28646 inpointsB = inpointsB-1 28647 28637 28648 maxNpointsAB = np.max(NpointsAB) 28649 print " Joined slice '" + newslcvarns[0] + "' & '" + newslcvarns[1] + "':", \ 28650 NpointsAB.shape, 'maxin:', maxNpointsAB 28638 28651 28639 28652 if not gen.searchInlist(onewnc.dimensions, dn+'gridin'): … … 28652 28665 innewvar.setncattr('coordinates',' '.join(Srgrid[::-1])) 28653 28666 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 28654 28673 anewvar = onewnc.createVariable(dn+'gridarea','f',tuple(Srgrid), \ 28655 28674 fill_value=gen.fillValueF) … … 28661 28680 fill_value=gen.fillValueF) 28662 28681 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') 28664 28683 pnewvar.setncattr('coordinates',' '.join(Scgrid[::-1])) 28665 28684 … … 28670 28689 Nin = NpointsAB[jB,iB,jA,iA] 28671 28690 innewvar[:,0:Nin,jB,iB,jA,iA] = pointsAB[:,0:Nin,jB,iB,jA,iA] 28691 slicearea = 0. 28672 28692 for iv in range(Nin): 28673 pA = oslicepA[inp A[iv],jA,iA]28674 pB = oslicepB[inp B[iv],jB,iB]28693 pA = oslicepA[inpointsA[iv,jA,iA],jA,iA] 28694 pB = oslicepB[inpointsB[iv,jB,iB],jB,iB] 28675 28695 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 28679 28707 28680 28708 onewnc.sync() 28681 28709 28682 28710 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) 28683 28728 28684 28729 for varn in varns: … … 28690 28735 vu = ovar.units 28691 28736 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() 28802 28792 28803 28793 # mask in var slice
Note: See TracChangeset
for help on using the changeset viewer.