Changeset 2299 in lmdz_wrf
- Timestamp:
- Jan 29, 2019, 8:49:10 PM (6 years ago)
- Location:
- trunk/tools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/module_scientific.f90
r2297 r2299 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)5636 SUBROUTINE multi_spacewightstats_in3DRK3_slc3v3(varin, Ngridsin, gridsin, percentages, varout, & 5637 di1, di2, di3, ds1, ds2, ds3, maxNgridsin) 5638 5638 ! Subroutine to compute an spatial statistics value from a 3D RK matrix using 3rd dimension as 5639 ! running one into a matrix of slicesusing spatial weights5639 ! running one into a matrix of 3-variables slices of rank 3 using spatial weights 5640 5640 5641 5641 IMPLICIT NONE 5642 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 5643 INTEGER, INTENT(in) :: di1, di2, di3, ds1, ds2, ds3 5644 INTEGER, INTENT(in) :: maxNgridsin 5645 INTEGER, DIMENSION(ds1,ds2,ds3), INTENT(in) :: Ngridsin 5646 INTEGER, DIMENSION(ds1,ds2,ds3,maxNgridsin,2), & 5647 INTENT(in) :: gridsin 5650 5648 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 5649 REAL(r_k), INTENT(in), & 5650 DIMENSION(ds1,ds2,ds3,maxNgridsin) :: percentages 5651 REAL(r_k), DIMENSION(ds1,ds2,ds3,di3,7), INTENT(out) :: varout 5655 5652 5656 5653 ! Local 5657 INTEGER :: i1, i2, i3, s1, s2, s3, s4, s5, s65654 INTEGER :: i1, i2, i3, s1, s2, s3, iv 5658 5655 INTEGER :: Ncounts, Nin 5659 5656 CHARACTER(len=3) :: val1S, val2S 5660 5657 CHARACTER(len=30) :: val3S 5661 REAL(r_k) :: val1, val2 5662 REAL(r_k), DIMENSION(Lstats) :: icounts 5658 REAL(r_k) :: minv, maxv, meanv, mean2v, stdv, medv 5663 5659 INTEGER, DIMENSION(:), ALLOCATABLE :: pin 5664 5660 INTEGER, DIMENSION(:,:), ALLOCATABLE :: gin 5661 REAL(r_k), DIMENSION(:), ALLOCATABLE :: svin 5662 REAL(r_k), DIMENSION(:,:), ALLOCATABLE :: vin 5665 5663 5666 5664 !!!!!!! Variables 5667 5665 ! di1, di2, di3: length of dimensions of the 3D matrix of values 5668 ! ds[1- 6]: length of dimensions of matrix with the slices5666 ! ds[1-3]: length of dimensions of matrix with the slices 5669 5667 ! maxNgridsin: maximum number of grid points from the 3D matrix in any slice 5670 5668 ! varin: 3D RK variable to be used … … 5672 5670 ! gridsin: coordinates of grids of the 3D RK matrix B to matrix of slices 5673 5671 ! 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 matrix5675 ! Avaialbe ones:5672 !!!!! 5673 ! Available spatial statistics to compute inside each slice using values from 3D RK matrix 5676 5674 ! 'min': minimum value 5677 5675 ! 'max': maximum value … … 5683 5681 ! varout: output statistical variable 5684 5682 5685 fname = 'multi_spacewightstats_in3DRK3_slc3v' 5683 fname = 'multi_spacewightstats_in3DRK3_slc3v3' 5684 5685 ! Let's be efficient? 5686 varout = fillVal64 5687 DO s1 =1, ds1 5688 DO s2 =1, ds2 5689 DO s3 =1, ds3 5690 Nin = Ngridsin(s1,s2,s3) 5691 IF (ALLOCATED(gin)) DEALLOCATE(gin) 5692 ALLOCATE(gin(Nin,2)) 5693 IF (ALLOCATED(pin)) DEALLOCATE(pin) 5694 ALLOCATE(pin(Nin)) 5695 IF (ALLOCATED(vin)) DEALLOCATE(vin) 5696 ALLOCATE(vin(Nin,di3)) 5697 IF (ALLOCATED(svin)) DEALLOCATE(svin) 5698 ALLOCATE(svin(Nin)) 5699 gin = gridsin(s1,s2,s3,1:Nin,:) 5700 pin = percentages(s1,s2,s3,1:Nin) 5701 5702 minv = fillVal64 5703 maxv = -fillVal64 5704 meanv = zeroRK 5705 mean2v = zeroRK 5706 stdv = zeroRK 5707 5708 ! Getting the values 5709 DO iv=1, Nin 5710 i1 = gin(iv,1) 5711 i2 = gin(iv,2) 5712 vin(iv,:) = varin(i1,i2,:) 5713 END DO 5714 5715 ! Computing along d3 5716 DO i3=1, di3 5717 minv = MINVAL(vin(:,i3)) 5718 maxv = MAXVAL(vin(:,i3)) 5719 meanv = SUM(vin(:,i3)*pin)/Nin 5720 mean2v = SUM(vin(:,i3)**2*pin)/Nin 5721 stdv = SQRT(mean2v - meanv**2) 5722 svin = vin(:,i3) 5723 CALL SortR_K(svin, Nin) 5724 medv = svin(INT(Nin/2)) 5725 varout(s1,s2,s3,i3,1) = minv 5726 varout(s1,s2,s3,i3,2) = maxv 5727 varout(s1,s2,s3,i3,3) = meanv 5728 varout(s1,s2,s3,i3,4) = mean2v 5729 varout(s1,s2,s3,i3,5) = stdv 5730 varout(s1,s2,s3,i3,6) = medv 5731 varout(s1,s2,s3,i3,7) = Nin*1. 5732 END DO 5733 END DO 5734 END DO 5735 END DO 5736 5737 IF (ALLOCATED(gin)) DEALLOCATE(gin) 5738 IF (ALLOCATED(pin)) DEALLOCATE(pin) 5739 IF (ALLOCATED(vin)) DEALLOCATE(vin) 5740 IF (ALLOCATED(svin)) DEALLOCATE(svin) 5741 5742 RETURN 5743 5744 END SUBROUTINE multi_spacewightstats_in3DRK3_slc3v3 5745 5746 SUBROUTINE multi_spacewightstats_in3DRK3_slc3v4(varin, Ngridsin, gridsin, percentages, varout, & 5747 di1, di2, di3, ds1, ds2, ds3, ds4, maxNgridsin) 5748 ! Subroutine to compute an spatial statistics value from a 3D RK matrix using 3rd dimension as 5749 ! running one into a matrix of 3-variables slices of rank 4 using spatial weights 5750 5751 IMPLICIT NONE 5752 5753 INTEGER, INTENT(in) :: di1, di2, di3, ds1, ds2, ds3, ds4 5754 INTEGER, INTENT(in) :: maxNgridsin 5755 INTEGER, DIMENSION(ds1,ds2,ds3,ds4), INTENT(in) :: Ngridsin 5756 INTEGER, INTENT(in), & 5757 DIMENSION(ds1,ds2,ds3,ds4,maxNgridsin,2) :: gridsin 5758 REAL(r_k), DIMENSION(di1,di2,di3), INTENT(in) :: varin 5759 REAL(r_k), INTENT(in), & 5760 DIMENSION(ds1,ds2,ds3,ds4,maxNgridsin) :: percentages 5761 REAL(r_k), DIMENSION(ds1,ds2,ds3,ds4,di3,7), & 5762 INTENT(out) :: varout 5763 5764 ! Local 5765 INTEGER :: i1, i2, i3, s1, s2, s3, s4, iv 5766 INTEGER :: Ncounts, Nin 5767 CHARACTER(len=3) :: val1S, val2S 5768 CHARACTER(len=30) :: val3S 5769 REAL(r_k) :: minv, maxv, meanv, mean2v, stdv, medv 5770 INTEGER, DIMENSION(:), ALLOCATABLE :: pin 5771 INTEGER, DIMENSION(:,:), ALLOCATABLE :: gin 5772 REAL(r_k), DIMENSION(:), ALLOCATABLE :: svin 5773 REAL(r_k), DIMENSION(:,:), ALLOCATABLE :: vin 5774 5775 !!!!!!! Variables 5776 ! di1, di2, di3: length of dimensions of the 3D matrix of values 5777 ! ds[1-4]: length of dimensions of matrix with the slices 5778 ! maxNgridsin: maximum number of grid points from the 3D matrix in any slice 5779 ! varin: 3D RK variable to be used 5780 ! Ngridsin: number of grids from 3D RK matrix for each slice 5781 ! gridsin: coordinates of grids of the 3D RK matrix B to matrix of slices 5782 ! percentages: weights as percentages of space of 3D RK matrix for each slice 5783 !!!!! 5784 ! Available spatial statistics to compute inside each slice using values from 3D RK matrix 5785 ! 'min': minimum value 5786 ! 'max': maximum value 5787 ! 'mean': space weighted mean value 5788 ! 'mean2': space weighted quadratic mean value 5789 ! 'stddev': space weighted standard deviation value 5790 ! 'median': median value 5791 ! 'count': percentage of the space of matrix A covered by each different value of matrix B 5792 ! varout: output statistical variable 5793 5794 fname = 'multi_spacewightstats_in3DRK3_slc3v4' 5686 5795 5687 5796 ! Let's be efficient? … … 5691 5800 DO s3 =1, ds3 5692 5801 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) 5802 Nin = Ngridsin(s1,s2,s3,s4) 5803 IF (ALLOCATED(gin)) DEALLOCATE(gin) 5804 ALLOCATE(gin(Nin,2)) 5805 IF (ALLOCATED(pin)) DEALLOCATE(pin) 5806 ALLOCATE(pin(Nin)) 5807 IF (ALLOCATED(vin)) DEALLOCATE(vin) 5808 ALLOCATE(vin(Nin,di3)) 5809 IF (ALLOCATED(svin)) DEALLOCATE(svin) 5810 ALLOCATE(svin(Nin)) 5811 gin = gridsin(s1,s2,s3,s4,1:Nin,:) 5812 pin = percentages(s1,s2,s3,s4,1:Nin) 5813 5814 minv = fillVal64 5815 maxv = -fillVal64 5816 meanv = zeroRK 5817 mean2v = zeroRK 5818 stdv = zeroRK 5819 5820 ! Getting the values 5821 DO iv=1, Nin 5822 i1 = gin(iv,1) 5823 i2 = gin(iv,2) 5824 vin(iv,:) = varin(i1,i2,:) 5825 END DO 5826 5827 ! Computing along d3 5828 DO i3=1, di3 5829 minv = MINVAL(vin(:,i3)) 5830 maxv = MAXVAL(vin(:,i3)) 5831 meanv = SUM(vin(:,i3)*pin)/Nin 5832 mean2v = SUM(vin(:,i3)**2*pin)/Nin 5833 stdv = SQRT(mean2v - meanv**2) 5834 svin = vin(:,i3) 5835 CALL SortR_K(svin, Nin) 5836 medv = svin(INT(Nin/2)) 5837 varout(s1,s2,s3,s4,i3,1) = minv 5838 varout(s1,s2,s3,s4,i3,2) = maxv 5839 varout(s1,s2,s3,s4,i3,3) = meanv 5840 varout(s1,s2,s3,s4,i3,4) = mean2v 5841 varout(s1,s2,s3,s4,i3,5) = stdv 5842 varout(s1,s2,s3,s4,i3,6) = medv 5843 varout(s1,s2,s3,s4,i3,7) = Nin*1. 5710 5844 END DO 5711 5845 END DO 5712 5846 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 5847 END DO 5848 END DO 5849 5850 IF (ALLOCATED(gin)) DEALLOCATE(gin) 5851 IF (ALLOCATED(pin)) DEALLOCATE(pin) 5852 IF (ALLOCATED(vin)) DEALLOCATE(vin) 5853 IF (ALLOCATED(svin)) DEALLOCATE(svin) 5854 5855 RETURN 5856 5857 END SUBROUTINE multi_spacewightstats_in3DRK3_slc3v4 5722 5858 5723 5859 SUBROUTINE multi_index_mat2DI(d1, d2, d12, mat, value, Nindices, indices) -
trunk/tools/nc_var_tools.py
r2297 r2299 27760 27760 27761 27761 # Statistics from values within final slice 27762 statns = ['min', 'max', 'mean', 'mean2', 'stddev', 'median' ]27762 statns = ['min', 'max', 'mean', 'mean2', 'stddev', 'median', 'count'] 27763 27763 Lstatns = {'min': 'space minimum', 'max': 'space maximum', 'mean': 'space mean', \ 27764 27764 'mean2': 'space quadratic mean', 'stddev': 'spcae standard deviation', \ 27765 27765 'median': 'median', 'count': 'amount of grids'} 27766 ustatns = {'min': 'vu', 'max': 'vu', 'mean': 'vu', 'mean2': 'vu', 'stddev': 'vu',\27766 Ustatns = {'min': 'vu', 'max': 'vu', 'mean': 'vu', 'mean2': 'vu', 'stddev': 'vu',\ 27767 27767 'median': 'vu', 'count': 'counts'} 27768 27768 … … 28562 28562 aanewvar.setncattr('coordinates',' '.join(Srgrid[::-1])) 28563 28563 28564 anewvar = onewnc.createVariable(dn+'gridarea','f',tuple(S rgrid), \28564 anewvar = onewnc.createVariable(dn+'gridarea','f',tuple(Spgrid), \ 28565 28565 fill_value=gen.fillValueF) 28566 28566 basicvardef(anewvar ,dn+'gridarea', "area of the join slice " + newslcvarns[0] + \ 28567 28567 " & " + newslcvarns[1], vu) 28568 anewvar.setncattr('coordinates',' '.join(S rgrid[::-1]))28568 anewvar.setncattr('coordinates',' '.join(Spgrid[::-1])) 28569 28569 28570 28570 pnewvar = onewnc.createVariable(dn+'gridpercen','f',tuple(Spgrid), \ … … 28572 28572 basicvardef(pnewvar ,dn+'gridpercen', "percentages of the " + \ 28573 28573 "grids cells from " + newslcvarns[0] + " laying within " + newslcvarns[1], '1') 28574 pnewvar.setncattr('coordinates',' '.join(S cgrid[::-1]))28574 pnewvar.setncattr('coordinates',' '.join(Spgrid[::-1])) 28575 28575 28576 28576 for jA in range(dyA): … … 28593 28593 # I do not understand why this is needed !! 28594 28594 if aA != gen.mamat[1] and aB != gen.mamat[1]: 28595 anewvar[ jB,iB,jA,iA]= (aA*pA)*(aB*pB)28595 anewvar[iv.jB,iB,jA,iA]= (aA*pA)*(aB*pB) 28596 28596 slicearea = slicearea + (aA*pA)*(aB*pB) 28597 28597 aanewvar[jB,iB,jA,iA]= slicearea … … 28671 28671 aanewvar.setncattr('coordinates',' '.join(Srgrid[::-1])) 28672 28672 28673 anewvar = onewnc.createVariable(dn+'gridarea','f',tuple(S rgrid), \28673 anewvar = onewnc.createVariable(dn+'gridarea','f',tuple(Spgrid), \ 28674 28674 fill_value=gen.fillValueF) 28675 28675 basicvardef(anewvar ,dn+'gridarea', "area of the join slice " + newslcvarns[0] + \ 28676 28676 " & " + newslcvarns[1], vu) 28677 anewvar.setncattr('coordinates',' '.join(S rgrid[::-1]))28677 anewvar.setncattr('coordinates',' '.join(Spgrid[::-1])) 28678 28678 28679 28679 pnewvar = onewnc.createVariable(dn+'gridpercen','f',tuple(Spgrid), \ … … 28681 28681 basicvardef(pnewvar ,dn+'gridpercen', "percentages of the " + \ 28682 28682 "grids cells from " + newslcvarns[0] + " laying within " + newslcvarns[1], '1') 28683 pnewvar.setncattr('coordinates',' '.join(S cgrid[::-1]))28683 pnewvar.setncattr('coordinates',' '.join(Spgrid[::-1])) 28684 28684 28685 28685 for jA in range(dyA): … … 28702 28702 # I do not understand why this is needed !! 28703 28703 if aA != gen.mamat[1] and aB != gen.mamat[1]: 28704 anewvar[ jB,iB,jA,iA]= (aA*pA)*(aB*pB)28704 anewvar[iv,jB,iB,jA,iA]= (aA*pA)*(aB*pB) 28705 28705 slicearea = slicearea + (aA*pA)*(aB*pB) 28706 28706 aanewvar[jB,iB,jA,iA]= slicearea … … 28722 28722 sa = oslicearea[:] 28723 28723 sga = oslicegridarea[:] 28724 sgp = oslicegridpercen[:] 28725 28726 dimsslice = list(oNslice.dimensions) 28727 shapeslice = list(oNslice.shape) 28724 28725 # removing monotones. Fortran only accepts rank <= 7 arrays !! 28726 sN, Ndims = gen.remove_monotones(sN, oNslice.dimensions) 28727 sin, indims = gen.remove_monotones(sin, oslicein.dimensions) 28728 sa, adims = gen.remove_monotones(sa, oslicearea.dimensions) 28729 sga, gadims = gen.remove_monotones(sga, oslicegridarea.dimensions) 28730 28731 # Percentages as the areal fraction of each grid with respect slice size 28732 sgp = sga/sa 28733 28734 ssh = sN.shape 28735 dimsslice = list(Ndims) 28736 shapeslice = list(sN.shape) 28737 28738 sNt = sN.transpose() 28739 sint = sin.transpose() 28740 spt = sgp.transpose() 28728 28741 28729 28742 for varn in varns: … … 28738 28751 vardims = [] 28739 28752 varshape = [] 28753 idd = 0 28740 28754 for dnn in vdimns: 28741 28755 vdimn = dimvars[dnn] … … 28769 28783 if not gen.searchInlist(onewnc.variables,vdimn): add_vars(onc, \ 28770 28784 onewnc, [vdimn]) 28785 idd = idd + 1 28771 28786 28772 28787 newvardims = vardims + dimsslice 28773 28788 newvarshape = varshape + shapeslice 28774 28789 print 'Lluis newvardims:', newvardims, 'newvarshape:', newvarshape 28790 28791 # newvarslice = [] 28792 # for dimn in 28793 28794 onewvars = {} 28775 28795 for statn in statns: 28776 28796 Lstn = Lstatns[statn] 28777 28797 if Ustatns[statn] == 'vu': vvu = vu 28778 28798 else: 28779 if statn == ' stddev': vvu = vu + '2'28799 if statn == 'mean2': vvu = vu + '2' 28780 28800 else: vvu = Ustatns[statn] 28781 28801 newvar= onewnc.createVariable(varn+'sliced'+statn,'f', tuple(newvardims),\ … … 28783 28803 basicvardef(newvar, varn+'sliced'+statn, Lstn + ' ' + varn + \ 28784 28804 ' within slice by '+ dn, vvu) 28805 onewvars[statn] = newvar 28785 28806 onewnc.sync() 28786 28807 28787 28808 # getting all the slices 28788 allslices = gen.provide_slices(dimsslice, shapeslice, dimsslice) 28789 print allslices 28809 #allslices = gen.provide_slices(dimsslice, shapeslice, dimsslice) 28810 #print allslices 28811 28812 varvt = varv.transpose() 28813 28814 print 'Lluis vshape:', vshape, 'sN:', sN.shape 28815 28816 if len(vshape) == 3 and len(sN.shape) == 4: 28817 voutt = fsci.module_scientific.multi_spacewightstats_in3drk3_slc3v4( \ 28818 varin=varvt, ngridsin=sNt, gridsin=sint, percentages=spt, \ 28819 di1=vshape[2], di2=vshape[1], di3=vshape[0], ds1=ssh[3], \ 28820 ds2=ssh[2], ds3=ssh[1], ds4=ssh[0], maxngridsin=sin.shape[1]) 28821 vout = voutt.transpose() 28822 elif len(vshape) == 3 and len(sN.shape) == 3: 28823 voutt = fsci.module_scientific.multi_spacewightstats_in3drk3_slc3v3( \ 28824 varin=varvt, ngridsin=sNt, gridsin=sint, percentages=spt, \ 28825 di1=vshape[2], di2=vshape[1], di3=vshape[0], ds1=ssh[2], \ 28826 ds2=ssh[1], ds3=ssh[0], maxngridsin=sin.shape[1]) 28827 vout = voutt.transpose() 28828 else: 28829 print errormsg 28830 print ' ' + fname + ": variable rank:", len(vshape), 'combined with', \ 28831 ' slice rank:', len(sN.shape), 'not ready!!' 28832 print ' available ones _______' 28833 print ' var_rank: 3 slice_rank: 3' 28834 print ' var_rank: 3 slice_rank: 4' 28835 quit(-1) 28836 28837 print 'Lluis shapes vout:', vout.shape 28838 28839 ist = 0 28840 for statn in statns: 28841 newvar = onewvars[statn] 28842 print 'Lluis stn:', statn, 'shape:', newvar.shape 28843 newvar[:] = vout[ist] 28844 onewnc.sync() 28790 28845 28791 28846 quit()
Note: See TracChangeset
for help on using the changeset viewer.