[109] | 1 | MODULE trdvor |
---|
| 2 | !!====================================================================== |
---|
| 3 | !! *** MODULE trdvor *** |
---|
| 4 | !! Ocean diagnostics: momentum trends |
---|
| 5 | !!===================================================================== |
---|
| 6 | |
---|
| 7 | #if defined key_trd_vor || defined key_esopa |
---|
| 8 | !!---------------------------------------------------------------------- |
---|
| 9 | !! 'key_trd_vor' : momentum trend diagnostics |
---|
| 10 | !!---------------------------------------------------------------------- |
---|
| 11 | !! trd_vor : momentum trends averaged over the depth |
---|
| 12 | !!---------------------------------------------------------------------- |
---|
| 13 | !! * Modules used |
---|
[129] | 14 | USE oce ! ocean dynamics and tracers variables |
---|
[109] | 15 | USE dom_oce ! ocean space and time domain variables |
---|
[129] | 16 | USE trddyn_oce ! ocean active tracer trend variables |
---|
[109] | 17 | USE zdf_oce ! ocean vertical physics |
---|
| 18 | USE in_out_manager ! I/O manager |
---|
| 19 | |
---|
| 20 | USE phycst ! Define parameters for the routines |
---|
[129] | 21 | USE ldfdyn_oce ! ocean active tracers: lateral physics |
---|
[109] | 22 | USE daymod ! calandar |
---|
| 23 | USE dianam ! build the name of file (routine) |
---|
[129] | 24 | USE ldfslp ! iso-neutral slopes |
---|
[109] | 25 | USE zdfmxl |
---|
| 26 | USE ioipsl |
---|
| 27 | USE lbclnk |
---|
| 28 | |
---|
| 29 | IMPLICIT NONE |
---|
| 30 | PRIVATE |
---|
[129] | 31 | |
---|
| 32 | |
---|
| 33 | !! * Accessibility |
---|
[109] | 34 | PUBLIC trd_vor ! routine called by step.F90 |
---|
| 35 | |
---|
| 36 | !! * Shared module variables |
---|
| 37 | LOGICAL, PUBLIC :: lk_trdvor = .TRUE. ! momentum trend flag |
---|
| 38 | |
---|
| 39 | !! * Module variables |
---|
| 40 | INTEGER,PARAMETER :: jplvor=11 |
---|
[129] | 41 | INTEGER :: & |
---|
| 42 | nh_t, nmoydpvor , & |
---|
| 43 | nidvor, nhoridvor, & |
---|
| 44 | ndexvor1(jpi*jpj), & |
---|
| 45 | ndimvor1 |
---|
[109] | 46 | |
---|
| 47 | REAL(wp), DIMENSION(jpi,jpj) :: & |
---|
[129] | 48 | vor_avr , & ! average |
---|
| 49 | vor_avrb , & ! before vorticity (kt-1) |
---|
| 50 | vor_avrbb , & ! vorticity at begining of the nwrite-1 timestep averaging period |
---|
| 51 | vor_avrbn , & ! after vorticity at time step after the |
---|
| 52 | rotot , & ! begining of the NWRITE-1 timesteps |
---|
| 53 | udpvor , & ! total cumulative trends |
---|
| 54 | vdpvor ! " " " |
---|
[109] | 55 | |
---|
[129] | 56 | REAL(wp), DIMENSION(jpi,jpj,jplvor):: & !: curl of trends |
---|
| 57 | vortrd |
---|
[109] | 58 | |
---|
| 59 | !! * Substitutions |
---|
| 60 | # include "domzgr_substitute.h90" |
---|
| 61 | # include "ldfdyn_substitute.h90" |
---|
| 62 | # include "vectopt_loop_substitute.h90" |
---|
| 63 | |
---|
| 64 | !!---------------------------------------------------------------------- |
---|
[129] | 65 | !! OPA 9.0 , LODYC-IPS (2004) |
---|
[109] | 66 | !!---------------------------------------------------------------------- |
---|
| 67 | |
---|
| 68 | CONTAINS |
---|
| 69 | |
---|
| 70 | SUBROUTINE trd_vor( kt ) |
---|
[129] | 71 | !!---------------------------------------------------------------------------- |
---|
[109] | 72 | !! *** ROUTINE trd_vor *** |
---|
| 73 | !! |
---|
| 74 | !! ** Purpose : computation of vertically integrated vorticity budgets |
---|
| 75 | !! from ocean surface down to control surface (NetCDF output) |
---|
| 76 | !! |
---|
| 77 | !! ** Method/usage : |
---|
| 78 | !! integration done over nwrite-1 time steps |
---|
| 79 | !! |
---|
| 80 | !! |
---|
| 81 | !! ** Action : |
---|
| 82 | !! /commld/ : |
---|
| 83 | !! vor_avr average |
---|
| 84 | !! vor_avrb vorticity at kt-1 |
---|
| 85 | !! vor_avrbb vorticity at begining of the NWRITE-1 |
---|
| 86 | !! time steps averaging period |
---|
| 87 | !! vor_avrbn vorticity at time step after the |
---|
| 88 | !! begining of the NWRITE-1 time |
---|
| 89 | !! steps averaging period |
---|
| 90 | !! |
---|
| 91 | !! trends : |
---|
| 92 | !! |
---|
| 93 | !! vortrd (,,1) = Pressure Gradient Trend |
---|
| 94 | !! vortrd (,,2) = KE Gradient Trend |
---|
| 95 | !! vortrd (,,3) = Relative Vorticity Trend |
---|
| 96 | !! vortrd (,,4) = Coriolis Term Trend |
---|
| 97 | !! vortrd (,,5) = Horizontal Diffusion Trend |
---|
| 98 | !! vortrd (,,6) = Vertical Advection Trend |
---|
| 99 | !! vortrd (,,7) = Vertical Diffusion Trend |
---|
| 100 | !! vortrd (,,8) = Surface Pressure Grad. Trend |
---|
| 101 | !! vortrd (,,9) = Beta V |
---|
| 102 | !! vortrd (,,10) = forcing term |
---|
| 103 | !! vortrd (,,11) = bottom friction term |
---|
| 104 | !! rotot(,) : total cumulative trends over nwrite-1 time steps |
---|
| 105 | !! vor_avrtot(,) : first membre of vrticity equation |
---|
| 106 | !! vor_avrres(,) : residual = dh/dt entrainment |
---|
| 107 | !! |
---|
| 108 | !! trends output in netCDF format using ioipsl |
---|
| 109 | !!---------------------------------------------------------------------- |
---|
| 110 | !! * Arguments |
---|
| 111 | INTEGER, INTENT( in ) :: kt ! ocean time-step index |
---|
| 112 | |
---|
| 113 | !! * Local declarations |
---|
| 114 | INTEGER ilseq |
---|
| 115 | INTEGER ji, jj, jk, jl, idebug, it |
---|
| 116 | |
---|
| 117 | REAL(wp) :: zmean |
---|
| 118 | REAL(wp) :: zun(jpi,jpj), zvn(jpi,jpj) |
---|
| 119 | REAL(wp) :: zjulian, zsto, zout |
---|
| 120 | REAL(wp) :: vor_avrtot(jpi,jpj), vor_avrres(jpi,jpj) |
---|
| 121 | INTEGER(wp) :: ikbu,ikbum1,ikbv,ikbvm1 |
---|
| 122 | CHARACTER (len=12) :: cvort |
---|
| 123 | CHARACTER (len=40) :: clhstnam |
---|
| 124 | CHARACTER (len=40) :: clop |
---|
| 125 | |
---|
| 126 | NAMELIST/namtrd/ ntrd,nctls |
---|
| 127 | !!---------------------------------------------------------------------- |
---|
| 128 | |
---|
| 129 | ! =================== |
---|
| 130 | ! 0. initialization |
---|
| 131 | ! =================== |
---|
| 132 | |
---|
| 133 | cvort='averaged-vor' |
---|
| 134 | |
---|
| 135 | ! Open specifier |
---|
| 136 | ilseq = 1 |
---|
| 137 | idebug = 0 ! set it to 1 in case of problem to have more Print |
---|
| 138 | |
---|
| 139 | IF( kt == nit000 ) THEN |
---|
| 140 | |
---|
| 141 | ! namelist namtrd : trend diagnostic |
---|
| 142 | REWIND( numnam ) |
---|
| 143 | READ ( numnam, namtrd ) |
---|
| 144 | |
---|
| 145 | IF(lwp) THEN |
---|
| 146 | WRITE(numout,*) 'namtrd' |
---|
| 147 | WRITE(numout,*) ' ' |
---|
| 148 | WRITE(numout,*) ' time step frequency trend ntrd = ',ntrd |
---|
| 149 | WRITE(numout,*) ' ' |
---|
| 150 | ENDIF |
---|
| 151 | |
---|
| 152 | ! cumulated trends array init |
---|
| 153 | nmoydpvor = 0 |
---|
| 154 | rotot(:,:)=0 |
---|
| 155 | vor_avrtot(:,:)=0 |
---|
| 156 | vor_avrres(:,:)=0 |
---|
| 157 | ENDIF |
---|
| 158 | |
---|
| 159 | ! set before values of vertically average u and v |
---|
| 160 | |
---|
| 161 | IF( kt > nit000 ) THEN |
---|
| 162 | vor_avrb(:,:) = vor_avr(:,:) |
---|
| 163 | ENDIF |
---|
| 164 | |
---|
| 165 | IF( idebug /= 0 ) THEN |
---|
[129] | 166 | WRITE(numout,*) ' debuging trd_vor: 0. done ' |
---|
| 167 | CALL FLUSH(numout) |
---|
[109] | 168 | ENDIF |
---|
| 169 | |
---|
| 170 | ! ================================= |
---|
| 171 | ! I. vertically integrated vorticity |
---|
| 172 | ! ================================= |
---|
| 173 | |
---|
| 174 | vor_avr(:,:) = 0. |
---|
| 175 | zun(:,:)=0 |
---|
| 176 | zvn(:,:)=0 |
---|
| 177 | vor_avrtot(:,:)=0 |
---|
| 178 | vor_avrres(:,:)=0 |
---|
| 179 | |
---|
| 180 | ! vertically averaged velocity |
---|
| 181 | DO jk = 1, jpk - 1 |
---|
[129] | 182 | zun(:,:)=zun(:,:) + e1u(:,:)*un(:,:,jk)*fse3u(:,:,jk) |
---|
| 183 | zvn(:,:)=zvn(:,:) + e2v(:,:)*vn(:,:,jk)*fse3v(:,:,jk) |
---|
[109] | 184 | END DO |
---|
| 185 | |
---|
| 186 | |
---|
| 187 | zun(:,:)=zun(:,:)*hur(:,:) |
---|
| 188 | zvn(:,:)=zvn(:,:)*hvr(:,:) |
---|
| 189 | |
---|
| 190 | !Curl |
---|
| 191 | DO ji=1,jpim1 |
---|
[129] | 192 | DO jj=1,jpjm1 |
---|
| 193 | vor_avr(ji,jj) = ((zvn(ji+1,jj)-zvn(ji,jj))- & |
---|
| 194 | (zun(ji,jj+1)-zun(ji,jj))) & |
---|
| 195 | /( e1f(ji,jj) * e2f(ji,jj) ) |
---|
| 196 | vor_avr(ji,jj) = vor_avr(ji,jj)*fmask(ji,jj,1) |
---|
| 197 | END DO |
---|
[109] | 198 | END DO |
---|
| 199 | |
---|
| 200 | |
---|
| 201 | IF(idebug /= 0) THEN |
---|
| 202 | WRITE(numout,*) ' debuging trd_vor: I done' |
---|
| 203 | CALL FLUSH(numout) |
---|
| 204 | ENDIF |
---|
| 205 | |
---|
| 206 | ! ================================= |
---|
| 207 | ! II. netCDF output initialization |
---|
| 208 | ! ================================= |
---|
| 209 | |
---|
[129] | 210 | # include "trdvor_ncinit.h90" |
---|
[109] | 211 | |
---|
| 212 | IF( idebug /= 0 ) THEN |
---|
| 213 | WRITE(numout,*) ' debuging trd_vor: II. done' |
---|
| 214 | CALL FLUSH(numout) |
---|
| 215 | ENDIF |
---|
| 216 | |
---|
[129] | 217 | ! ===================================== |
---|
| 218 | ! III vertical integration of 3D trends |
---|
| 219 | ! ===================================== |
---|
| 220 | ! Beta.V : intergration, no average |
---|
| 221 | utrd(:,:,:,9)=utrd(:,:,:,4) |
---|
| 222 | vtrd(:,:,:,9)=vtrd(:,:,:,4) |
---|
[109] | 223 | |
---|
[129] | 224 | DO jl=1,jplvor |
---|
[109] | 225 | |
---|
[129] | 226 | udpvor(:,:)=0 |
---|
| 227 | vdpvor(:,:)=0 |
---|
| 228 | |
---|
| 229 | !bottom friction |
---|
| 230 | IF( jl == jplvor ) THEN |
---|
[109] | 231 | |
---|
[129] | 232 | CALL lbc_lnk( tautrd(:,:,3), 'U' , -1. ) |
---|
| 233 | CALL lbc_lnk( tautrd(:,:,4), 'V' , -1. ) |
---|
[109] | 234 | |
---|
[129] | 235 | DO jj = 2, jpjm1 |
---|
| 236 | DO ji = fs_2, fs_jpim1 |
---|
| 237 | ikbu = min( mbathy(ji+1,jj), mbathy(ji,jj) ) |
---|
| 238 | ikbum1 = max( ikbu-1, 1 ) |
---|
| 239 | ikbv = min( mbathy(ji,jj+1), mbathy(ji,jj) ) |
---|
| 240 | ikbvm1 = max( ikbv-1, 1 ) |
---|
| 241 | |
---|
| 242 | udpvor(ji,jj)=tautrd(ji,jj,3)*fse3u(ji,jj,ikbum1)*e1u(ji,jj)*umask(ji,jj,ikbum1) |
---|
| 243 | vdpvor(ji,jj)=tautrd(ji,jj,4)*fse3v(ji,jj,ikbvm1)*e2v(ji,jj)*vmask(ji,jj,ikbvm1) |
---|
| 244 | END DO |
---|
| 245 | END DO |
---|
[109] | 246 | |
---|
[129] | 247 | !wind stress |
---|
| 248 | ELSE IF( jl == (jplvor-1) ) THEN |
---|
[109] | 249 | |
---|
[129] | 250 | CALL lbc_lnk( tautrd(:,:,1), 'U' , -1. ) |
---|
| 251 | CALL lbc_lnk( tautrd(:,:,2), 'V' , -1. ) |
---|
[109] | 252 | |
---|
[129] | 253 | udpvor(:,:)=tautrd(:,:,1)*fse3u(:,:,1)*e1u(:,:)*umask(:,:,1) |
---|
| 254 | vdpvor(:,:)=tautrd(:,:,2)*fse3v(:,:,1)*e2v(:,:)*vmask(:,:,1) |
---|
[109] | 255 | |
---|
[129] | 256 | ELSE |
---|
[109] | 257 | |
---|
[129] | 258 | CALL lbc_lnk( utrd(:,:,:,jl), 'U' , -1. ) |
---|
| 259 | CALL lbc_lnk( vtrd(:,:,:,jl), 'V' , -1. ) |
---|
[109] | 260 | |
---|
[129] | 261 | !utrd and vtrd terms |
---|
| 262 | DO jk = 1,jpk |
---|
| 263 | udpvor(:,:)=udpvor(:,:)+utrd(:,:,jk,jl)*fse3u(:,:,jk)*e1u(:,:)*umask(:,:,jk) |
---|
| 264 | vdpvor(:,:)=vdpvor(:,:)+vtrd(:,:,jk,jl)*fse3v(:,:,jk)*e2v(:,:)*vmask(:,:,jk) |
---|
| 265 | END DO |
---|
[109] | 266 | |
---|
[129] | 267 | ENDIF |
---|
[109] | 268 | |
---|
[129] | 269 | !average except for Beta.V |
---|
| 270 | IF (jl/=9) THEN |
---|
| 271 | udpvor(:,:) = udpvor(:,:) * hur(:,:) |
---|
| 272 | vdpvor(:,:) = vdpvor(:,:) * hvr(:,:) |
---|
| 273 | ENDIF |
---|
| 274 | |
---|
| 275 | !Curl |
---|
| 276 | DO ji=1,jpim1 |
---|
| 277 | DO jj=1,jpjm1 |
---|
| 278 | vortrd(ji,jj,jl)=( vdpvor(ji+1,jj)-vdpvor(ji,jj) & |
---|
| 279 | - ( udpvor(ji,jj+1)-udpvor(ji,jj) ) ) & |
---|
| 280 | / ( e1f(ji,jj) * e2f(ji,jj) ) |
---|
| 281 | END DO |
---|
[109] | 282 | END DO |
---|
[129] | 283 | |
---|
| 284 | vortrd(:,:,9)=vortrd(:,:,9)*hur(:,:) |
---|
| 285 | |
---|
| 286 | !surface mask |
---|
| 287 | DO ji=1,jpi |
---|
| 288 | DO jj=1,jpj |
---|
| 289 | vortrd(ji,jj,jl)=vortrd(ji,jj,jl)*fmask(ji,jj,1) !surface mask |
---|
| 290 | END DO |
---|
| 291 | END DO |
---|
| 292 | |
---|
[109] | 293 | END DO |
---|
| 294 | |
---|
| 295 | IF( idebug /= 0 ) THEN |
---|
| 296 | IF(lwp) WRITE(numout,*) ' debuging trd_vor: III done' |
---|
| 297 | CALL FLUSH(numout) |
---|
| 298 | ENDIF |
---|
| 299 | |
---|
| 300 | ! ================================= |
---|
| 301 | ! IV. Cumulated trends |
---|
| 302 | ! ================================= |
---|
| 303 | |
---|
| 304 | ! IV.1 set `before' mixed layer values for kt = nit000+1 |
---|
| 305 | ! -------------------------------------------------------- |
---|
| 306 | IF( kt == nit000+1 ) THEN |
---|
| 307 | vor_avrbb(:,:) = vor_avrb(:,:) |
---|
| 308 | vor_avrbn(:,:) = vor_avr (:,:) |
---|
| 309 | ENDIF |
---|
| 310 | |
---|
| 311 | IF( idebug /= 0 ) THEN |
---|
| 312 | WRITE(numout,*) ' debuging trd_vor: IV.1 done' |
---|
| 313 | CALL FLUSH(numout) |
---|
| 314 | ENDIF |
---|
| 315 | |
---|
| 316 | ! IV.2 cumulated trends over analysis period (kt=2 to nwrite) |
---|
| 317 | ! ---------------------- |
---|
| 318 | ! trends cumulated over nwrite-2 time steps |
---|
| 319 | |
---|
| 320 | IF( kt >= nit000+2 ) THEN |
---|
| 321 | nmoydpvor = nmoydpvor + 1 |
---|
| 322 | DO jl = 1, jplvor |
---|
[129] | 323 | IF( jl /= 9 ) THEN |
---|
| 324 | rotot(:,:) = rotot(:,:) + vortrd(:,:,jl) |
---|
| 325 | ENDIF |
---|
[109] | 326 | END DO |
---|
| 327 | ENDIF |
---|
| 328 | |
---|
| 329 | IF( idebug /= 0 ) THEN |
---|
| 330 | WRITE(numout,*) ' debuging trd_vor: IV.2 done' |
---|
| 331 | CALL FLUSH(numout) |
---|
| 332 | ENDIF |
---|
| 333 | |
---|
| 334 | ! ============================================= |
---|
| 335 | ! V. Output in netCDF + residual computation |
---|
| 336 | ! ============================================= |
---|
| 337 | IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN |
---|
| 338 | |
---|
| 339 | ! V.1 compute total trend |
---|
| 340 | ! ------------------------ |
---|
| 341 | zmean = float(nmoydpvor) |
---|
| 342 | |
---|
| 343 | vor_avrtot(:,:) = ( vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - & |
---|
[129] | 344 | vor_avrbb(:,:) ) / (zmean * 2. * rdt) |
---|
[109] | 345 | |
---|
[129] | 346 | IF( idebug /= 0 ) THEN |
---|
| 347 | WRITE(numout,*) ' zmean = ',zmean |
---|
| 348 | WRITE(numout,*) ' debuging trd_vor: V.1 done' |
---|
| 349 | CALL FLUSH(numout) |
---|
[109] | 350 | ENDIF |
---|
| 351 | |
---|
| 352 | ! V.2 compute residual |
---|
| 353 | ! --------------------- |
---|
| 354 | vor_avrres(:,:) = vor_avrtot(:,:) - rotot(:,:) / zmean |
---|
| 355 | |
---|
[129] | 356 | ! Boundary conditions |
---|
[109] | 357 | CALL lbc_lnk( vor_avrtot, 'F', 1. ) |
---|
| 358 | CALL lbc_lnk( vor_avrres, 'F', 1. ) |
---|
| 359 | |
---|
| 360 | IF( idebug /= 0 ) THEN |
---|
| 361 | WRITE(numout,*) ' debuging trd_vor: V.2 done' |
---|
| 362 | CALL FLUSH(numout) |
---|
| 363 | ENDIF |
---|
| 364 | |
---|
| 365 | ! V.3 time evolution array swap |
---|
| 366 | ! ------------------------------ |
---|
| 367 | vor_avrbb(:,:) = vor_avrb(:,:) |
---|
| 368 | vor_avrbn(:,:) = vor_avr(:,:) |
---|
| 369 | |
---|
| 370 | IF( idebug /= 0 ) THEN |
---|
| 371 | WRITE(numout,*) ' debuging trd_vor: V.3 done' |
---|
| 372 | CALL FLUSH(numout) |
---|
| 373 | ENDIF |
---|
| 374 | |
---|
[129] | 375 | nmoydpvor=0 |
---|
[109] | 376 | |
---|
| 377 | ENDIF |
---|
| 378 | |
---|
| 379 | ! V.5 write trends to output |
---|
| 380 | ! --------------------------- |
---|
| 381 | IF( kt >= nit000+1 ) THEN |
---|
| 382 | |
---|
| 383 | #include "trdvor_ncwrite.h90" |
---|
| 384 | |
---|
| 385 | IF( idebug /= 0 ) THEN |
---|
| 386 | WRITE(numout,*) ' debuging trd_vor: IV.5 done' |
---|
| 387 | CALL FLUSH(numout) |
---|
| 388 | ENDIF |
---|
| 389 | |
---|
| 390 | ENDIF |
---|
| 391 | |
---|
[129] | 392 | IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN |
---|
| 393 | rotot(:,:)=0 |
---|
| 394 | ENDIF |
---|
[109] | 395 | |
---|
| 396 | IF( kt == nitend ) THEN |
---|
[129] | 397 | CALL histclo( nidvor ) |
---|
| 398 | ENDIF |
---|
[109] | 399 | |
---|
| 400 | END SUBROUTINE trd_vor |
---|
| 401 | |
---|
| 402 | #else |
---|
| 403 | !!---------------------------------------------------------------------- |
---|
| 404 | !! Default option : Empty module |
---|
| 405 | !!---------------------------------------------------------------------- |
---|
| 406 | LOGICAL, PUBLIC :: lk_trdvor = .FALSE. ! momentum trend flag |
---|
| 407 | CONTAINS |
---|
| 408 | SUBROUTINE trd_vor( kt ) ! Empty routine |
---|
[129] | 409 | WRITE(*,*) 'trd_vor: You should not have seen this print! error?', kt |
---|
[109] | 410 | END SUBROUTINE trd_vor |
---|
| 411 | #endif |
---|
| 412 | |
---|
| 413 | !!====================================================================== |
---|
| 414 | END MODULE trdvor |
---|