| 1 | SUBROUTINE ana_grid (ng, tile, model)
|
|---|
| 2 | !
|
|---|
| 3 | !! svn $Id: ana_grid.h 34 2007-04-27 04:40:21Z arango $
|
|---|
| 4 | !!======================================================================
|
|---|
| 5 | !! Copyright (c) 2002-2007 The ROMS/TOMS Group !
|
|---|
| 6 | !! Licensed under a MIT/X style license !
|
|---|
| 7 | !! See License_ROMS.txt !
|
|---|
| 8 | !! !
|
|---|
| 9 | !=======================================================================
|
|---|
| 10 | ! !
|
|---|
| 11 | ! This routine sets model grid using an analytical expressions. !
|
|---|
| 12 | ! !
|
|---|
| 13 | ! On Output: stored in common blocks: !
|
|---|
| 14 | ! !
|
|---|
| 15 | ! "grid" (file grid.h) !
|
|---|
| 16 | ! "scalars" (file scalar.h) !
|
|---|
| 17 | ! !
|
|---|
| 18 | ! el Length (m) of domain box in the ETA-direction. !
|
|---|
| 19 | ! f Coriolis parameter (1/seconds) at RHO-points. !
|
|---|
| 20 | ! h Bathymetry (meters; positive) at RHO-points. !
|
|---|
| 21 | ! hmin Minimum depth of bathymetry (m). !
|
|---|
| 22 | ! hmax Maximum depth of bathymetry (m). !
|
|---|
| 23 | ! pm Coordinate transformation metric "m" (1/meters) !
|
|---|
| 24 | ! associated with the differential distances in XI !
|
|---|
| 25 | ! at RHO-points. !
|
|---|
| 26 | ! pn Coordinate transformation metric "n" (1/meters) !
|
|---|
| 27 | ! associated with the differential distances in ETA. !
|
|---|
| 28 | ! at RHO-points. !
|
|---|
| 29 | ! xl Length (m) of domain box in the XI-direction. !
|
|---|
| 30 | ! xp XI-coordinates (m) at PSI-points. !
|
|---|
| 31 | ! xr XI-coordinates (m) at RHO-points. !
|
|---|
| 32 | ! yp ETA-coordinates (m) at PSI-points. !
|
|---|
| 33 | ! yr ETA-coordinates (m) at RHO-points. !
|
|---|
| 34 | ! !
|
|---|
| 35 | !=======================================================================
|
|---|
| 36 | !
|
|---|
| 37 | USE mod_param
|
|---|
| 38 | USE mod_grid
|
|---|
| 39 | USE mod_ncparam
|
|---|
| 40 | !
|
|---|
| 41 | ! Imported variable declarations.
|
|---|
| 42 | !
|
|---|
| 43 | integer, intent(in) :: ng, tile, model
|
|---|
| 44 |
|
|---|
| 45 | #include "tile.h"
|
|---|
| 46 | !
|
|---|
| 47 | CALL ana_grid_tile (ng, model, Istr, Iend, Jstr, Jend, &
|
|---|
| 48 | & LBi, UBi, LBj, UBj, &
|
|---|
| 49 | & GRID(ng) % angler, &
|
|---|
| 50 | #if defined CURVGRID && defined UV_ADV
|
|---|
| 51 | & GRID(ng) % dmde, &
|
|---|
| 52 | & GRID(ng) % dndx, &
|
|---|
| 53 | #endif
|
|---|
| 54 | #ifdef ICESHELF
|
|---|
| 55 | & GRID(ng) % zice, &
|
|---|
| 56 | #endif
|
|---|
| 57 | #ifdef SPHERICAL
|
|---|
| 58 | & GRID(ng) % lonp, &
|
|---|
| 59 | & GRID(ng) % lonr, &
|
|---|
| 60 | & GRID(ng) % lonu, &
|
|---|
| 61 | & GRID(ng) % lonv, &
|
|---|
| 62 | & GRID(ng) % latp, &
|
|---|
| 63 | & GRID(ng) % latr, &
|
|---|
| 64 | & GRID(ng) % latu, &
|
|---|
| 65 | & GRID(ng) % latv, &
|
|---|
| 66 | #else
|
|---|
| 67 | & GRID(ng) % xp, &
|
|---|
| 68 | & GRID(ng) % xr, &
|
|---|
| 69 | & GRID(ng) % xu, &
|
|---|
| 70 | & GRID(ng) % xv, &
|
|---|
| 71 | & GRID(ng) % yp, &
|
|---|
| 72 | & GRID(ng) % yr, &
|
|---|
| 73 | & GRID(ng) % yu, &
|
|---|
| 74 | & GRID(ng) % yv, &
|
|---|
| 75 | #endif
|
|---|
| 76 | & GRID(ng) % pn, &
|
|---|
| 77 | & GRID(ng) % pm, &
|
|---|
| 78 | & GRID(ng) % f, &
|
|---|
| 79 | & GRID(ng) % h)
|
|---|
| 80 | !
|
|---|
| 81 | ! Set analytical header file name used.
|
|---|
| 82 | !
|
|---|
| 83 | IF (Lanafile) THEN
|
|---|
| 84 | ANANAME( 7)='ROMS/Functionals/ana_grid.h'
|
|---|
| 85 | END IF
|
|---|
| 86 |
|
|---|
| 87 | RETURN
|
|---|
| 88 | END SUBROUTINE ana_grid
|
|---|
| 89 | !
|
|---|
| 90 | !***********************************************************************
|
|---|
| 91 | SUBROUTINE ana_grid_tile (ng, model, Istr, Iend, Jstr, Jend, &
|
|---|
| 92 | & LBi, UBi, LBj, UBj, &
|
|---|
| 93 | & angler, &
|
|---|
| 94 | #if defined CURVGRID && defined UV_ADV
|
|---|
| 95 | & dmde, dndx, &
|
|---|
| 96 | #endif
|
|---|
| 97 | #ifdef ICESHELF
|
|---|
| 98 | & zice, &
|
|---|
| 99 | #endif
|
|---|
| 100 | #ifdef SPHERICAL
|
|---|
| 101 | & lonp, lonr, lonu, lonv, &
|
|---|
| 102 | & latp, latr, latu, latv, &
|
|---|
| 103 | #else
|
|---|
| 104 | & xp, xr, xu, xv, &
|
|---|
| 105 | & yp, yr, yu, yv, &
|
|---|
| 106 | #endif
|
|---|
| 107 | & pn, pm, f, h)
|
|---|
| 108 | !***********************************************************************
|
|---|
| 109 | !
|
|---|
| 110 | USE mod_param
|
|---|
| 111 | USE mod_parallel
|
|---|
| 112 | USE mod_scalars
|
|---|
| 113 | !
|
|---|
| 114 | #ifdef DISTRIBUTE
|
|---|
| 115 | USE distribute_mod, ONLY : mp_reduce
|
|---|
| 116 | #endif
|
|---|
| 117 | #if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 118 | USE exchange_2d_mod, ONLY : exchange_r2d_tile
|
|---|
| 119 | #endif
|
|---|
| 120 | #ifdef DISTRIBUTE
|
|---|
| 121 | USE mp_exchange_mod, ONLY : mp_exchange2d
|
|---|
| 122 | #endif
|
|---|
| 123 | !
|
|---|
| 124 | ! Imported variable declarations.
|
|---|
| 125 | !
|
|---|
| 126 | integer, intent(in) :: ng, model, Iend, Istr, Jend, Jstr
|
|---|
| 127 | integer, intent(in) :: LBi, UBi, LBj, UBj
|
|---|
| 128 | !
|
|---|
| 129 | #ifdef ASSUMED_SHAPE
|
|---|
| 130 | real(r8), intent(out) :: angler(LBi:,LBj:)
|
|---|
| 131 | # if defined CURVGRID && defined UV_ADV
|
|---|
| 132 | real(r8), intent(out) :: dmde(LBi:,LBj:)
|
|---|
| 133 | real(r8), intent(out) :: dndx(LBi:,LBj:)
|
|---|
| 134 | # endif
|
|---|
| 135 | # ifdef ICESHELF
|
|---|
| 136 | real(r8), intent(out) :: zice(LBi:,LBj:)
|
|---|
| 137 | # endif
|
|---|
| 138 | # ifdef SPHERICAL
|
|---|
| 139 | real(r8), intent(out) :: lonp(LBi:,LBj:)
|
|---|
| 140 | real(r8), intent(out) :: lonr(LBi:,LBj:)
|
|---|
| 141 | real(r8), intent(out) :: lonu(LBi:,LBj:)
|
|---|
| 142 | real(r8), intent(out) :: lonv(LBi:,LBj:)
|
|---|
| 143 | real(r8), intent(out) :: latp(LBi:,LBj:)
|
|---|
| 144 | real(r8), intent(out) :: latr(LBi:,LBj:)
|
|---|
| 145 | real(r8), intent(out) :: latu(LBi:,LBj:)
|
|---|
| 146 | real(r8), intent(out) :: latv(LBi:,LBj:)
|
|---|
| 147 | # else
|
|---|
| 148 | real(r8), intent(out) :: xp(LBi:,LBj:)
|
|---|
| 149 | real(r8), intent(out) :: xr(LBi:,LBj:)
|
|---|
| 150 | real(r8), intent(out) :: xu(LBi:,LBj:)
|
|---|
| 151 | real(r8), intent(out) :: xv(LBi:,LBj:)
|
|---|
| 152 | real(r8), intent(out) :: yp(LBi:,LBj:)
|
|---|
| 153 | real(r8), intent(out) :: yr(LBi:,LBj:)
|
|---|
| 154 | real(r8), intent(out) :: yu(LBi:,LBj:)
|
|---|
| 155 | real(r8), intent(out) :: yv(LBi:,LBj:)
|
|---|
| 156 | # endif
|
|---|
| 157 | real(r8), intent(out) :: pn(LBi:,LBj:)
|
|---|
| 158 | real(r8), intent(out) :: pm(LBi:,LBj:)
|
|---|
| 159 | real(r8), intent(out) :: f(LBi:,LBj:)
|
|---|
| 160 | real(r8), intent(out) :: h(LBi:,LBj:)
|
|---|
| 161 | #else
|
|---|
| 162 | real(r8), intent(out) :: angler(LBi:UBi,LBj:UBj)
|
|---|
| 163 | # if defined CURVGRID && defined UV_ADV
|
|---|
| 164 | real(r8), intent(out) :: dmde(LBi:UBi,LBj:UBj)
|
|---|
| 165 | real(r8), intent(out) :: dndx(LBi:UBi,LBj:UBj)
|
|---|
| 166 | # endif
|
|---|
| 167 | # ifdef ICESHELF
|
|---|
| 168 | real(r8), intent(out) :: zice(LBi:UBi,LBj:UBj)
|
|---|
| 169 | # endif
|
|---|
| 170 | # ifdef SPHERICAL
|
|---|
| 171 | real(r8), intent(out) :: lonp(LBi:UBi,LBj:UBj)
|
|---|
| 172 | real(r8), intent(out) :: lonr(LBi:UBi,LBj:UBj)
|
|---|
| 173 | real(r8), intent(out) :: lonu(LBi:UBi,LBj:UBj)
|
|---|
| 174 | real(r8), intent(out) :: lonv(LBi:UBi,LBj:UBj)
|
|---|
| 175 | real(r8), intent(out) :: latp(LBi:UBi,LBj:UBj)
|
|---|
| 176 | real(r8), intent(out) :: latr(LBi:UBi,LBj:UBj)
|
|---|
| 177 | real(r8), intent(out) :: latu(LBi:UBi,LBj:UBj)
|
|---|
| 178 | real(r8), intent(out) :: latv(LBi:UBi,LBj:UBj)
|
|---|
| 179 | # else
|
|---|
| 180 | real(r8), intent(out) :: xp(LBi:UBi,LBj:UBj)
|
|---|
| 181 | real(r8), intent(out) :: xr(LBi:UBi,LBj:UBj)
|
|---|
| 182 | real(r8), intent(out) :: xu(LBi:UBi,LBj:UBj)
|
|---|
| 183 | real(r8), intent(out) :: xv(LBi:UBi,LBj:UBj)
|
|---|
| 184 | real(r8), intent(out) :: yp(LBi:UBi,LBj:UBj)
|
|---|
| 185 | real(r8), intent(out) :: yr(LBi:UBi,LBj:UBj)
|
|---|
| 186 | real(r8), intent(out) :: yu(LBi:UBi,LBj:UBj)
|
|---|
| 187 | real(r8), intent(out) :: yv(LBi:UBi,LBj:UBj)
|
|---|
| 188 | # endif
|
|---|
| 189 | real(r8), intent(out) :: pn(LBi:UBi,LBj:UBj)
|
|---|
| 190 | real(r8), intent(out) :: pm(LBi:UBi,LBj:UBj)
|
|---|
| 191 | real(r8), intent(out) :: f(LBi:UBi,LBj:UBj)
|
|---|
| 192 | real(r8), intent(out) :: h(LBi:UBi,LBj:UBj)
|
|---|
| 193 | #endif
|
|---|
| 194 | !
|
|---|
| 195 | ! Local variable declarations.
|
|---|
| 196 | !
|
|---|
| 197 | #ifdef DISTRIBUTE
|
|---|
| 198 | # ifdef EW_PERIODIC
|
|---|
| 199 | logical :: EWperiodic=.TRUE.
|
|---|
| 200 | # else
|
|---|
| 201 | logical :: EWperiodic=.FALSE.
|
|---|
| 202 | # endif
|
|---|
| 203 | # ifdef NS_PERIODIC
|
|---|
| 204 | logical :: NSperiodic=.TRUE.
|
|---|
| 205 | # else
|
|---|
| 206 | logical :: NSperiodic=.FALSE.
|
|---|
| 207 | # endif
|
|---|
| 208 | #endif
|
|---|
| 209 | integer :: Imin, Imax, Jmin, Jmax
|
|---|
| 210 | integer :: IstrR, IendR, JstrR, JendR, IstrU, JstrV
|
|---|
| 211 | integer :: NSUB, i, j, k
|
|---|
| 212 |
|
|---|
| 213 | real(r8), parameter :: twopi = 2.0_r8*pi
|
|---|
| 214 |
|
|---|
| 215 | real(r8) :: Esize, Xsize, beta, cff, depth, dth
|
|---|
| 216 | real(r8) :: dx, dy, f0, my_min, my_max, r, theta, val1, val2
|
|---|
| 217 |
|
|---|
| 218 | #ifdef DISTRIBUTE
|
|---|
| 219 | real(r8), dimension(2) :: buffer
|
|---|
| 220 | character (len=3), dimension(2) :: op_handle
|
|---|
| 221 | #endif
|
|---|
| 222 | #ifdef WEDDELL
|
|---|
| 223 | real(r8) :: hwrk(-1:235), xwrk(-1:235), zwrk
|
|---|
| 224 | #endif
|
|---|
| 225 | real(r8) :: wrkX(PRIVATE_2D_SCRATCH_ARRAY)
|
|---|
| 226 | real(r8) :: wrkY(PRIVATE_2D_SCRATCH_ARRAY)
|
|---|
| 227 | !
|
|---|
| 228 | #include "set_bounds.h"
|
|---|
| 229 | !
|
|---|
| 230 | !-----------------------------------------------------------------------
|
|---|
| 231 | ! Set grid parameters:
|
|---|
| 232 | !
|
|---|
| 233 | ! Xsize Length (m) of domain box in the XI-direction.
|
|---|
| 234 | ! Esize Length (m) of domain box in the ETA-direction.
|
|---|
| 235 | ! depth Maximum depth of bathymetry (m).
|
|---|
| 236 | ! f0 Coriolis parameter, f-plane constant (1/s).
|
|---|
| 237 | ! beta Coriolis parameter, beta-plane constant (1/s/m).
|
|---|
| 238 | !-----------------------------------------------------------------------
|
|---|
| 239 | !
|
|---|
| 240 | #if defined BASIN
|
|---|
| 241 | Xsize=3600.0E+03_r8
|
|---|
| 242 | Esize=2800.0E+03_r8
|
|---|
| 243 | depth=5000.0_r8
|
|---|
| 244 | f0=1.0E-04_r8
|
|---|
| 245 | beta=2.0E-11_r8
|
|---|
| 246 | #elif defined BENCHMARK
|
|---|
| 247 | Xsize=360.0_r8 ! degrees of longitude
|
|---|
| 248 | Esize=20.0_r8 ! degrees of latitude
|
|---|
| 249 | depth=4000.0_r8
|
|---|
| 250 | f0=-1.0E-04_r8
|
|---|
| 251 | beta=2.0E-11_r8
|
|---|
| 252 | #elif defined BL_TEST
|
|---|
| 253 | Xsize=100.0E+03_r8
|
|---|
| 254 | Esize=5.0E+03_r8
|
|---|
| 255 | depth=47.5_r8
|
|---|
| 256 | f0=9.25E-04_r8
|
|---|
| 257 | beta=0.0_r8
|
|---|
| 258 | #elif defined CANYON
|
|---|
| 259 | Xsize=128.0E+03_r8
|
|---|
| 260 | Esize=96.0E+03_r8
|
|---|
| 261 | depth=4000.0_r8
|
|---|
| 262 | f0=1.0E-04_r8
|
|---|
| 263 | beta=0.0_r8
|
|---|
| 264 | #elif defined COUPLING_TEST
|
|---|
| 265 | Xsize=6000.0_r8*REAL(Lm(ng),r8)
|
|---|
| 266 | Esize=6000.0_r8*REAL(Mm(ng),r8)
|
|---|
| 267 | depth=1500.0_r8
|
|---|
| 268 | f0=5.0E-05_r8
|
|---|
| 269 | beta=0.0_r8
|
|---|
| 270 | #elif defined DOUBLE_GYRE
|
|---|
| 271 | Xsize=1000.0E+03_r8
|
|---|
| 272 | Esize=2000.0E+03_r8
|
|---|
| 273 | depth=500.0_r8
|
|---|
| 274 | !! depth=5000.0_r8
|
|---|
| 275 | f0=7.3E-05_r8
|
|---|
| 276 | beta=2.0E-11_r8
|
|---|
| 277 | #elif defined ESTUARY_TEST
|
|---|
| 278 | Xsize=100000.0_r8
|
|---|
| 279 | Esize=300.0_r8
|
|---|
| 280 | depth=10.0_r8
|
|---|
| 281 | f0=0.0_r8
|
|---|
| 282 | beta=0.0_r8
|
|---|
| 283 | #elif defined KELVIN
|
|---|
| 284 | Xsize=20000.0_r8*REAL(Lm(ng),r8)
|
|---|
| 285 | Esize=20000.0_r8*REAL(Mm(ng),r8)
|
|---|
| 286 | depth=100.0_r8
|
|---|
| 287 | f0=1.0E-04_r8
|
|---|
| 288 | beta=0.0_r8
|
|---|
| 289 | #elif defined FLT_TEST
|
|---|
| 290 | Xsize=1.0E+03_r8*REAL(Lm(ng),r8)
|
|---|
| 291 | Esize=1.0E+03_r8*REAL(Mm(ng),r8)
|
|---|
| 292 | depth=10.0_r8
|
|---|
| 293 | f0=0.0_r8
|
|---|
| 294 | beta=0.0_r8
|
|---|
| 295 | #elif defined GRAV_ADJ
|
|---|
| 296 | Xsize=64.0E+03_r8
|
|---|
| 297 | Esize=2.0E+03_r8
|
|---|
| 298 | depth=20.0_r8
|
|---|
| 299 | f0=0.0_r8
|
|---|
| 300 | beta=0.0_r8
|
|---|
| 301 | #elif defined LAB_CANYON
|
|---|
| 302 | Xsize=0.55_r8 ! width of annulus
|
|---|
| 303 | Esize=2.0_r8*pi ! azimuthal length (radians)
|
|---|
| 304 | f0=4.0_r8*pi/25.0_r8
|
|---|
| 305 | beta=0.0_r8
|
|---|
| 306 | #elif defined LAKE_SIGNELL
|
|---|
| 307 | Xsize=50.0e3_r8
|
|---|
| 308 | Esize=10.0e3_r8
|
|---|
| 309 | depth=18.0_r8
|
|---|
| 310 | f0=0.0E-04_r8
|
|---|
| 311 | beta=0.0_r8
|
|---|
| 312 | #elif defined LMD_TEST
|
|---|
| 313 | Xsize=100.0E+03_r8
|
|---|
| 314 | Esize=100.0E+03_r8
|
|---|
| 315 | depth=50.0_r8
|
|---|
| 316 | f0=1.09E-04_r8
|
|---|
| 317 | beta=0.0_r8
|
|---|
| 318 | # elif defined MIXED_LAYER
|
|---|
| 319 | Xsize=500.0_r8
|
|---|
| 320 | Esize=400.0_r8
|
|---|
| 321 | depth=50.0_r8
|
|---|
| 322 | f0=0.0_r8
|
|---|
| 323 | beta=0.0_r8
|
|---|
| 324 | #elif defined OVERFLOW
|
|---|
| 325 | Xsize=4.0E+03_r8
|
|---|
| 326 | Esize=200.0E+03_r8
|
|---|
| 327 | depth=4000.0_r8
|
|---|
| 328 | f0=0.0_r8
|
|---|
| 329 | beta=0.0_r8
|
|---|
| 330 | #elif defined RIVERPLUME1
|
|---|
| 331 | Xsize=58.5E+03_r8
|
|---|
| 332 | Esize=201.0E+03_r8
|
|---|
| 333 | depth=150.0_r8
|
|---|
| 334 | f0=1.0E-04_r8
|
|---|
| 335 | beta=0.0_r8
|
|---|
| 336 | #elif defined RIVERPLUME2
|
|---|
| 337 | Xsize=100.0E+03_r8
|
|---|
| 338 | Esize=210.0E+03_r8
|
|---|
| 339 | depth=190.0_r8
|
|---|
| 340 | f0=1.0E-04_r8
|
|---|
| 341 | beta=0.0_r8
|
|---|
| 342 | #elif defined SEAMOUNT
|
|---|
| 343 | Xsize=320.0E+03_r8
|
|---|
| 344 | Esize=320.0E+03_r8
|
|---|
| 345 | depth=5000.0_r8
|
|---|
| 346 | f0=1.0E-04_r8
|
|---|
| 347 | beta=0.0_r8
|
|---|
| 348 | #elif defined SOLITON
|
|---|
| 349 | !! Xsize=0.5_r8*REAL(Lm(ng),r8)
|
|---|
| 350 | !! Esize=0.5_r8*REAL(Mm(ng),r8)
|
|---|
| 351 | Xsize=48.0_r8
|
|---|
| 352 | Esize=16.0_r8
|
|---|
| 353 | depth=1.0_r8
|
|---|
| 354 | f0=0.0_r8
|
|---|
| 355 | beta=1.0_r8
|
|---|
| 356 | g=1.0_r8
|
|---|
| 357 | #elif defined SED_TEST1
|
|---|
| 358 | Xsize=300.0_r8
|
|---|
| 359 | Esize=36.0_r8
|
|---|
| 360 | depth=10.0_r8
|
|---|
| 361 | f0=0.0_r8
|
|---|
| 362 | beta=0.0_r8
|
|---|
| 363 | #elif defined SED_TOY
|
|---|
| 364 | Xsize=40.0_r8
|
|---|
| 365 | Esize=30.0_r8
|
|---|
| 366 | depth=0.5_r8
|
|---|
| 367 | f0=0.0_r8
|
|---|
| 368 | beta=0.0_r8
|
|---|
| 369 | # elif defined SHOREFACE
|
|---|
| 370 | Xsize=1180.0_r8
|
|---|
| 371 | Esize=140.0_r8
|
|---|
| 372 | depth=15.0_r8
|
|---|
| 373 | f0=0.0E-04_r8
|
|---|
| 374 | beta=0.0_r8
|
|---|
| 375 | #elif defined TEST_CHAN
|
|---|
| 376 | Xsize=10000.0_r8
|
|---|
| 377 | Esize=1000.0_r8
|
|---|
| 378 | depth=10.0_r8
|
|---|
| 379 | f0=0.0_r8
|
|---|
| 380 | beta=0.0_r8
|
|---|
| 381 | #elif defined UPWELLING
|
|---|
| 382 | Xsize=1000.0_r8*REAL(Lm(ng),r8)
|
|---|
| 383 | Esize=1000.0_r8*REAL(Mm(ng),r8)
|
|---|
| 384 | depth=150.0_r8
|
|---|
| 385 | f0=-8.26E-05_r8
|
|---|
| 386 | beta=0.0_r8
|
|---|
| 387 | #elif defined WEDDELL
|
|---|
| 388 | Xsize=4000.0_r8*REAL(Lm(ng),r8)
|
|---|
| 389 | Esize=4000.0_r8*REAL(Mm(ng),r8)
|
|---|
| 390 | depth=4500.0_r8
|
|---|
| 391 | f0=0.0_r8
|
|---|
| 392 | beta=0.0_r8
|
|---|
| 393 | #elif defined WINDBASIN
|
|---|
| 394 | Xsize=2000.0_r8*REAL(Lm(ng),r8)
|
|---|
| 395 | Esize=1000.0_r8*REAL(Mm(ng),r8)
|
|---|
| 396 | depth=50.0_r8
|
|---|
| 397 | f0=1.0E-04_r8
|
|---|
| 398 | beta=0.0_r8
|
|---|
| 399 | #else
|
|---|
| 400 | ana_grid.h: no values provided for Xsize, Esize, depth, f0, beta.
|
|---|
| 401 | #endif
|
|---|
| 402 | !
|
|---|
| 403 | ! Load grid parameters to global storage.
|
|---|
| 404 | !
|
|---|
| 405 | IF (SOUTH_WEST_TEST) THEN
|
|---|
| 406 | xl(ng)=Xsize
|
|---|
| 407 | el(ng)=Esize
|
|---|
| 408 | END IF
|
|---|
| 409 | !
|
|---|
| 410 | !-----------------------------------------------------------------------
|
|---|
| 411 | ! Compute the (XI,ETA) coordinates at PSI- and RHO-points.
|
|---|
| 412 | ! Set grid spacing (m).
|
|---|
| 413 | !-----------------------------------------------------------------------
|
|---|
| 414 | !
|
|---|
| 415 | ! Determine I- and J-ranges for computing grid data. This ranges
|
|---|
| 416 | ! are special in periodic boundary conditons since periodicity cannot
|
|---|
| 417 | ! be imposed in the grid coordinates.
|
|---|
| 418 | !
|
|---|
| 419 | IF (WESTERN_EDGE) THEN
|
|---|
| 420 | Imin=Istr-1
|
|---|
| 421 | ELSE
|
|---|
| 422 | Imin=Istr
|
|---|
| 423 | END IF
|
|---|
| 424 | IF (EASTERN_EDGE) THEN
|
|---|
| 425 | Imax=Iend+1
|
|---|
| 426 | ELSE
|
|---|
| 427 | Imax=Iend
|
|---|
| 428 | END IF
|
|---|
| 429 | IF (SOUTHERN_EDGE) THEN
|
|---|
| 430 | Jmin=Jstr-1
|
|---|
| 431 | ELSE
|
|---|
| 432 | Jmin=Jstr
|
|---|
| 433 | END IF
|
|---|
| 434 | IF (NORTHERN_EDGE) THEN
|
|---|
| 435 | Jmax=Jend+1
|
|---|
| 436 | ELSE
|
|---|
| 437 | Jmax=Jend
|
|---|
| 438 | END IF
|
|---|
| 439 |
|
|---|
| 440 | #if defined BENCHMARK
|
|---|
| 441 | !
|
|---|
| 442 | ! Spherical coordinates set-up.
|
|---|
| 443 | !
|
|---|
| 444 | dx=Xsize/REAL(Lm(ng),r8)
|
|---|
| 445 | dy=Esize/REAL(Mm(ng),r8)
|
|---|
| 446 | spherical=.TRUE.
|
|---|
| 447 | DO j=Jmin,Jmax
|
|---|
| 448 | val1=-70.0_r8+dy*(REAL(j,r8)-0.5_r8)
|
|---|
| 449 | val2=-70.0_r8+dy*REAL(j,r8)
|
|---|
| 450 | DO i=Imin,Imax
|
|---|
| 451 | lonr(i,j)=dx*(REAL(i,r8)-0.5_r8)
|
|---|
| 452 | latr(i,j)=val1
|
|---|
| 453 | lonu(i,j)=dx*REAL(i,r8)
|
|---|
| 454 | lonp(i,j)=lonu(i,j)
|
|---|
| 455 | latu(i,j)=latr(i,j)
|
|---|
| 456 | lonv(i,j)=lonr(i,j)
|
|---|
| 457 | latv(i,j)=val2
|
|---|
| 458 | latp(i,j)=latv(i,j)
|
|---|
| 459 | END DO
|
|---|
| 460 | END DO
|
|---|
| 461 | #elif defined LAB_CANYON
|
|---|
| 462 | !
|
|---|
| 463 | ! Polar coordinates set-up.
|
|---|
| 464 | !
|
|---|
| 465 | dx=Xsize/REAL(Lm(ng),r8)
|
|---|
| 466 | dy=Esize/REAL(Mm(ng),r8)
|
|---|
| 467 | !! dth=twopi/REAL(Mm(ng),r8) ! equal azimultal spacing
|
|---|
| 468 | dth=0.01_r8 ! azimultal spacing
|
|---|
| 469 | cff=(4.0_r8*pi/(dth*REAL(Mm(ng),r8)))-1.0_r8 ! F
|
|---|
| 470 | DO j=Jmin,Jmax
|
|---|
| 471 | DO i=Imin,Imax
|
|---|
| 472 | r=0.35_r8+dx*REAL(i-1,r8)
|
|---|
| 473 | theta=-pi+ &
|
|---|
| 474 | & 0.5_r8*dth*((cff+1.0_r8)*REAL(j-1,r8)+ &
|
|---|
| 475 | & (cff-1.0_r8)*(REAL(Mm(ng),r8)/twopi)* &
|
|---|
| 476 | & SIN(twopi*REAL(j-1,r8)/REAL(Mm(ng),r8)))
|
|---|
| 477 | xp(i,j)=r*COS(theta)
|
|---|
| 478 | yp(i,j)=r*SIN(theta)
|
|---|
| 479 | r=0.35_r8+dx*(REAL(i-1,r8)+0.5_r8)
|
|---|
| 480 | theta=-pi+ &
|
|---|
| 481 | & 0.5_r8*dth*((cff+1.0_r8)*(REAL(j-1,r8)+0.5_r8)+ &
|
|---|
| 482 | & (cff-1.0_r8)*(REAL(Mm(ng),r8)/twopi)* &
|
|---|
| 483 | & SIN(twopi*(REAL(j-1,r8)+0.5_r8)/ &
|
|---|
| 484 | & REAL(Mm(ng),r8)))
|
|---|
| 485 | xr(i,j)=r*COS(theta)
|
|---|
| 486 | yr(i,j)=r*SIN(theta)
|
|---|
| 487 | xu(i,j)=xp(i,j)
|
|---|
| 488 | yu(i,j)=yr(i,j)
|
|---|
| 489 | xv(i,j)=xr(i,j)
|
|---|
| 490 | yv(i,j)=yp(i,j)
|
|---|
| 491 | END DO
|
|---|
| 492 | END DO
|
|---|
| 493 | #else
|
|---|
| 494 | dx=Xsize/REAL(Lm(ng),r8)
|
|---|
| 495 | dy=Esize/REAL(Mm(ng),r8)
|
|---|
| 496 | DO j=Jmin,Jmax
|
|---|
| 497 | DO i=Imin,Imax
|
|---|
| 498 | # ifdef BL_TEST
|
|---|
| 499 | dx=0.5_r8*(4000.0_r8/REAL(Lm(ng)+1,r8))*REAL(i,r8)+675.0_r8
|
|---|
| 500 | # endif
|
|---|
| 501 | xp(i,j)=dx*REAL(i-1,r8)
|
|---|
| 502 | xr(i,j)=dx*(REAL(i-1,r8)+0.5_r8)
|
|---|
| 503 | xu(i,j)=xp(i,j)
|
|---|
| 504 | xv(i,j)=xr(i,j)
|
|---|
| 505 | yp(i,j)=dy*REAL(j-1,r8)
|
|---|
| 506 | yr(i,j)=dy*(REAL(j-1,r8)+0.5_r8)
|
|---|
| 507 | yu(i,j)=yr(i,j)
|
|---|
| 508 | yv(i,j)=yp(i,j)
|
|---|
| 509 | END DO
|
|---|
| 510 | END DO
|
|---|
| 511 | #endif
|
|---|
| 512 | #ifdef DISTRIBUTE
|
|---|
| 513 | # ifdef SPHERICAL
|
|---|
| 514 | CALL mp_exchange2d (ng, model, 4, Istr, Iend, Jstr, Jend, &
|
|---|
| 515 | & LBi, UBi, LBj, UBj, &
|
|---|
| 516 | & NghostPoints, .FALSE., .FALSE., &
|
|---|
| 517 | & lonp, lonr, lonu, lonv)
|
|---|
| 518 | CALL mp_exchange2d (ng, model, 4, Istr, Iend, Jstr, Jend, &
|
|---|
| 519 | & LBi, UBi, LBj, UBj, &
|
|---|
| 520 | & NghostPoints, .FALSE., .FALSE., &
|
|---|
| 521 | & latp, latr, latu, latv)
|
|---|
| 522 | # else
|
|---|
| 523 | CALL mp_exchange2d (ng, model, 4, Istr, Iend, Jstr, Jend, &
|
|---|
| 524 | & LBi, UBi, LBj, UBj, &
|
|---|
| 525 | & NghostPoints, .FALSE., .FALSE., &
|
|---|
| 526 | & xp, xr, xu, xv)
|
|---|
| 527 | CALL mp_exchange2d (ng, model, 4, Istr, Iend, Jstr, Jend, &
|
|---|
| 528 | & LBi, UBi, LBj, UBj, &
|
|---|
| 529 | & NghostPoints, .FALSE., .FALSE., &
|
|---|
| 530 | & yp, yr, yu, yv)
|
|---|
| 531 | # endif
|
|---|
| 532 | #endif
|
|---|
| 533 | !
|
|---|
| 534 | !-----------------------------------------------------------------------
|
|---|
| 535 | ! Compute coordinate transformation metrics at RHO-points "pm" and
|
|---|
| 536 | ! "pn" (1/m) associated with the differential distances in XI and
|
|---|
| 537 | ! ETA, respectively.
|
|---|
| 538 | !-----------------------------------------------------------------------
|
|---|
| 539 | !
|
|---|
| 540 | #define J_RANGE MIN(JstrR,Jstr-1),MAX(Jend+1,JendR)
|
|---|
| 541 | #define I_RANGE MIN(IstrR,Istr-1),MAX(Iend+1,IendR)
|
|---|
| 542 |
|
|---|
| 543 | #if defined BENCHMARK
|
|---|
| 544 | !
|
|---|
| 545 | ! Spherical coordinates set-up.
|
|---|
| 546 | !
|
|---|
| 547 | val1=REAL(Lm(ng),r8)/(2.0_r8*pi*Eradius)
|
|---|
| 548 | val2=REAL(Mm(ng),r8)*360.0_r8/(2.0_r8*pi*Eradius*Esize)
|
|---|
| 549 | DO j=J_RANGE
|
|---|
| 550 | cff=1.0_r8/COS((-70.0_r8+dy*(REAL(j,r8)-0.5_r8))*deg2rad)
|
|---|
| 551 | DO i=I_RANGE
|
|---|
| 552 | wrkX(i,j)=val1*cff
|
|---|
| 553 | wrkY(i,j)=val2
|
|---|
| 554 | END DO
|
|---|
| 555 | END DO
|
|---|
| 556 | #elif defined LAB_CANYON
|
|---|
| 557 | !
|
|---|
| 558 | ! Polar coordinates set-up.
|
|---|
| 559 | !
|
|---|
| 560 | DO j=J_RANGE
|
|---|
| 561 | DO i=I_RANGE
|
|---|
| 562 | r=0.35_r8+dx*(REAL(i-1,r8)+0.5_r8)
|
|---|
| 563 | theta=0.5_r8*dth*((cff+1.0_r8)+ &
|
|---|
| 564 | & (cff-1.0_r8)* &
|
|---|
| 565 | & COS(twopi*REAL(j-1,r8)/REAL(Mm(ng),r8)))
|
|---|
| 566 | wrkX(i,j)=1.0_r8/dx
|
|---|
| 567 | wrkY(i,j)=1.0_r8/(r*theta)
|
|---|
| 568 | END DO
|
|---|
| 569 | END DO
|
|---|
| 570 | #else
|
|---|
| 571 | DO j=J_RANGE
|
|---|
| 572 | DO i=I_RANGE
|
|---|
| 573 | # ifdef BL_TEST
|
|---|
| 574 | dx=0.5_r8*(4000.0_r8/REAL(Lm(ng)+1,r8))*REAL(i,r8)+675.0_r8
|
|---|
| 575 | # endif
|
|---|
| 576 | wrkX(i,j)=1.0_r8/dx
|
|---|
| 577 | wrkY(i,j)=1.0_r8/dy
|
|---|
| 578 | END DO
|
|---|
| 579 | END DO
|
|---|
| 580 | #endif
|
|---|
| 581 | #undef J_RANGE
|
|---|
| 582 | #undef I_RANGE
|
|---|
| 583 | DO j=JstrR,JendR
|
|---|
| 584 | DO i=IstrR,IendR
|
|---|
| 585 | pm(i,j)=wrkX(i,j)
|
|---|
| 586 | pn(i,j)=wrkY(i,j)
|
|---|
| 587 | END DO
|
|---|
| 588 | END DO
|
|---|
| 589 | #if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 590 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 591 | & LBi, UBi, LBj, UBj, &
|
|---|
| 592 | & pm)
|
|---|
| 593 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 594 | & LBi, UBi, LBj, UBj, &
|
|---|
| 595 | & pn)
|
|---|
| 596 | #endif
|
|---|
| 597 | #ifdef DISTRIBUTE
|
|---|
| 598 | CALL mp_exchange2d (ng, model, 2, Istr, Iend, Jstr, Jend, &
|
|---|
| 599 | & LBi, UBi, LBj, UBj, &
|
|---|
| 600 | & NghostPoints, EWperiodic, NSperiodic, &
|
|---|
| 601 | & pm, pn)
|
|---|
| 602 | #endif
|
|---|
| 603 | #if (defined CURVGRID && defined UV_ADV)
|
|---|
| 604 | !
|
|---|
| 605 | !-----------------------------------------------------------------------
|
|---|
| 606 | ! Compute d(1/n)/d(xi) and d(1/m)/d(eta) at RHO-points.
|
|---|
| 607 | !-----------------------------------------------------------------------
|
|---|
| 608 | !
|
|---|
| 609 | DO j=Jstr,Jend
|
|---|
| 610 | DO i=Istr,Iend
|
|---|
| 611 | dndx(i,j)=0.5_r8*((1.0_r8/wrkY(i+1,j ))- &
|
|---|
| 612 | & (1.0_r8/wrkY(i-1,j )))
|
|---|
| 613 | dmde(i,j)=0.5_r8*((1.0_r8/wrkX(i ,j+1))- &
|
|---|
| 614 | & (1.0_r8/wrkX(i ,j-1)))
|
|---|
| 615 | END DO
|
|---|
| 616 | END DO
|
|---|
| 617 | # if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 618 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 619 | & LBi, UBi, LBj, UBj, &
|
|---|
| 620 | & dndx)
|
|---|
| 621 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 622 | & LBi, UBi, LBj, UBj, &
|
|---|
| 623 | & dmde)
|
|---|
| 624 | # endif
|
|---|
| 625 | # ifdef DISTRIBUTE
|
|---|
| 626 | CALL mp_exchange2d (ng, model, 2, Istr, Iend, Jstr, Jend, &
|
|---|
| 627 | & LBi, UBi, LBj, UBj, &
|
|---|
| 628 | & NghostPoints, EWperiodic, NSperiodic, &
|
|---|
| 629 | & dndx, dmde)
|
|---|
| 630 | # endif
|
|---|
| 631 | #endif
|
|---|
| 632 | !
|
|---|
| 633 | !-----------------------------------------------------------------------
|
|---|
| 634 | ! Angle (radians) between XI-axis and true EAST at RHO-points.
|
|---|
| 635 | !-----------------------------------------------------------------------
|
|---|
| 636 | !
|
|---|
| 637 | #if defined LAB_CANYON
|
|---|
| 638 | DO j=JstrR,JendR
|
|---|
| 639 | DO i=IstrR,IendR
|
|---|
| 640 | theta=-pi+ &
|
|---|
| 641 | & 0.5_r8*dth*((cff+1.0_r8)*(REAL(j-1,r8)+0.5_r8)+ &
|
|---|
| 642 | & (cff-1.0_r8)*(REAL(Mm(ng),r8)/twopi)* &
|
|---|
| 643 | & SIN(twopi*(REAL(j-1,r8)+0.5_r8)/ &
|
|---|
| 644 | & REAL(Mm(ng),r8)))
|
|---|
| 645 | angler(i,j)=theta
|
|---|
| 646 | END DO
|
|---|
| 647 | END DO
|
|---|
| 648 | #elif defined WEDDELL
|
|---|
| 649 | val1=90.0_r8*deg2rad
|
|---|
| 650 | DO j=JstrR,JendR
|
|---|
| 651 | DO i=IstrR,IendR
|
|---|
| 652 | angler(i,j)=val1
|
|---|
| 653 | END DO
|
|---|
| 654 | END DO
|
|---|
| 655 | #else
|
|---|
| 656 | DO j=JstrR,JendR
|
|---|
| 657 | DO i=IstrR,IendR
|
|---|
| 658 | angler(i,j)=0.0_r8
|
|---|
| 659 | END DO
|
|---|
| 660 | END DO
|
|---|
| 661 | #endif
|
|---|
| 662 | #if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 663 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 664 | & LBi, UBi, LBj, UBj, &
|
|---|
| 665 | & angler)
|
|---|
| 666 | #endif
|
|---|
| 667 | #ifdef DISTRIBUTE
|
|---|
| 668 | CALL mp_exchange2d (ng, model, 1, Istr, Iend, Jstr, Jend, &
|
|---|
| 669 | & LBi, UBi, LBj, UBj, &
|
|---|
| 670 | & NghostPoints, EWperiodic, NSperiodic, &
|
|---|
| 671 | & angler)
|
|---|
| 672 | #endif
|
|---|
| 673 | !
|
|---|
| 674 | !-----------------------------------------------------------------------
|
|---|
| 675 | ! Compute Coriolis parameter (1/s) at RHO-points.
|
|---|
| 676 | !-----------------------------------------------------------------------
|
|---|
| 677 | !
|
|---|
| 678 | #if defined BENCHMARK
|
|---|
| 679 | val1=2.0_r8*(2.0_r8*pi*366.25_r8/365.25_r8)/86400.0_r8
|
|---|
| 680 | DO j=JstrR,JendR
|
|---|
| 681 | DO i=IstrR,IendR
|
|---|
| 682 | f(i,j)=val1*SIN(latr(i,j)*deg2rad)
|
|---|
| 683 | END DO
|
|---|
| 684 | END DO
|
|---|
| 685 | #elif defined WEDDELL
|
|---|
| 686 | val1=10.4_r8/REAL(Lm(ng),r8)
|
|---|
| 687 | DO j=JstrR,JendR
|
|---|
| 688 | DO i=IstrR,IendR
|
|---|
| 689 | f(i,j)=2.0_r8*7.2E-05_r8* &
|
|---|
| 690 | & SIN((-79.0_r8+REAL(i-1,r8)*val1)*deg2rad)
|
|---|
| 691 | END DO
|
|---|
| 692 | END DO
|
|---|
| 693 | #else
|
|---|
| 694 | val1=0.5_r8*Esize
|
|---|
| 695 | DO j=JstrR,JendR
|
|---|
| 696 | DO i=IstrR,IendR
|
|---|
| 697 | f(i,j)=f0+beta*(yr(i,j)-val1)
|
|---|
| 698 | END DO
|
|---|
| 699 | END DO
|
|---|
| 700 | #endif
|
|---|
| 701 | #if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 702 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 703 | & LBi, UBi, LBj, UBj, &
|
|---|
| 704 | & f)
|
|---|
| 705 | #endif
|
|---|
| 706 | #ifdef DISTRIBUTE
|
|---|
| 707 | CALL mp_exchange2d (ng, model, 1, Istr, Iend, Jstr, Jend, &
|
|---|
| 708 | & LBi, UBi, LBj, UBj, &
|
|---|
| 709 | & NghostPoints, EWperiodic, NSperiodic, &
|
|---|
| 710 | & f)
|
|---|
| 711 | #endif
|
|---|
| 712 | !
|
|---|
| 713 | !-----------------------------------------------------------------------
|
|---|
| 714 | ! Set bathymetry (meters; positive) at RHO-points.
|
|---|
| 715 | !-----------------------------------------------------------------------
|
|---|
| 716 | !
|
|---|
| 717 | #if defined BENCHMARK
|
|---|
| 718 | DO j=JstrR,JendR
|
|---|
| 719 | DO i=IstrR,IendR
|
|---|
| 720 | h(i,j)=500.0_r8+1750.0_r8*(1.0+TANH((68.0_r8+latr(i,j))/dy))
|
|---|
| 721 | END DO
|
|---|
| 722 | END DO
|
|---|
| 723 | #elif defined BL_TEST
|
|---|
| 724 | DO j=JstrR,JendR
|
|---|
| 725 | DO i=IstrR,IendR
|
|---|
| 726 | val1=(xr(i,j)+500.0_r8)/15000.0_r8
|
|---|
| 727 | h(i,j)=14.0_r8+ &
|
|---|
| 728 | & 25.0_r8*(1.0_r8-EXP(-pi*xr(i,j)*1.0E-05_r8))- &
|
|---|
| 729 | & 8.0_r8*EXP(-val1*val1)
|
|---|
| 730 | END DO
|
|---|
| 731 | END DO
|
|---|
| 732 | #elif defined CANYON_A || defined CANYON_B
|
|---|
| 733 | DO j=JstrR,JendR
|
|---|
| 734 | DO i=IstrR,IendR
|
|---|
| 735 | val1=32000.0_r8-16000.0_r8*(SIN(pi*xr(i,j)/Xsize))**24
|
|---|
| 736 | h(i,j)=20.0_r8+0.5_r8*(depth-20.0_r8)* &
|
|---|
| 737 | & (1.0_r8+TANH((yr(i,j)-val1)/10000.0_r8))
|
|---|
| 738 | END DO
|
|---|
| 739 | END DO
|
|---|
| 740 | #elif defined ESTUARY_TEST
|
|---|
| 741 | DO j=JstrR,JendR
|
|---|
| 742 | DO i=IstrR,IendR
|
|---|
| 743 | h(i,j)=5.0_r8+(Xsize-xr(i,j))/Xsize*5.0_r8
|
|---|
| 744 | END DO
|
|---|
| 745 | END DO
|
|---|
| 746 | #elif defined LAB_CANYON
|
|---|
| 747 | DO j=JstrR,JendR
|
|---|
| 748 | DO i=IstrR,IendR
|
|---|
| 749 | r=0.35_r8+dx*(REAL(i-1,r8)+0.5_r8)
|
|---|
| 750 | theta=-pi+ &
|
|---|
| 751 | & 0.5_r8*dth*((cff+1.0_r8)*(REAL(j-1,r8)+0.5_r8)+ &
|
|---|
| 752 | & (cff-1.0_r8)*(REAL(Mm(ng),r8)/twopi)* &
|
|---|
| 753 | & SIN(dth*(REAL(j-1,r8)+0.5_r8)/ &
|
|---|
| 754 | & REAL(Mm(ng),r8)))
|
|---|
| 755 | val1=0.55_r8-0.15_r8*(COS(pi*theta*0.55_r8/0.2_r8)**2) !r_small
|
|---|
| 756 | val2=0.15_r8+0.15_r8*(COS(pi*theta*0.55_r8/0.2_r8)**2) !lambda
|
|---|
| 757 | IF (ABS(theta).ge.0.181818181818_r8) THEN
|
|---|
| 758 | IF (r.le.0.55_r8) THEN
|
|---|
| 759 | h(i,j)=0.025_r8 ! shelf
|
|---|
| 760 | ELSE IF (r.ge.0.7_r8) THEN
|
|---|
| 761 | h(i,j)=0.125_r8 ! deep
|
|---|
| 762 | ELSE
|
|---|
| 763 | h(i,j)=0.125_r8-0.1_r8* &
|
|---|
| 764 | & (COS(0.5_r8*pi*(r-0.55_r8)/0.15_r8)**2)
|
|---|
| 765 | END IF
|
|---|
| 766 | ELSE
|
|---|
| 767 | IF (r.le.val1) THEN
|
|---|
| 768 | h(i,j)=0.025_r8 ! shelf
|
|---|
| 769 | ELSE IF (r.ge.0.7_r8) THEN
|
|---|
| 770 | h(i,j)=0.125_r8 ! deep
|
|---|
| 771 | ELSE
|
|---|
| 772 | h(i,j)=0.125_r8-0.1_r8* &
|
|---|
| 773 | & (COS(0.5_r8*pi*(r-val1)/val2)**2)
|
|---|
| 774 | END IF
|
|---|
| 775 | END IF
|
|---|
| 776 | END DO
|
|---|
| 777 | END DO
|
|---|
| 778 | #elif defined LAKE_SIGNELL
|
|---|
| 779 | DO j=JstrR,JendR
|
|---|
| 780 | DO i=IstrR,IendR
|
|---|
| 781 | h(i,j)=18.0_r8-16.0_r8*FLOAT(Mm(ng)-j)/FLOAT(Mm(ng)-1)
|
|---|
| 782 | END DO
|
|---|
| 783 | END DO
|
|---|
| 784 | # elif defined MIXED_LAYER
|
|---|
| 785 | DO j=JstrR,JendR
|
|---|
| 786 | DO i=IstrR,IendR
|
|---|
| 787 | h(i,j)=50.0_r8
|
|---|
| 788 | END DO
|
|---|
| 789 | END DO
|
|---|
| 790 | #elif defined OVERFLOW
|
|---|
| 791 | val1=200.0_r8
|
|---|
| 792 | DO j=JstrR,JendR
|
|---|
| 793 | DO i=IstrR,IendR
|
|---|
| 794 | h(i,j)=val1+0.5_r8*(depth-val1)* &
|
|---|
| 795 | & (1.0_r8+TANH((yr(i,j)-100000.0_r8)/20000.0_r8))
|
|---|
| 796 | END DO
|
|---|
| 797 | END DO
|
|---|
| 798 | #elif defined RIVERPLUME1
|
|---|
| 799 | DO j=JstrR,JendR
|
|---|
| 800 | DO i=IstrR,MIN(5,IendR)
|
|---|
| 801 | h(i,j)=15.0_r8
|
|---|
| 802 | END DO
|
|---|
| 803 | DO i=MAX(6,IstrR),IendR
|
|---|
| 804 | h(i,j)=depth+REAL(Lm(ng)-i,r8)*(15.0_r8-depth)/ &
|
|---|
| 805 | & REAL(Lm(ng)-6,r8)
|
|---|
| 806 | END DO
|
|---|
| 807 | END DO
|
|---|
| 808 | #elif defined RIVERPLUME2
|
|---|
| 809 | DO j=JstrR,JendR
|
|---|
| 810 | DO i=IstrR,MIN(5,IendR)
|
|---|
| 811 | h(i,j)=15.0_r8
|
|---|
| 812 | END DO
|
|---|
| 813 | DO i=MAX(6,IstrR),IendR
|
|---|
| 814 | h(i,j)=depth+REAL(Lm(ng)-i,r8)*(15.0_r8-depth)/ &
|
|---|
| 815 | & REAL(Lm(ng)-6,r8)
|
|---|
| 816 | END DO
|
|---|
| 817 | END DO
|
|---|
| 818 | #elif defined SEAMOUNT
|
|---|
| 819 | DO j=JstrR,JendR
|
|---|
| 820 | DO i=IstrR,IendR
|
|---|
| 821 | val1=(xr(i,j)-xr(Lm(ng)/2,Mm(ng)/2))/40000.0_r8
|
|---|
| 822 | val2=(yr(i,j)-yr(Lm(ng)/2,Mm(ng)/2))/40000.0_r8
|
|---|
| 823 | h(i,j)=depth-4500.0_r8*EXP(-(val1*val1+val2*val2))
|
|---|
| 824 | END DO
|
|---|
| 825 | END DO
|
|---|
| 826 | #elif defined SED_TOY
|
|---|
| 827 | DO j=JstrR,JendR
|
|---|
| 828 | DO i=IstrR,IendR
|
|---|
| 829 | h(i,j)=20.0_r8
|
|---|
| 830 | END DO
|
|---|
| 831 | END DO
|
|---|
| 832 | #elif defined SHOREFACE
|
|---|
| 833 | DO j=JstrR,JendR
|
|---|
| 834 | DO i=IstrR,IendR
|
|---|
| 835 | h(i,j)=11.75_r8-0.0125_r8*Xsize/FLOAT(Lm(ng)+1)*FLOAT(i)
|
|---|
| 836 | END DO
|
|---|
| 837 | END DO
|
|---|
| 838 | #elif defined TEST_CHAN
|
|---|
| 839 | DO j=JstrR,JendR
|
|---|
| 840 | DO i=IstrR,IendR
|
|---|
| 841 | h(i,j)=10.0_r8+0.4040_r8*REAL(i,r8)/REAL(Lm(ng)+1,r8)
|
|---|
| 842 | END DO
|
|---|
| 843 | END DO
|
|---|
| 844 | #elif defined UPWELLING
|
|---|
| 845 | DO j=JstrR,JendR
|
|---|
| 846 | IF (j.le.Mm(ng)/2) THEN
|
|---|
| 847 | val1=REAL(j,r8)
|
|---|
| 848 | ELSE
|
|---|
| 849 | val1=REAL(Mm(ng)+1-j,r8)
|
|---|
| 850 | END IF
|
|---|
| 851 | val2=MIN(depth,84.5_r8+66.526_r8*TANH((val1-10.0_r8)/7.0_r8))
|
|---|
| 852 | DO i=IstrR,IendR
|
|---|
| 853 | h(i,j)=val2
|
|---|
| 854 | END DO
|
|---|
| 855 | END DO
|
|---|
| 856 | #elif defined WEDDELL
|
|---|
| 857 | val1=98.80_r8
|
|---|
| 858 | val2=0.8270_r8
|
|---|
| 859 | DO k=-1,26
|
|---|
| 860 | xwrk(k)=REAL(k-1,r8)*15.0_r8*1000.0_r8
|
|---|
| 861 | hwrk(k)=375.0_r8
|
|---|
| 862 | END DO
|
|---|
| 863 | DO k=27,232
|
|---|
| 864 | zwrk=-2.0_r8+REAL(k-1,r8)*0.020_r8
|
|---|
| 865 | xwrk(k)=(520.0_r8+val1+zwrk*val1+ &
|
|---|
| 866 | & val1*val2*LOG(COSH(zwrk)))*1000.0_r8
|
|---|
| 867 | hwrk(k)=-75.0_r8+2198.0_r8*(1.0_r8+val2*TANH(zwrk))
|
|---|
| 868 | END DO
|
|---|
| 869 | DO k=233,235
|
|---|
| 870 | xwrk(k)=(850.0_r8+REAL(k-228,r8)*50.0_r8)*1000.0_r8
|
|---|
| 871 | hwrk(k)=4000.0_r8
|
|---|
| 872 | END DO
|
|---|
| 873 | DO j=JstrR,JendR
|
|---|
| 874 | DO i=IstrR,IendR
|
|---|
| 875 | DO k=1,234
|
|---|
| 876 | IF ((xwrk(k).le.xr(i,1)).and.(xr(i,1).lt.xwrk(k+1))) THEN
|
|---|
| 877 | cff=1.0_r8/(xwrk(k+1)-xwrk(k))
|
|---|
| 878 | h(i,j)=cff*(xwrk(k+1)-xr(i,j))*hwrk(k )+ &
|
|---|
| 879 | & cff*(xr(i,j)-xwrk(k ))*hwrk(k+1)
|
|---|
| 880 | END IF
|
|---|
| 881 | END DO
|
|---|
| 882 | END DO
|
|---|
| 883 | END DO
|
|---|
| 884 | #elif defined WINDBASIN
|
|---|
| 885 | DO i=IstrR,IendR
|
|---|
| 886 | val1=1;
|
|---|
| 887 | IF ((i-IstrR).lt.(INT(0.03_r8*REAL(IendR-IstrR,r8)))) THEN
|
|---|
| 888 | val1=1.0_r8-(REAL((i-IstrR+1)- &
|
|---|
| 889 | & INT(0.03_r8*REAL(IendR-IstrR,r8)),r8)/ &
|
|---|
| 890 | & (0.03_r8*REAL(IendR-IstrR,r8)))**2
|
|---|
| 891 | END IF
|
|---|
| 892 | IF ((IendR-i).lt.(INT(0.03_r8*REAL(IendR-IstrR,r8)))) THEN
|
|---|
| 893 | val1=1.0_r8-(REAL((IendR-i+1)- &
|
|---|
| 894 | & INT(0.03_r8*REAL(IendR-IstrR,r8)),r8)/ &
|
|---|
| 895 | & (0.03_r8*REAL(IendR-IstrR,r8)))**2
|
|---|
| 896 | END IF
|
|---|
| 897 | DO j=JstrR,JendR
|
|---|
| 898 | val2=2.0_r8*REAL(j-(Mm(ng)+1)/2,r8)/REAL(Mm(ng)+1,r8)
|
|---|
| 899 | h(i,j)=depth*(0.08_r8+0.92_r8*val1*(1.0_r8-val2*val2))
|
|---|
| 900 | END DO
|
|---|
| 901 | END DO
|
|---|
| 902 | #else
|
|---|
| 903 | DO j=JstrR,JendR
|
|---|
| 904 | DO i=IstrR,IendR
|
|---|
| 905 | h(i,j)=depth
|
|---|
| 906 | END DO
|
|---|
| 907 | END DO
|
|---|
| 908 | #endif
|
|---|
| 909 | #if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 910 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 911 | & LBi, UBi, LBj, UBj, &
|
|---|
| 912 | & h)
|
|---|
| 913 | #endif
|
|---|
| 914 | #ifdef DISTRIBUTE
|
|---|
| 915 | CALL mp_exchange2d (ng, model, 1, Istr, Iend, Jstr, Jend, &
|
|---|
| 916 | & LBi, UBi, LBj, UBj, &
|
|---|
| 917 | & NghostPoints, EWperiodic, NSperiodic, &
|
|---|
| 918 | & h)
|
|---|
| 919 | #endif
|
|---|
| 920 | !
|
|---|
| 921 | ! Determine minimum depth: first, determine minimum values of depth
|
|---|
| 922 | ! within each subdomain (stored as private variable cff), then
|
|---|
| 923 | ! determine global minimum by comparing these subdomain minima.
|
|---|
| 924 | !
|
|---|
| 925 | my_min=h(IstrR,JstrR)
|
|---|
| 926 | my_max=h(IstrR,JstrR)
|
|---|
| 927 | DO j=JstrR,JendR
|
|---|
| 928 | DO i=IstrR,IendR
|
|---|
| 929 | my_min=MIN(my_min,h(i,j))
|
|---|
| 930 | my_max=MAX(my_max,h(i,j))
|
|---|
| 931 | END DO
|
|---|
| 932 | END DO
|
|---|
| 933 | IF (SOUTH_WEST_CORNER.and. &
|
|---|
| 934 | & NORTH_EAST_CORNER) THEN
|
|---|
| 935 | NSUB=1 ! non-tiled application
|
|---|
| 936 | ELSE
|
|---|
| 937 | NSUB=NtileX(ng)*NtileE(ng) ! tiled application
|
|---|
| 938 | END IF
|
|---|
| 939 | !$OMP CRITICAL (H_RANGE)
|
|---|
| 940 | IF (tile_count.eq.0) THEN
|
|---|
| 941 | hmin(ng)=my_min
|
|---|
| 942 | hmax(ng)=my_max
|
|---|
| 943 | ELSE
|
|---|
| 944 | hmin(ng)=MIN(hmin(ng),my_min)
|
|---|
| 945 | hmax(ng)=MAX(hmax(ng),my_max)
|
|---|
| 946 | END IF
|
|---|
| 947 | tile_count=tile_count+1
|
|---|
| 948 | IF (tile_count.eq.NSUB) THEN
|
|---|
| 949 | tile_count=0
|
|---|
| 950 | #ifdef DISTRIBUTE
|
|---|
| 951 | buffer(1)=hmin(ng)
|
|---|
| 952 | buffer(2)=hmax(ng)
|
|---|
| 953 | op_handle(1)='MIN'
|
|---|
| 954 | op_handle(2)='MAX'
|
|---|
| 955 | CALL mp_reduce (ng, model, 2, buffer, op_handle)
|
|---|
| 956 | hmin(ng)=buffer(1)
|
|---|
| 957 | hmax(ng)=buffer(2)
|
|---|
| 958 | #endif
|
|---|
| 959 | END IF
|
|---|
| 960 | !$OMP END CRITICAL (H_RANGE)
|
|---|
| 961 | #ifdef ICESHELF
|
|---|
| 962 | !
|
|---|
| 963 | !-----------------------------------------------------------------------
|
|---|
| 964 | ! Set depth of ice shelf (meters; negative) at RHO-points.
|
|---|
| 965 | !-----------------------------------------------------------------------
|
|---|
| 966 | !
|
|---|
| 967 | # ifdef WEDDELL
|
|---|
| 968 | val1=340.0_r8/16.0_r8
|
|---|
| 969 | DO j=JstrR,JendR
|
|---|
| 970 | DO i=IstrR,IendR
|
|---|
| 971 | IF (i.gt.20) THEN
|
|---|
| 972 | zice(i,j)=0.0_r8
|
|---|
| 973 | ELSE IF (i.gt.4) THEN
|
|---|
| 974 | zice(i,j)=-340.0_r8+REAL(i-1,r8)*val1
|
|---|
| 975 | ELSE
|
|---|
| 976 | zice(i,j)=-340.0_r8
|
|---|
| 977 | END IF
|
|---|
| 978 | END DO
|
|---|
| 979 | END DO
|
|---|
| 980 | # else
|
|---|
| 981 | DO j=JstrR,JendR
|
|---|
| 982 | DO i=IstrR,IendR
|
|---|
| 983 | zice(i,j)=0.0_r8
|
|---|
| 984 | END DO
|
|---|
| 985 | END DO
|
|---|
| 986 | # endif
|
|---|
| 987 | # if defined EW_PERIODIC || defined NS_PERIODIC
|
|---|
| 988 | CALL exchange_r2d_tile (ng, Istr, Iend, Jstr, Jend, &
|
|---|
| 989 | & LBi, UBi, LBj, UBj, &
|
|---|
| 990 | & zice)
|
|---|
| 991 | # endif
|
|---|
| 992 | # ifdef DISTRIBUTE
|
|---|
| 993 | CALL mp_exchange2d (ng, model, 1, Istr, Iend, Jstr, Jend, &
|
|---|
| 994 | & LBi, UBi, LBj, UBj, &
|
|---|
| 995 | & NghostPoints, EWperiodic, NSperiodic, &
|
|---|
| 996 | & zice)
|
|---|
| 997 | # endif
|
|---|
| 998 | #endif
|
|---|
| 999 | RETURN
|
|---|
| 1000 | END SUBROUTINE ana_grid_tile
|
|---|