Changeset 2351 in lmdz_wrf for trunk/tools


Ignore:
Timestamp:
Feb 19, 2019, 5:47:15 PM (6 years ago)
Author:
lfita
Message:

Adding:

  • `multi_spaceweightstats_in4DRK3_4_slc3v3': Subroutine to compute an spatial statistics value from a 4D RK matrix using 3rd and 4th dimensions as running ones into a matrix of 3-variables slices of rank 3 using spatial weights
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/module_scientific.f90

    r2345 r2351  
    5252! multi_spaceweightstats_in3DRK3_slc3v4: Subroutine to compute an spatial statistics value from a 3D RK matrix using
    5353!   3rd dimension as running one into a matrix of 3-variables slices of rank 4 using spatial weights
     54! multi_spaceweightstats_in4DRK3_4_slc3v3: Subroutine to compute an spatial statistics value from a 4D RK matrix using
     55!   3rd and 4th dimensions as running ones into a matrix of 3-variables slices of rank 3 using spatial weights
    5456! NcountR: Subroutine to count real values
    5557! paths_border: Subroutine to search the paths of a border field.
     
    61716173  END SUBROUTINE multi_spaceweightstats_in3DRK3_slc3v3
    61726174
     6175  SUBROUTINE multi_spaceweightstats_in4DRK3_4_slc3v3(varin, Ngridsin, gridsin, percentages, varout,   &
     6176    di1, di2, di3, di4, ds1, ds2, ds3, maxNgridsin)
     6177  ! Subroutine to compute an spatial statistics value from a 4D RK matrix using 3rd and 4th dimensions
     6178  !   as running ones into a matrix of 3-variables slices of rank 3 using spatial weights
     6179
     6180    IMPLICIT NONE
     6181
     6182    INTEGER, INTENT(in)                                  :: di1, di2, di3, di4, ds1, ds2, ds3
     6183    INTEGER, INTENT(in)                                  :: maxNgridsin
     6184    INTEGER, DIMENSION(ds1,ds2,ds3), INTENT(in)          :: Ngridsin
     6185    INTEGER, DIMENSION(ds1,ds2,ds3,maxNgridsin,2),                                                    &
     6186      INTENT(in)                                         :: gridsin
     6187    REAL(r_k), DIMENSION(di1,di2,di3,di4), INTENT(in)    :: varin
     6188    REAL(r_k), INTENT(in),                                                                            &
     6189      DIMENSION(ds1,ds2,ds3,maxNgridsin)                 :: percentages
     6190    REAL(r_k), DIMENSION(ds1,ds2,ds3,di3,di4,7),                                                      &
     6191      INTENT(out)                                        :: varout
     6192
     6193! Local
     6194    INTEGER                                              :: i1, i2, i3, i4, s1, s2, s3, iv
     6195    INTEGER                                              :: ii3, ss1, ss2, ss3
     6196    INTEGER                                              :: Ncounts, Nin
     6197    CHARACTER(len=3)                                     :: val1S, val2S
     6198    CHARACTER(len=30)                                    :: val3S
     6199    REAL(r_k)                                            :: minv, maxv, meanv, mean2v, stdv, medv
     6200    REAL(r_k), DIMENSION(:), ALLOCATABLE                 :: pin
     6201    INTEGER, DIMENSION(:,:), ALLOCATABLE                 :: gin
     6202    REAL(r_k), DIMENSION(:), ALLOCATABLE                 :: svin
     6203    REAL(r_k), DIMENSION(:,:,:), ALLOCATABLE             :: vin
     6204
     6205!!!!!!! Variables
     6206! di1, di2, di3, di4: length of dimensions of the 4D matrix of values
     6207! ds[1-3]: length of dimensions of matrix with the slices
     6208! maxNgridsin: maximum number of grid points from the 3D matrix in any slice
     6209! varin: 3D RK variable to be used
     6210! Ngridsin: number of grids from 3D RK matrix for each slice
     6211! gridsin: coordinates of grids of the 3D RK matrix B to matrix of slices
     6212! percentages: weights as percentages of space of 3D RK matrix for each slice
     6213!!!!!
     6214! Available spatial statistics to compute inside each slice using values from 3D RK matrix
     6215!   'min': minimum value
     6216!   'max': maximum value
     6217!   'mean': space weighted mean value
     6218!   'mean2': space weighted quadratic mean value
     6219!   'stddev': space weighted standard deviation value
     6220!   'median': median value
     6221!   'count': percentage of the space of matrix A covered by each different value of matrix B
     6222! varout: output statistical variable
     6223
     6224    fname = 'multi_spaceweightstats_in4DRK3_4_slc3v3'
     6225
     6226    varout = fillval64
     6227
     6228    ! Let's be efficient?
     6229    varout = fillVal64
     6230    DO s1 =1, ds1
     6231      DO s2 =1, ds2
     6232        DO s3 =1, ds3
     6233          Nin = Ngridsin(s1,s2,s3)
     6234          ! Computing along d3 and d4
     6235          IF (Nin > 1) THEN
     6236            IF (ALLOCATED(gin)) DEALLOCATE(gin)
     6237            ALLOCATE(gin(Nin,2))
     6238            IF (ALLOCATED(pin)) DEALLOCATE(pin)
     6239            ALLOCATE(pin(Nin))
     6240            IF (ALLOCATED(vin)) DEALLOCATE(vin)
     6241            ALLOCATE(vin(Nin,di3,di4))
     6242            IF (ALLOCATED(svin)) DEALLOCATE(svin)
     6243            ALLOCATE(svin(Nin))
     6244            gin = gridsin(s1,s2,s3,1:Nin,:)
     6245            pin = percentages(s1,s2,s3,1:Nin)
     6246
     6247            ! Getting the values
     6248            DO iv=1, Nin
     6249              i1 = gin(iv,1)
     6250              i2 = gin(iv,2)
     6251              vin(iv,:,:) = varin(i1,i2,:,:)
     6252            END DO
     6253            DO i3=1, di3
     6254              DO i4=1, di4
     6255                minv = fillVal64
     6256                maxv = -fillVal64
     6257                meanv = zeroRK
     6258                mean2v = zeroRK
     6259                stdv = zeroRK
     6260                minv = MINVAL(vin(:,i3,i4))
     6261                maxv = MAXVAL(vin(:,i3,i4))
     6262                meanv = SUM(vin(:,i3,i4)*pin)
     6263                mean2v = SUM(vin(:,i3,i4)**2*pin)
     6264                DO iv=1,Nin
     6265                  stdv = stdv + ( (meanv - vin(iv,i3,i4))*pin(iv) )**2
     6266                END DO
     6267                stdv = SQRT(stdv)
     6268                svin = vin(:,i3,i4)
     6269                CALL SortR_K(svin, Nin)
     6270                medv = svin(INT(Nin/2))
     6271                varout(s1,s2,s3,i3,i4,1) = minv
     6272                varout(s1,s2,s3,i3,i4,2) = maxv
     6273                varout(s1,s2,s3,i3,i4,3) = meanv
     6274                varout(s1,s2,s3,i3,i4,4) = mean2v
     6275                varout(s1,s2,s3,i3,i4,5) = stdv
     6276                varout(s1,s2,s3,i3,i4,6) = medv
     6277                varout(s1,s2,s3,i3,i4,7) = Nin*1.
     6278              END DO
     6279            END DO
     6280          ELSE IF (Nin == 1) THEN
     6281            i1 = gridsin(s1,s2,s3,1,1)
     6282            i2 = gridsin(s1,s2,s3,1,2)
     6283            varout(s1,s2,s3,:,:,1) = varin(i1,i2,:,:)
     6284            varout(s1,s2,s3,:,:,2) = varin(i1,i2,:,:)
     6285            varout(s1,s2,s3,:,:,3) = varin(i1,i2,:,:)
     6286            varout(s1,s2,s3,:,:,4) = varin(i1,i2,:,:)*varin(i1,i2,:,:)
     6287            varout(s1,s2,s3,:,:,5) = zeroRK
     6288            varout(s1,s2,s3,:,:,6) = varin(i1,i2,:,:)
     6289            varout(s1,s2,s3,:,:,7) = Nin*1.
     6290          ELSE
     6291            varout(s1,s2,s3,:,:,1) = fillval64
     6292            varout(s1,s2,s3,:,:,2) = fillval64
     6293            varout(s1,s2,s3,:,:,3) = fillval64
     6294            varout(s1,s2,s3,:,:,4) = fillval64
     6295            varout(s1,s2,s3,:,:,5) = fillval64
     6296            varout(s1,s2,s3,:,:,6) = fillval64
     6297            varout(s1,s2,s3,:,:,7) = zeroRK
     6298          END IF
     6299        END DO
     6300      END DO
     6301    END DO
     6302
     6303    IF (ALLOCATED(gin)) DEALLOCATE(gin)
     6304    IF (ALLOCATED(pin)) DEALLOCATE(pin)
     6305    IF (ALLOCATED(vin)) DEALLOCATE(vin)
     6306    IF (ALLOCATED(svin)) DEALLOCATE(svin)
     6307   
     6308    RETURN
     6309
     6310  END SUBROUTINE multi_spaceweightstats_in4DRK3_4_slc3v3
     6311
    61736312  SUBROUTINE multi_spaceweightstats_in3DRK3_slc3v4(varin, Ngridsin, gridsin, percentages, varout,     &
    61746313    di1, di2, di3, ds1, ds2, ds3, ds4, maxNgridsin)
Note: See TracChangeset for help on using the changeset viewer.