Changeset 2524 in lmdz_wrf for trunk/tools


Ignore:
Timestamp:
May 9, 2019, 5:29:40 PM (6 years ago)
Author:
lfita
Message:

Adding:

  • `multi_spaceweightstats_in3DRK3_slc2v2': Subroutine to compute an spatial statistics value from a 3D RK matrix using 3rd dimension as running one into a matrix of 2-variables slices of rank 2 using spatial weights
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/module_scientific.f90

    r2522 r2524  
    5353! multi_spaceweightstats_in2DRKno_slc2v2: Subroutine to compute an spatial statistics value from a 2D RK matrix without
    5454!   running one into a matrix of 2-variables slices of rank 2 using spatial weights
     55! multi_spaceweightstats_in3DRK3_slc2v2: Subroutine to compute an spatial statistics value from a 3D RK matrix using
     56!   3rd dimension as running one into a matrix of 2-variables slices of rank 2 using spatial weights
    5557! multi_spaceweightstats_in3DRK3_slc3v3: Subroutine to compute an spatial statistics value from a 3D RK matrix using
    5658!   3rd dimension as running one into a matrix of 3-variables slices of rank 3 using spatial weights
     
    62356237  END SUBROUTINE multi_spaceweightstats_in2DRKno_slc2v2
    62366238
     6239  SUBROUTINE multi_spaceweightstats_in3DRK3_slc2v2(varin, Ngridsin, gridsin, percentages, varout,     &
     6240    di1, di2, di3, ds1, ds2, maxNgridsin)
     6241  ! Subroutine to compute an spatial statistics value from a 3D RK matrix using 3rd dimension as
     6242  !   running one into a matrix of 2-variables slices of rank 2 using spatial weights
     6243
     6244    IMPLICIT NONE
     6245
     6246    INTEGER, INTENT(in)                                  :: di1, di2, di3, ds1, ds2
     6247    INTEGER, INTENT(in)                                  :: maxNgridsin
     6248    INTEGER, DIMENSION(ds1,ds2), INTENT(in)              :: Ngridsin
     6249    INTEGER, DIMENSION(ds1,ds2,maxNgridsin,2),                                                        &
     6250      INTENT(in)                                         :: gridsin
     6251    REAL(r_k), DIMENSION(di1,di2,di3), INTENT(in)        :: varin
     6252    REAL(r_k), INTENT(in),                                                                            &
     6253      DIMENSION(ds1,ds2,maxNgridsin)                     :: percentages
     6254    REAL(r_k), DIMENSION(ds1,ds2,di3,7), INTENT(out)     :: varout
     6255
     6256! Local
     6257    INTEGER                                              :: i1, i2, i3, s1, s2, iv
     6258    INTEGER                                              :: ii3, ss1, ss2
     6259    INTEGER                                              :: Ncounts, Nin
     6260    CHARACTER(len=3)                                     :: val1S, val2S
     6261    CHARACTER(len=30)                                    :: val3S
     6262    REAL(r_k)                                            :: minv, maxv, meanv, mean2v, stdv, medv
     6263    REAL(r_k), DIMENSION(:), ALLOCATABLE                 :: pin
     6264    INTEGER, DIMENSION(:,:), ALLOCATABLE                 :: gin
     6265    REAL(r_k), DIMENSION(:), ALLOCATABLE                 :: svin
     6266    REAL(r_k), DIMENSION(:,:), ALLOCATABLE               :: vin
     6267
     6268!!!!!!! Variables
     6269! di1, di2, di3: length of dimensions of the 3D matrix of values
     6270! ds[1-2]: length of dimensions of matrix with the slices
     6271! maxNgridsin: maximum number of grid points from the 3D matrix in any slice
     6272! varin: 3D RK variable to be used
     6273! Ngridsin: number of grids from 3D RK matrix for each slice
     6274! gridsin: coordinates of grids of the 3D RK matrix B to matrix of slices
     6275! percentages: weights as percentages of space of 3D RK matrix for each slice
     6276!!!!!
     6277! Available spatial statistics to compute inside each slice using values from 3D RK matrix
     6278!   'min': minimum value
     6279!   'max': maximum value
     6280!   'mean': space weighted mean value
     6281!   'mean2': space weighted quadratic mean value
     6282!   'stddev': space weighted standard deviation value
     6283!   'median': median value
     6284!   'count': percentage of the space of matrix A covered by each different value of matrix B
     6285! varout: output statistical variable
     6286
     6287    fname = 'multi_spaceweightstats_in3DRK3_slc2v2'
     6288
     6289    ss1 = 8 + 1
     6290    ss2 = 5 + 1
     6291    ii3 = 1 + 1
     6292
     6293    ! Let's be efficient?
     6294    varout = fillVal64
     6295    DO s1 =1, ds1
     6296      DO s2 =1, ds2
     6297        Nin = Ngridsin(s1,s2)
     6298        ! Computing along d3
     6299        IF (Nin > 1) THEN
     6300          IF (ALLOCATED(gin)) DEALLOCATE(gin)
     6301          ALLOCATE(gin(Nin,2))
     6302          IF (ALLOCATED(pin)) DEALLOCATE(pin)
     6303          ALLOCATE(pin(Nin))
     6304          IF (ALLOCATED(vin)) DEALLOCATE(vin)
     6305          ALLOCATE(vin(Nin,di3))
     6306          IF (ALLOCATED(svin)) DEALLOCATE(svin)
     6307          ALLOCATE(svin(Nin))
     6308          gin = gridsin(s1,s2,1:Nin,:)
     6309          pin = percentages(s1,s2,1:Nin)
     6310
     6311          ! Getting the values
     6312          DO iv=1, Nin
     6313            i1 = gin(iv,1)
     6314            i2 = gin(iv,2)
     6315            vin(iv,:) = varin(i1,i2,:)
     6316          END DO
     6317          DO i3=1, di3
     6318            minv = fillVal64
     6319            maxv = -fillVal64
     6320            meanv = zeroRK
     6321            mean2v = zeroRK
     6322            stdv = zeroRK
     6323            minv = MINVAL(vin(:,i3))
     6324            maxv = MAXVAL(vin(:,i3))
     6325            meanv = SUM(vin(:,i3)*pin)
     6326            mean2v = SUM(vin(:,i3)**2*pin)
     6327            DO iv=1,Nin
     6328              stdv = stdv + ( (meanv - vin(iv,i3))*pin(iv) )**2
     6329            END DO
     6330            stdv = SQRT(stdv)
     6331            svin = vin(:,i3)
     6332            CALL SortR_K(svin, Nin)
     6333            medv = svin(INT(Nin/2))
     6334            varout(s1,s2,i3,1) = minv
     6335            varout(s1,s2,i3,2) = maxv
     6336            varout(s1,s2,i3,3) = meanv
     6337            varout(s1,s2,i3,4) = mean2v
     6338            varout(s1,s2,i3,5) = stdv
     6339            varout(s1,s2,i3,6) = medv
     6340            varout(s1,s2,i3,7) = Nin*1.
     6341          END DO
     6342        ELSE IF (Nin == 1) THEN
     6343          i1 = gridsin(s1,s2,1,1)
     6344          i2 = gridsin(s1,s2,1,2)
     6345          varout(s1,s2,:,1) = varin(i1,i2,:)
     6346          varout(s1,s2,:,2) = varin(i1,i2,:)
     6347          varout(s1,s2,:,3) = varin(i1,i2,:)
     6348          varout(s1,s2,:,4) = varin(i1,i2,:)*varin(i1,i2,:)
     6349          varout(s1,s2,:,5) = zeroRK
     6350          varout(s1,s2,:,6) = varin(i1,i2,:)
     6351          varout(s1,s2,:,7) = Nin*1.
     6352        ELSE
     6353          varout(s1,s2,:,1) = fillval64
     6354          varout(s1,s2,:,2) = fillval64
     6355          varout(s1,s2,:,3) = fillval64
     6356          varout(s1,s2,:,4) = fillval64
     6357          varout(s1,s2,:,5) = fillval64
     6358          varout(s1,s2,:,6) = fillval64
     6359          varout(s1,s2,:,7) = zeroRK
     6360        END IF
     6361      END DO
     6362    END DO
     6363
     6364    IF (ALLOCATED(gin)) DEALLOCATE(gin)
     6365    IF (ALLOCATED(pin)) DEALLOCATE(pin)
     6366    IF (ALLOCATED(vin)) DEALLOCATE(vin)
     6367    IF (ALLOCATED(svin)) DEALLOCATE(svin)
     6368   
     6369    RETURN
     6370
     6371  END SUBROUTINE multi_spaceweightstats_in3DRK3_slc2v2
     6372
    62376373  SUBROUTINE multi_spaceweightstats_in3DRK3_slc3v3(varin, Ngridsin, gridsin, percentages, varout,     &
    62386374    di1, di2, di3, ds1, ds2, ds3, maxNgridsin)
Note: See TracChangeset for help on using the changeset viewer.