Changeset 2351 in lmdz_wrf for trunk/tools
- Timestamp:
- Feb 19, 2019, 5:47:15 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/module_scientific.f90
r2345 r2351 52 52 ! multi_spaceweightstats_in3DRK3_slc3v4: Subroutine to compute an spatial statistics value from a 3D RK matrix using 53 53 ! 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 54 56 ! NcountR: Subroutine to count real values 55 57 ! paths_border: Subroutine to search the paths of a border field. … … 6171 6173 END SUBROUTINE multi_spaceweightstats_in3DRK3_slc3v3 6172 6174 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 6173 6312 SUBROUTINE multi_spaceweightstats_in3DRK3_slc3v4(varin, Ngridsin, gridsin, percentages, varout, & 6174 6313 di1, di2, di3, ds1, ds2, ds3, ds4, maxNgridsin)
Note: See TracChangeset
for help on using the changeset viewer.