[1885] | 1 | MODULE gridsum |
---|
| 2 | !!====================================================================== |
---|
| 3 | !! *** MODULE gridsum *** |
---|
| 4 | !! NEMOVAR: Horizontal sum values |
---|
| 5 | !!====================================================================== |
---|
| 6 | |
---|
| 7 | !!---------------------------------------------------------------------- |
---|
| 8 | !! max_value : Find maximum value of interior points in a 2D/3D field |
---|
| 9 | !! min_value : Find minimum value of interior points in a 2D/3D field |
---|
| 10 | !! global_sum : Compute the global sum of a 2D/3D field |
---|
| 11 | !! global_sum_weig : Compute the global weighted sum of a 2D/3D field |
---|
| 12 | !! zonal_sum : Compute the zonal sum of a 2D field |
---|
| 13 | !!---------------------------------------------------------------------- |
---|
| 14 | !! * Modules used |
---|
| 15 | USE par_kind ! Kind variables |
---|
| 16 | USE dom_oce ! Domain variables |
---|
| 17 | USE lib_mpp ! MPP stuff |
---|
| 18 | USE mppsumtam ! Reproducible sum |
---|
| 19 | USE mpp_tam ! MPP stuff |
---|
| 20 | |
---|
| 21 | IMPLICIT NONE |
---|
| 22 | |
---|
| 23 | !! * Routine accessibility |
---|
| 24 | |
---|
| 25 | PRIVATE |
---|
| 26 | |
---|
| 27 | PUBLIC & |
---|
| 28 | & max_value, & |
---|
| 29 | & min_value, & |
---|
| 30 | & global_sum, & |
---|
| 31 | & global_sum_weig, & |
---|
| 32 | & zonal_sum |
---|
| 33 | |
---|
| 34 | !! * Interfaces |
---|
| 35 | |
---|
| 36 | INTERFACE max_value |
---|
| 37 | MODULE PROCEDURE max_value_2d |
---|
| 38 | MODULE PROCEDURE max_value_3d |
---|
| 39 | END INTERFACE |
---|
| 40 | |
---|
| 41 | INTERFACE min_value |
---|
| 42 | MODULE PROCEDURE min_value_2d |
---|
| 43 | MODULE PROCEDURE min_value_3d |
---|
| 44 | END INTERFACE |
---|
| 45 | |
---|
| 46 | INTERFACE global_sum |
---|
| 47 | MODULE PROCEDURE global_sum_2d |
---|
| 48 | MODULE PROCEDURE global_sum_3d |
---|
| 49 | END INTERFACE |
---|
| 50 | |
---|
| 51 | INTERFACE global_sum_weig |
---|
| 52 | MODULE PROCEDURE global_sum_weig_2d |
---|
| 53 | MODULE PROCEDURE global_sum_weig_3d |
---|
| 54 | END INTERFACE |
---|
| 55 | |
---|
| 56 | CONTAINS |
---|
| 57 | |
---|
| 58 | FUNCTION max_value_2d( pfld ) |
---|
| 59 | !!---------------------------------------------------------------------- |
---|
| 60 | !! *** ROUTINE max_value_2d *** |
---|
| 61 | !! |
---|
| 62 | !! ** Purpose : Find the global maximum of pfld |
---|
| 63 | !! |
---|
| 64 | !! ** Method : Call the mpp_max routine, The result is |
---|
| 65 | !! available on all processors |
---|
| 66 | !! |
---|
| 67 | !! ** Action : |
---|
| 68 | !! |
---|
| 69 | !! References : |
---|
| 70 | !! |
---|
| 71 | !! History : |
---|
| 72 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 73 | !!---------------------------------------------------------------------- |
---|
| 74 | !! * Function return |
---|
| 75 | REAL(wp) :: max_value_2d |
---|
| 76 | !! * Arguments |
---|
| 77 | REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: & |
---|
| 78 | & pfld ! Field to be averaged |
---|
| 79 | !! * Local declarations |
---|
| 80 | real(wp) :: & |
---|
| 81 | & ztmp |
---|
| 82 | |
---|
| 83 | ! Get max with mpp_max |
---|
| 84 | |
---|
| 85 | ztmp = MAXVAL( pfld(nldi:nlei,nldj:nlej) ) |
---|
| 86 | IF( lk_mpp ) CALL mpp_max( ztmp ) |
---|
| 87 | max_value_2d = ztmp |
---|
| 88 | |
---|
| 89 | END FUNCTION max_value_2d |
---|
| 90 | |
---|
| 91 | FUNCTION max_value_3d( pfld ) |
---|
| 92 | !!---------------------------------------------------------------------- |
---|
| 93 | !! *** ROUTINE max_value_3d *** |
---|
| 94 | !! |
---|
| 95 | !! ** Purpose : Find the global maximum of pfld |
---|
| 96 | !! |
---|
| 97 | !! ** Method : Call the mpp_max routine, The result is |
---|
| 98 | !! available on all processors |
---|
| 99 | !! |
---|
| 100 | !! ** Action : |
---|
| 101 | !! |
---|
| 102 | !! References : |
---|
| 103 | !! |
---|
| 104 | !! History : |
---|
| 105 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 106 | !!---------------------------------------------------------------------- |
---|
| 107 | !! * Function return |
---|
| 108 | REAL(wp) :: max_value_3d |
---|
| 109 | !! * Arguments |
---|
| 110 | REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: & |
---|
| 111 | & pfld ! Field to be averaged |
---|
| 112 | !! * Local declarations |
---|
| 113 | real(wp) :: & |
---|
| 114 | & ztmp |
---|
| 115 | |
---|
| 116 | ! Get max with mpp_max |
---|
| 117 | |
---|
| 118 | ztmp = MAXVAL( pfld(nldi:nlei,nldj:nlej,:) ) |
---|
| 119 | IF( lk_mpp ) CALL mpp_max( ztmp ) |
---|
| 120 | max_value_3d = ztmp |
---|
| 121 | |
---|
| 122 | END FUNCTION max_value_3d |
---|
| 123 | |
---|
| 124 | FUNCTION min_value_2d( pfld ) |
---|
| 125 | !!---------------------------------------------------------------------- |
---|
| 126 | !! *** ROUTINE min_value_2d *** |
---|
| 127 | !! |
---|
| 128 | !! ** Purpose : Find the global minimum of pfld |
---|
| 129 | !! |
---|
| 130 | !! ** Method : Call the mpp_min routine, The result is |
---|
| 131 | !! available on all processors |
---|
| 132 | !! |
---|
| 133 | !! ** Action : |
---|
| 134 | !! |
---|
| 135 | !! References : |
---|
| 136 | !! |
---|
| 137 | !! History : |
---|
| 138 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 139 | !!---------------------------------------------------------------------- |
---|
| 140 | !! * Function return |
---|
| 141 | REAL(wp) :: min_value_2d |
---|
| 142 | !! * Arguments |
---|
| 143 | REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: & |
---|
| 144 | & pfld ! Field to be averaged |
---|
| 145 | !! * Local declarations |
---|
| 146 | real(wp) :: & |
---|
| 147 | & ztmp |
---|
| 148 | |
---|
| 149 | ! Get min with mpp_min |
---|
| 150 | |
---|
| 151 | ztmp = MINVAL( pfld(nldi:nlei,nldj:nlej) ) |
---|
| 152 | IF( lk_mpp ) CALL mpp_min( ztmp ) |
---|
| 153 | min_value_2d = ztmp |
---|
| 154 | |
---|
| 155 | END FUNCTION min_value_2d |
---|
| 156 | |
---|
| 157 | FUNCTION min_value_3d( pfld ) |
---|
| 158 | !!---------------------------------------------------------------------- |
---|
| 159 | !! *** ROUTINE min_value_3d *** |
---|
| 160 | !! |
---|
| 161 | !! ** Purpose : Find the global minimum of pfld |
---|
| 162 | !! |
---|
| 163 | !! ** Method : Call the mpp_min_real routine, The result is |
---|
| 164 | !! available on all processors |
---|
| 165 | !! |
---|
| 166 | !! ** Action : |
---|
| 167 | !! |
---|
| 168 | !! References : |
---|
| 169 | !! |
---|
| 170 | !! History : |
---|
| 171 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 172 | !!---------------------------------------------------------------------- |
---|
| 173 | !! * Function return |
---|
| 174 | REAL(wp) :: min_value_3d |
---|
| 175 | !! * Arguments |
---|
| 176 | REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: & |
---|
| 177 | & pfld ! Field to be averaged |
---|
| 178 | !! * Local declarations |
---|
| 179 | real(wp) :: & |
---|
| 180 | & ztmp |
---|
| 181 | |
---|
| 182 | ! Get min with mpp_min |
---|
| 183 | |
---|
| 184 | ztmp = MINVAL(pfld(nldi:nlei,nldj:nlej,:)) |
---|
| 185 | IF( lk_mpp ) CALL mpp_min( ztmp ) |
---|
| 186 | min_value_3d = ztmp |
---|
| 187 | |
---|
| 188 | END FUNCTION min_value_3d |
---|
| 189 | |
---|
| 190 | FUNCTION global_sum_2d( pfld ) |
---|
| 191 | !!---------------------------------------------------------------------- |
---|
| 192 | !! *** ROUTINE global_sum_2d *** |
---|
| 193 | !! |
---|
| 194 | !! ** Purpose : Compute the global sum of pfld |
---|
| 195 | !! |
---|
| 196 | !! ** Method : Call the mppsum routine, The result is available |
---|
| 197 | !! on all processors |
---|
| 198 | !! |
---|
| 199 | !! ** Action : |
---|
| 200 | !! |
---|
| 201 | !! References : |
---|
| 202 | !! |
---|
| 203 | !! History : |
---|
| 204 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 205 | !!---------------------------------------------------------------------- |
---|
| 206 | !! * Function return |
---|
| 207 | REAL(wp) :: global_sum_2d |
---|
| 208 | !! * Arguments |
---|
| 209 | REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: & |
---|
| 210 | & pfld ! Field to be averaged |
---|
| 211 | !! * Local declarations |
---|
| 212 | |
---|
| 213 | ! Compute sum using the mppsum module |
---|
| 214 | |
---|
| 215 | global_sum_2d = mpp_sum_inter( PACK( pfld(nldi:nlei,nldj:nlej), .TRUE. ), & |
---|
| 216 | & ( nlei - nldi + 1 ) * ( nlej - nldj + 1 ) ) |
---|
| 217 | |
---|
| 218 | END FUNCTION global_sum_2d |
---|
| 219 | |
---|
| 220 | FUNCTION global_sum_3d( pfld ) |
---|
| 221 | !!---------------------------------------------------------------------- |
---|
| 222 | !! *** ROUTINE global_sum_3d *** |
---|
| 223 | !! |
---|
| 224 | !! ** Purpose : Compute the global sum of pfld |
---|
| 225 | !! |
---|
| 226 | !! ** Method : Call the mppsum routine, The result is available |
---|
| 227 | !! on all processors |
---|
| 228 | !! |
---|
| 229 | !! ** Action : |
---|
| 230 | !! |
---|
| 231 | !! References : |
---|
| 232 | !! |
---|
| 233 | !! History : |
---|
| 234 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 235 | !!---------------------------------------------------------------------- |
---|
| 236 | !! * Function return |
---|
| 237 | REAL(wp) :: global_sum_3d |
---|
| 238 | !! * Arguments |
---|
| 239 | REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: & |
---|
| 240 | & pfld ! Field to be averaged |
---|
| 241 | !! * Local declarations |
---|
| 242 | |
---|
| 243 | ! Compute sum using the mppsum module |
---|
| 244 | |
---|
| 245 | global_sum_3d = mpp_sum_inter( PACK( pfld(nldi:nlei,nldj:nlej,1:jpk), .TRUE. ), & |
---|
| 246 | & ( nlei - nldi + 1 ) * ( nlej - nldj + 1 ) * jpk ) |
---|
| 247 | |
---|
| 248 | END FUNCTION global_sum_3d |
---|
| 249 | |
---|
| 250 | FUNCTION global_sum_weig_2d( pfld, pweig ) |
---|
| 251 | !!---------------------------------------------------------------------- |
---|
| 252 | !! *** ROUTINE global_sum_weig_2d *** |
---|
| 253 | !! |
---|
| 254 | !! ** Purpose : Compute the global sum of pfld weighted by pweig |
---|
| 255 | !! |
---|
| 256 | !! ** Method : Call the mppsum routine, The result is available |
---|
| 257 | !! on all processors |
---|
| 258 | !! |
---|
| 259 | !! ** Action : |
---|
| 260 | !! |
---|
| 261 | !! References : |
---|
| 262 | !! |
---|
| 263 | !! History : |
---|
| 264 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 265 | !!---------------------------------------------------------------------- |
---|
| 266 | !! * Function return |
---|
| 267 | REAL(wp) :: global_sum_weig_2d |
---|
| 268 | !! * Arguments |
---|
| 269 | REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: & |
---|
| 270 | & pfld, & ! Field to be averaged |
---|
| 271 | & pweig |
---|
| 272 | !! * Local declarations |
---|
| 273 | REAL(wp), DIMENSION(jpi,jpj) :: & |
---|
| 274 | & zwrk |
---|
| 275 | |
---|
| 276 | ! Apply wieghts |
---|
| 277 | |
---|
| 278 | zwrk(:,:) = pfld(:,:) * pweig(:,:) |
---|
| 279 | |
---|
| 280 | ! Compute sum using the mppsum module |
---|
| 281 | |
---|
| 282 | global_sum_weig_2d = mpp_sum_inter( PACK( zwrk(nldi:nlei,nldj:nlej), & |
---|
| 283 | & .TRUE. ), & |
---|
| 284 | & ( nlei - nldi + 1 ) * & |
---|
| 285 | & ( nlej - nldj + 1 ) ) |
---|
| 286 | |
---|
| 287 | END FUNCTION global_sum_weig_2d |
---|
| 288 | |
---|
| 289 | FUNCTION global_sum_weig_3d( pfld, pweig ) |
---|
| 290 | !!---------------------------------------------------------------------- |
---|
| 291 | !! *** ROUTINE global_sum_weig_2d *** |
---|
| 292 | !! |
---|
| 293 | !! ** Purpose : Compute the global sum of pfld weighted by pweig |
---|
| 294 | !! |
---|
| 295 | !! ** Method : Call the mppsum routine, The result is available |
---|
| 296 | !! on all processors |
---|
| 297 | !! |
---|
| 298 | !! ** Action : |
---|
| 299 | !! |
---|
| 300 | !! References : |
---|
| 301 | !! |
---|
| 302 | !! History : |
---|
| 303 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 304 | !!---------------------------------------------------------------------- |
---|
| 305 | !! * Function return |
---|
| 306 | REAL(wp) :: global_sum_weig_3d |
---|
| 307 | !! * Arguments |
---|
| 308 | REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: & |
---|
| 309 | & pfld, & ! Field to be averaged |
---|
| 310 | & pweig |
---|
| 311 | !! * Local declarations |
---|
| 312 | REAL(wp), DIMENSION(jpi,jpj,jpk) :: & |
---|
| 313 | & zwrk |
---|
| 314 | |
---|
| 315 | ! Apply wieghts |
---|
| 316 | |
---|
| 317 | zwrk(:,:,:) = pfld(:,:,:) * pweig(:,:,:) |
---|
| 318 | |
---|
| 319 | ! Compute sum using the mppsum module |
---|
| 320 | |
---|
| 321 | global_sum_weig_3d = mpp_sum_inter( PACK( zwrk(nldi:nlei,nldj:nlej,1:jpk), & |
---|
| 322 | & .TRUE. ), & |
---|
| 323 | & ( nlei - nldi + 1 ) * & |
---|
| 324 | & ( nlej - nldj + 1 ) * jpk ) |
---|
| 325 | |
---|
| 326 | END FUNCTION global_sum_weig_3d |
---|
| 327 | |
---|
| 328 | SUBROUTINE zonal_sum( pfld, pweig, pout ) |
---|
| 329 | !!---------------------------------------------------------------------- |
---|
| 330 | !! *** ROUTINE zonal_sum *** |
---|
| 331 | !! |
---|
| 332 | !! ** Purpose : Compute the zonal sum of pfld weighted by pweig |
---|
| 333 | !! |
---|
| 334 | !! ** Method : Put local data unto a global grid and call the |
---|
| 335 | !! mppsum routine for all latitudes. |
---|
| 336 | !! |
---|
| 337 | !! This should be done in a more optimum way !!! |
---|
| 338 | !! |
---|
| 339 | !! The result is available on all processors |
---|
| 340 | !! |
---|
| 341 | !! ** Action : |
---|
| 342 | !! |
---|
| 343 | !! References : |
---|
| 344 | !! |
---|
| 345 | !! History : |
---|
| 346 | !! ! 07-07 (K. Mogensen) Original code |
---|
| 347 | !!---------------------------------------------------------------------- |
---|
| 348 | !! * Arguments |
---|
| 349 | REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: & |
---|
| 350 | & pfld, & ! Field to be averaged |
---|
| 351 | & pweig |
---|
| 352 | REAL(wp), DIMENSION(jpjglo), INTENT(OUT) :: & |
---|
| 353 | & pout |
---|
| 354 | !! * Local declarations |
---|
| 355 | REAL(wp), DIMENSION(:,:), ALLOCATABLE :: & |
---|
| 356 | & zwrk |
---|
| 357 | INTEGER :: & |
---|
| 358 | & ji, & |
---|
| 359 | & jj, & |
---|
| 360 | & ii, & |
---|
| 361 | & ij |
---|
| 362 | |
---|
| 363 | |
---|
| 364 | |
---|
| 365 | ! Allocate and fill global array with local input data |
---|
| 366 | |
---|
| 367 | ALLOCATE( & |
---|
| 368 | & zwrk(jpiglo,jpjglo) & |
---|
| 369 | & ) |
---|
| 370 | |
---|
| 371 | zwrk(:,:) = 0.0 |
---|
| 372 | |
---|
| 373 | DO jj = nldj, nlej |
---|
| 374 | |
---|
| 375 | ij = mjg(jj) |
---|
| 376 | |
---|
| 377 | DO ji = nldi, nlei |
---|
| 378 | |
---|
| 379 | ii = mig(ji) |
---|
| 380 | |
---|
| 381 | zwrk(ii,ij) = pfld(ji,jj) * pweig(ji,jj) |
---|
| 382 | |
---|
| 383 | ENDDO |
---|
| 384 | |
---|
| 385 | ENDDO |
---|
| 386 | |
---|
| 387 | ! Sum individual latitudes |
---|
| 388 | |
---|
| 389 | DO jj = 1, jpjglo |
---|
| 390 | |
---|
| 391 | |
---|
| 392 | pout(jj) = mpp_sum_inter( zwrk(:,jj), jpiglo ) |
---|
| 393 | |
---|
| 394 | ENDDO |
---|
| 395 | |
---|
| 396 | ! Deallocate the work array |
---|
| 397 | |
---|
| 398 | DEALLOCATE(zwrk) |
---|
| 399 | |
---|
| 400 | END SUBROUTINE zonal_sum |
---|
| 401 | |
---|
| 402 | END MODULE gridsum |
---|
| 403 | |
---|