Changeset 2524 in lmdz_wrf for trunk/tools
- Timestamp:
- May 9, 2019, 5:29:40 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/module_scientific.f90
r2522 r2524 53 53 ! multi_spaceweightstats_in2DRKno_slc2v2: Subroutine to compute an spatial statistics value from a 2D RK matrix without 54 54 ! 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 55 57 ! multi_spaceweightstats_in3DRK3_slc3v3: Subroutine to compute an spatial statistics value from a 3D RK matrix using 56 58 ! 3rd dimension as running one into a matrix of 3-variables slices of rank 3 using spatial weights … … 6235 6237 END SUBROUTINE multi_spaceweightstats_in2DRKno_slc2v2 6236 6238 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 6237 6373 SUBROUTINE multi_spaceweightstats_in3DRK3_slc3v3(varin, Ngridsin, gridsin, percentages, varout, & 6238 6374 di1, di2, di3, ds1, ds2, ds3, maxNgridsin)
Note: See TracChangeset
for help on using the changeset viewer.