Changeset 503
- Timestamp:
- 2006-09-27T10:52:29+02:00 (18 years ago)
- Location:
- trunk/NEMO/OPA_SRC
- Files:
-
- 2 added
- 42 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/DYN/dynhpg.F90
r474 r503 4 4 !! Ocean dynamics: hydrostatic pressure gradient trend 5 5 !!====================================================================== 6 !! History : 1.0 ! 87-09 (P. Andrich, M.-A. Foujols) hpg_zco: Original code 7 !! 5.0 ! 91-11 (G. Madec) 8 !! 7.0 ! 96-01 (G. Madec) hpg_sco: Original code for s-coordinates 9 !! 8.0 ! 97-05 (G. Madec) split dynber into dynkeg and dynhpg 10 !! 8.5 ! 02-07 (G. Madec) F90: Free form and module 11 !! 8.5 ! 02-08 (A. Bozec) hpg_zps: Original code 12 !! 9.0 ! 05-10 (A. Beckmann, B.W. An) various s-coordinate options 13 !! Original code for hpg_ctl, hpg_hel hpg_wdj, hpg_djc, hpg_rot 14 !! 9.0 ! 05-11 (G. Madec) style & small optimisation 15 !!---------------------------------------------------------------------- 6 16 7 17 !!---------------------------------------------------------------------- … … 18 28 !! hpg_rot : s-coordinate (ROTated axes scheme) 19 29 !!---------------------------------------------------------------------- 20 !! * Modules used21 30 USE oce ! ocean dynamics and tracers 22 31 USE dom_oce ! ocean space and time domain … … 32 41 PRIVATE 33 42 34 !! * Accessibility 35 PUBLIC dyn_hpg ! routine called by step.F90 43 PUBLIC dyn_hpg ! routine called by step module 36 44 37 45 #if defined key_mpp_omp … … 49 57 #endif 50 58 51 !! * Share module variables 52 LOGICAL :: & !!! ** nam_dynhpg ** hpg flags 53 ln_hpg_zco = .TRUE. , & ! z-coordinate - full steps 54 ln_hpg_zps = .FALSE., & ! z-coordinate - partial steps (interpolation) 55 ln_hpg_sco = .FALSE., & ! s-coordinate (standard jacobian formulation) 56 ln_hpg_hel = .FALSE., & ! s-coordinate (helsinki modification) 57 ln_hpg_wdj = .FALSE., & ! s-coordinate (weighted density jacobian) 58 ln_hpg_djc = .FALSE., & ! s-coordinate (Density Jacobian with Cubic polynomial) 59 ln_hpg_rot = .FALSE. ! s-coordinate (ROTated axes scheme) 60 61 REAL(wp) :: & !!! ** nam_dynhpg ** 62 gamm = 0.e0 ! weighting coefficient 63 64 INTEGER :: & ! 65 nhpg = 0 ! = 0 to 6, type of pressure gradient scheme used 66 ! ! (deduced from ln_hpg_... flags) 59 !!* Namelist nam_dynhpg : Choice of horizontal pressure gradient computation 60 LOGICAL :: ln_hpg_zco = .TRUE. ! z-coordinate - full steps 61 LOGICAL :: ln_hpg_zps = .FALSE. ! z-coordinate - partial steps (interpolation) 62 LOGICAL :: ln_hpg_sco = .FALSE. ! s-coordinate (standard jacobian formulation) 63 LOGICAL :: ln_hpg_hel = .FALSE. ! s-coordinate (helsinki modification) 64 LOGICAL :: ln_hpg_wdj = .FALSE. ! s-coordinate (weighted density jacobian) 65 LOGICAL :: ln_hpg_djc = .FALSE. ! s-coordinate (Density Jacobian with Cubic polynomial) 66 LOGICAL :: ln_hpg_rot = .FALSE. ! s-coordinate (ROTated axes scheme) 67 REAL(wp) :: gamm = 0.e0 ! weighting coefficient 68 NAMELIST/nam_dynhpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco, ln_hpg_hel, & 69 & ln_hpg_wdj, ln_hpg_djc, ln_hpg_rot, gamm 70 71 INTEGER :: nhpg = 0 ! = 0 to 6, type of pressure gradient scheme used 72 ! ! (deduced from ln_hpg_... flags) 67 73 68 74 !! * Substitutions … … 72 78 !! OPA 9.0 , LOCEAN-IPSL (2005) 73 79 !! $Header$ 74 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt80 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 75 81 !!---------------------------------------------------------------------- 76 82 … … 82 88 !! 83 89 !! ** Method : Call the hydrostatic pressure gradient routine 84 !! using the scheme defined in the namelist (nhpg parameter)90 !! using the scheme defined in the namelist 85 91 !! 86 92 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 87 93 !! - Save the trend (l_trddyn=T) 88 !! - Control print (ln_ctl) 89 !! 90 !! History : 91 !! 9.0 ! 05-10 (A. Beckmann, G. Madec) various s-coordinate options 92 !!---------------------------------------------------------------------- 93 !! * Arguments 94 INTEGER, INTENT( in ) :: kt ! ocean time-step index 95 96 !! * local declarations 97 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 98 ztrdu, ztrdv ! 3D temporary workspace 94 !!---------------------------------------------------------------------- 95 INTEGER, INTENT(in) :: kt ! ocean time-step index 96 !! 97 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D temporary workspace 99 98 !!---------------------------------------------------------------------- 100 99 101 100 IF( kt == nit000 ) CALL hpg_ctl ! initialisation & control of options 102 101 103 ! Temporary saving of ua and va trends (l_trddyn) 104 IF( l_trddyn ) THEN 102 IF( l_trddyn ) THEN ! Temporary saving of ua and va trends (l_trddyn) 105 103 ztrdu(:,:,:) = ua(:,:,:) 106 104 ztrdv(:,:,:) = va(:,:,:) … … 108 106 109 107 SELECT CASE ( nhpg ) ! Hydrastatic pressure gradient computation 110 CASE ( 0 ) ! z-coordinate 111 CALL hpg_zco( kt ) 112 CASE ( 1 ) ! z-coordinate plus partial steps (interpolation) 113 CALL hpg_zps( kt ) 114 CASE ( 2 ) ! s-coordinate (standard jacobian formulation) 115 CALL hpg_sco( kt ) 116 CASE ( 3 ) ! s-coordinate (helsinki modification) 117 CALL hpg_hel( kt ) 118 CASE ( 4 ) ! s-coordinate (weighted density jacobian) 119 CALL hpg_wdj( kt ) 120 CASE ( 5 ) ! s-coordinate (Density Jacobian with Cubic polynomial) 121 CALL hpg_djc( kt ) 122 CASE ( 6 ) ! s-coordinate (ROTated axes scheme) 123 CALL hpg_rot( kt ) 124 CASE ( 10 ) ! z-coordinate 125 CALL hpg_zco_jki( kt ) 126 CASE ( 11 ) ! z-coordinate plus partial steps (interpolation) 127 CALL hpg_zps_jki( kt ) 128 CASE ( 12 ) ! s-coordinate (standard jacobian formulation) 129 CALL hpg_sco_jki( kt ) 108 CASE ( 0 ) ; CALL hpg_zco ( kt ) ! z-coordinate 109 CASE ( 1 ) ; CALL hpg_zps ( kt ) ! z-coordinate plus partial steps (interpolation) 110 CASE ( 2 ) ; CALL hpg_sco ( kt ) ! s-coordinate (standard jacobian formulation) 111 CASE ( 3 ) ; CALL hpg_hel ( kt ) ! s-coordinate (helsinki modification) 112 CASE ( 4 ) ; CALL hpg_wdj ( kt ) ! s-coordinate (weighted density jacobian) 113 CASE ( 5 ) ; CALL hpg_djc ( kt ) ! s-coordinate (Density Jacobian with Cubic polynomial) 114 CASE ( 6 ) ; CALL hpg_rot ( kt ) ! s-coordinate (ROTated axes scheme) 115 CASE ( 10 ) ; CALL hpg_zco_jki( kt ) ! z-coordinate (k-j-i) 116 CASE ( 11 ) ; CALL hpg_zps_jki( kt ) ! z-coordinate plus partial steps (interpolation) (k-j-i) 117 CASE ( 12 ) ; CALL hpg_sco_jki( kt ) ! s-coordinate (standard jacobian formulation) (k-j-i) 130 118 END SELECT 131 119 132 ! save the hydrostatic pressure gradient trends for momentum trend diagnostics 133 IF( l_trddyn ) THEN 120 IF( l_trddyn ) THEN ! save the hydrostatic pressure gradient trends for momentum trend diagnostics 134 121 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 135 122 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 136 CALL trd_mod( ztrdu, ztrdv, jpd tdhpg, 'DYN', kt )123 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_hpg, 'DYN', kt ) 137 124 ENDIF 138 139 IF(ln_ctl) THEN ! print sum trends (used for debugging) 140 CALL prt_ctl( tab3d_1=ua, clinfo1=' hpg - Ua: ', mask1=umask, & 141 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 142 ENDIF 143 125 ! 126 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' hpg - Ua: ', mask1=umask, & 127 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 128 ! 144 129 END SUBROUTINE dyn_hpg 145 130 … … 154 139 !! ** Action : Read the namelist namdynhpg and check the consistency 155 140 !! with the type of vertical coordinate used (zco, zps, sco) 156 !!157 !! History :158 !! 9.0 ! 05-10 (A. Beckmann) Original code159 141 !!---------------------------------------------------------------------- 160 142 INTEGER :: ioptio = 0 ! temporary integer 161 162 NAMELIST/nam_dynhpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco, & 163 & ln_hpg_hel, ln_hpg_wdj, ln_hpg_djc, ln_hpg_rot, & 164 & gamm 165 !!---------------------------------------------------------------------- 166 167 ! Read Namelist nam_dynhpg : pressure gradient calculation options 168 REWIND ( numnam ) 143 !!---------------------------------------------------------------------- 144 145 REWIND ( numnam ) ! Read Namelist nam_dynhpg : pressure gradient calculation options 169 146 READ ( numnam, nam_dynhpg ) 170 147 171 ! Control print 172 IF(lwp) THEN 148 IF(lwp) THEN ! Control print 173 149 WRITE(numout,*) 174 150 WRITE(numout,*) 'dyn:hpg_ctl : hydrostatic pressure gradient control' … … 185 161 ENDIF 186 162 187 ! set nhpg from ln_hpg_... flags163 ! ! Set nhpg from ln_hpg_... flags 188 164 IF( ln_hpg_zco ) nhpg = 0 189 165 IF( ln_hpg_zps ) nhpg = 1 … … 194 170 IF( ln_hpg_rot ) nhpg = 6 195 171 196 ! Consitency check172 ! ! Consitency check 197 173 ioptio = 0 198 174 IF( ln_hpg_zco ) ioptio = ioptio + 1 … … 203 179 IF( ln_hpg_djc ) ioptio = ioptio + 1 204 180 IF( ln_hpg_rot ) ioptio = ioptio + 1 205 IF ( ioptio > 1 ) & 206 & CALL ctl_stop( ' several hydrostatic pressure gradient options used' ) 181 IF ( ioptio /= 1 ) CALL ctl_stop( ' NO or several hydrostatic pressure gradient options used' ) 207 182 208 183 IF( lk_dynhpg_jki ) THEN … … 211 186 IF(lwp) WRITE(numout,*) ' Autotasking or OPENMP: use j-k-i loops (i.e. _jki routines)' 212 187 ENDIF 213 188 ! 214 189 END SUBROUTINE hpg_ctl 215 190 … … 230 205 !! 231 206 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 232 !! 233 !! History : 234 !! 1.0 ! 87-09 (P. Andrich, M.-A. Foujols) Original code 235 !! 5.0 ! 91-11 (G. Madec) 236 !! 7.0 ! 96-01 (G. Madec) 237 !! 8.0 ! 97-05 (G. Madec) split dynber into dynkeg and dynhpg 238 !! 8.5 ! 02-07 (G. Madec) F90: Free form and module 239 !!---------------------------------------------------------------------- 240 !! * modules used 241 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 242 & zhpj => sa ! use sa as 3D workspace 243 244 !! * Arguments 245 INTEGER, INTENT( in ) :: kt ! ocean time-step index 246 247 !! * local declarations 248 INTEGER :: ji, jj, jk ! dummy loop indices 249 REAL(wp) :: & 250 zcoef0, zcoef1 ! temporary scalars 207 !!---------------------------------------------------------------------- 208 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 209 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 210 !! 211 INTEGER, INTENT(in) :: kt ! ocean time-step index 212 !! 213 INTEGER :: ji, jj, jk ! dummy loop indices 214 REAL(wp) :: zcoef0, zcoef1 ! temporary scalars 251 215 !!---------------------------------------------------------------------- 252 216 … … 257 221 ENDIF 258 222 259 260 223 ! Local constant initialization 261 ! -----------------------------262 224 zcoef0 = - grav * 0.5 263 225 264 226 ! Surface value 265 ! -------------266 227 DO jj = 2, jpjm1 267 228 DO ji = fs_2, fs_jpim1 ! vector opt. … … 275 236 END DO 276 237 END DO 277 238 ! 278 239 ! interior value (2=<jk=<jpkm1) 279 ! --------------280 240 DO jk = 2, jpkm1 281 241 DO jj = 2, jpjm1 … … 296 256 END DO 297 257 END DO 298 258 ! 299 259 END SUBROUTINE hpg_zco 300 260 … … 307 267 !! 308 268 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 309 !!310 !! History :311 !! 8.5 ! 02-08 (A. Bozec) Original code312 !! 9.0 ! 04-08 (G. Madec) F90313 269 !!---------------------------------------------------------------------- 314 !! * modules used 315 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 316 & zhpj => sa ! use sa as 3D workspace 317 318 !! * Arguments 319 INTEGER, INTENT( in ) :: kt ! ocean time-step index 320 321 !! * local declarations 322 INTEGER :: ji, jj, jk ! dummy loop indices 323 INTEGER :: iku, ikv ! temporary integers 324 REAL(wp) :: & 325 zcoef0, zcoef1, & ! temporary scalars 326 zcoef2, zcoef3 ! " " 270 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 271 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 272 !! 273 INTEGER, INTENT(in) :: kt ! ocean time-step index 274 !! 275 INTEGER :: ji, jj, jk ! dummy loop indices 276 INTEGER :: iku, ikv ! temporary integers 277 REAL(wp) :: zcoef0, zcoef1, zcoef2, zcoef3 ! temporary scalars 327 278 !!---------------------------------------------------------------------- 328 279 … … 330 281 IF(lwp) WRITE(numout,*) 331 282 IF(lwp) WRITE(numout,*) 'dyn:hpg_zps : hydrostatic pressure gradient trend' 332 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate with partial steps' 333 IF(lwp) WRITE(numout,*) ' vector optimization' 283 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate with partial steps - vector optimization' 334 284 ENDIF 335 285 336 337 ! 0. Local constant initialization 338 ! -------------------------------- 286 ! Local constant initialization 339 287 zcoef0 = - grav * 0.5 340 288 341 ! 1. Surface value 342 ! ---------------- 289 ! Surface value 343 290 DO jj = 2, jpjm1 344 291 DO ji = fs_2, fs_jpim1 ! vector opt. … … 353 300 END DO 354 301 355 ! 2. interior value (2=<jk=<jpkm1) 356 ! ----------------- 302 ! interior value (2=<jk=<jpkm1) 357 303 DO jk = 2, jpkm1 358 304 DO jj = 2, jpjm1 … … 410 356 # endif 411 357 END DO 412 358 ! 413 359 END SUBROUTINE hpg_zps 414 360 … … 431 377 !! 432 378 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 433 !! 434 !! History : 435 !! 7.0 ! 96-01 (G. Madec) s-coordinates 436 !! ! 97-05 (G. Madec) split dynber into dynkeg and dynhpg 437 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module, vector opt. 438 !! 9.0 ! 04-08 (C. Talandier) New trends organization 439 !! 9.0 ! 05-10 (A. Beckmann) various s-coordinate options 440 !!---------------------------------------------------------------------- 441 !! * modules used 442 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 443 & zhpj => sa ! use sa as 3D workspace 444 445 !! * Arguments 446 INTEGER, INTENT( in ) :: kt ! ocean time-step index 447 448 !! * Local declarations 449 INTEGER :: ji, jj, jk ! dummy loop indices 450 REAL(wp) :: & 451 zcoef0, zuap, zvap ! temporary scalars 379 !!---------------------------------------------------------------------- 380 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 381 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 382 !! 383 INTEGER, INTENT(in) :: kt ! ocean time-step index 384 !! 385 INTEGER :: ji, jj, jk ! dummy loop indices 386 REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars 452 387 !!---------------------------------------------------------------------- 453 388 … … 458 393 ENDIF 459 394 460 461 ! 0. Local constant initialization 462 ! -------------------------------- 395 ! Local constant initialization 463 396 zcoef0 = - grav * 0.5 464 397 465 466 ! 1. Surface value 467 ! ---------------- 398 ! Surface value 468 399 DO jj = 2, jpjm1 469 400 DO ji = fs_2, fs_jpim1 ! vector opt. … … 484 415 END DO 485 416 486 487 ! 2. interior value (2=<jk=<jpkm1) 488 ! ----------------- 417 ! interior value (2=<jk=<jpkm1) 489 418 DO jk = 2, jpkm1 490 419 DO jj = 2, jpjm1 … … 508 437 END DO 509 438 END DO 510 439 ! 511 440 END SUBROUTINE hpg_sco 512 441 … … 530 459 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 531 460 !! - Save the trend (l_trddyn=T) 532 !! 533 !! History : 534 !! 9.0 ! 05-10 (A. Beckmann) Original code 535 !!---------------------------------------------------------------------- 536 !! * modules used 537 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 538 & zhpj => sa ! use sa as 3D workspace 539 540 !! * Arguments 541 INTEGER, INTENT( in ) :: kt ! ocean time-step index 542 543 !! * Local declarations 544 INTEGER :: ji, jj, jk ! dummy loop indices 545 REAL(wp) :: & 546 zcoef0, zuap, zvap ! temporary scalars 461 !!---------------------------------------------------------------------- 462 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 463 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 464 !! 465 INTEGER, INTENT(in) :: kt ! ocean time-step index 466 !! 467 INTEGER :: ji, jj, jk ! dummy loop indices 468 REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars 547 469 !!---------------------------------------------------------------------- 548 470 … … 553 475 ENDIF 554 476 555 556 ! 0. Local constant initialization 557 ! -------------------------------- 477 ! Local constant initialization 558 478 zcoef0 = - grav * 0.5 559 560 479 561 ! 1. Surface value 562 ! ---------------- 480 ! Surface value 563 481 DO jj = 2, jpjm1 564 482 DO ji = fs_2, fs_jpim1 ! vector opt. … … 578 496 END DO 579 497 END DO 580 581 ! 2. interior value (2=<jk=<jpkm1) 582 ! ----------------- 498 ! 499 ! interior value (2=<jk=<jpkm1) 583 500 DO jk = 2, jpkm1 584 501 DO jj = 2, jpjm1 … … 606 523 END DO 607 524 END DO 608 525 ! 609 526 END SUBROUTINE hpg_hel 610 527 … … 619 536 !! 620 537 !! Reference : Song, Mon. Wea. Rev., 126, 3213-3230, 1998. 621 !! 622 !! History : 623 !! 9.0 ! 05-05 (B.W. An) Original code 624 !! ! 05-10 (G. Madec) style & small optimisation 625 !!---------------------------------------------------------------------- 626 !! * modules used 627 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 628 & zhpj => sa ! use sa as 3D workspace 629 630 !! * Arguments 631 INTEGER, INTENT( in ) :: kt ! ocean time-step index 632 633 !! * Local declarations 634 INTEGER :: ji, jj, jk ! dummy loop indices 635 REAL(wp) :: & 636 zcoef0, zuap, zvap, & ! temporary scalars 637 zalph , zbeta ! " " 538 !!---------------------------------------------------------------------- 539 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 540 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 541 !! 542 INTEGER, INTENT(in) :: kt ! ocean time-step index 543 !! 544 INTEGER :: ji, jj, jk ! dummy loop indices 545 REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars 546 REAL(wp) :: zalph , zbeta ! " " 638 547 !!---------------------------------------------------------------------- 639 548 … … 644 553 ENDIF 645 554 646 647 555 ! Local constant initialization 648 ! -----------------------------649 556 zcoef0 = - grav * 0.5 650 557 zalph = 0.5 - gamm ! weighting coefficients (alpha=0.5-gamm) … … 652 559 653 560 ! Surface value (no ponderation) 654 ! -------------655 561 DO jj = 2, jpjm1 656 562 DO ji = fs_2, fs_jpim1 ! vector opt. … … 672 578 673 579 ! Interior value (2=<jk=<jpkm1) (weighted with zalph & zbeta) 674 ! --------------675 580 DO jk = 2, jpkm1 676 581 DO jj = 2, jpjm1 … … 700 605 END DO 701 606 END DO 702 607 ! 703 608 END SUBROUTINE hpg_wdj 704 609 … … 710 615 !! ** Method : Density Jacobian with Cubic polynomial scheme 711 616 !! 712 !! Reference: Shchepetkin, A.F. & J.C. McWilliams, J. Geophys. Res., 713 !! 108(C3), 3090, 2003 714 !! History : 715 !! 9.0 ! 05-05 (B.W. An) Original code 716 !!---------------------------------------------------------------------- 717 !! * modules used 718 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 719 & zhpj => sa ! use sa as 3D workspace 720 721 !! * Arguments 722 INTEGER, INTENT( in ) :: kt ! ocean time-step index 723 724 !! * Local declarations 725 INTEGER :: ji, jj, jk ! dummy loop indices 726 REAL(wp) :: & 727 zcoef0, z1_10, cffu, cffx, & ! temporary scalars 728 z1_12, cffv, cffy, & ! " " 729 zep , cffw ! " " 730 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & ! 3D workspace 731 drhox, dzx, drhou, dzu, rho_i, & 732 drhoy, dzy, drhov, dzv, rho_j, & 733 drhoz, dzz, drhow, dzw, rho_k 617 !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003 618 !!---------------------------------------------------------------------- 619 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 620 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 621 !! 622 INTEGER, INTENT(in) :: kt ! ocean time-step index 623 !! 624 INTEGER :: ji, jj, jk ! dummy loop indices 625 REAL(wp) :: zcoef0, zep, cffw ! temporary scalars 626 REAL(wp) :: z1_10, cffu, cffx ! " " 627 REAL(wp) :: z1_12, cffv, cffy ! " " 628 REAL(wp), DIMENSION(jpi,jpj,jpk) :: drhox, dzx, drhou, dzu, rho_i ! 3D workspace 629 REAL(wp), DIMENSION(jpi,jpj,jpk) :: drhoy, dzy, drhov, dzv, rho_j ! " " 630 REAL(wp), DIMENSION(jpi,jpj,jpk) :: drhoz, dzz, drhow, dzw, rho_k ! " " 734 631 !!---------------------------------------------------------------------- 735 632 … … 741 638 742 639 743 ! 0. Local constant initialization 744 ! -------------------------------- 640 ! Local constant initialization 745 641 zcoef0 = - grav * 0.5 746 642 z1_10 = 1.0 / 10.0 … … 771 667 zep = 1.e-15 772 668 773 774 669 !!bug gm drhoz not defined at level 1 and used (jk-1 with jk=2) 670 !!bug gm idem for drhox, drhoy et ji=jpi and jj=jpj 775 671 776 672 DO jk = 2, jpkm1 … … 930 826 END DO 931 827 END DO 932 828 ! 933 829 END SUBROUTINE hpg_djc 934 830 … … 941 837 !! 942 838 !! Reference: Thiem & Berntsen, Ocean Modelling, In press, 2005. 943 !! History : 944 !! 9.0 ! 05-07 (B.W. An) 945 !! 9.0 ! 05-10 (A. Beckmann) adapted to non-equidistant and masked grids 946 !!---------------------------------------------------------------------- 947 !! * modules used 948 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 949 & zhpj => sa ! use sa as 3D workspace 950 951 !! * Arguments 952 INTEGER, INTENT( in ) :: kt ! ocean time-step index 953 954 !! * Local declarations 955 INTEGER :: ji, jj, jk ! dummy loop indices 956 REAL(wp) :: & 957 zforg, zcoef0, zuap, zmskd1, zmskd1m, & 958 zfrot , zvap, zmskd2, zmskd2m 959 REAL(wp), DIMENSION(jpi,jpj) :: & ! 2D temporary workspace 960 zdistr, zsina, zcosa 961 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & ! 3D temporary workspace 962 zhpiorg, zhpirot, zhpitra, zhpine, & 963 zhpjorg, zhpjrot, zhpjtra, zhpjne 839 !!---------------------------------------------------------------------- 840 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 841 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 842 !! 843 INTEGER, INTENT(in) :: kt ! ocean time-step index 844 !! 845 INTEGER :: ji, jj, jk ! dummy loop indices 846 REAL(wp) :: zforg, zcoef0, zuap, zmskd1, zmskd1m ! temporary scalar 847 REAL(wp) :: zfrot , zvap, zmskd2, zmskd2m ! " " 848 REAL(wp), DIMENSION(jpi,jpj) :: zdistr, zsina, zcosa ! 2D workspace 849 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpiorg, zhpirot, zhpitra, zhpine ! 3D workspace 850 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpjorg, zhpjrot, zhpjtra, zhpjne ! " " 964 851 !!---------------------------------------------------------------------- 965 852 … … 1118 1005 END DO 1119 1006 END DO 1120 1007 ! 1121 1008 END SUBROUTINE hpg_rot 1122 1009 -
trunk/NEMO/OPA_SRC/DYN/dynhpg_jki.F90
r456 r503 4 4 !! Ocean dynamics: hydrostatic pressure gradient trend 5 5 !!====================================================================== 6 7 !!---------------------------------------------------------------------- 8 !! hpg...o_jki : update the momentum trend with the horizontal 9 !! gradient of the hydrostatic pressure 10 !!---------------------------------------------------------------------- 11 !! * Modules used 6 !! History : 9.0 ! 06-09 (G. Madec) From dynhpg module 7 !!---------------------------------------------------------------------- 8 9 !!---------------------------------------------------------------------- 10 !! hpg_sco_jki : update the momentum trend with the horizontal 11 !! gradient of the hydrostatic pressure (s-coordinate) 12 !! hpg_zps_jki : update the momentum trend with the horizontal 13 !! gradient of the hydrostatic pressure (partial step) 14 !! hpg_zco_jki : update the momentum trend with the horizontal 15 !! gradient of the hydrostatic pressure (z-coordinate) 16 !!---------------------------------------------------------------------- 12 17 USE oce ! ocean dynamics and tracers 13 18 USE dom_oce ! ocean space and time domain 14 19 USE phycst ! physical constants 15 20 USE in_out_manager ! I/O manager 16 USE trdmod ! ocean dynamics trends17 USE trdmod_oce ! ocean variables trends18 USE prtctl ! Print control19 21 USE lbclnk ! lateral boundary condition 20 22 … … 22 24 PRIVATE 23 25 24 !! * Accessibility 25 PUBLIC hpg_sco_jki ! routine called by step.F90 26 PUBLIC hpg_zps_jki ! routine called by step.F90 27 PUBLIC hpg_zco_jki ! routine called by step.F90 26 PUBLIC hpg_sco_jki ! routine called by step.F90 27 PUBLIC hpg_zps_jki ! routine called by step.F90 28 PUBLIC hpg_zco_jki ! routine called by step.F90 28 29 29 30 !! * Substitutions … … 32 33 !!---------------------------------------------------------------------- 33 34 !! OPA 9.0 , LOCEAN-IPSL (2005) 35 !! $Header$ 36 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 34 37 !!---------------------------------------------------------------------- 35 38 … … 57 60 !! 58 61 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 59 !! - Save the trend in (utrd,vtrd) ('key_trddyn') 60 !! 61 !! History : 62 !! 7.0 ! 96-01 (G. Madec) s-coordinates 63 !! ! 97-05 (G. Madec) split dynber into dynkeg and dynhpg 64 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 65 !! 9.0 ! 04-08 (C. Talandier) New trends organization 66 !!---------------------------------------------------------------------- 67 !! * modules used 68 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 69 & zhpj => sa ! use sa as 3D workspace 70 71 !! * Arguments 72 INTEGER, INTENT( in ) :: kt ! ocean time-step index 73 74 !! * Local declarations 75 INTEGER :: ji, jj, jk ! dummy loop indices 76 REAL(wp) :: & 77 zcoef0, zuap, zvap ! temporary scalars 78 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 79 ztdua, ztdva ! temporary scalars 62 !! - Save the trend in (ztrdu,ztrdv) ('key_trddyn') 63 !!---------------------------------------------------------------------- 64 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 65 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 66 !! 67 INTEGER, INTENT(in) :: kt ! ocean time-step index 68 !! 69 INTEGER :: ji, jj, jk ! dummy loop indices 70 REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars 80 71 !!---------------------------------------------------------------------- 81 72 … … 86 77 ENDIF 87 78 88 ! Save ua and va trends 89 IF( l_trddyn ) THEN 90 ztdua(:,:,:) = ua(:,:,:) 91 ztdva(:,:,:) = va(:,:,:) 92 ENDIF 93 94 ! 0. Local constant initialization 95 ! -------------------------------- 79 ! Local constant initialization 96 80 zcoef0 = - grav * 0.5 97 81 zuap = 0.e0 … … 101 85 DO jj = 2, jpjm1 ! Vertical slab 102 86 ! ! =============== 103 ! 1. Surface value 104 ! ---------------- 105 DO ji = 2, jpim1 87 DO ji = 2, jpim1 ! Surface value 106 88 ! hydrostatic pressure gradient along s-surfaces 107 89 zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) & … … 118 100 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap 119 101 END DO 120 121 ! 2. interior value (2=<jk=<jpkm1) 122 ! ----------------- 123 DO jk = 2, jpkm1 102 ! 103 DO jk = 2, jpkm1 ! interior value (2=<jk=<jpkm1) 124 104 DO ji = 2, jpim1 125 105 ! hydrostatic pressure gradient along s-surfaces … … 143 123 END DO ! End of slab 144 124 ! ! =============== 145 146 ! save the hydrostatic pressure gradient trends for diagnostic147 ! momentum trends148 IF( l_trddyn ) THEN149 zhpi(:,:,:) = ua(:,:,:) - ztdua(:,:,:)150 zhpj(:,:,:) = va(:,:,:) - ztdva(:,:,:)151 CALL trd_mod(zhpi, zhpj, jpdtdhpg, 'DYN', kt)152 ENDIF153 154 IF(ln_ctl) THEN ! print sum trends (used for debugging)155 CALL prt_ctl(tab3d_1=ua, clinfo1=' hpg - Ua: ', mask1=umask, &156 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn')157 ENDIF158 159 125 END SUBROUTINE hpg_sco_jki 160 126 … … 178 144 !! 179 145 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 180 !! - Save the trend in (utrd,vtrd) ('key_trddyn') 181 !! 182 !! History : 183 !! 8.5 ! 02-08 (A. Bozec) Original code 184 !!---------------------------------------------------------------------- 185 !! * modules used 186 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 187 & zhpj => sa ! use sa as 3D workspace 188 189 !! * Arguments 190 INTEGER, INTENT( in ) :: kt ! ocean time-step index 191 192 !! * local declarations 193 INTEGER :: ji, jj, jk ! dummy loop indices 194 INTEGER :: iku, ikv ! temporary integers 195 REAL(wp) :: & 196 zcoef0, zcoef1, zuap, & ! temporary scalars 197 zcoef2, zcoef3, zvap ! " " 198 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 199 ztdua, ztdva ! temporary scalars 146 !! - Save the trend in (ztrdu,ztrdv) ('key_trddyn') 147 !!---------------------------------------------------------------------- 148 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 149 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 150 !! 151 INTEGER, INTENT(in) :: kt ! ocean time-step index 152 !! 153 INTEGER :: ji, jj, jk ! dummy loop indices 154 INTEGER :: iku, ikv ! temporary integers 155 REAL(wp) :: zcoef0, zcoef1, zuap ! temporary scalars 156 REAL(wp) :: zcoef2, zcoef3, zvap ! " " 200 157 !!---------------------------------------------------------------------- 201 158 … … 206 163 ENDIF 207 164 208 ! Save ua and va trends 209 IF( l_trddyn ) THEN 210 ztdua(:,:,:) = ua(:,:,:) 211 ztdva(:,:,:) = va(:,:,:) 212 ENDIF 213 214 ! 0. Local constant initialization 215 ! -------------------------------- 165 ! Local constant initialization 216 166 zcoef0 = - grav * 0.5 217 167 zuap = 0.e0 … … 220 170 DO jj = 2, jpjm1 ! Vertical slab 221 171 ! ! =============== 222 ! 1. Surface value 223 ! ---------------- 224 DO ji = 2, jpim1 172 DO ji = 2, jpim1 ! Surface value 225 173 zcoef1 = zcoef0 * fse3w(ji,jj,1) 226 174 ! hydrostatic pressure gradient … … 231 179 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 232 180 END DO 233 234 ! 2. interior value (2=<jk=<jpkm1) 235 ! ----------------- 236 DO jk = 2, jpkm1 181 ! 182 DO jk = 2, jpkm1 ! interior value (2=<jk=<jpkm1) 237 183 DO ji = 2, jpim1 238 184 zcoef1 = zcoef0 * fse3w(ji,jj,jk) … … 250 196 END DO 251 197 END DO 252 198 ! 253 199 ! partial steps correction at the last level (new gradient with intgrd.F) 254 200 DO ji = 2, jpim1 … … 281 227 END DO ! End of slab 282 228 ! ! =============== 283 284 ! save the hydrostatic pressure gradient trends for diagnostic285 ! momentum trends286 IF( l_trddyn ) THEN287 zhpi(:,:,:) = ua(:,:,:) - ztdua(:,:,:)288 zhpj(:,:,:) = va(:,:,:) - ztdva(:,:,:)289 CALL trd_mod(zhpi, zhpj, jpdtdhpg, 'DYN', kt)290 ENDIF291 292 IF(ln_ctl) THEN ! print sum trends (used for debugging)293 CALL prt_ctl(tab3d_1=ua, clinfo1=' hpg - Ua: ', mask1=umask, &294 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn')295 ENDIF296 297 229 END SUBROUTINE hpg_zps_jki 298 230 … … 317 249 !! 318 250 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 319 !! - Save the trend in (utrd,vtrd) ('key_trddyn') 320 !! 321 !! History : 322 !! 1.0 ! 87-09 (P. Andrich, m.-a. Foujols) Original code 323 !! ! 91-11 (G. Madec) 324 !! ! 96-01 (G. Madec) s-coordinates 325 !! ! 97-05 (G. Madec) split dynber into dynkeg and dynhpg 326 !! 8.5 ! 02-07 (G. Madec) F90: Free form and module 327 !!---------------------------------------------------------------------- 328 !! * modules used 329 USE oce, ONLY : zhpi => ta, & ! use ta as 3D workspace 330 & zhpj => sa ! use sa as 3D workspace 331 332 !! * Arguments 333 INTEGER, INTENT( in ) :: kt ! ocean time-step index 334 335 !! * local declarations 336 INTEGER :: ji, jj, jk ! dummy loop indices 337 REAL(wp) :: & 338 zcoef0, zcoef1, zuap, zvap ! temporary scalars 339 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 340 ztdua, ztdva ! temporary scalars 251 !! - Save the trend in (ztrdu,ztrdv) ('key_trddyn') 252 !!---------------------------------------------------------------------- 253 USE oce, ONLY : zhpi => ta ! use ta as 3D workspace 254 USE oce, ONLY : zhpj => sa ! use sa as 3D workspace 255 !! 256 INTEGER, INTENT(in) :: kt ! ocean time-step index 257 !! 258 INTEGER :: ji, jj, jk ! dummy loop indices 259 REAL(wp) :: zcoef0, zcoef1, zuap, zvap ! temporary scalars 341 260 !!---------------------------------------------------------------------- 342 261 … … 347 266 ENDIF 348 267 349 ! Save ua and va trends 350 IF( l_trddyn ) THEN 351 ztdua(:,:,:) = ua(:,:,:) 352 ztdva(:,:,:) = va(:,:,:) 353 ENDIF 354 355 ! 0. Local constant initialization 356 ! -------------------------------- 268 ! Local constant initialization 357 269 zcoef0 = - grav * 0.5 358 270 zuap = 0.e0 … … 362 274 DO jj = 2, jpjm1 ! Vertical slab 363 275 ! ! =============== 364 ! 1. Surface value 365 ! ---------------- 366 367 368 DO ji = 2, jpim1 276 DO ji = 2, jpim1 ! Surface value 369 277 zcoef1 = zcoef0 * fse3w(ji,jj,1) 370 278 ! hydrostatic pressure gradient … … 375 283 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 376 284 END DO 377 378 ! 2. interior value (2=<jk=<jpkm1) 379 ! ----------------- 380 DO jk = 2, jpkm1 285 ! 286 DO jk = 2, jpkm1 ! interior value (2=<jk=<jpkm1) 381 287 DO ji = 2, jpim1 382 288 zcoef1 = zcoef0 * fse3w(ji,jj,jk) … … 397 303 END DO ! End of slab 398 304 ! ! =============== 399 400 ! save the hydrostatic pressure gradient trends for diagnostic401 ! momentum trends402 IF( l_trddyn ) THEN403 zhpi(:,:,:) = ua(:,:,:) - ztdua(:,:,:)404 zhpj(:,:,:) = va(:,:,:) - ztdva(:,:,:)405 406 CALL trd_mod(zhpi, zhpj, jpdtdhpg, 'DYN', kt)407 ENDIF408 409 IF(ln_ctl) THEN ! print sum trends (used for debugging)410 CALL prt_ctl(tab3d_1=ua, clinfo1=' hpg - Ua: ', mask1=umask, &411 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn')412 ENDIF413 414 305 END SUBROUTINE hpg_zco_jki 415 306 -
trunk/NEMO/OPA_SRC/DYN/dynkeg.F90
r258 r503 4 4 !! Ocean dynamics: kinetic energy gradient trend 5 5 !!====================================================================== 6 !! History : 1.0 ! 87-09 (P. Andrich, m.-a. Foujols) Original code 7 !! 7.0 ! 97-05 (G. Madec) Split dynber into dynkeg and dynhpg 8 !! 9.0 ! 02-07 (G. Madec) F90: Free form and module 9 !!---------------------------------------------------------------------- 6 10 7 11 !!---------------------------------------------------------------------- 8 12 !! dyn_keg : update the momentum trend with the horizontal tke 9 13 !!---------------------------------------------------------------------- 10 !! * Modules used11 14 USE oce ! ocean dynamics and tracers 12 15 USE dom_oce ! ocean space and time domain … … 19 22 PRIVATE 20 23 21 !! * Accessibility 22 PUBLIC dyn_keg ! routine called by step.F90 24 PUBLIC dyn_keg ! routine called by step module 23 25 24 26 !! * Substitutions 25 27 # include "vectopt_loop_substitute.h90" 26 !!---------------------------------------------------------------------- -----------28 !!---------------------------------------------------------------------- 27 29 !! OPA 9.0 , LOCEAN-IPSL (2005) 28 30 !! $Header$ 29 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt30 !!---------------------------------------------------------------------- -----------31 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 32 !!---------------------------------------------------------------------- 31 33 32 34 CONTAINS … … 40 42 !! general momentum trend. 41 43 !! 42 !! ** Method : Compute the now horizontal kinetic energy :44 !! ** Method : Compute the now horizontal kinetic energy 43 45 !! zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ] 44 46 !! Take its horizontal gradient and add it to the general momentum … … 48 50 !! 49 51 !! ** Action : - Update the (ua, va) with the hor. ke gradient trend 50 !! - Save the trends in (utrd,vtrd) ('key_trddyn') 52 !! - save this trends (l_trddyn=T) for post-processing 53 !!---------------------------------------------------------------------- 54 USE oce, ONLY : ztrdu => ta ! use ta as 3D workspace 55 USE oce, ONLY : ztrdv => sa ! use sa as 3D workspace 51 56 !! 52 !! History : 53 !! 1.0 ! 87-09 (P. Andrich, m.-a. Foujols) Original code 54 !! 7.0 ! 97-05 (G. Madec) Split dynber into dynkeg and dynhpg 55 !! 9.0 ! 02-07 (G. Madec) F90: Free form and module 56 !! " ! 04-08 (C. Talandier) New trends organization 57 !!---------------------------------------------------------------------- 58 !! * Modules used 59 USE oce, ONLY : ztdua => ta, & ! use ta as 3D workspace 60 ztdva => sa ! use sa as 3D workspace 61 62 !! * Arguments 63 INTEGER, INTENT( in ) :: kt ! ocean time-step index 64 65 !! * Local declarations 66 INTEGER :: ji, jj, jk ! dummy loop indices 67 REAL(wp) :: zua, zva, zu, zv ! temporary scalars 68 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 69 zhke ! temporary workspace 57 INTEGER, INTENT( in ) :: kt ! ocean time-step index 58 !! 59 INTEGER :: ji, jj, jk ! dummy loop indices 60 REAL(wp) :: zu, zv ! temporary scalars 61 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhke ! temporary 3D workspace 70 62 !!---------------------------------------------------------------------- 71 63 … … 76 68 ENDIF 77 69 78 ! Save ua and va trends 79 IF( l_trddyn ) THEN 80 ztdua(:,:,:) = ua(:,:,:) 81 ztdva(:,:,:) = va(:,:,:) 70 IF( l_trddyn ) THEN ! Save ua and va trends 71 ztrdu(:,:,:) = ua(:,:,:) 72 ztrdv(:,:,:) = va(:,:,:) 82 73 ENDIF 83 74 … … 85 76 DO jk = 1, jpkm1 ! Horizontal slab 86 77 ! ! =============== 87 ! Horizontal kinetic energy at T-point 88 DO jj = 2, jpj 78 DO jj = 2, jpj ! Horizontal kinetic energy at T-point 89 79 DO ji = fs_2, jpi ! vector opt. 80 zu = 0.25 * ( un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 81 & + un(ji ,jj ,jk) * un(ji ,jj ,jk) ) 90 82 zv = 0.25 * ( vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) & 91 + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) ) 92 zu = 0.25 * ( un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 93 + un(ji ,jj ,jk) * un(ji ,jj ,jk) ) 83 & + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) ) 94 84 zhke(ji,jj,jk) = zv + zu 95 85 END DO 96 86 END DO 97 98 ! Horizontal gradient of Horizontal kinetic energy 99 DO jj = 2, jpjm1 87 DO jj = 2, jpjm1 ! add the gradient of kinetic energy to the general momentum trends 100 88 DO ji = fs_2, fs_jpim1 ! vector opt. 101 ! gradient of kinetic energy 102 zua = -( zhke(ji+1,jj ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 103 zva = -( zhke(ji ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 104 ! add to the general momentum trends 105 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 106 va(ji,jj,jk) = va(ji,jj,jk) + zva 89 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zhke(ji+1,jj ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 90 va(ji,jj,jk) = va(ji,jj,jk) - ( zhke(ji ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 107 91 END DO 108 92 END DO … … 111 95 ! ! =============== 112 96 113 ! save the Kinetic Energy trends for diagnostic 114 ! momentum trends 115 IF( l_trddyn ) THEN 116 ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) 117 ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) 118 119 CALL trd_mod(ztdua, ztdva, jpdtdkeg, 'DYN', kt) 97 IF( l_trddyn ) THEN ! save the Kinetic Energy trends for diagnostic 98 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 99 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 100 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_keg, 'DYN', kt ) 120 101 ENDIF 121 122 IF(ln_ctl) THEN ! print sum trends (used for debugging) 123 CALL prt_ctl(tab3d_1=ua, clinfo1=' keg - Ua: ', mask1=umask, & 124 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn') 125 ENDIF 126 102 ! 103 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' keg - Ua: ', mask1=umask, & 104 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 105 ! 127 106 END SUBROUTINE dyn_keg 128 107 -
trunk/NEMO/OPA_SRC/DYN/dynldf.F90
r474 r503 4 4 !! Ocean physics: lateral diffusivity trends 5 5 !!===================================================================== 6 !! History : 9.0 ! 05-11 (G. Madec) Original code (new step architecture) 7 !!---------------------------------------------------------------------- 6 8 7 9 !!---------------------------------------------------------------------- … … 9 11 !! dyn_ldf_ctl : initialization, namelist read, and parameters control 10 12 !!---------------------------------------------------------------------- 11 !! * Modules used 12 USE oce ! ocean dynamics and tracers 13 USE dom_oce ! ocean space and time domain 14 USE phycst ! physical constants 15 USE ldfdyn_oce ! ocean dynamics lateral physics 16 USE ldfslp ! ??? 17 USE dynldf_bilapg ! lateral mixing (dyn_ldf_bilapg routine) 18 USE dynldf_bilap ! lateral mixing (dyn_ldf_bilap routine) 19 USE dynldf_iso ! lateral mixing (dyn_ldf_iso routine) 20 USE dynldf_lap ! lateral mixing (dyn_ldf_lap routine) 21 USE trdmod ! ocean dynamics and tracer trends 22 USE trdmod_oce ! ocean variables trends 23 USE prtctl ! Print control 24 USE in_out_manager ! I/O manager 25 USE lib_mpp ! distribued memory computing library 26 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 13 USE oce ! ocean dynamics and tracers 14 USE dom_oce ! ocean space and time domain 15 USE phycst ! physical constants 16 USE ldfdyn_oce ! ocean dynamics lateral physics 17 USE ldfslp ! lateral mixing: slopes of mixing orientation 18 USE dynldf_bilapg ! lateral mixing (dyn_ldf_bilapg routine) 19 USE dynldf_bilap ! lateral mixing (dyn_ldf_bilap routine) 20 USE dynldf_iso ! lateral mixing (dyn_ldf_iso routine) 21 USE dynldf_lap ! lateral mixing (dyn_ldf_lap routine) 22 USE trdmod ! ocean dynamics and tracer trends 23 USE trdmod_oce ! ocean variables trends 24 USE prtctl ! Print control 25 USE in_out_manager ! I/O manager 26 USE lib_mpp ! distribued memory computing library 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 27 28 28 29 IMPLICIT NONE 29 30 PRIVATE 30 31 31 !! * Routine accessibility 32 PUBLIC dyn_ldf ! called by step.F90 32 PUBLIC dyn_ldf ! called by step module 33 33 34 !! * module variables 35 INTEGER :: & 36 nldf = 0 ! type of lateral diffusion used 37 ! ! defined from ln_dynldf_... namlist logicals) 34 INTEGER :: nldf = 0 ! type of lateral diffusion used defined from ln_dynldf_... namlist logicals) 38 35 39 36 !! * Substitutions … … 42 39 !!--------------------------------------------------------------------------------- 43 40 !! OPA 9.0 , LOCEAN-IPSL (2005) 44 !!--------------------------------------------------------------------------------- 41 !! $Header$ 42 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 43 !!---------------------------------------------------------------------- 45 44 46 45 CONTAINS … … 51 50 !! 52 51 !! ** Purpose : compute the lateral ocean dynamics physics. 52 !!---------------------------------------------------------------------- 53 INTEGER, INTENT(in) :: kt ! ocean time-step index 53 54 !! 54 !!---------------------------------------------------------------------- 55 !! * Arguments 56 INTEGER, INTENT( in ) :: kt ! ocean time-step index 57 58 !! * local declarations 59 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 60 ztrdu, ztrdv ! 3D temporary workspace 55 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D workspace 61 56 !!---------------------------------------------------------------------- 62 57 … … 69 64 70 65 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend 66 ! 67 CASE ( 0 ) ; CALL dyn_ldf_lap ( kt ) ! iso-level laplacian 68 CASE ( 1 ) ; CALL dyn_ldf_iso ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 69 CASE ( 2 ) ; CALL dyn_ldf_bilap ( kt ) ! iso-level bilaplacian 70 CASE ( 3 ) ; CALL dyn_ldf_bilapg ( kt ) ! s-coord. horizontal bilaplacian 71 ! 71 72 CASE ( -1 ) ! esopa: test all possibility with control print 72 CALL dyn_ldf_lap ( kt ) 73 IF(ln_ctl) THEN ! print sum trends (used for debugging) 74 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask, & 75 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 76 ENDIF 77 CALL dyn_ldf_iso ( kt ) 78 IF(ln_ctl) THEN ! print sum trends (used for debugging) 79 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask, & 80 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 81 ENDIF 82 CALL dyn_ldf_bilap ( kt ) 83 IF(ln_ctl) THEN ! print sum trends (used for debugging) 84 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask, & 85 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 86 ENDIF 87 CALL dyn_ldf_bilapg ( kt ) 88 IF(ln_ctl) THEN ! print sum trends (used for debugging) 89 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask, & 90 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 91 ENDIF 92 93 CASE ( 0 ) ! iso-level laplacian 94 CALL dyn_ldf_lap ( kt ) 95 CASE ( 1 ) ! rotated laplacian (except dk[ dk[.] ] part) 96 CALL dyn_ldf_iso ( kt ) 97 CASE ( 2 ) ! iso-level bilaplacian 98 CALL dyn_ldf_bilap ( kt ) 99 CASE ( 3 ) ! s-coord. horizontal bilaplacian 100 CALL dyn_ldf_bilapg ( kt ) 73 ; CALL dyn_ldf_lap ( kt ) 74 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask, & 75 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 76 ; CALL dyn_ldf_iso ( kt ) 77 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask, & 78 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 79 ; CALL dyn_ldf_bilap ( kt ) 80 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask, & 81 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 82 ; CALL dyn_ldf_bilapg ( kt ) 83 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask, & 84 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 101 85 END SELECT 102 86 103 ! ! save the horizontal diffusive trends for further diagnostics 104 IF( l_trddyn ) THEN 87 IF( l_trddyn ) THEN ! save the horizontal diffusive trends for further diagnostics 105 88 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 106 89 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 107 CALL trd_mod( ztrdu, ztrdv, jpd tdldf, 'DYN', kt )90 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_ldf, 'DYN', kt ) 108 91 ENDIF 109 110 IF(ln_ctl) THEN ! print mean trends (used for debugging) 111 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf - Ua: ', mask1=umask, & 112 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 113 ENDIF 114 92 ! ! print sum trends (used for debugging) 93 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf - Ua: ', mask1=umask, & 94 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 95 ! 115 96 END SUBROUTINE dyn_ldf 116 97 … … 121 102 !! 122 103 !! ** Purpose : initializations of the horizontal ocean dynamics physics 123 !!124 !! ** Method :125 !!126 !! History :127 !! 9.0 ! 05-11 (G. Madec) Original code128 104 !!---------------------------------------------------------------------- 129 !! * Local declarations130 105 INTEGER :: ioptio, ierr ! temporary integers 131 106 !!---------------------------------------------------------------------- 107 108 ! ! Namelist nam_dynldf: already read in ldfdyn module 132 109 133 ! Define the lateral dynamics physics parameters 134 ! ============================================= 135 136 ! Namelist nam_dynldf already read in ldfdyn module 137 138 IF(lwp) THEN 110 IF(lwp) THEN ! Namelist print 139 111 WRITE(numout,*) 140 WRITE(numout,*) 'dyn :ldf_ctl : Choice of the lateral diffusive operator on dynamics'112 WRITE(numout,*) 'dyn_ldf_ctl : Choice of the lateral diffusive operator on dynamics' 141 113 WRITE(numout,*) '~~~~~~~~~~~' 142 WRITE(numout,*) ' 143 WRITE(numout,*) ' 144 WRITE(numout,*) ' 145 WRITE(numout,*) ' 146 WRITE(numout,*) ' 147 WRITE(numout,*) ' 114 WRITE(numout,*) ' Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 115 WRITE(numout,*) ' laplacian operator ln_dynldf_lap = ', ln_dynldf_lap 116 WRITE(numout,*) ' bilaplacian operator ln_dynldf_bilap = ', ln_dynldf_bilap 117 WRITE(numout,*) ' iso-level ln_dynldf_level = ', ln_dynldf_level 118 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor = ', ln_dynldf_hor 119 WRITE(numout,*) ' iso-neutral ln_dynldf_iso = ', ln_dynldf_iso 148 120 ENDIF 149 121 150 ! control the consistency122 ! ! control the consistency 151 123 ioptio = 0 152 124 IF( ln_dynldf_lap ) ioptio = ioptio + 1 … … 159 131 IF( ioptio /= 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 160 132 161 ! defined the type of lateral diffusionfrom ln_dynldf_... logicals133 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 162 134 ierr = 0 163 135 IF ( ln_dynldf_lap ) THEN ! laplacian operator … … 196 168 ENDIF 197 169 ENDIF 170 171 IF( lk_esopa ) nldf = -1 ! esopa test 198 172 199 IF( ierr == 1 ) & 200 & CALL ctl_stop( ' iso-level in z-coordinate - partial step, not allowed' ) 201 IF( ierr == 2 ) & 202 & CALL ctl_stop( ' isoneutral bilaplacian operator does not exist' ) 173 IF( ierr == 1 ) CALL ctl_stop( 'iso-level in z-coordinate - partial step, not allowed' ) 174 IF( ierr == 2 ) CALL ctl_stop( 'isoneutral bilaplacian operator does not exist' ) 203 175 IF( nldf == 1 .OR. nldf == 3 ) THEN ! rotation 204 IF( .NOT.lk_ldfslp ) & 205 & CALL ctl_stop( ' the rotation of the diffusive tensor require key_ldfslp' ) 206 ENDIF 207 208 IF( lk_esopa ) THEN 209 IF(lwp ) WRITE(numout,*) ' esopa test: use all lateral physics options' 210 nldf = -1 176 IF( .NOT.lk_ldfslp ) CALL ctl_stop( 'the rotation of the diffusive tensor require key_ldfslp' ) 211 177 ENDIF 212 178 … … 219 185 IF( nldf == 3 ) WRITE(numout,*) ' Rotated bilaplacian' 220 186 ENDIF 221 187 ! 222 188 END SUBROUTINE dyn_ldf_ctl 223 189 -
trunk/NEMO/OPA_SRC/DYN/dynspg.F90
r474 r503 4 4 !! Ocean dynamics: surface pressure gradient control 5 5 !!====================================================================== 6 !! History : 9.0 ! 05-12 (C. Talandier, G. Madec) Original code 7 !! 9.0 ! 05-12 (V. Garnier) dyn_spg_ctl: Original code 8 !!---------------------------------------------------------------------- 6 9 7 10 !!---------------------------------------------------------------------- … … 9 12 !! dyn_spg_ctl : initialization, namelist read, and parameters control 10 13 !!---------------------------------------------------------------------- 11 !! * Modules used12 14 USE oce ! ocean dynamics and tracers variables 13 15 USE dom_oce ! ocean space and time domain variables … … 29 31 PRIVATE 30 32 31 !! * Accessibility32 33 PUBLIC dyn_spg ! routine called by step module 33 34 34 35 !! * module variables 35 INTEGER :: & 36 nspg = 0 ! type of surface pressure gradient scheme 37 ! ! defined from lk_dynspg_... 36 INTEGER :: nspg = 0 ! type of surface pressure gradient scheme defined from lk_dynspg_... 38 37 39 38 !! * Substitutions … … 43 42 !! OPA 9.0 , LOCEAN-IPSL (2005) 44 43 !! $Header$ 45 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt44 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 46 45 !!---------------------------------------------------------------------- 47 46 … … 53 52 !! 54 53 !! ** Purpose : compute the lateral ocean dynamics physics. 55 !! 56 !! History : 57 !! 9.0 ! 05-12 (C. Talandier, G. Madec) Original code 58 !!---------------------------------------------------------------------- 59 !! * Arguments 54 !!---------------------------------------------------------------------- 60 55 INTEGER, INTENT( in ) :: kt ! ocean time-step index 61 56 INTEGER, INTENT( out ) :: kindic ! solver flag 62 63 !! * local declarations 57 !! 64 58 REAL(wp) :: z2dt ! temporary scalar 65 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 66 ztrdu, ztrdv ! 3D temporary workspace 59 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D workspace 67 60 !!---------------------------------------------------------------------- 68 61 … … 75 68 76 69 SELECT CASE ( nspg ) ! compute surf. pressure gradient trend and add it to the general trend 70 ! ! k-j-i loops 71 CASE ( 0 ) ; CALL dyn_spg_exp ( kt ) ! explicit 72 CASE ( 1 ) ; CALL dyn_spg_ts ( kt ) ! time-splitting 73 CASE ( 2 ) ; CALL dyn_spg_flt ( kt, kindic ) ! filtered 74 CASE ( 3 ) ; CALL dyn_spg_rl ( kt, kindic ) ! rigid lid 75 ! ! j-k-i loops 76 CASE ( 10 ) ; CALL dyn_spg_exp_jki( kt ) ! explicit with j-k-i loop 77 CASE ( 11 ) ; CALL dyn_spg_ts_jki ( kt ) ! time-splitting with j-k-i loop 78 CASE ( 12 ) ; CALL dyn_spg_flt_jki( kt, kindic ) ! filtered with j-k-i loop 79 ! 77 80 CASE ( -1 ) ! esopa: test all possibility with control print 78 CALL dyn_spg_exp ( kt ) 79 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg0 - Ua: ', mask1=umask, & 80 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 81 CALL dyn_spg_ts ( kt ) 82 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg1 - Ua: ', mask1=umask, & 83 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 84 CALL dyn_spg_flt ( kt, kindic ) 85 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg2 - Ua: ', mask1=umask, & 86 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 87 CALL dyn_spg_exp_jki( kt ) 88 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg10- Ua: ', mask1=umask, & 89 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 90 CALL dyn_spg_ts_jki ( kt ) 91 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg12- Ua: ', mask1=umask, & 92 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 93 CALL dyn_spg_flt_jki( kt, kindic ) 94 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg13- Ua: ', mask1=umask, & 95 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 96 CASE ( 0 ) ! explicit 97 CALL dyn_spg_exp ( kt ) 98 CASE ( 1 ) ! time-splitting 99 CALL dyn_spg_ts ( kt ) 100 CASE ( 2 ) ! filtered 101 CALL dyn_spg_flt ( kt, kindic ) 102 CASE ( 3 ) ! rigid lid 103 CALL dyn_spg_rl ( kt, kindic ) 104 105 CASE ( 10 ) ! explicit with j-k-i loop 106 CALL dyn_spg_exp_jki( kt ) 107 CASE ( 11 ) ! time-splitting with j-k-i loop 108 CALL dyn_spg_ts_jki ( kt ) 109 CASE ( 12 ) ! filtered with j-k-i loop 110 CALL dyn_spg_flt_jki( kt, kindic ) 81 ; CALL dyn_spg_exp ( kt ) 82 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' spg0 - Ua: ', mask1=umask, & 83 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 84 ; CALL dyn_spg_ts ( kt ) 85 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' spg1 - Ua: ', mask1=umask, & 86 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 87 ; CALL dyn_spg_flt ( kt, kindic ) 88 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' spg2 - Ua: ', mask1=umask, & 89 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 90 ; CALL dyn_spg_exp_jki( kt ) 91 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' spg10- Ua: ', mask1=umask, & 92 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 93 ; CALL dyn_spg_ts_jki ( kt ) 94 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' spg12- Ua: ', mask1=umask, & 95 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 96 ; CALL dyn_spg_flt_jki( kt, kindic ) 97 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' spg13- Ua: ', mask1=umask, & 98 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 111 99 END SELECT 112 113 ! ! save the horizontal diffusive trends for further diagnostics 114 IF( l_trddyn ) THEN 100 ! 101 IF( l_trddyn ) THEN ! save the horizontal diffusive trends for further diagnostics 115 102 SELECT CASE ( nspg ) 116 103 CASE ( 0, 1, 3, 10, 11 ) … … 123 110 ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / z2dt - ztrdv(:,:,:) 124 111 END SELECT 125 CALL trd_mod( ztrdu, ztrdv, jpdtdspg, 'DYN', kt ) 126 ENDIF 127 112 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_spg, 'DYN', kt ) 113 ENDIF 128 114 ! ! print mean trends (used for debugging) 129 115 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg - Ua: ', mask1=umask, & 130 116 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 131 117 ! 132 118 END SUBROUTINE dyn_spg 133 119 … … 139 125 !! ** Purpose : Control the consistency between cpp options for 140 126 !! surface pressure gradient schemes 141 !!142 !! History :143 !! 9.0 ! 05-10 (V. Garnier) Original code : spg re-organization144 127 !!---------------------------------------------------------------------- 145 128 !! * Local declarations -
trunk/NEMO/OPA_SRC/DYN/dynspg_flt_jki.F90
r474 r503 9 9 !! 'key_mpp_omp' j-k-i loop (vector opt.) 10 10 !!---------------------------------------------------------------------- 11 !!---------------------------------------------------------------------- 11 12 !! dyn_spg_flt_jki : Update the momentum trend with the surface pressure 12 13 !! gradient for the free surf. constant volume case 13 14 !! with auto-tasking (j-slab) (no vectior opt.) 14 15 !!---------------------------------------------------------------------- 15 !! OPA 9.0 , LOCEAN-IPSL (2005)16 !! $Header$17 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt18 !!----------------------------------------------------------------------19 !! * Modules used20 16 USE oce ! ocean dynamics and tracers 21 17 USE dom_oce ! ocean space and time domain … … 51 47 !! OPA 9.0 , LOCEAN-IPSL (2005) 52 48 !! $Header$ 53 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt49 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 54 50 !!---------------------------------------------------------------------- 55 51 … … 100 96 !! ** Action : - Update (ua,va) with the surf. pressure gradient trend 101 97 !! 102 !! References : 103 !! Roullet and Madec 1999, JGR. 104 !! 105 !! History : 106 !! ! 98-05 (G. Roullet) Original code 107 !! ! 98-10 (G. Madec, M. Imbard) release 8.2 108 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 109 !! ! 02-11 (C. Talandier, A-M Treguier) Open boundaries 110 !! 9.0 ! 04-08 (C. Talandier) New trends organization 111 !! " ! 05-11 (V. Garnier) Surface pressure gradient organization 98 !! References : Roullet and Madec 1999, JGR. 112 99 !!--------------------------------------------------------------------- 113 !! * Arguments114 100 INTEGER, INTENT( in ) :: kt ! ocean time-step index 115 INTEGER, INTENT( out ) :: kindic ! solver convergence flag 116 ! if the solver doesn t converge 117 ! the flag is < 0 118 !! * Local declarations 101 INTEGER, INTENT( out ) :: kindic ! solver convergence flag, <0 if the solver doesn t converge 102 !! 119 103 INTEGER :: ji, jj, jk ! dummy loop indices 120 104 REAL(wp) :: & ! temporary scalars … … 154 138 spgv(ji,jj) = - grav * ( sshn(ji ,jj+1) - sshn(ji,jj) ) / e2v(ji,jj) 155 139 END DO 156 157 140 ! Add the surface pressure trend to the general trend 158 141 DO jk = 1, jpkm1 … … 162 145 END DO 163 146 END DO 164 165 147 ! Evaluate the masked next velocity (effect of the additional force not included) 166 148 DO jk = 1, jpkm1 … … 170 152 END DO 171 153 END DO 172 173 154 ! ! =============== 174 155 END DO ! End of slab … … 202 183 spgv(ji,jj) = 0.e0 203 184 END DO 204 205 185 ! vertical sum 206 186 DO jk = 1, jpk … … 210 190 END DO 211 191 END DO 212 213 192 ! transport: multiplied by the horizontal scale factor 214 193 DO ji = 2, jpim1 … … 216 195 spgv(ji,jj) = spgv(ji,jj) * e1v(ji,jj) 217 196 END DO 218 219 197 ! ! =============== 220 198 END DO ! End of slab … … 302 280 WRITE(ctmp1,*) ' ~~~~~~~~~~~~~~~~ not = ', nsolv 303 281 CALL ctl_stop( ' dyn_spg_flt_jki : e r r o r, nsolv = 1, 2, 3 or 4', ctmp1 ) 304 ENDIF 305 306 !,,,,,,,,,,,,,,,,,,,,,,,,,,,,,synchro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 307 308 !CDIR PARALLEL DO 309 !$OMP PARALLEL DO 282 ENDIF 283 ENDIF 284 285 !,,,,,,,,,,,,,,,,,,,,,,,,,,,,,synchro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 286 310 287 ! ! =============== 311 288 DO jj = 2, jpjm1 ! Vertical slab … … 353 330 ! 8. Sea surface elevation time stepping 354 331 ! -------------------------------------- 355 ! Euler (forward) time stepping, no time filter 356 IF( neuler == 0 .AND. kt == nit000 ) THEN 332 IF( neuler == 0 .AND. kt == nit000 ) THEN ! Euler (forward) time stepping, no time filter 357 333 DO ji = 1, jpi 358 334 ! after free surface elevation … … 362 338 sshn(ji,jj) = zssha 363 339 END DO 364 ELSE 365 ! Leap-frog time stepping and time filter 340 ELSE ! Leap-frog time stepping and time filter 366 341 DO ji = 1, jpi 367 342 ! after free surface elevation … … 384 359 CALL prt_ctl( tab2d_1=sshn, clinfo1=' spg - ssh: ', mask1=tmask) 385 360 ENDIF 386 387 361 ! 388 362 END SUBROUTINE dyn_spg_flt_jki 389 363 -
trunk/NEMO/OPA_SRC/DYN/dynvor.F90
r474 r503 5 5 !! planetary vorticity trends 6 6 !!====================================================================== 7 !! History : 1.0 ! 89-12 (P. Andrich) vor_ens: Original code 8 !! 5.0 ! 91-11 (G. Madec) vor_ene, vor_mix: Original code 9 !! 6.0 ! 96-01 (G. Madec) s-coord, suppress work arrays 10 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 11 !! 8.5 ! 04-02 (G. Madec) vor_een: Original code 12 !! 9.0 ! 03-08 (G. Madec) vor_ctl: Original code 13 !! 9.0 ! 05-11 (G. Madec) dyn_vor: Original code (new step architecture) 14 !!---------------------------------------------------------------------- 7 15 8 16 !!---------------------------------------------------------------------- … … 14 22 !! vor_ctl : control of the different vorticity option 15 23 !!---------------------------------------------------------------------- 16 !! * Modules used 17 USE oce ! ocean dynamics and tracers 18 USE dom_oce ! ocean space and time domain 19 USE in_out_manager ! I/O manager 20 USE trdmod ! ocean dynamics trends 21 USE trdmod_oce ! ocean variables trends 22 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 23 USE prtctl ! Print control 24 USE oce ! ocean dynamics and tracers 25 USE dom_oce ! ocean space and time domain 26 USE trdmod ! ocean dynamics trends 27 USE trdmod_oce ! ocean variables trends 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 USE prtctl ! Print control 30 USE in_out_manager ! I/O manager 24 31 25 32 IMPLICIT NONE 26 33 PRIVATE 27 34 28 !! * Routine accessibility 29 PUBLIC dyn_vor ! routine called by step.F90 30 31 !! * Shared module variables 35 PUBLIC dyn_vor ! routine called by step.F90 36 37 !!* Namelist nam_dynvor: vorticity term 32 38 LOGICAL, PUBLIC :: ln_dynvor_ene = .FALSE. !: energy conserving scheme 33 39 LOGICAL, PUBLIC :: ln_dynvor_ens = .TRUE. !: enstrophy conserving scheme 34 40 LOGICAL, PUBLIC :: ln_dynvor_mix = .FALSE. !: mixed scheme 35 LOGICAL, PUBLIC :: ln_dynvor_een = .FALSE. !: energy and enstrophy conserving scheme 36 37 !! * module variables 38 INTEGER :: & 39 nvor = 0 ! type of vorticity trend used 41 LOGICAL, PUBLIC :: ln_dynvor_een = .FALSE. !: energy and enstrophy conserving scheme 42 NAMELIST/nam_dynvor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een 43 44 INTEGER :: nvor = 0 ! type of vorticity trend used 40 45 41 46 !! * Substitutions … … 43 48 # include "vectopt_loop_substitute.h90" 44 49 !!---------------------------------------------------------------------- 45 !! OPA 9.0 , LOCEAN-IPSL (2005) 50 !! OPA 9.0 , LOCEAN-IPSL (2006) 51 !! $Header$ 52 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 46 53 !!---------------------------------------------------------------------- 47 54 … … 54 61 !! 55 62 !! ** Action : - Update (ua,va) with the now vorticity term trend 56 !! - save the trends in ( utrd,vtrd) in 2 parts (relative63 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 57 64 !! and planetary vorticity trends) ('key_trddyn') 58 !! 59 !! History : 60 !! 9.0 ! 05-11 (G. Madec) Original code 61 !!---------------------------------------------------------------------- 62 USE oce, ONLY : ztrdu => ta, & ! use ta as 3D workspace 63 ztrdv => sa ! use sa as 3D workspace 64 65 !! * Arguments 66 INTEGER, INTENT( in ) :: kt ! ocean time-step index 65 !!---------------------------------------------------------------------- 66 USE oce, ONLY : ztrdu => ta ! use ta as 3D workspace 67 USE oce, ONLY : ztrdv => sa ! use sa as 3D workspace 68 !! 69 INTEGER, INTENT( in ) :: kt ! ocean time-step index 67 70 !!---------------------------------------------------------------------- 68 71 … … 74 77 CASE ( -1 ) ! esopa: test all possibility with control print 75 78 CALL vor_ene( kt, 'TOT', ua, va ) 76 IF(ln_ctl)CALL prt_ctl( tab3d_1=ua, clinfo1=' vor0 - Ua: ', mask1=umask, &77 & 79 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor0 - Ua: ', mask1=umask, & 80 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 78 81 CALL vor_ens( kt, 'TOT', ua, va ) 79 IF(ln_ctl)CALL prt_ctl( tab3d_1=ua, clinfo1=' vor1 - Ua: ', mask1=umask, &80 & 82 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor1 - Ua: ', mask1=umask, & 83 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 81 84 CALL vor_mix( kt ) 82 IF(ln_ctl)CALL prt_ctl( tab3d_1=ua, clinfo1=' vor2 - Ua: ', mask1=umask, &83 & 85 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor2 - Ua: ', mask1=umask, & 86 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 84 87 CALL vor_een( kt, 'TOT', ua, va ) 85 IF(ln_ctl)CALL prt_ctl( tab3d_1=ua, clinfo1=' vor3 - Ua: ', mask1=umask, &86 & 88 CALL prt_ctl( tab3d_1=ua, clinfo1=' vor3 - Ua: ', mask1=umask, & 89 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 87 90 88 91 CASE ( 0 ) ! energy conserving scheme … … 93 96 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 94 97 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 95 CALL trd_mod( ztrdu, ztrdv, jpd tdrvo, 'DYN', kt )98 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 96 99 ztrdu(:,:,:) = ua(:,:,:) 97 100 ztrdv(:,:,:) = va(:,:,:) … … 99 102 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 100 103 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 101 CALL trd_mod( ztrdu, ztrdu, jpd tdpvo, 'DYN', kt )102 CALL trd_mod( ztrdu, ztrdv, jpd tddat, 'DYN', kt )104 CALL trd_mod( ztrdu, ztrdu, jpdyn_trd_pvo, 'DYN', kt ) 105 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 103 106 ELSE 104 107 CALL vor_ene( kt, 'TOT', ua, va ) ! total vorticity … … 112 115 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 113 116 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 114 CALL trd_mod( ztrdu, ztrdv, jpd tdrvo, 'DYN', kt )117 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 115 118 ztrdu(:,:,:) = ua(:,:,:) 116 119 ztrdv(:,:,:) = va(:,:,:) … … 118 121 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 119 122 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 120 CALL trd_mod( ztrdu, ztrdu, jpd tdpvo, 'DYN', kt )121 CALL trd_mod( ztrdu, ztrdv, jpd tddat, 'DYN', kt )123 CALL trd_mod( ztrdu, ztrdu, jpdyn_trd_pvo, 'DYN', kt ) 124 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 122 125 ELSE 123 126 CALL vor_ens( kt, 'TOT', ua, va ) ! total vorticity … … 131 134 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 132 135 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 133 CALL trd_mod( ztrdu, ztrdv, jpd tdrvo, 'DYN', kt )136 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 134 137 ztrdu(:,:,:) = ua(:,:,:) 135 138 ztrdv(:,:,:) = va(:,:,:) … … 137 140 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 138 141 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 139 CALL trd_mod( ztrdu, ztrdu, jpd tdpvo, 'DYN', kt )140 CALL trd_mod( ztrdu, ztrdv, jpd tddat, 'DYN', kt )142 CALL trd_mod( ztrdu, ztrdu, jpdyn_trd_pvo, 'DYN', kt ) 143 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 141 144 ELSE 142 145 CALL vor_mix( kt ) ! total vorticity (mix=ens-ene) … … 150 153 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 151 154 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 152 CALL trd_mod( ztrdu, ztrdv, jpd tdrvo, 'DYN', kt )155 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt ) 153 156 ztrdu(:,:,:) = ua(:,:,:) 154 157 ztrdv(:,:,:) = va(:,:,:) … … 156 159 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 157 160 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 158 CALL trd_mod( ztrdu, ztrdu, jpd tdpvo, 'DYN', kt )159 CALL trd_mod( ztrdu, ztrdv, jpd tddat, 'DYN', kt )161 CALL trd_mod( ztrdu, ztrdu, jpdyn_trd_pvo, 'DYN', kt ) 162 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt ) 160 163 ELSE 161 164 CALL vor_een( kt, 'TOT', ua, va ) ! total vorticity … … 192 195 !! 193 196 !! ** Action : - Update (ua,va) with the now vorticity term trend 194 !! - save the trends in ( utrd,vtrd) in 2 parts (relative197 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 195 198 !! and planetary vorticity trends) ('key_trddyn') 196 199 !! 197 !! References : 198 !! Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 199 !! History : 200 !! 5.0 ! 91-11 (G. Madec) Original code 201 !! 6.0 ! 96-01 (G. Madec) s-coord, suppress work arrays 202 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 203 !! 9.0 ! 04-08 (C. Talandier) New trends organization 204 !!---------------------------------------------------------------------- 205 !! * Arguments 206 INTEGER, INTENT( in ) :: kt ! ocean time-step index 207 CHARACTER(len=3) , INTENT( in ) :: & 208 cd_vor ! define the vorticity considered 209 ! ! ='COR' (planetary) ; ='VOR' (relative) ; ='TOT' (total) 210 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: & 211 pua, pva ! ???? 212 213 !! * Local declarations 214 INTEGER :: ji, jj, jk ! dummy loop indices 215 REAL(wp) :: & 216 zfact2, & ! temporary scalars 217 zx1, zx2, zy1, zy2 ! " " 218 REAL(wp), DIMENSION(jpi,jpj) :: & 219 zwx, zwy, zwz ! temporary workspace 200 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 201 !!---------------------------------------------------------------------- 202 INTEGER , INTENT(in ) :: kt ! ocean time-step index 203 CHARACTER(len=3) , INTENT(in ) :: cd_vor ! ='COR' (planetary) ; ='VOR' (relative) 204 ! ! ='TOT' (total) 205 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua ! total u-trend 206 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 207 !! 208 INTEGER :: ji, jj, jk ! dummy loop indices 209 REAL(wp) :: zx1, zy1, zfact2 ! temporary scalars 210 REAL(wp) :: zx2, zy2 ! " " 211 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 2D workspace 220 212 !!---------------------------------------------------------------------- 221 213 … … 234 226 DO jk = 1, jpkm1 ! Horizontal slab 235 227 ! ! =============== 236 237 228 ! Potential vorticity and horizontal fluxes 238 229 ! ----------------------------------------- 239 230 SELECT CASE( cd_vor ) ! vorticity considered 240 CASE ( 'COR' ) ! planetary vorticcity (Coriolis) 241 zwz(:,:) = ff(:,:) 242 CASE ( 'VOR' ) ! relative vorticity 243 zwz(:,:) = rotn(:,:,jk) 244 CASE ( 'TOT' ) ! total vorticity (planetary + relative) 245 zwz(:,:) = rotn(:,:,jk) + ff(:,:) 231 CASE ( 'COR' ) ; zwz(:,:) = ff(:,:) ! planetary vorticity (Coriolis) 232 CASE ( 'VOR' ) ; zwz(:,:) = rotn(:,:,jk) ! relative vorticity 233 CASE ( 'TOT' ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) ! total vorticity 246 234 END SELECT 247 235 … … 270 258 END DO ! End of slab 271 259 ! ! =============== 272 273 260 END SUBROUTINE vor_ene 274 261 … … 300 287 !! 301 288 !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 302 !! - Save the trends in ( utrd,vtrd) in 2 parts (relative289 !! - Save the trends in (ztrdu,ztrdv) in 2 parts (relative 303 290 !! and planetary vorticity trends) ('key_trddyn') 304 291 !! 305 !! References : 306 !! Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 307 !! History : 308 !! 5.0 ! 91-11 (G. Madec) Original code, enstrophy-energy-combined schemes 309 !! 6.0 ! 96-01 (G. Madec) s-coord, suppress work arrays 310 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 311 !! 9.0 ! 04-08 (C. Talandier) New trends organization 312 !!---------------------------------------------------------------------- 313 !! * Arguments 314 INTEGER, INTENT( in ) :: kt ! ocean timestep index 315 316 !! * Local declarations 317 INTEGER :: ji, jj, jk ! dummy loop indices 318 REAL(wp) :: & 319 zfact1, zfact2, zua, zva, & ! temporary scalars 320 zcua, zcva, zx1, zx2, zy1, zy2 321 REAL(wp), DIMENSION(jpi,jpj) :: & 322 zwx, zwy, zwz, zww ! temporary workspace 292 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 293 !!---------------------------------------------------------------------- 294 INTEGER, INTENT(in) :: kt ! ocean timestep index 295 !! 296 INTEGER :: ji, jj, jk ! dummy loop indices 297 REAL(wp) :: zfact1, zua, zcua, zx1, zy1 ! temporary scalars 298 REAL(wp) :: zfact2, zva, zcva, zx2, zy2 ! " " 299 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz, zww ! temporary 3D workspace 323 300 !!---------------------------------------------------------------------- 324 301 … … 367 344 zcua = zfact2 * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 368 345 zcva =-zfact2 * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 369 346 ! mixed vorticity trend added to the momentum trends 370 347 ua(ji,jj,jk) = ua(ji,jj,jk) + zcua + zua 371 348 va(ji,jj,jk) = va(ji,jj,jk) + zcva + zva … … 375 352 END DO ! End of slab 376 353 ! ! =============== 377 378 354 END SUBROUTINE vor_mix 379 355 … … 400 376 !! 401 377 !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 402 !! - Save the trends in ( utrd,vtrd) in 2 parts (relative378 !! - Save the trends in (ztrdu,ztrdv) in 2 parts (relative 403 379 !! and planetary vorticity trends) ('key_trddyn') 404 380 !! 405 !! References : 406 !! Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 407 !! History : 408 !! 5.0 ! 91-11 (G. Madec) Original code 409 !! 6.0 ! 96-01 (G. Madec) s-coord, suppress work arrays 410 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 411 !! 9.0 ! 04-08 (C. Talandier) New trends organization 412 !!---------------------------------------------------------------------- 413 !! * Arguments 414 INTEGER, INTENT( in ) :: kt ! ocean timestep 415 CHARACTER(len=3) , INTENT( in ) :: & 416 cd_vor ! define the vorticity considered 417 ! ! ='COR' (planetary) ; ='VOR' (relative) ; ='TOT' (total) 418 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: & 419 pua, pva ! ???? 420 421 !! * Local declarations 422 INTEGER :: ji, jj, jk ! dummy loop indices 423 REAL(wp) :: & 424 zfact1, zuav, zvau ! temporary scalars 425 REAL(wp), DIMENSION(jpi,jpj) :: & 426 zwx, zwy, zwz ! temporary workspace 381 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 382 !!---------------------------------------------------------------------- 383 INTEGER , INTENT(in ) :: kt ! ocean time-step index 384 CHARACTER(len=3) , INTENT(in ) :: cd_vor ! ='COR' (planetary) ; ='VOR' (relative) 385 ! ! ='TOT' (total) 386 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua ! total u-trend 387 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 388 !! 389 INTEGER :: ji, jj, jk ! dummy loop indices 390 REAL(wp) :: zfact1, zuav, zvau ! temporary scalars 391 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 3D workspace 427 392 !!---------------------------------------------------------------------- 428 393 … … 441 406 DO jk = 1, jpkm1 ! Horizontal slab 442 407 ! ! =============== 443 444 408 ! Potential vorticity and horizontal fluxes 445 409 ! ----------------------------------------- 446 410 SELECT CASE( cd_vor ) ! vorticity considered 447 CASE ( 'COR' ) ! planetary vorticcity (Coriolis) 448 zwz(:,:) = ff(:,:) 449 CASE ( 'VOR' ) ! relative vorticity 450 zwz(:,:) = rotn(:,:,jk) 451 CASE ( 'TOT' ) ! total vorticity (planetary + relative) 452 zwz(:,:) = rotn(:,:,jk) + ff(:,:) 411 CASE ( 'COR' ) ; zwz(:,:) = ff(:,:) ! planetary vorticity (Coriolis) 412 CASE ( 'VOR' ) ; zwz(:,:) = rotn(:,:,jk) ! relative vorticity 413 CASE ( 'TOT' ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) ! total vorticity 453 414 END SELECT 454 415 … … 470 431 ENDIF 471 432 472 473 433 ! Compute and add the vorticity term trend 474 434 ! ---------------------------------------- … … 476 436 DO ji = fs_2, fs_jpim1 ! vector opt. 477 437 zuav = zfact1 / e1u(ji,jj) * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) & 478 438 & + zwy(ji ,jj ) + zwy(ji+1,jj ) ) 479 439 zvau =-zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 480 + zwx(ji ,jj ) + zwx(ji ,jj+1) ) 481 440 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) 482 441 pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 483 442 pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj ) + zwz(ji,jj) ) … … 487 446 END DO ! End of slab 488 447 ! ! =============== 489 490 448 END SUBROUTINE vor_ens 491 449 … … 509 467 !! 510 468 !! ** Action : - Update (ua,va) with the now vorticity term trend 511 !! - save the trends in ( utrd,vtrd) in 2 parts (relative469 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 512 470 !! and planetary vorticity trends) ('key_trddyn') 513 471 !! 514 !! References : 515 !! Arakawa and Lamb 1980, A potential enstrophy and energy conserving 516 !! scheme for the Shallow water equations, 517 !! Monthly Weather Review, vol. 109, p 18-36 518 !! 519 !! History : 520 !! 8.5 ! 04-02 (G. Madec) Original code 521 !! 9.0 ! 04-08 (C. Talandier) New trends organization 522 !!---------------------------------------------------------------------- 523 !! * Arguments 524 INTEGER, INTENT( in ) :: kt ! ocean time-step index 525 CHARACTER(len=3) , INTENT( in ) :: & 526 cd_vor ! define the vorticity considered 527 ! ! ='COR' (planetary) ; ='VOR' (relative) ; ='TOT' (total) 528 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: & 529 pua, pva ! ???? 530 531 !! * Local declarations 532 INTEGER :: ji, jj, jk ! dummy loop indices 533 REAL(wp) :: & 534 zfac12, zua, zva ! temporary scalars 535 REAL(wp), DIMENSION(jpi,jpj) :: & 536 zwx, zwy, zwz, & ! temporary workspace 537 ztnw, ztne, ztsw, ztse ! " " 538 REAL(wp), DIMENSION(jpi,jpj,jpk), SAVE :: & 539 ze3f 472 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 473 !!---------------------------------------------------------------------- 474 INTEGER , INTENT(in ) :: kt ! ocean time-step index 475 CHARACTER(len=3) , INTENT(in ) :: cd_vor ! ='COR' (planetary) ; ='VOR' (relative) 476 ! ! ='TOT' (total) 477 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua ! total u-trend 478 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 479 !! 480 INTEGER :: ji, jj, jk ! dummy loop indices 481 REAL(wp) :: zfac12, zua, zva ! temporary scalars 482 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 2D workspace 483 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse ! temporary 3D workspace 484 REAL(wp), DIMENSION(jpi,jpj,jpk), SAVE :: ze3f 540 485 !!---------------------------------------------------------------------- 541 486 … … 570 515 ! ----------------------------------------- 571 516 SELECT CASE( cd_vor ) ! vorticity considered 572 CASE ( 'COR' ) ! planetary vorticcity (Coriolis) 573 zwz(:,:) = ff(:,:) * ze3f(:,:,jk) 574 CASE ( 'VOR' ) ! relative vorticity 575 zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) 576 CASE ( 'TOT' ) ! total vorticity (planetary + relative) 577 zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) 517 CASE ( 'COR' ) ; zwz(:,:) = ff(:,:) * ze3f(:,:,jk) ! planetary vorticity (Coriolis) 518 CASE ( 'VOR' ) ; zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) ! relative vorticity 519 CASE ( 'TOT' ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) ! total vorticity 578 520 END SELECT 579 521 … … 599 541 END DO 600 542 END DO 601 602 543 DO jj = 2, jpjm1 603 544 DO ji = fs_2, fs_jpim1 ! vector opt. … … 613 554 END DO ! End of slab 614 555 ! ! =============== 615 616 556 END SUBROUTINE vor_een 617 557 … … 623 563 !! ** Purpose : Control the consistency between cpp options for 624 564 !! tracer advection schemes 625 !! 626 !! History : 627 !! 9.0 ! 03-08 (G. Madec) Original code 628 !!---------------------------------------------------------------------- 629 !! * Local declarations 565 !!---------------------------------------------------------------------- 630 566 INTEGER :: ioptio ! temporary integer 631 632 NAMELIST/nam_dynvor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een 633 !!---------------------------------------------------------------------- 634 635 ! Read Namelist nam_dynvor : Vorticity scheme options 636 ! ------------------------ 637 REWIND ( numnam ) 567 !!---------------------------------------------------------------------- 568 569 REWIND ( numnam ) ! Read Namelist nam_dynvor : Vorticity scheme options 638 570 READ ( numnam, nam_dynvor ) 639 571 640 ! Control of vorticity scheme options 641 ! ----------------------------------- 642 ! Control print 643 IF(lwp) THEN 572 IF(lwp) THEN ! Namelist print 644 573 WRITE(numout,*) 645 574 WRITE(numout,*) 'dyn:vor_ctl : vorticity term : read namelist and control the consistency' 646 575 WRITE(numout,*) '~~~~~~~~~~~' 647 WRITE(numout,*) ' 648 WRITE(numout,*) ' 649 WRITE(numout,*) ' 650 WRITE(numout,*) ' 651 WRITE(numout,*) ' 576 WRITE(numout,*) ' Namelist nam_dynvor : oice of the vorticity term scheme' 577 WRITE(numout,*) ' energy conserving scheme ln_dynvor_ene = ', ln_dynvor_ene 578 WRITE(numout,*) ' enstrophy conserving scheme ln_dynvor_ens = ', ln_dynvor_ens 579 WRITE(numout,*) ' mixed enstrophy/energy conserving scheme ln_dynvor_mix = ', ln_dynvor_mix 580 WRITE(numout,*) ' enstrophy and energy conserving scheme ln_dynvor_een = ', ln_dynvor_een 652 581 ENDIF 653 582 654 ioptio = 0 655 IF( ln_dynvor_ene ) THEN 656 nvor = 0 657 IF(lwp) WRITE(numout,*) 658 IF(lwp) WRITE(numout,*) ' vorticity term : energy conserving scheme' 659 ioptio = ioptio + 1 583 ioptio = 0 ! Control of vorticity scheme options 584 IF( ln_dynvor_ene ) ioptio = ioptio + 1 585 IF( ln_dynvor_ens ) ioptio = ioptio + 1 586 IF( ln_dynvor_mix ) ioptio = ioptio + 1 587 IF( ln_dynvor_een ) ioptio = ioptio + 1 588 IF( lk_esopa ) ioptio = 1 589 590 IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 591 592 ! ! Set nvor 593 IF( ln_dynvor_ene ) nvor = 0 594 IF( ln_dynvor_ens ) nvor = 1 595 IF( ln_dynvor_mix ) nvor = 2 596 IF( ln_dynvor_een ) nvor = 3 597 IF( lk_esopa ) nvor = -1 598 599 IF(lwp) THEN ! Print the choice 600 WRITE(numout,*) 601 IF( nvor == 0 ) WRITE(numout,*) ' vorticity term used : energy conserving scheme' 602 IF( nvor == 1 ) WRITE(numout,*) ' vorticity term used : enstrophy conserving scheme' 603 IF( nvor == 2 ) WRITE(numout,*) ' vorticity term used : mixed enstrophy/energy conserving scheme' 604 IF( nvor == 3 ) WRITE(numout,*) ' vorticity term used : energy and enstrophy conserving scheme' 605 IF( nvor == -1 ) WRITE(numout,*) ' esopa test: use all lateral physics options' 660 606 ENDIF 661 IF( ln_dynvor_ens ) THEN 662 nvor = 1 663 IF(lwp) WRITE(numout,*) 664 IF(lwp) WRITE(numout,*) ' vorticity term : enstrophy conserving scheme' 665 ioptio = ioptio + 1 666 ENDIF 667 IF( ln_dynvor_mix ) THEN 668 nvor = 2 669 IF(lwp) WRITE(numout,*) 670 IF(lwp) WRITE(numout,*) ' vorticity term : mixed enstrophy/energy conserving scheme' 671 ioptio = ioptio + 1 672 ENDIF 673 IF( ln_dynvor_een ) THEN 674 nvor = 3 675 IF(lwp) WRITE(numout,*) 676 IF(lwp) WRITE(numout,*) ' vorticity term : energy and enstrophy conserving scheme' 677 ioptio = ioptio + 1 678 ENDIF 679 IF( ioptio /= 1 .AND. .NOT. lk_esopa ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 680 IF( lk_esopa ) THEN 681 nvor = -1 682 IF(lwp ) WRITE(numout,*) ' esopa test: use all lateral physics options' 683 ENDIF 684 IF(lwp) WRITE(numout,*) ' choice of vor_... nvor = ', nvor 685 607 ! 686 608 END SUBROUTINE vor_ctl 687 609 688 !!==============================================================================610 !!============================================================================== 689 611 END MODULE dynvor -
trunk/NEMO/OPA_SRC/DYN/dynzad.F90
r455 r503 4 4 !! Ocean dynamics : vertical advection trend 5 5 !!====================================================================== 6 !! History : 6.0 ! 91-01 (G. Madec) Original code 7 !! 7.0 ! 91-11 (G. Madec) 8 !! 7.5 ! 96-01 (G. Madec) statement function for e3 9 !! 8.5 ! 02-07 (G. Madec) j-k-i case: Original code 10 !! 8.5 ! 02-07 (G. Madec) Free form, F90 11 !!---------------------------------------------------------------------- 6 12 7 13 !!---------------------------------------------------------------------- 8 !! dyn_zad : vertical advection momentum trend 9 !!---------------------------------------------------------------------- 10 !! * Modules used 11 USE oce ! ocean dynamics and tracers 12 USE dom_oce ! ocean space and time domain 13 USE in_out_manager ! I/O manager 14 USE trdmod ! ocean dynamics trends 15 USE trdmod_oce ! ocean variables trends 16 USE flxrnf ! ocean runoffs 17 USE prtctl ! Print control 14 !! dyn_zad : vertical advection momentum trend 15 !!---------------------------------------------------------------------- 16 USE oce ! ocean dynamics and tracers 17 USE dom_oce ! ocean space and time domain 18 USE in_out_manager ! I/O manager 19 USE trdmod ! ocean dynamics trends 20 USE trdmod_oce ! ocean variables trends 21 USE flxrnf ! ocean runoffs 22 USE prtctl ! Print control 18 23 19 24 IMPLICIT NONE 20 25 PRIVATE 21 26 22 !! * Accessibility 23 PUBLIC dyn_zad ! routine called by step.F90 27 PUBLIC dyn_zad ! routine called by step.F90 24 28 25 29 !! * Substitutions … … 29 33 !! OPA 9.0 , LOCEAN-IPSL (2005) 30 34 !! $Header$ 31 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt35 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 32 36 !!---------------------------------------------------------------------- 33 37 … … 54 58 !! 55 59 !! ** Action : - Update (ua,va) with the vert. momentum advection trends 56 !! - Save the trends in (utrd,vtrd) ('key_trddyn') 57 !! 58 !! History : 59 !! 6.0 ! 91-01 (G. Madec) Original code 60 !! 7.0 ! 91-11 (G. Madec) 61 !! 7.5 ! 96-01 (G. Madec) statement function for e3 62 !! 8.5 ! 02-07 (G. Madec) Free form, F90 63 !! 9.0 ! 04-08 (C. Talandier) New trends organization 64 !!---------------------------------------------------------------------- 65 !! * modules used 66 USE oce, ONLY: zwuw => ta, & ! use ta as 3D workspace 67 zwvw => sa ! use sa as 3D workspace 68 69 !! * Arguments 70 INTEGER, INTENT( in ) :: kt ! ocean time-step inedx 71 72 !! * Local declarations 73 INTEGER :: ji, jj, jk ! dummy loop indices 74 REAL(wp) :: zvn, zua, zva ! temporary scalars 75 REAL(wp), DIMENSION(jpi) :: & 76 zww ! temporary workspace 77 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 78 ztdua, ztdva ! temporary workspace 60 !! - Save the trends in (ztrdu,ztrdv) ('key_trddyn') 61 !!---------------------------------------------------------------------- 62 USE oce, ONLY: zwuw => ta ! use ta as 3D workspace 63 USE oce, ONLY: zwvw => sa ! use sa as 3D workspace 64 !! 65 INTEGER, INTENT(in) :: kt ! ocean time-step inedx 66 !! 67 INTEGER :: ji, jj, jk ! dummy loop indices 68 REAL(wp) :: zvn, zua, zva ! temporary scalars 69 REAL(wp), DIMENSION(jpi) :: zww ! 1D workspace 70 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D workspace 79 71 !!---------------------------------------------------------------------- 80 72 … … 85 77 ENDIF 86 78 87 ! Save ua and va trends 88 IF( l_trddyn ) THEN 89 ztdua(:,:,:) = ua(:,:,:) 90 ztdva(:,:,:) = va(:,:,:) 79 IF( l_trddyn ) THEN ! Save ua and va trends 80 ztrdu(:,:,:) = ua(:,:,:) 81 ztrdv(:,:,:) = va(:,:,:) 91 82 ENDIF 92 83 … … 94 85 DO jj = 2, jpjm1 ! Vertical slab 95 86 ! ! =============== 96 97 ! Vertical momentum advection at level w and u- and v- vertical 98 ! ---------------------------------------------------------------- 99 DO jk = 2, jpkm1 100 ! vertical fluxes 101 DO ji = 2, jpi 87 DO jk = 2, jpkm1 ! Vertical momentum advection at uw and vw-pts 88 DO ji = 2, jpi ! vertical fluxes 102 89 zww(ji) = 0.25 * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk) 103 90 END DO 104 ! vertical momentum advection at w-point 105 DO ji = 2, jpim1 91 DO ji = 2, jpim1 ! vertical momentum advection at w-point 106 92 zvn = 0.25 * e1t(ji,jj+1) * e2t(ji,jj+1) * wn(ji,jj+1,jk) 107 93 zwuw(ji,jj,jk) = ( zww(ji+1) + zww(ji) ) * ( un(ji,jj,jk-1)-un(ji,jj,jk) ) … … 109 95 END DO 110 96 END DO 111 112 ! Surface and bottom values set to zero 113 DO ji = 2, jpim1 97 DO ji = 2, jpim1 ! Surface and bottom values set to zero 114 98 zwuw(ji,jj, 1 ) = 0.e0 115 99 zwvw(ji,jj, 1 ) = 0.e0 … … 117 101 zwvw(ji,jj,jpk) = 0.e0 118 102 END DO 119 120 ! Vertical momentum advection at u- and v-points 121 ! ---------------------------------------------- 122 DO jk = 1, jpkm1 103 ! 104 DO jk = 1, jpkm1 ! Vertical momentum advection at u- and v-points 123 105 DO ji = 2, jpim1 124 ! vertical momentum advective trends106 ! ! vertical momentum advective trends 125 107 zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 126 108 zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 127 ! add the trends to the general momentum trends109 ! ! add the trends to the general momentum trends 128 110 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 129 111 va(ji,jj,jk) = va(ji,jj,jk) + zva … … 133 115 END DO ! End of slab 134 116 ! ! =============== 135 136 ! save the vertical advection trends for diagnostic 137 ! momentum trends 138 IF( l_trddyn ) THEN 139 ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) 140 ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) 141 142 CALL trd_mod(ztdua, ztdva, jpdtdzad, 'DYN', kt) 143 ENDIF 144 145 IF(ln_ctl) THEN ! print sum trends (used for debugging) 146 CALL prt_ctl(tab3d_1=ua, clinfo1=' zad - Ua: ', mask1=umask, & 147 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn') 148 ENDIF 149 117 ! 118 IF( l_trddyn ) THEN ! save the vertical advection trends for diagnostic 119 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 120 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 121 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_zad, 'DYN', kt ) 122 ENDIF 123 ! ! Control print 124 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' zad - Ua: ', mask1=umask, & 125 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn' ) 126 ! 150 127 END SUBROUTINE dyn_zad 151 128 … … 169 146 !! 170 147 !! ** Action : - Update (ua,va) with the vert. momentum adv. trends 171 !! - Save the trends in (utrd,vtrd) ('key_trddyn') 172 !! 173 !! History : 174 !! 8.5 ! 02-07 (G. Madec) Original code 175 !!---------------------------------------------------------------------- 176 !! * modules used 177 USE oce, ONLY: zwuw => ta, & ! use ta as 3D workspace 178 zwvw => sa ! use sa as 3D workspace 179 !! * Arguments 180 INTEGER, INTENT( in ) :: kt ! ocean time-step inedx 181 182 !! * Local declarations 183 INTEGER :: ji, jj, jk ! dummy loop indices 184 REAL(wp) :: zua, zva ! temporary scalars 185 REAL(wp), DIMENSION(jpi,jpj) :: & 186 zww ! temporary workspace 187 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 188 ztdua, ztdva ! temporary workspace 148 !! - Save the trends in (ztrdu,ztrdv) ('key_trddyn') 149 !!---------------------------------------------------------------------- 150 USE oce, ONLY: zwuw => ta ! use ta as 3D workspace 151 USE oce, ONLY: zwvw => sa ! use sa as 3D workspace 152 !! 153 INTEGER, INTENT(in) :: kt ! ocean time-step inedx 154 !! 155 INTEGER :: ji, jj, jk ! dummy loop indices 156 REAL(wp) :: zua, zva ! temporary scalars 157 REAL(wp), DIMENSION(jpi,jpj) :: zww ! 2D workspace 158 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D workspace 189 159 !!---------------------------------------------------------------------- 190 160 … … 195 165 ENDIF 196 166 197 ! Save ua and va trends 198 IF( l_trddyn ) THEN 199 ztdua(:,:,:) = ua(:,:,:) 200 ztdva(:,:,:) = va(:,:,:) 167 IF( l_trddyn ) THEN ! Save ua and va trends 168 ztrdu(:,:,:) = ua(:,:,:) 169 ztrdv(:,:,:) = va(:,:,:) 201 170 ENDIF 202 171 203 ! Vertical momentum advection at level w and u- and v- vertical 204 ! ------------------------------------------------------------- 205 DO jk = 2, jpkm1 206 ! vertical fluxes 207 DO jj = 2, jpj 208 DO ji = fs_2, jpi ! vector opt. 172 DO jk = 2, jpkm1 ! Vertical momentum advection at level w and u- and v- vertical 173 DO jj = 2, jpj ! vertical fluxes 174 DO ji = fs_2, jpi ! vector opt. 209 175 zww(ji,jj) = 0.25 * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk) 210 176 END DO 211 177 END DO 212 ! vertical momentum advection at w-point 213 DO jj = 2, jpjm1 214 DO ji = fs_2, fs_jpim1 ! vector opt. 178 DO jj = 2, jpjm1 ! vertical momentum advection at w-point 179 DO ji = fs_2, fs_jpim1 ! vector opt. 215 180 zwuw(ji,jj,jk) = ( zww(ji+1,jj ) + zww(ji,jj) ) * ( un(ji,jj,jk-1)-un(ji,jj,jk) ) 216 181 zwvw(ji,jj,jk) = ( zww(ji ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1)-vn(ji,jj,jk) ) … … 218 183 END DO 219 184 END DO 220 221 ! Surface and bottom values set to zero 222 DO jj = 2, jpjm1 223 DO ji = fs_2, fs_jpim1 ! vector opt. 185 DO jj = 2, jpjm1 ! Surface and bottom values set to zero 186 DO ji = fs_2, fs_jpim1 ! vector opt. 224 187 zwuw(ji,jj, 1 ) = 0.e0 225 188 zwvw(ji,jj, 1 ) = 0.e0 … … 229 192 END DO 230 193 231 232 ! Vertical momentum advection at u- and v-points 233 ! ---------------------------------------------- 234 DO jk = 1, jpkm1 194 DO jk = 1, jpkm1 ! Vertical momentum advection at u- and v-points 235 195 DO jj = 2, jpjm1 236 DO ji = fs_2, fs_jpim1 ! vector opt.237 ! vertical momentum advective trends196 DO ji = fs_2, fs_jpim1 ! vector opt. 197 ! ! vertical momentum advective trends 238 198 zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 239 199 zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 240 ! add the trends to the general momentum trends200 ! ! add the trends to the general momentum trends 241 201 ua(ji,jj,jk) = ua(ji,jj,jk) + zua 242 202 va(ji,jj,jk) = va(ji,jj,jk) + zva … … 245 205 END DO 246 206 247 ! save the vertical advection trends for diagnostic 248 ! momentum trends 249 IF( l_trddyn ) THEN 250 ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) 251 ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) 252 253 CALL trd_mod(ztdua, ztdva, jpdtdzad, 'DYN', kt) 254 ENDIF 255 256 IF(ln_ctl) THEN ! print sum trends (used for debugging) 257 CALL prt_ctl(tab3d_1=ua, clinfo1=' zad - Ua: ', mask1=umask, & 258 & tab3d_2=va, clinfo2=' Va: ', mask2=vmask, clinfo3='dyn') 259 ENDIF 260 207 IF( l_trddyn ) THEN ! save the vertical advection trends for diagnostic 208 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 209 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 210 CALL trd_mod(ztrdu, ztrdv, jpdyn_trd_zad, 'DYN', kt) 211 ENDIF 212 ! ! Control print 213 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' zad - Ua: ', mask1=umask, & 214 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 215 ! 261 216 END SUBROUTINE dyn_zad 262 217 #endif 263 218 264 !!======================================================================219 !!====================================================================== 265 220 END MODULE dynzad -
trunk/NEMO/OPA_SRC/DYN/dynzdf.F90
r456 r503 4 4 !! Ocean dynamics : vertical component of the momentum mixing trend 5 5 !!============================================================================== 6 !! History : 9.0 ! 05-11 (G. Madec) Original code 7 !!---------------------------------------------------------------------- 8 6 9 !!---------------------------------------------------------------------- 7 10 !! dyn_zdf : Update the momentum trend with the vertical diffusion 8 !! zdf_ctl : ???11 !! zdf_ctl : initializations of the vertical diffusion scheme 9 12 !!---------------------------------------------------------------------- 10 !! * Modules used11 13 USE oce ! ocean dynamics and tracers variables 12 14 USE dom_oce ! ocean space and time domain variables … … 26 28 PRIVATE 27 29 28 !! * Routine accessibility 29 PUBLIC dyn_zdf ! routine called by step.F90 30 PUBLIC dyn_zdf ! routine called by step.F90 30 31 31 !! * module variables 32 INTEGER :: & 33 nzdf = 0 ! type vertical diffusion algorithm used 32 INTEGER :: nzdf = 0 ! type vertical diffusion algorithm used 34 33 ! ! defined from ln_zdf... namlist logicals) 35 34 36 !! * Module variables 37 REAL(wp) :: & 38 r2dt ! time-step, = 2 rdttra except at nit000 (=rdttra) if neuler=0 35 REAL(wp) :: r2dt ! time-step, = 2 rdttra 36 ! ! except at nit000 (=rdttra) if neuler=0 39 37 40 38 !! * Substitutions … … 44 42 !!---------------------------------------------------------------------- 45 43 !! OPA 9.0 , LOCEAN-IPSL (2005) 44 !! $Header$ 45 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 46 46 !!---------------------------------------------------------------------- 47 47 … … 53 53 !! 54 54 !! ** Purpose : compute the vertical ocean dynamics physics. 55 !! ** Method :56 !! ** Action :55 !!--------------------------------------------------------------------- 56 INTEGER, INTENT( in ) :: kt ! ocean time-step index 57 57 !! 58 !! History : 59 !! 9.0 ! 05-11 (G. Madec) Original code 60 !!--------------------------------------------------------------------- 61 !! * Arguments 62 INTEGER, INTENT( in ) :: kt ! ocean time-step index 63 64 !! * local declarations 65 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 66 ztrdu, ztrdv ! 3D temporary workspace 58 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdu, ztrdv ! 3D workspace 67 59 !!--------------------------------------------------------------------- 68 60 … … 70 62 71 63 ! ! set time step 72 IF( neuler == 0 .AND. kt == nit000 ) THEN ! at nit000 73 r2dt = rdt ! = rdtra (restarting with Euler time stepping) 74 ELSEIF( kt <= nit000 + 1) THEN ! at nit000 or nit000+1 75 r2dt = 2. * rdt ! = 2 rdttra (leapfrog) 64 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdtra (restarting with Euler time stepping) 65 ELSEIF( kt <= nit000 + 1) THEN ; r2dt = 2. * rdt ! = 2 rdttra (leapfrog) 76 66 ENDIF 77 78 67 79 68 IF( l_trddyn ) THEN ! temporary save of ta and sa trends … … 83 72 84 73 SELECT CASE ( nzdf ) ! compute lateral mixing trend and add it to the general trend 85 CASE ( -1 ) ! esopa: test all possibility with control print 86 CALL dyn_zdf_exp ( kt ) 87 CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf0 - Ua: ', mask1=umask, & 88 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 89 CALL dyn_zdf_imp ( kt ) 90 CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf1 - Ua: ', mask1=umask, & 91 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 92 CALL dyn_zdf_imp_jki( kt ) 93 CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf2 - Ua: ', mask1=umask, & 94 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 95 96 CASE ( 0 ) ! explicit scheme 97 CALL dyn_zdf_exp ( kt ) 98 99 CASE ( 1 ) ! implicit scheme (k-j-i loop) 100 CALL dyn_zdf_imp ( kt ) 101 102 CASE ( 2 ) ! implicit scheme (j-k-i loop) 103 CALL dyn_zdf_imp_jki( kt ) 104 74 ! 75 CASE ( 0 ) ; CALL dyn_zdf_exp ( kt, r2dt ) ! explicit scheme 76 CASE ( 1 ) ; CALL dyn_zdf_imp ( kt, r2dt ) ! implicit scheme (k-j-i loop) 77 CASE ( 2 ) ; CALL dyn_zdf_imp_jki( kt, r2dt ) ! implicit scheme (j-k-i loop) 78 ! 79 CASE ( -1 ) ! esopa: test all possibility with control print 80 ; CALL dyn_zdf_exp ( kt, r2dt ) 81 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf0 - Ua: ', mask1=umask, & 82 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 83 ; CALL dyn_zdf_imp ( kt, r2dt ) 84 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf1 - Ua: ', mask1=umask, & 85 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 86 ; CALL dyn_zdf_imp_jki( kt, r2dt ) 87 ; CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf2 - Ua: ', mask1=umask, & 88 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 105 89 END SELECT 106 90 107 IF( l_trddyn ) THEN 91 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 108 92 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 109 93 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 110 CALL trd_mod( ztrdu, ztrdv, jp ttdzdf, 'DYN', kt )94 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_zdf, 'DYN', kt ) 111 95 ENDIF 112 113 96 ! ! print mean trends (used for debugging) 114 97 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf - Ua: ', mask1=umask, & 115 98 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 116 99 ! 117 100 END SUBROUTINE dyn_zdf 118 101 … … 122 105 !! *** ROUTINE zdf_ctl *** 123 106 !! 124 !! ** Purpose : initializations of the vertical ocean dynamics physics107 !! ** Purpose : initializations of the vertical diffusion scheme 125 108 !! 126 109 !! ** Method : implicit (euler backward) scheme (default) 127 110 !! explicit (time-splitting) scheme if ln_zdfexp=T 128 111 !! OpenMP / NEC autotasking: use j-k-i loops 129 !!130 !! History :131 !! 9.0 ! 05-11 (G. Madec) Original code132 112 !!---------------------------------------------------------------------- 133 !! * Module used134 113 USE zdftke 135 114 USE zdfkpp 136 115 !!---------------------------------------------------------------------- 137 116 138 ! Define the vertical dynamics physics scheme139 ! ==========================================140 141 117 ! Choice from ln_zdfexp read in namelist in zdfini 142 IF( ln_zdfexp ) THEN ! use explicit scheme 143 nzdf = 0 144 ELSE ! use implicit scheme 145 nzdf = 1 118 IF( ln_zdfexp ) THEN ; nzdf = 0 ! use explicit scheme 119 ELSE ; nzdf = 1 ! use implicit scheme 146 120 ENDIF 147 121 148 122 ! Force implicit schemes 149 IF( lk_zdftke .OR. lk_zdfkpp ) nzdf = 1 150 IF( ln_dynldf_iso ) nzdf = 1 151 IF( ln_dynldf_hor .AND. ln_sco ) nzdf = 1 123 IF( lk_zdftke .OR. lk_zdfkpp ) nzdf = 1 ! TKE or KPP physics 124 IF( ln_dynldf_iso ) nzdf = 1 ! iso-neutral lateral physics 125 IF( ln_dynldf_hor .AND. ln_sco ) nzdf = 1 ! horizontal lateral physics in s-coordinate 152 126 153 127 ! OpenMP / NEC autotasking 154 128 #if defined key_mpp_omp 155 IF( nzdf == 1 ) nzdf = 2 129 IF( nzdf == 1 ) nzdf = 2 ! j-k-i loop 156 130 #endif 157 131 158 !!bug 159 ! IF( ln_dynldf_iso ) nzdf = 3 ! iso-neutral lateral physics 160 ! IF( ln_dynldf_hor .AND. ln_sco ) nzdf = 3 ! horizontal lateral physics in s-coordinate 161 !!bug 162 ! Test: esopa 163 IF( lk_esopa ) nzdf = -1 ! All schemes used 132 IF( lk_esopa ) nzdf = -1 ! Esopa key: All schemes used 164 133 165 IF(lwp) THEN 134 IF(lwp) THEN ! Print the choice 166 135 WRITE(numout,*) 167 136 WRITE(numout,*) 'dyn:zdf_ctl : vertical dynamics physics scheme' … … 172 141 IF( nzdf == 2 ) WRITE(numout,*) ' Implicit (euler backward) scheme with j-k-i loops' 173 142 ENDIF 174 143 ! 175 144 END SUBROUTINE zdf_ctl 176 145 -
trunk/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
r455 r503 4 4 !! Ocean dynamics: vertical component(s) of the momentum mixing trend 5 5 !!============================================================================== 6 !! History : ! 90-10 (B. Blanke) Original code 7 !! ! 97-05 (G. Madec) vertical component of isopycnal 8 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 9 !!---------------------------------------------------------------------- 6 10 7 11 !!---------------------------------------------------------------------- … … 16 20 USE in_out_manager ! I/O manager 17 21 USE taumod ! surface ocean stress 18 USE prtctl ! Print control19 22 20 23 IMPLICIT NONE … … 30 33 !! OPA 9.0 , LOCEAN-IPSL (2005) 31 34 !! $Header$ 32 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt35 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 33 36 !!---------------------------------------------------------------------- 34 37 35 38 CONTAINS 36 39 37 SUBROUTINE dyn_zdf_exp( kt )40 SUBROUTINE dyn_zdf_exp( kt, p2dt ) 38 41 !!---------------------------------------------------------------------- 39 42 !! *** ROUTINE dyn_zdf_exp *** … … 50 53 !! 51 54 !! ** Action : - Update (ua,va) with the vertical diffusive trend 52 !! - Save the trends in (ztdua,ztdva) ('key_trddyn')53 !!54 !! History :55 !! ! 90-10 (B. Blanke) Original code56 !! ! 97-05 (G. Madec) vertical component of isopycnal57 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module58 !! 9.0 ! 04-08 (C. Talandier) New trends organization59 55 !!--------------------------------------------------------------------- 60 !! * Modules used61 USE oce, ONLY : ztdua => ta, & ! use ta as 3D workspace62 ztdva => sa ! use sa as 3D workspace63 56 !! * Arguments 64 INTEGER, INTENT( in ) :: kt ! ocean time-step index 57 INTEGER , INTENT( in ) :: kt ! ocean time-step index 58 REAL(wp), INTENT( in ) :: p2dt ! time-step 65 59 66 60 !! * Local declarations 67 INTEGER :: & 68 ji, jj, jk, jl ! dummy loop indices 69 REAL(wp) :: & 70 zrau0r, zlavmr, z2dt, zua, zva ! temporary scalars 71 REAL(wp), DIMENSION(jpi,jpk) :: & 72 zwx, zwy, zwz, zww ! temporary workspace arrays 61 INTEGER :: ji, jj, jk, jl ! dummy loop indices 62 REAL(wp) :: zrau0r, zlavmr, zua, zva ! temporary scalars 63 REAL(wp), DIMENSION(jpi,jpk) :: zwx, zwy, zwz, zww ! temporary workspace arrays 73 64 !!---------------------------------------------------------------------- 74 65 … … 83 74 zrau0r = 1. / rau0 ! inverse of the reference density 84 75 zlavmr = 1. / float( n_zdfexp ) ! inverse of the number of sub time step 85 z2dt = 2. * rdt ! Leap-frog environnement86 87 IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt ! Euler time stepping when starting from rest88 76 89 77 ! ! =============== … … 124 112 va(ji,jj,jk) = va(ji,jj,jk) + zva 125 113 126 zwx(ji,jk) = zwx(ji,jk) + z2dt*zua*umask(ji,jj,jk)127 zwz(ji,jk) = zwz(ji,jk) + z2dt*zva*vmask(ji,jj,jk)114 zwx(ji,jk) = zwx(ji,jk) + p2dt*zua*umask(ji,jj,jk) 115 zwz(ji,jk) = zwz(ji,jk) + p2dt*zva*vmask(ji,jj,jk) 128 116 END DO 129 117 END DO -
trunk/NEMO/OPA_SRC/DYN/dynzdf_imp.F90
r455 r503 4 4 !! Ocean dynamics: vertical component(s) of the momentum mixing trend 5 5 !!============================================================================== 6 !! History : ! 90-10 (B. Blanke) Original code 7 !! ! 97-05 (G. Madec) vertical component of isopycnal 8 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 9 !!---------------------------------------------------------------------- 6 10 7 11 !!---------------------------------------------------------------------- … … 11 15 !! OPA 9.0 , LOCEAN-IPSL (2005) 12 16 !! $Header$ 13 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt17 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 14 18 !!---------------------------------------------------------------------- 15 19 !! * Modules used … … 20 24 USE in_out_manager ! I/O manager 21 25 USE taumod ! surface ocean stress 22 USE prtctl ! Print control23 26 24 27 IMPLICIT NONE … … 40 43 41 44 42 SUBROUTINE dyn_zdf_imp( kt )45 SUBROUTINE dyn_zdf_imp( kt, p2dt ) 43 46 !!---------------------------------------------------------------------- 44 47 !! *** ROUTINE dyn_zdf_imp *** … … 58 61 !! ** Action : - Update (ua,va) arrays with the after vertical diffusive 59 62 !! mixing trend. 60 !!61 !! History :62 !! ! 90-10 (B. Blanke) Original code63 !! ! 97-05 (G. Madec) vertical component of isopycnal64 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module65 !! 9.0 ! 04-08 (C. Talandier) New trends organization66 63 !!--------------------------------------------------------------------- 67 64 !! * Modules used 68 USE oce, ONLY : zwd => ta, & ! use ta as workspace69 zws => sa ! use sa as workspace65 USE oce, ONLY : zwd => ta, & ! use ta as workspace 66 zws => sa ! use sa as workspace 70 67 71 68 !! * Arguments 72 INTEGER, INTENT( in ) :: kt ! ocean time-step index 69 INTEGER , INTENT( in ) :: kt ! ocean time-step index 70 REAL(wp), INTENT( in ) :: p2dt ! vertical profile of tracer time-step 73 71 74 72 !! * Local declarations 75 INTEGER :: ji, jj, jk ! dummy loop indices 76 REAL(wp) :: & 77 zrau0r, z2dt, & ! temporary scalars 78 z2dtf, zcoef, zzws, zrhs ! " " 79 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 80 zwi ! temporary workspace arrays 73 INTEGER :: ji, jj, jk ! dummy loop indices 74 REAL(wp) :: zrau0r, z2dtf, zcoef, zzws, zrhs ! temporary scalars 75 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi ! temporary workspace arrays 81 76 !!---------------------------------------------------------------------- 82 77 … … 90 85 ! -------------------------------- 91 86 zrau0r = 1. / rau0 ! inverse of the reference density 92 z2dt = 2. * rdt ! Leap-frog environnement93 94 ! Euler time stepping when starting from rest95 IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt96 87 97 88 ! 1. Vertical diffusion on u … … 104 95 DO jj = 2, jpjm1 105 96 DO ji = fs_2, fs_jpim1 ! vector opt. 106 zcoef = - z2dt / fse3u(ji,jj,jk)97 zcoef = - p2dt / fse3u(ji,jj,jk) 107 98 zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk ) / fse3uw(ji,jj,jk ) 108 99 zzws = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1) … … 150 141 !!! change les resultats (derniers digit, pas significativement + rapide 1* de moins) 151 142 !!! ua(ji,jj,1) = ub(ji,jj,1) & 152 !!! + z2dt * ( ua(ji,jj,1) + taux(ji,jj) / ( fse3u(ji,jj,1)*rau0 ) )153 z2dtf = z2dt / ( fse3u(ji,jj,1)*rau0 )143 !!! + p2dt * ( ua(ji,jj,1) + taux(ji,jj) / ( fse3u(ji,jj,1)*rau0 ) ) 144 z2dtf = p2dt / ( fse3u(ji,jj,1)*rau0 ) 154 145 ua(ji,jj,1) = ub(ji,jj,1) & 155 + z2dt * ua(ji,jj,1) + z2dtf * taux(ji,jj)156 END DO 157 END DO 158 DO jk = 2, jpkm1 159 DO jj = 2, jpjm1 160 DO ji = fs_2, fs_jpim1 ! vector opt. 161 zrhs = ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ! zrhs=right hand side146 + p2dt * ua(ji,jj,1) + z2dtf * taux(ji,jj) 147 END DO 148 END DO 149 DO jk = 2, jpkm1 150 DO jj = 2, jpjm1 151 DO ji = fs_2, fs_jpim1 ! vector opt. 152 zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) ! zrhs=right hand side 162 153 ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 163 154 END DO … … 183 174 DO jj = 2, jpjm1 184 175 DO ji = fs_2, fs_jpim1 ! vector opt. 185 ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) / z2dt176 ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) / p2dt 186 177 END DO 187 178 END DO … … 198 189 DO jj = 2, jpjm1 199 190 DO ji = fs_2, fs_jpim1 ! vector opt. 200 zcoef = - z2dt / fse3v(ji,jj,jk)191 zcoef = -p2dt / fse3v(ji,jj,jk) 201 192 zwi(ji,jj,jk) = zcoef * avmv(ji,jj,jk ) / fse3vw(ji,jj,jk ) 202 193 zzws = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1) … … 245 236 !!! change les resultats (derniers digit, pas significativement + rapide 1* de moins) 246 237 !!! va(ji,jj,1) = vb(ji,jj,1) & 247 !!! + z2dt * ( va(ji,jj,1) + tauy(ji,jj) / ( fse3v(ji,jj,1)*rau0 ) )248 z2dtf = z2dt / ( fse3v(ji,jj,1)*rau0 )238 !!! + p2dt * ( va(ji,jj,1) + tauy(ji,jj) / ( fse3v(ji,jj,1)*rau0 ) ) 239 z2dtf = p2dt / ( fse3v(ji,jj,1)*rau0 ) 249 240 va(ji,jj,1) = vb(ji,jj,1) & 250 + z2dt * va(ji,jj,1) + z2dtf * tauy(ji,jj)241 + p2dt * va(ji,jj,1) + z2dtf * tauy(ji,jj) 251 242 END DO 252 243 END DO … … 254 245 DO jj = 2, jpjm1 255 246 DO ji = fs_2, fs_jpim1 ! vector opt. 256 zrhs = vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ! zrhs=right hand side247 zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) ! zrhs=right hand side 257 248 va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 258 249 END DO … … 274 265 END DO 275 266 276 ! flux de surface doit etre calcule dans trdmod et boootom stress277 ! deduit par integration verticale dans trmod pour jpdtdzdf278 !RB IF( l_trddyn ) THEN279 ! ! diagnose surface and bottom momentum fluxes280 ! DO jj = 2, jpjm1281 ! DO ji = fs_2, fs_jpim1 ! vector opt.282 ! ! save the surface forcing momentum fluxes283 ! ztsy(ji,jj) = tauy(ji,jj) / ( fse3v(ji,jj,1)*rau0 )284 ! ztsx(ji,jj) = taux(ji,jj) / ( fse3u(ji,jj,1)*rau0 )285 ! ! save bottom friction momentum fluxes286 ! ikbv = MIN( mbathy(ji,jj+1), mbathy(ji,jj) )287 ! ikbvm1 = MAX( ikbv-1, 1 )288 ! ztby(ji,jj) = - avmv(ji,jj,ikbv) * va(ji,jj,ikbvm1) &289 ! / ( fse3v(ji,jj,ikbvm1)*fse3vw(ji,jj,ikbv) )290 ! ! subtract surface forcing and bottom friction trend from vertical291 ! ! diffusive momentum trend292 ! ztdva(ji,jj,1 ) = ztdva(ji,jj,1 ) - ztsy(ji,jj)293 ! ztdva(ji,jj,ikbvm1) = ztdva(ji,jj,ikbvm1) - ztby(ji,jj)294 ! END DO295 ! END DO296 ! ENDIF297 298 267 ! Normalization to obtain the general momentum trend va 299 268 DO jk = 1, jpkm1 300 269 DO jj = 2, jpjm1 301 270 DO ji = fs_2, fs_jpim1 ! vector opt. 302 va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) / z2dt271 va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) / p2dt 303 272 END DO 304 273 END DO -
trunk/NEMO/OPA_SRC/DYN/dynzdf_imp_jki.F90
r456 r503 4 4 !! Ocean dynamics: vertical component(s) of the momentum mixing trend 5 5 !!============================================================================== 6 !! History : 8.5 ! 02-08 (G. Madec) auto-tasking option 7 !!---------------------------------------------------------------------- 6 8 7 9 !!---------------------------------------------------------------------- … … 17 19 USE in_out_manager ! I/O manager 18 20 USE taumod ! surface ocean stress 19 USE prtctl ! Print control20 21 21 22 IMPLICIT NONE … … 30 31 !!---------------------------------------------------------------------- 31 32 !! OPA 9.0 , LOCEAN-IPSL (2005) 33 !! $Header$ 34 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 32 35 !!---------------------------------------------------------------------- 33 36 34 37 CONTAINS 35 38 36 SUBROUTINE dyn_zdf_imp_jki( kt )39 SUBROUTINE dyn_zdf_imp_jki( kt, p2dt ) 37 40 !!---------------------------------------------------------------------- 38 41 !! *** ROUTINE dyn_zdf_imp_jki *** … … 52 55 !! ** Action : - Update (ua,va) arrays with the after vertical diffusive 53 56 !! mixing trend. 54 !!55 !! History :56 !! 8.5 ! 02-08 (G. Madec) auto-tasking option57 !! 9.0 ! 04-08 (C. Talandier) New trends organization58 57 !!--------------------------------------------------------------------- 59 !! * Modules used60 USE oce, ONLY : ztdua => ta, & ! use ta as 3D workspace61 ztdva => sa ! use sa as 3D workspace62 63 58 !! * Arguments 64 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 INTEGER , INTENT( in ) :: kt ! ocean time-step index 60 REAL(wp), INTENT( in ) :: p2dt ! ocean time-step index 65 61 66 62 !! * Local declarations 67 INTEGER :: ji, jj, jk ! dummy loop indices 68 INTEGER :: ikst, ikenm2, ikstp1 ! temporary integers 69 REAL(wp) :: zrau0r, z2dt, & !temporary scalars 70 & z2dtf, zcoef, zzws 71 REAL(wp), DIMENSION(jpi,jpk) :: & 72 zwx, zwy, zwz, & ! workspace 73 zwd, zws, zwi, zwt 63 INTEGER :: ji, jj, jk ! dummy loop indices 64 INTEGER :: ikst, ikenm2, ikstp1 ! temporary integers 65 REAL(wp) :: zrau0r, z2dtf, zcoef, zzws ! temporary scalars 66 REAL(wp), DIMENSION(jpi,jpk) :: zwx, zwy, zwz, & ! workspace 67 & zwd, zws, zwi, zwt 74 68 !!---------------------------------------------------------------------- 75 69 … … 84 78 ! -------------------------------- 85 79 zrau0r = 1. / rau0 ! inverse of the reference density 86 z2dt = 2. * rdt ! Leap-frog environnement87 88 ! Euler time stepping when starting from rest89 IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt90 80 91 81 ! ! =============== … … 101 91 DO jk = 1, jpkm1 102 92 DO ji = 2, jpim1 103 zcoef = - z2dt / fse3u(ji,jj,jk)93 zcoef = - p2dt / fse3u(ji,jj,jk) 104 94 zwi(ji,jk) = zcoef * avmu(ji,jj,jk ) / fse3uw(ji,jj,jk ) 105 95 zzws = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 106 96 zws(ji,jk) = zzws * umask(ji,jj,jk+1) 107 97 zwd(ji,jk) = 1. - zwi(ji,jk) - zzws 108 zwy(ji,jk) = ub(ji,jj,jk) + z2dt * ua(ji,jj,jk)98 zwy(ji,jk) = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) 109 99 END DO 110 100 END DO … … 112 102 ! Surface boudary conditions 113 103 DO ji = 2, jpim1 114 z2dtf = z2dt / ( fse3u(ji,jj,1)*rau0 )104 z2dtf = p2dt / ( fse3u(ji,jj,1)*rau0 ) 115 105 zwi(ji,1) = 0. 116 106 zwd(ji,1) = 1. - zws(ji,1) … … 175 165 DO jk = 1, jpkm1 176 166 DO ji = 2, jpim1 177 ua(ji,jj,jk) = ( zwx(ji,jk) - ub(ji,jj,jk) ) / z2dt167 ua(ji,jj,jk) = ( zwx(ji,jk) - ub(ji,jj,jk) ) / p2dt 178 168 END DO 179 169 END DO … … 188 178 DO jk = 1, jpkm1 189 179 DO ji = 2, jpim1 190 zcoef = - z2dt/fse3v(ji,jj,jk)180 zcoef = -p2dt/fse3v(ji,jj,jk) 191 181 zwi(ji,jk) = zcoef * avmv(ji,jj,jk ) / fse3vw(ji,jj,jk ) 192 182 zzws = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1) 193 183 zws(ji,jk) = zzws * vmask(ji,jj,jk+1) 194 184 zwd(ji,jk) = 1. - zwi(ji,jk) - zzws 195 zwy(ji,jk) = vb(ji,jj,jk) + z2dt * va(ji,jj,jk)185 zwy(ji,jk) = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) 196 186 END DO 197 187 END DO … … 199 189 ! Surface boudary conditions 200 190 DO ji = 2, jpim1 201 z2dtf = z2dt / ( fse3v(ji,jj,1)*rau0 )191 z2dtf = p2dt / ( fse3v(ji,jj,1)*rau0 ) 202 192 zwi(ji,1) = 0.e0 203 193 zwd(ji,1) = 1. - zws(ji,1) … … 262 252 DO jk = 1, jpkm1 263 253 DO ji = 2, jpim1 264 va(ji,jj,jk) = ( zwx(ji,jk) - vb(ji,jj,jk) ) / z2dt254 va(ji,jj,jk) = ( zwx(ji,jk) - vb(ji,jj,jk) ) / p2dt 265 255 END DO 266 256 END DO -
trunk/NEMO/OPA_SRC/TRA/traadv.F90
r474 r503 4 4 !! Ocean active tracers: advection trend 5 5 !!============================================================================== 6 !! History : 7 !! 9.0 ! 05-11 (G. Madec) Original code 6 !! History : 9.0 ! 05-11 (G. Madec) Original code 7 !!---------------------------------------------------------------------- 8 8 9 !!---------------------------------------------------------------------- 9 10 !! tra_adv : compute ocean tracer advection trend 10 11 !! tra_adv_ctl : control the different options of advection scheme 11 12 !!---------------------------------------------------------------------- 12 !! * Modules used13 13 USE oce ! ocean dynamics and active tracers 14 14 USE dom_oce ! ocean space and time domain 15 USE traadv_cen2 ! 2nd order centered scheme (tra_adv_cen2routine)16 USE traadv_cen2_jki ! 2nd order centered scheme (tra_adv_cen2routine)17 USE traadv_tvd ! TVD scheme(tra_adv_tvd routine)18 USE traadv_muscl ! MUSCL scheme(tra_adv_muscl routine)15 USE traadv_cen2 ! 2nd order centered scheme (tra_adv_cen2 routine) 16 USE traadv_cen2_jki ! 2nd order centered scheme (tra_adv_cen2 routine) 17 USE traadv_tvd ! TVD scheme (tra_adv_tvd routine) 18 USE traadv_muscl ! MUSCL scheme (tra_adv_muscl routine) 19 19 USE traadv_muscl2 ! MUSCL2 scheme (tra_adv_muscl2 routine) 20 USE traadv_ubs ! UBS scheme (tra_adv_ubs routine) 20 21 USE traadv_eiv ! eddy induced velocity (tra_adv_eiv routine) 21 USE trabbl ! ???22 USE ldftra_oce ! ???22 USE trabbl ! tracers: bottom boundary layer 23 USE ldftra_oce ! lateral diffusion coefficient on tracers 23 24 USE in_out_manager ! I/O manager 24 25 USE prtctl ! Print control … … 27 28 PRIVATE 28 29 29 !! * Accessibility 30 PUBLIC tra_adv ! routine called by step module 30 PUBLIC tra_adv ! routine called by step module 31 31 32 !! * Share module variables 33 LOGICAL, PUBLIC :: & 34 ln_traadv_cen2 = .TRUE. , & ! 2nd order centered scheme flag 35 ln_traadv_tvd = .FALSE. , & ! TVD scheme flag 36 ln_traadv_muscl = .FALSE. , & ! MUSCL scheme flag 37 ln_traadv_muscl2 = .FALSE. ! MUSCL2 scheme flag 32 !!* Namelist nam_traadv 33 LOGICAL, PUBLIC :: ln_traadv_cen2 = .TRUE. ! 2nd order centered scheme flag 34 LOGICAL, PUBLIC :: ln_traadv_tvd = .FALSE. ! TVD scheme flag 35 LOGICAL, PUBLIC :: ln_traadv_muscl = .FALSE. ! MUSCL scheme flag 36 LOGICAL, PUBLIC :: ln_traadv_muscl2 = .FALSE. ! MUSCL2 scheme flag 37 LOGICAL, PUBLIC :: ln_traadv_ubs = .FALSE. ! UBS scheme flag 38 NAMELIST/nam_traadv/ ln_traadv_cen2 , ln_traadv_tvd, & 39 & ln_traadv_muscl, ln_traadv_muscl2, ln_traadv_ubs 38 40 39 !! * Module variables 40 INTEGER :: & 41 nadv ! choice of the type of advection scheme 41 INTEGER :: nadv ! choice of the type of advection scheme 42 42 43 43 !! * Substitutions 44 # 45 # 44 # include "domzgr_substitute.h90" 45 # include "vectopt_loop_substitute.h90" 46 46 !!---------------------------------------------------------------------- 47 !! OPA 9.0 , LOCEAN-IPSL (2005) 47 !! OPA 9.0 , LOCEAN-IPSL (2006) 48 !! $Header$ 49 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 48 50 !!---------------------------------------------------------------------- 49 51 … … 56 58 !! ** Purpose : compute the ocean tracer advection trend. 57 59 !! 60 !! ** Method : - Update (ua,va) with the advection term following nadv 58 61 !!---------------------------------------------------------------------- 59 62 #if ( defined key_trabbl_adv || defined key_traldf_eiv ) 60 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & ! temporary arrays 61 & zun, zvn, zwn 63 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zun, zvn, zwn ! effective velocity 62 64 #else 63 USE oce , zun => un, & ! When no advective bbl, zun == un64 & zvn => vn, & ! " " , zvn == vn65 & zwn => wn ! " " , zwn == wn65 USE oce, ONLY : zun => un ! the effective velocity is the 66 USE oce, ONLY : zvn => vn ! Eulerian velocity 67 USE oce, ONLY : zwn => wn ! 66 68 #endif 67 68 !! * Arguments 69 INTEGER, INTENT( in ) :: kt ! ocean time-step index 69 !! 70 INTEGER, INTENT( in ) :: kt ! ocean time-step index 70 71 !!---------------------------------------------------------------------- 71 72 72 IF( kt == nit000 ) CALL tra_adv_ctl 73 IF( kt == nit000 ) CALL tra_adv_ctl ! initialisation & control of options 73 74 74 75 #if defined key_trabbl_adv 75 ! Advective bottom boundary layer ! add the bbl velocity 76 ! ------------------------------- 77 zun(:,:,:) = un(:,:,:) - u_bbl(:,:,:) 76 zun(:,:,:) = un(:,:,:) - u_bbl(:,:,:) ! add the bbl velocity 78 77 zvn(:,:,:) = vn(:,:,:) - v_bbl(:,:,:) 79 78 zwn(:,:,:) = wn(:,:,:) + w_bbl(:,:,:) 80 79 #endif 81 IF( lk_traldf_eiv ) THEN !add the eiv velocity80 IF( lk_traldf_eiv ) THEN ! commpute and add the eiv velocity 82 81 IF( .NOT. lk_trabbl_adv ) THEN 83 82 zun(:,:,:) = un(:,:,:) … … 85 84 zwn(:,:,:) = wn(:,:,:) 86 85 ENDIF 87 CALL tra_adv_eiv( kt, zun, zvn, zwn ) ! compute and add the eiv velocity86 CALL tra_adv_eiv( kt, zun, zvn, zwn ) 88 87 ENDIF 89 88 90 SELECT CASE ( nadv ) ! compute advection trend and add it to general trend 91 CASE ( -1 ) ! esopa: test all possibility with control print 92 CALL tra_adv_cen2 ( kt, zun, zvn, zwn ) 93 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf0 - Ta: ', mask1=tmask, & 94 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 95 CALL tra_adv_cen2_jki( kt, zun, zvn, zwn ) 96 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf1 - Ta: ', mask1=tmask, & 97 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 98 CALL tra_adv_tvd ( kt, zun, zvn, zwn ) 99 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf2 - Ta: ', mask1=tmask, & 100 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 101 CALL tra_adv_muscl ( kt, zun, zvn, zwn ) 102 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf3 - Ta: ', mask1=tmask, & 103 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 104 CALL tra_adv_muscl2 ( kt, zun, zvn, zwn ) 105 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf4 - Ta: ', mask1=tmask, & 106 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 107 108 CASE ( 0 ) ! 2nd order centered scheme k-j-i loops 109 CALL tra_adv_cen2 ( kt, zun, zvn, zwn ) 110 CASE ( 1 ) ! 2nd order centered scheme 111 CALL tra_adv_cen2_jki( kt, zun, zvn, zwn ) 112 CASE ( 2 ) ! TVD scheme 113 CALL tra_adv_tvd ( kt, zun, zvn, zwn ) 114 CASE ( 3 ) ! MUSCL scheme 115 CALL tra_adv_muscl ( kt, zun, zvn, zwn ) 116 CASE ( 4 ) ! MUSCL2 scheme 117 CALL tra_adv_muscl2 ( kt, zun, zvn, zwn ) 89 SELECT CASE ( nadv ) ! compute advection trend and add it to general trend 90 CASE ( 0 ) ; CALL tra_adv_cen2 ( kt, zun, zvn, zwn ) ! 2nd order centered scheme k-j-i loops 91 CASE ( 1 ) ; CALL tra_adv_cen2_jki( kt, zun, zvn, zwn ) ! 2nd order centered scheme 92 CASE ( 2 ) ; CALL tra_adv_tvd ( kt, zun, zvn, zwn ) ! TVD scheme 93 CASE ( 3 ) ; CALL tra_adv_muscl ( kt, zun, zvn, zwn ) ! MUSCL scheme 94 CASE ( 4 ) ; CALL tra_adv_muscl2 ( kt, zun, zvn, zwn ) ! MUSCL2 scheme 95 CASE ( 5 ) ; CALL tra_adv_ubs ( kt, zun, zvn, zwn ) ! UBS scheme 96 ! 97 CASE (-1 ) ! esopa: test all possibility with control print 98 ; CALL tra_adv_cen2 ( kt, zun, zvn, zwn ) 99 ; CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf0 - Ta: ', mask1=tmask, & 100 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 101 ; CALL tra_adv_cen2_jki( kt, zun, zvn, zwn ) 102 ; CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf1 - Ta: ', mask1=tmask, & 103 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 104 ; CALL tra_adv_tvd ( kt, zun, zvn, zwn ) 105 ; CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf2 - Ta: ', mask1=tmask, & 106 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 107 ; CALL tra_adv_muscl ( kt, zun, zvn, zwn ) 108 ; CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf3 - Ta: ', mask1=tmask, & 109 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 110 ; CALL tra_adv_muscl2 ( kt, zun, zvn, zwn ) 111 ; CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf4 - Ta: ', mask1=tmask, & 112 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 113 ; CALL tra_adv_ubs ( kt, zun, zvn, zwn ) 114 ; CALL prt_ctl( tab3d_1=ta, clinfo1=' adv5 - Ta: ', mask1=tmask, & 115 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 118 116 END SELECT 119 120 ! ! print mean trends (used for debugging) 121 ! IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' adv - Ta: ', mask1=tmask, & 122 ! & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 123 117 ! ! print mean trends (used for debugging) 118 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' adv - Ta: ', mask1=tmask, & 119 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 120 ! 124 121 END SUBROUTINE tra_adv 125 122 … … 129 126 !! *** ROUTINE tra_adv_ctl *** 130 127 !! 131 !! ** Purpose : Control the consistency between cpp options for 132 !! tracer advection schemes 133 !! 128 !! ** Purpose : Control the consistency between namelist options for 129 !! tracer advection schemes and set nadv 134 130 !!---------------------------------------------------------------------- 135 131 INTEGER :: ioptio 136 NAMELIST/nam_traadv/ ln_traadv_cen2 , ln_traadv_tvd, &137 & ln_traadv_muscl, ln_traadv_muscl2138 132 !!---------------------------------------------------------------------- 139 133 140 ! Read Namelist nam_traadv : tracer advection scheme 141 ! ------------------------- 142 REWIND ( numnam ) 134 REWIND ( numnam ) ! Read Namelist nam_traadv : tracer advection scheme 143 135 READ ( numnam, nam_traadv ) 144 136 145 ! Parameter control and print 146 ! --------------------------- 147 ! Control print 148 IF(lwp) THEN 137 IF(lwp) THEN ! Namelist print 149 138 WRITE(numout,*) 150 139 WRITE(numout,*) 'tra_adv_ctl : choice/control of the tracer advection scheme' 151 140 WRITE(numout,*) '~~~~~~~~~~~' 152 WRITE(numout,*) ' Namelist nam_tra_adv : chose a advection scheme for tracers'153 WRITE(numout,*) 154 WRITE(numout,*) ' 2nd order advection scheme ln_traadv_cen2 = ', ln_traadv_cen2155 WRITE(numout,*) ' TVD advection scheme ln_traadv_tvd = ', ln_traadv_tvd156 WRITE(numout,*) ' MUSCL advection scheme ln_traadv_muscl = ', ln_traadv_muscl157 WRITE(numout,*) ' MUSCL2 advection scheme ln_traadv_muscl2 = ', ln_traadv_muscl2141 WRITE(numout,*) ' Namelist nam_traadv : chose a advection scheme for tracers' 142 WRITE(numout,*) ' 2nd order advection scheme ln_traadv_cen2 = ', ln_traadv_cen2 143 WRITE(numout,*) ' TVD advection scheme ln_traadv_tvd = ', ln_traadv_tvd 144 WRITE(numout,*) ' MUSCL advection scheme ln_traadv_muscl = ', ln_traadv_muscl 145 WRITE(numout,*) ' MUSCL2 advection scheme ln_traadv_muscl2 = ', ln_traadv_muscl2 146 WRITE(numout,*) ' UBS advection scheme ln_traadv_ubs = ', ln_traadv_ubs 158 147 ENDIF 159 148 160 ! Control of Advection scheme options 161 ! ----------------------------------- 162 ioptio = 0 149 ioptio = 0 ! Parameter control 163 150 IF( ln_traadv_cen2 ) ioptio = ioptio + 1 164 151 IF( ln_traadv_tvd ) ioptio = ioptio + 1 165 152 IF( ln_traadv_muscl ) ioptio = ioptio + 1 166 153 IF( ln_traadv_muscl2 ) ioptio = ioptio + 1 154 IF( ln_traadv_ubs ) ioptio = ioptio + 1 155 IF( lk_esopa ) ioptio = 1 167 156 168 IF( .NOT.lk_esopa .AND. ( ioptio > 1 .OR. ioptio == 0 ) ) & 169 & CALL ctl_stop( ' Choose ONE advection scheme in namelist nam_traadv' ) 157 IF( ioptio /= 1 ) CALL ctl_stop( 'Choose ONE advection scheme in namelist nam_traadv' ) 170 158 171 IF( n_cla == 1 .AND. .NOT. ln_traadv_cen2 ) &172 & CALL ctl_stop( 'cross-land advection only with 2nd order advection scheme' )159 IF( n_cla == 1 .AND. .NOT. ln_traadv_cen2 ) & 160 & CALL ctl_stop( 'cross-land advection only with 2nd order advection scheme' ) 173 161 174 ! Set nadv 175 ! -------- 176 IF( ln_traadv_cen2 ) nadv = 0 162 ! ! Set nadv 163 IF( ln_traadv_cen2 ) nadv = 0 177 164 #if defined key_mpp_omp 178 IF( ln_traadv_cen2 ) nadv = 1165 IF( ln_traadv_cen2 ) nadv = 1 179 166 #endif 180 IF( ln_traadv_tvd ) nadv = 2 181 IF( ln_traadv_muscl ) nadv = 3 182 IF( ln_traadv_muscl2 ) nadv = 4 167 IF( ln_traadv_tvd ) nadv = 2 168 IF( ln_traadv_muscl ) nadv = 3 169 IF( ln_traadv_muscl2 ) nadv = 4 170 IF( ln_traadv_ubs ) nadv = 5 171 IF( lk_esopa ) nadv = -1 183 172 184 IF( lk_esopa ) THEN 185 IF(lwp) WRITE(numout,*) ' esopa control: use all lateral physics options' 186 nadv = -1 173 IF(lwp) THEN ! Print the choice 174 WRITE(numout,*) 175 IF( nadv == 0 ) WRITE(numout,*) ' 2nd order scheme is used' 176 IF( nadv == 1 ) WRITE(numout,*) ' 2nd order scheme is usedi, k-j-i case' 177 IF( nadv == 2 ) WRITE(numout,*) ' TVD scheme is used' 178 IF( nadv == 3 ) WRITE(numout,*) ' MUSCL scheme is used' 179 IF( nadv == 4 ) WRITE(numout,*) ' MUSCL2 scheme is used' 180 IF( nadv == 5 ) WRITE(numout,*) ' UBS scheme is used' 181 IF( nadv == -1 ) WRITE(numout,*) ' esopa test: use all advection scheme' 187 182 ENDIF 188 IF(lwp) WRITE(numout,*) ' choice of tra_adv_... nadv = ', nadv 189 183 ! 190 184 END SUBROUTINE tra_adv_ctl 191 185 -
trunk/NEMO/OPA_SRC/TRA/traadv_cen2.F90
r457 r503 4 4 !! Ocean active tracers: horizontal & vertical advective trend 5 5 !!============================================================================== 6 !! History : 7 !! 8.2 ! 01-08 (G. Madec, E. Durand) trahad+trazad = traadv8 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module9 !! 9.0 ! 04-08 (C. Talandier) New trendsorganization10 !! " ! 05-11 (V. Garnier) Surface pressure gradient organization11 !! " ! 06-04 (R. Benshila, G. Madec) Step reorganization 6 !! History : 8.2 ! 01-08 (G. Madec, E. Durand) trahad+trazad = traadv 7 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 8 !! 9.0 ! 05-11 (V. Garnier) Surface pressure gradient organization 9 !! " " ! 06-04 (R. Benshila, G. Madec) Step reorganization 10 !!---------------------------------------------------------------------- 11 12 12 !!---------------------------------------------------------------------- 13 13 !! tra_adv_cen2 : update the tracer trend with the horizontal and … … 15 15 !! centered scheme. (k-j-i loops) 16 16 !!---------------------------------------------------------------------- 17 !! * Modules used18 17 USE oce ! ocean dynamics and active tracers 19 18 USE dom_oce ! ocean space and time domain … … 33 32 PRIVATE 34 33 35 !! * Accessibility 36 PUBLIC tra_adv_cen2 ! routine called by step.F90 34 PUBLIC tra_adv_cen2 ! routine called by step.F90 35 36 REAL(wp), DIMENSION(jpi,jpj) :: btr2 ! inverse of T-point surface [1/(e1t*e2t)] 37 37 38 38 !! * Substitutions … … 42 42 !! OPA 9.0 , LOCEAN-IPSL (2005) 43 43 !! $Header$ 44 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt44 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 45 45 !!---------------------------------------------------------------------- 46 46 … … 86 86 !! zta+tn*divn=1/(e1t*e2t*e3t) { mi-1( e2u*e3u un di[tn] ) 87 87 !! +mj-1( e1v*e3v vn mj[tn] ) } 88 !! C A U T I O N : the trend saved is the centered trend only.89 !! It doesn't take into account the upstream part of the scheme.90 88 !! NB:in z-coordinate - full step (ln_zco=T) e3u=e3v=e3t, so 91 89 !! they vanish from the expression of the flux and divergence. … … 110 108 !! 111 109 !! ** Action : - update (ta,sa) with the now advective tracer trends 112 !! - save trends in (ttrdh,ttrd,strdhi,strd) ('key_trdtra') 113 !! 110 !! - save trends in (ztrdt,ztrds) ('key_trdtra') 114 111 !!---------------------------------------------------------------------- 115 !! * Modules used 116 USE oce , zwx => ua, & ! use ua as workspace 117 & zwy => va ! use va as workspace 118 119 !! * Arguments 120 INTEGER , INTENT( in ) :: kt ! ocean time-step index 121 REAL(wp), INTENT( in ), DIMENSION(jpi,jpj,jpk) :: & 122 pun, pvn, pwn ! now ocean velocity fields 123 124 !! * Local save 125 REAL(wp), DIMENSION(jpi,jpj), SAVE :: & 126 zbtr2 127 128 !! * Local declarations 129 INTEGER :: ji, jj, jk ! dummy loop indices 112 USE oce, ONLY : zwx => ua ! use ua as workspace 113 USE oce, ONLY : zwy => va ! use va as workspace 114 !! 115 INTEGER , INTENT(in) :: kt ! ocean time-step index 116 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pun ! ocean velocity u-component 117 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pvn ! ocean velocity v-component 118 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pwn ! ocean velocity w-component 119 !! 120 INTEGER :: ji, jj, jk ! dummy loop indices 130 121 REAL(wp) :: & 131 122 zbtr, zta, zsa, zfui, zfvj, & ! temporary scalars … … 135 126 zcofk, zupst, zupss, zcent, & ! " " 136 127 zcens, zfp_w, zfm_w, & ! " " 137 zcenut, zcenvt, zcenus, zcenvs 138 REAL(wp), DIMENSION(jpi,jpj,jpk) :: &139 zwz, zww, zind, & ! temporary workspace arrays140 ztdta, ztdsa ! ""128 zcenut, zcenvt, zcenus, zcenvs, & ! " " 129 z_hdivn_x, z_hdivn_y, z_hdivn 130 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwz, ztrdt, zind ! 3D workspace 131 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zww, ztrds ! " " 141 132 !!---------------------------------------------------------------------- 142 133 … … 146 137 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ Vector optimization case' 147 138 IF(lwp) WRITE(numout,*) 148 149 zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 150 ENDIF 151 152 ! Save ta and sa trends 153 IF( l_trdtra ) THEN 154 ztdta(:,:,:) = ta(:,:,:) 155 ztdsa(:,:,:) = sa(:,:,:) 156 l_adv = 'ce2' 139 ! 140 btr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 157 141 ENDIF 158 142 159 143 ! Upstream / centered scheme indicator 160 144 ! ------------------------------------ 161 162 145 DO jk = 1, jpk 163 146 DO jj = 1, jpj … … 176 159 177 160 178 ! I. Horizontal advective fluxes 179 ! ------------------------------ 180 181 ! 1. Second order centered tracer flux at u and v-points 182 ! ------------------------------------------------------- 183 161 ! Horizontal advective fluxes 162 ! ----------------------------- 184 163 ! ! =============== 185 164 DO jk = 1, jpkm1 ! Horizontal slab … … 220 199 END DO 221 200 222 ! 2. Tracer flux divergence at t-point added to the general trend 223 ! --------------------------------------------------------------- 224 201 ! Tracer flux divergence at t-point added to the general trend 202 ! -------------------------------------------------------------- 225 203 DO jj = 2, jpjm1 226 204 DO ji = fs_2, fs_jpim1 ! vector opt. 227 205 #if defined key_zco 228 zbtr = zbtr2(ji,jj)229 #else 230 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)206 zbtr = btr2(ji,jj) 207 #else 208 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 231 209 #endif 232 210 ! horizontal advective trends … … 244 222 ! ! =============== 245 223 246 ! 3. Save the horizontal advective trends for diagnostic 247 ! ------------------------------------------------------ 248 IF( l_trdtra ) THEN 249 ! Recompute the hoizontal advection zta & zsa trends computed 250 ! at the step 2. above in making the difference between the new 251 ! trends and the previous one ta()/sa - ztdta()/ztdsa() and add 252 ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 253 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:) 254 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 255 256 CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 257 258 ! Save the new ta and sa trends 259 ztdta(:,:,:) = ta(:,:,:) 260 ztdsa(:,:,:) = sa(:,:,:) 261 224 ! Save the horizontal advective trends for diagnostic 225 ! ----------------------------------------------------- 226 IF( l_trdtra ) THEN 227 ! T/S ZONAL advection trends 228 ztrdt(:,:,:) = 0.e0 ; ztrds(:,:,:) = 0.e0 229 ! 230 DO jk = 1, jpkm1 231 DO jj = 2, jpjm1 232 DO ji = fs_2, fs_jpim1 ! vector opt. 233 !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 234 ! N.B. This computation is not valid along OBCs (if any) 235 #if defined key_zco 236 zbtr = btr2(ji,jj) 237 z_hdivn_x = ( e2u(ji ,jj) * pun(ji ,jj,jk) & 238 & - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 239 #else 240 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 241 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * pun(ji ,jj,jk) & 242 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 243 #endif 244 ztrdt(ji,jj,jk) = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 245 ztrds(ji,jj,jk) = - zbtr * ( zww(ji,jj,jk) - zww(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 246 END DO 247 END DO 248 END DO 249 CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 250 ! 251 ! T/S MERIDIONAL advection trends 252 DO jk = 1, jpkm1 253 DO jj = 2, jpjm1 254 DO ji = fs_2, fs_jpim1 ! vector opt. 255 !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 256 ! N.B. This computation is not valid along OBCs (if any) 257 #if defined key_zco 258 zbtr = btr2(ji,jj) 259 z_hdivn_y = ( e1v(ji,jj ) * pvn(ji,jj ,jk) & 260 & - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 261 #else 262 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 263 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * pvn(ji,jj ,jk) & 264 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 265 #endif 266 ztrdt(ji,jj,jk) = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y 267 ztrds(ji,jj,jk) = - zbtr * ( zwz(ji,jj,jk) - zwz(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 268 END DO 269 END DO 270 END DO 271 CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 272 ! 273 ! Save the horizontal up-to-date ta/sa trends 274 ztrdt(:,:,:) = ta(:,:,:) 275 ztrds(:,:,:) = sa(:,:,:) 262 276 ENDIF 263 277 … … 265 279 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 266 280 267 ! "zonal" mean advective heat and salt transport 281 ! 4. "zonal" mean advective heat and salt transport 282 ! ------------------------------------------------- 283 268 284 IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 269 285 IF( lk_zco ) THEN … … 299 315 ! 1. Vertical advective fluxes 300 316 ! ---------------------------- 301 302 317 ! Second order centered tracer flux at w-point 303 304 318 DO jk = 2, jpk 305 319 DO jj = 2, jpjm1 … … 324 338 END DO 325 339 326 327 340 ! 2. Tracer flux divergence at t-point added to the general trend 328 341 ! ------------------------- 329 330 342 DO jk = 1, jpkm1 331 343 DO jj = 2, jpjm1 … … 347 359 ! Recompute the vertical advection zta & zsa trends computed 348 360 ! at the step 2. above in making the difference between the new 349 ! trends and the previous one: ta()/sa - zt dta()/ztdsa() and substract361 ! trends and the previous one: ta()/sa - ztrdt()/ztrds() and substract 350 362 ! the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 351 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - tn(:,:,:) * hdivn(:,:,:) 352 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 353 354 CALL trd_mod(ztdta, ztdsa, jpttdzad, 'TRA', kt) 363 364 DO jk = 1, jpkm1 365 DO jj = 2, jpjm1 366 DO ji = fs_2, fs_jpim1 ! vector opt. 367 #if defined key_zco 368 zbtr = btr2(ji,jj) 369 z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 370 z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 371 #else 372 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 373 z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 374 z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 375 #endif 376 z_hdivn = (z_hdivn_x + z_hdivn_y) * zbtr 377 ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn 378 ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 379 END DO 380 END DO 381 END DO 382 CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 355 383 ENDIF 356 384 357 385 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' cen2 zad - Ta: ', mask1=tmask, & 358 386 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 359 360 387 ! 361 388 END SUBROUTINE tra_adv_cen2 362 389 -
trunk/NEMO/OPA_SRC/TRA/traadv_cen2_jki.F90
r458 r503 4 4 !! Ocean active tracers: horizontal & vertical advective trend 5 5 !!============================================================================== 6 !! History : 7 !! 8.2 ! 01-08 (G. Madec, E. Durand) trahad+trazad = traadv8 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module9 !! 9.0 ! 04-08 (C. Talandier) New trendsorganization10 !! " ! 05-11 (V. Garnier) Surface pressure gradient organization11 !! " ! 06-04 (R. Benshila, G. Madec) Step reorganization 6 !! History : 8.2 ! 01-08 (G. Madec, E. Durand) trahad+trazad = traadv 7 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 8 !! 9.0 ! 05-11 (V. Garnier) Surface pressure gradient organization 9 !! " " ! 06-04 (R. Benshila, G. Madec) Step reorganization 10 !!---------------------------------------------------------------------- 11 12 12 !!---------------------------------------------------------------------- 13 13 !! tra_adv_cen2_jki : update the tracer trend with the horizontal and … … 16 16 !! hor. adv., j-slab for vert. adv. (j-k-i loops) 17 17 !!---------------------------------------------------------------------- 18 !! * Modules used19 18 USE oce ! ocean dynamics and active tracers 20 19 USE dom_oce ! ocean space and time domain … … 34 33 PRIVATE 35 34 36 !! * Accessibility 37 PUBLIC tra_adv_cen2_jki ! routine called by step.F90 35 PUBLIC tra_adv_cen2_jki ! routine called by step.F90 36 37 REAL(wp), DIMENSION(jpi,jpj) :: btr2 ! inverse of T-point surface [1/(e1t*e2t)] 38 38 39 39 !! * Substitutions … … 42 42 !!---------------------------------------------------------------------- 43 43 !! OPA 9.0 , LOCEAN-IPSL (2005) 44 !! $Header$ 45 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 44 46 !!---------------------------------------------------------------------- 45 47 46 48 CONTAINS 47 48 !!----------------------------------------------------------------------49 !! OPA 9.0 , LOCEAN-IPSL (2005)50 !!----------------------------------------------------------------------51 49 52 50 SUBROUTINE tra_adv_cen2_jki( kt, pun, pvn, pwn ) … … 89 87 !! zta+tn*divn=1/(e1t*e2t*e3t) { mi-1( e2u*e3u un di[tn] ) 90 88 !! +mj-1( e1v*e3v vn mj[tn] ) } 91 !! C A U T I O N : the trend saved is the centered trend only.92 !! It doesn't take into account the upstream part of the scheme.93 89 !! NB:in z-coordinate - full step (ln_zco=T) e3u=e3v=e3t, so 94 90 !! they vanish from the expression of the flux and divergence. … … 113 109 !! 114 110 !! ** Action : - update (ta,sa) with the now advective tracer trends 115 !! - save trends in (ttrdh,ttrd,strdhi,strd) ('key_trdtra') 116 !! 111 !! - save trends in (ztrdt,ztrds) ('key_trdtra') 117 112 !!---------------------------------------------------------------------- 118 !! * Modules used 119 USE oce , zwx => ua, & ! use ua as workspace 120 & zwy => va ! use va as workspace 121 122 !! * Arguments 123 INTEGER , INTENT( in ) :: kt ! ocean time-step index 124 REAL(wp), INTENT( in ), DIMENSION(jpi,jpj,jpk) :: & 125 pun, pvn, pwn ! now ocean velocity fields 126 127 !! * Local save 128 REAL(wp), DIMENSION(jpi,jpj), SAVE :: & 129 zbtr2 130 131 !! * Local declarations 132 INTEGER :: ji, jj, jk ! dummy loop indices 113 USE oce, ONLY : zwx => ua ! use ua as workspace 114 USE oce, ONLY : zwy => va ! use va as workspace 115 !! 116 INTEGER , INTENT(in) :: kt ! ocean time-step index 117 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pun ! ocean velocity u-component 118 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pvn ! ocean velocity v-component 119 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pwn ! ocean velocity w-component 120 !! 121 INTEGER :: ji, jj, jk ! dummy loop indices 133 122 REAL(wp) :: & 134 123 zbtr, zta, zsa, zfui, zfvj, & ! temporary scalars … … 138 127 zcofk, zupst, zupss, zcent, & ! " " 139 128 zcens, zfp_w, zfm_w, & ! " " 140 zcenut, zcenvt, zcenus, zcenvs 141 REAL(wp), DIMENSION(jpi,jpj,jpk) :: &142 zwz, zww, zind, & ! temporary workspace arrays143 ztdta, ztdsa ! ""129 zcenut, zcenvt, zcenus, zcenvs, & ! " " 130 z_hdivn_x, z_hdivn_y, z_hdivn 131 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwz, ztrdt, zind ! 3D workspace 132 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zww, ztrds ! " " 144 133 !!---------------------------------------------------------------------- 145 134 … … 149 138 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~ Auto-tasking case' 150 139 IF(lwp) WRITE(numout,*) 151 152 zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 153 ENDIF 154 155 ! Save ta and sa trends 156 IF( l_trdtra ) THEN 157 ztdta(:,:,:) = ta(:,:,:) 158 ztdsa(:,:,:) = sa(:,:,:) 159 l_adv = 'ce2' 140 ! 141 btr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 160 142 ENDIF 161 143 … … 165 147 DO jk = 1, jpkm1 ! Horizontal slab 166 148 ! ! =============== 167 168 ! 0. Upstream / centered scheme indicator 169 ! --------------------------------------- 149 ! Upstream / centered scheme indicator 150 ! -------------------------------------- 170 151 DO jj = 1, jpj 171 152 DO ji = 1, jpi … … 181 162 END DO 182 163 183 184 ! I. Horizontal advective fluxes 185 ! ------------------------------ 164 ! Horizontal advective fluxes 165 ! ----------------------------- 186 166 ! Second order centered tracer flux at u and v-points 187 167 DO jj = 1, jpjm1 … … 220 200 END DO 221 201 222 ! 2. Tracer flux divergence at t-point added to the general trend 223 ! --------------------------------------------------------------- 224 202 ! Tracer flux divergence at t-point added to the general trend 225 203 DO jj = 2, jpjm1 226 204 DO ji = fs_2, fs_jpim1 ! vector opt. 227 205 #if defined key_zco 228 zbtr = zbtr2(ji,jj)229 #else 230 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)206 zbtr = btr2(ji,jj) 207 #else 208 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 231 209 #endif 232 210 ! horizontal advective trends … … 244 222 ! ! =============== 245 223 246 ! 3. Save the horizontal advective trends for diagnostic 247 ! ------------------------------------------------------ 224 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' cen2 had - Ta: ', mask1=tmask, & 225 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 226 227 ! Save the horizontal advective trends for diagnostics 248 228 IF( l_trdtra ) THEN 249 ! Recompute the hoizontal advection zta & zsa trends computed 250 ! at the step 2. above in making the difference between the new 251 ! trends and the previous one ta()/sa - ztdta()/ztdsa() and add 252 ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 253 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:) 254 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 255 256 CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 257 258 ! Save the new ta and sa trends 259 ztdta(:,:,:) = ta(:,:,:) 260 ztdsa(:,:,:) = sa(:,:,:) 261 229 ztrdt(:,:,:) = 0.e0 ; ztrds(:,:,:) = 0.e0 230 ! 231 ! T/S ZONAL advection trends 232 DO jk = 1, jpkm1 233 DO jj = 2, jpjm1 234 DO ji = fs_2, fs_jpim1 ! vector opt. 235 !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 236 ! N.B. This computation is not valid along OBCs (if any) 237 #if defined key_zco 238 zbtr = btr2(ji,jj) 239 z_hdivn_x = ( e2u(ji ,jj) * pun(ji ,jj,jk) & 240 & - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 241 #else 242 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 243 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * pun(ji ,jj,jk) & 244 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 245 #endif 246 ztrdt(ji,jj,jk) = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 247 ztrds(ji,jj,jk) = - zbtr * ( zww(ji,jj,jk) - zww(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 248 END DO 249 END DO 250 END DO 251 CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 252 ! 253 ! T/S MERIDIONAL advection trends 254 DO jk = 1, jpkm1 255 DO jj = 2, jpjm1 256 DO ji = fs_2, fs_jpim1 ! vector opt. 257 !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 258 ! N.B. This computation is not valid along OBCs (if any) 259 #if defined key_zco 260 zbtr = btr2(ji,jj) 261 z_hdivn_y = ( e1v(ji,jj ) * pvn(ji,jj ,jk) & 262 & - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 263 #else 264 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 265 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * pvn(ji,jj ,jk) & 266 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 267 #endif 268 ztrdt(ji,jj,jk) = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y 269 ztrds(ji,jj,jk) = - zbtr * ( zwz(ji,jj,jk) - zwz(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 270 END DO 271 END DO 272 END DO 273 CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 274 ! 275 ! Save the up-to-date ta and sa trends 276 ztrdt(:,:,:) = ta(:,:,:) 277 ztrds(:,:,:) = sa(:,:,:) 278 ! 262 279 ENDIF 263 280 … … 281 298 ENDIF 282 299 283 ! II.Vertical advection284 ! -------------------- --300 ! Vertical advection 301 ! -------------------- 285 302 !CDIR PARALLEL DO 286 303 !$OMP PARALLEL DO … … 300 317 ENDIF 301 318 302 ! 1. Vertical advective fluxes 303 ! ---------------------------- 304 ! Second order centered tracer flux at w-point 319 ! Vertical advective fluxes at w-point 305 320 DO jk = 2, jpk 306 321 DO ji = 2, jpim1 … … 323 338 END DO 324 339 325 ! 2. Tracer flux divergence at t-point added to the general trend 326 ! ------------------------- 340 ! Tracer flux divergence at t-point added to the general trend 327 341 DO jk = 1, jpkm1 328 342 DO ji = 2, jpim1 … … 340 354 ! ! =============== 341 355 342 ! 3. Save the vertical advective trends for diagnostic 343 ! ---------------------------------------------------- 356 ! Save the vertical advective trends for diagnostic 344 357 IF( l_trdtra ) THEN 345 358 ! Recompute the vertical advection zta & zsa trends computed 346 359 ! at the step 2. above in making the difference between the new 347 ! trends and the previous one: ta()/sa - zt dta()/ztdsa() and substract360 ! trends and the previous one: ta()/sa - ztrdt()/ztrds() and substract 348 361 ! the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 349 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - tn(:,:,:) * hdivn(:,:,:) 350 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 351 352 CALL trd_mod(ztdta, ztdsa, jpttdzad, 'TRA', kt) 362 ! 363 DO jk = 1, jpkm1 364 DO jj = 2, jpjm1 365 DO ji = fs_2, fs_jpim1 ! vector opt. 366 #if defined key_zco 367 zbtr = btr2(ji,jj) 368 z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 369 z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 370 #else 371 zbtr = btr2(ji,jj) / fse3t(ji,jj,jk) 372 z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 373 z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 374 #endif 375 z_hdivn = (z_hdivn_x + z_hdivn_y) * zbtr 376 ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn 377 ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 378 END DO 379 END DO 380 END DO 381 CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 382 ! 353 383 ENDIF 354 384 355 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' cen2 zad - Ta: ', mask1=tmask, &385 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' cen2 zad - Ta: ', mask1=tmask, & 356 386 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 357 387 ! 358 388 END SUBROUTINE tra_adv_cen2_jki 359 389 -
trunk/NEMO/OPA_SRC/TRA/traadv_eiv.F90
r458 r503 1 1 MODULE traadv_eiv 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE traadv_eiv *** 4 4 !! Ocean active tracers: advection trend - eddy induced velocity 5 !!============================================================================== 6 !! History : 7 !! 9.0 ! 05-11 (G. Madec) Original code from traldf & zdf _iso 5 !!====================================================================== 6 !! History : 9.0 ! 05-11 (G. Madec) Original code, from traldf and zdf _iso 8 7 !!---------------------------------------------------------------------- 9 8 #if defined key_traldf_eiv || defined key_esopa … … 11 10 !! 'key_traldf_eiv' rotation of the lateral mixing tensor 12 11 !!---------------------------------------------------------------------- 12 !!---------------------------------------------------------------------- 13 13 !! tra_ldf_iso : update the tracer trend with the horizontal component 14 14 !! of iso neutral laplacian operator or horizontal 15 15 !! laplacian operator in s-coordinate 16 16 !!---------------------------------------------------------------------- 17 !! * Modules used18 17 USE oce ! ocean dynamics and tracers variables 19 18 USE dom_oce ! ocean space and time domain variables … … 25 24 PRIVATE 26 25 27 !! * Routine accessibility 28 PUBLIC tra_adv_eiv ! routine called by step.F90 29 26 PUBLIC tra_adv_eiv ! routine called by step.F90 30 27 31 28 !! * Substitutions … … 35 32 # include "vectopt_loop_substitute.h90" 36 33 !!---------------------------------------------------------------------- 37 !! OPA 9.0 , LOCEAN-IPSL (2005) 34 !! OPA 9.0 , LOCEAN-IPSL (2006) 35 !! $Header$ 36 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 38 37 !!---------------------------------------------------------------------- 39 38 … … 57 56 !! 58 57 !! ** Action : - add to p.n the eiv component 58 !!---------------------------------------------------------------------- 59 INTEGER , INTENT(in ) :: kt ! ocean time-step index 60 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun ! in : 3 ocean velocity components 61 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pvn ! out: 3 ocean velocity components 62 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pwn ! increased by the eiv 59 63 !! 60 !!---------------------------------------------------------------------- 61 !! * Arguments 62 INTEGER , INTENT( in ) :: kt ! ocean time-step index 63 REAL(wp), INTENT( inout ), DIMENSION(jpi,jpj,jpk) :: & 64 pun, pvn, pwn ! in : now ocean velocity fields 65 ! ! out: fields increased by the eiv components 66 67 !! * Local declarations 68 INTEGER :: ji, jj, jk ! dummy loop indices 69 REAL(wp) :: & 70 zuwk, zuwk1, zuwi, zuwi1, & ! temporary scalar 71 zvwk, zvwk1, zvwj, zvwj1, & ! 72 zu_eiv, zv_eiv, zw_eiv ! 64 INTEGER :: ji, jj, jk ! dummy loop indices 65 REAL(wp) :: zuwk, zuwk1, zuwi, zuwi1 ! temporary scalar 66 REAL(wp) :: zvwk, zvwk1, zvwj, zvwj1 ! " " 67 REAL(wp) :: zu_eiv, zv_eiv, zw_eiv ! " " 73 68 !!---------------------------------------------------------------------- 74 69 … … 83 78 # endif 84 79 ENDIF 85 86 80 ! ! ================= 87 81 DO jk = 1, jpkm1 ! Horizontal slab 88 82 ! ! ================= 89 90 83 DO jj = 1, jpjm1 91 84 DO ji = 1, fs_jpim1 ! vector opt. … … 95 88 zvwk1= ( wslpj(ji,jj,jk+1) + wslpj(ji,jj+1,jk+1) ) * fsaeiv(ji,jj,jk+1) * vmask(ji,jj,jk+1) 96 89 97 zu_eiv = 98 zv_eiv = 90 zu_eiv = 0.5 * umask(ji,jj,jk) * ( zuwk - zuwk1 ) / fse3u(ji,jj,jk) 91 zv_eiv = 0.5 * vmask(ji,jj,jk) * ( zvwk - zvwk1 ) / fse3v(ji,jj,jk) 99 92 100 93 pun(ji,jj,jk) = pun(ji,jj,jk) + zu_eiv 101 94 pvn(ji,jj,jk) = pvn(ji,jj,jk) + zv_eiv 102 103 95 # if defined key_diaeiv 104 96 u_eiv(ji,jj,jk) = zu_eiv … … 118 110 zw_eiv = - 0.5 * tmask(ji,jj,jk) * ( zuwi1 - zuwi + zvwj1 - zvwj ) / ( e1t(ji,jj)*e2t(ji,jj) ) 119 111 # else 120 zuw ki= ( wslpi(ji,jj,jk) + wslpi(ji-1,jj,jk) ) * e2u(ji-1,jj) * umask(ji-1,jj,jk)121 zuw k= ( wslpi(ji,jj,jk) + wslpi(ji+1,jj,jk) ) * e2u(ji ,jj) * umask(ji ,jj,jk)122 zvw ki= ( wslpj(ji,jj,jk) + wslpj(ji,jj-1,jk) ) * e1v(ji,jj-1) * vmask(ji,jj-1,jk)123 zvw k= ( wslpj(ji,jj,jk) + wslpj(ji,jj+1,jk) ) * e1v(ji ,jj) * vmask(ji ,jj,jk)112 zuwi = ( wslpi(ji,jj,jk) + wslpi(ji-1,jj,jk) ) * e2u(ji-1,jj) * umask(ji-1,jj,jk) 113 zuwi1 = ( wslpi(ji,jj,jk) + wslpi(ji+1,jj,jk) ) * e2u(ji ,jj) * umask(ji ,jj,jk) 114 zvwj = ( wslpj(ji,jj,jk) + wslpj(ji,jj-1,jk) ) * e1v(ji,jj-1) * vmask(ji,jj-1,jk) 115 zvwj1 = ( wslpj(ji,jj,jk) + wslpj(ji,jj+1,jk) ) * e1v(ji ,jj) * vmask(ji ,jj,jk) 124 116 125 zw_eiv = - 0.5 * tmask(ji,jj,jk) * fsaeiw(ji,jj,jk) * ( zuw k - zuwki + zvwk - zvwki )117 zw_eiv = - 0.5 * tmask(ji,jj,jk) * fsaeiw(ji,jj,jk) * ( zuwi1 - zuwi + zvwj1 - zvwj ) & 126 118 & / ( e1t(ji,jj)*e2t(ji,jj) ) 127 119 # endif … … 137 129 END DO ! End of slab 138 130 ! ! ================= 139 140 131 END SUBROUTINE tra_adv_eiv 141 132 … … 146 137 CONTAINS 147 138 SUBROUTINE tra_adv_eiv( kt, pun, pvn, pwn ) ! Empty routine 148 INTEGER :: kt149 139 REAL, DIMENSION(:,:,:) :: pun, pvn, pwn 150 WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?', & 151 & kt, pun(1,1,1), pvn(1,1,1), pwn(1,1,1) 140 WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?', kt, pun(1,1,1), pvn(1,1,1), pwn(1,1,1) 152 141 END SUBROUTINE tra_adv_eiv 153 142 #endif -
trunk/NEMO/OPA_SRC/TRA/traadv_muscl.F90
r457 r503 1 1 MODULE traadv_muscl 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE traadv_muscl *** 4 4 !! Ocean active tracers: horizontal & vertical advective trend 5 !!============================================================================== 5 !!====================================================================== 6 !! History : ! 06-00 (A.Estublier) for passive tracers 7 !! ! 01-08 (E.Durand, G.Madec) adapted for T & S 8 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 9 !!---------------------------------------------------------------------- 6 10 7 11 !!---------------------------------------------------------------------- … … 9 13 !! and vertical advection trends using MUSCL scheme 10 14 !!---------------------------------------------------------------------- 11 !! * Modules used12 15 USE oce ! ocean dynamics and active tracers 13 16 USE dom_oce ! ocean space and time domain … … 25 28 PRIVATE 26 29 27 !! * Accessibility 28 PUBLIC tra_adv_muscl ! routine called by step.F90 30 PUBLIC tra_adv_muscl ! routine called by step.F90 29 31 30 32 !! * Substitutions … … 32 34 # include "vectopt_loop_substitute.h90" 33 35 !!---------------------------------------------------------------------- 34 !! OPA 9.0 , LOCEAN-IPSL (200 5)36 !! OPA 9.0 , LOCEAN-IPSL (2006) 35 37 !! $Header$ 36 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt38 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 37 39 !!---------------------------------------------------------------------- 38 40 … … 50 52 !! 51 53 !! ** Action : - update (ta,sa) with the now advective tracer trends 52 !! - save trends in (ztdta,ztdsa) ('key_trdtra') 53 !! 54 !! References : 55 !! Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 56 !! IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 57 !! 58 !! History : 59 !! ! 06-00 (A.Estublier) for passive tracers 60 !! ! 01-08 (E.Durand G.Madec) adapted for T & S 61 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 62 !! 9.0 ! 04-08 (C. Talandier) New trends organization 54 !! - save trends in (ztrdt,ztrds) ('key_trdtra') 55 !! 56 !! References : Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 57 !! IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 63 58 !!---------------------------------------------------------------------- 64 !! * Arguments 65 INTEGER , INTENT( in ) :: kt ! ocean time-step index 66 REAL(wp), INTENT( in ), DIMENSION(jpi,jpj,jpk) :: & 67 pun, pvn, pwn ! now ocean velocity fields 68 69 !! * Local declarations 70 INTEGER :: ji, jj, jk ! dummy loop indices 59 USE oce, ONLY : ztrdt => ua ! use ua as workspace 60 USE oce, ONLY : ztrds => va ! use va as workspace 61 !! 62 INTEGER , INTENT(in) :: kt ! ocean time-step index 63 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pun ! ocean velocity u-component 64 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pvn ! ocean velocity v-component 65 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pwn ! ocean velocity w-component 66 !! 67 INTEGER :: ji, jj, jk ! dummy loop indices 71 68 REAL(wp) :: & 72 69 zu, zv, zw, zeu, zev, & … … 75 72 zzt1, zzt2, zalpha, & 76 73 zzs1, zzs2, z2, & 77 zta, zsa 78 REAL(wp), DIMENSION (jpi,jpj,jpk) :: & 79 zt1, zt2, ztp1, ztp2, & 80 zs1, zs2, zsp1, zsp2, & 81 ztdta, ztdsa 74 zta, zsa, & 75 z_hdivn_x, z_hdivn_y, z_hdivn 76 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zt1, zt2, ztp1, ztp2 ! 3D workspace 77 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zs1, zs2, zsp1, zsp2 ! " " 82 78 !!---------------------------------------------------------------------- 83 79 … … 88 84 ENDIF 89 85 90 IF( neuler == 0 .AND. kt == nit000 ) THEN 91 z2=1. 92 ELSE 93 z2=2. 94 ENDIF 95 96 ! Save ta and sa trends 97 IF( l_trdtra ) THEN 98 ztdta(:,:,:) = ta(:,:,:) 99 ztdsa(:,:,:) = sa(:,:,:) 100 l_adv = 'mus' 101 ENDIF 102 86 IF( neuler == 0 .AND. kt == nit000 ) THEN ; z2 = 1. 87 ELSE ; z2 = 2. 88 ENDIF 103 89 104 90 ! I. Horizontal advective fluxes 105 91 ! ------------------------------ 106 107 92 ! first guess of the slopes 108 93 ! interior values … … 193 178 zt1(ji,jj,jk) = zeu * ( zalpha * zzt1 + (1.-zalpha) * zzt2 ) 194 179 zs1(ji,jj,jk) = zeu * ( zalpha * zzs1 + (1.-zalpha) * zzs2 ) 195 180 ! 196 181 z0v = SIGN( 0.5, pvn(ji,jj,jk) ) 197 182 zalpha = 0.5 - z0v … … 211 196 CALL lbc_lnk( zt2, 'V', -1. ) ; CALL lbc_lnk( zs2, 'V', -1. ) 212 197 213 ! Save MUSCL fluxes to compute i- & j- horizontal 214 ! advection trends in the MLD 215 IF( l_trdtra ) THEN 216 ! save i- terms 217 tladi(:,:,:) = zt1(:,:,:) 218 sladi(:,:,:) = zs1(:,:,:) 219 ! save j- terms 220 tladj(:,:,:) = zt2(:,:,:) 221 sladj(:,:,:) = zs2(:,:,:) 222 ENDIF 223 224 ! Compute & add the horizontal advective trend 225 198 ! Tracer flux divergence at t-point added to the general trend 226 199 DO jk = 1, jpkm1 227 200 DO jj = 2, jpjm1 … … 244 217 END DO 245 218 246 ! Save the horizontal advective trends for diagnostic 247 248 IF( l_trdtra ) THEN 249 ! Recompute the horizontal advection zta & zsa trends computed 250 ! at the step 2. above in making the difference between the new 251 ! trends and the previous one ta()/sa - ztdta()/ztdsa() and add 252 ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 253 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:) 254 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 255 256 CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 257 258 ! Save the new ta and sa trends 259 ztdta(:,:,:) = ta(:,:,:) 260 ztdsa(:,:,:) = sa(:,:,:) 261 262 ENDIF 263 264 IF(ln_ctl) THEN 265 CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl had - Ta: ', mask1=tmask , & 266 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra' ) 219 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl had - Ta: ', mask1=tmask , & 220 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 221 222 ! Save the horizontal advective trends for diagnostics 223 IF( l_trdtra ) THEN 224 ztrdt(:,:,:) = 0.e0 ; ztrds(:,:,:) = 0.e0 225 ! 226 ! T/S ZONAL advection trends 227 DO jk = 1, jpkm1 228 DO jj = 2, jpjm1 229 DO ji = fs_2, fs_jpim1 ! vector opt. 230 !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 231 ! N.B. This computation is not valid along OBCs (if any) 232 #if defined key_zco 233 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 234 z_hdivn_x = ( e2u(ji ,jj) * pun(ji ,jj,jk) & 235 & - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 236 #else 237 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 238 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * pun(ji ,jj,jk) & 239 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 240 #endif 241 ztrdt(ji,jj,jk) = - zbtr * ( zt1(ji,jj,jk) - zt1(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 242 ztrds(ji,jj,jk) = - zbtr * ( zs1(ji,jj,jk) - zs1(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 243 END DO 244 END DO 245 END DO 246 CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 247 248 ! T/S MERIDIONAL advection trends 249 DO jk = 1, jpkm1 250 DO jj = 2, jpjm1 251 DO ji = fs_2, fs_jpim1 ! vector opt. 252 !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 253 ! N.B. This computation is not valid along OBCs (if any) 254 #if defined key_zco 255 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 256 z_hdivn_y = ( e1v(ji,jj ) * pvn(ji,jj ,jk) & 257 & - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 258 #else 259 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 260 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * pvn(ji,jj ,jk) & 261 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 262 #endif 263 ztrdt(ji,jj,jk) = - zbtr * ( zt2(ji,jj,jk) - zt2(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y 264 ztrds(ji,jj,jk) = - zbtr * ( zs2(ji,jj,jk) - zs2(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 265 END DO 266 END DO 267 END DO 268 CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 269 270 ! Save the up-to-date ta and sa trends 271 ztrdt(:,:,:) = ta(:,:,:) 272 ztrds(:,:,:) = sa(:,:,:) 273 ! 267 274 ENDIF 268 275 … … 378 385 379 386 ! Save the vertical advective trends for diagnostic 380 387 ! ------------------------------------------------- 381 388 IF( l_trdtra ) THEN 382 389 ! Recompute the vertical advection zta & zsa trends computed 383 390 ! at the step 2. above in making the difference between the new 384 ! trends and the previous one: ta()/sa - zt dta()/ztdsa() and substract391 ! trends and the previous one: ta()/sa - ztrdt()/ztrds() and substract 385 392 ! the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 386 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - tn(:,:,:) * hdivn(:,:,:) 387 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 388 389 CALL trd_mod(ztdta, ztdsa, jpttdzad, 'TRA', kt) 390 ENDIF 391 392 IF(ln_ctl) THEN 393 CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl zad - Ta: ', mask1=tmask , & 394 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 395 ENDIF 396 393 394 DO jk = 1, jpkm1 395 DO jj = 2, jpjm1 396 DO ji = fs_2, fs_jpim1 ! vector opt. 397 #if defined key_zco 398 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 399 z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 400 z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 401 #else 402 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 403 z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 404 z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 405 #endif 406 z_hdivn = (z_hdivn_x + z_hdivn_y) * zbtr 407 ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn 408 ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 409 END DO 410 END DO 411 END DO 412 CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 413 ! 414 ENDIF 415 416 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl zad - Ta: ', mask1=tmask , & 417 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 418 ! 397 419 END SUBROUTINE tra_adv_muscl 398 420 -
trunk/NEMO/OPA_SRC/TRA/traadv_muscl2.F90
r457 r503 4 4 !! Ocean active tracers: horizontal & vertical advective trend 5 5 !!============================================================================== 6 !! History : 9.0 ! 02-06 (G. Madec) from traadv_muscl 7 !!---------------------------------------------------------------------- 6 8 7 9 !!---------------------------------------------------------------------- … … 9 11 !! and vertical advection trends using MUSCL2 scheme 10 12 !!---------------------------------------------------------------------- 11 !! * Modules used12 13 USE oce ! ocean dynamics and active tracers 13 14 USE dom_oce ! ocean space and time domain … … 32 33 # include "vectopt_loop_substitute.h90" 33 34 !!---------------------------------------------------------------------- 34 !! OPA 9.0 , LOCEAN-IPSL (200 5)35 !! OPA 9.0 , LOCEAN-IPSL (2006) 35 36 !! $Header$ 36 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt37 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 37 38 !!---------------------------------------------------------------------- 38 39 … … 50 51 !! 51 52 !! ** Action : - update (ta,sa) with the now advective tracer trends 52 !! - save trends in (ztdta,ztdsa) ('key_trdtra') 53 !! 54 !! References : 55 !! Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 56 !! IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 57 !! 58 !! History : 59 !! ! 06-00 (A.Estublier) for passive tracers 60 !! ! 01-08 (E.Durand G.Madec) adapted for T & S 61 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 62 !! 9.0 ! 04-08 (C. Talandier) New trends organization 53 !! - save trends in (ztrdt,ztrds) ('key_trdtra') 54 !! 55 !! References : Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 56 !! IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 63 57 !!---------------------------------------------------------------------- 64 !! * Arguments 65 INTEGER , INTENT( in ) :: kt ! ocean time-step index 66 REAL(wp), INTENT( in ), DIMENSION(jpi,jpj,jpk) :: & 67 pun, pvn, pwn ! now ocean velocity fields 68 69 70 !! * Local declarations 71 INTEGER :: ji, jj, jk ! dummy loop indices 58 USE oce , ztrdt => ua ! use ua as workspace 59 USE oce , ztrds => va ! use va as workspace 60 !! 61 INTEGER , INTENT(in) :: kt ! ocean time-step index 62 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pun ! ocean velocity u-component 63 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pvn ! ocean velocity v-component 64 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pwn ! ocean velocity w-component 65 !! 66 INTEGER :: ji, jj, jk ! dummy loop indices 72 67 REAL(wp) :: & 73 68 zu, zv, zw, zeu, zev, & … … 76 71 zzt1, zzt2, zalpha, & 77 72 zzs1, zzs2, z2, & 78 zta, zsa 79 REAL(wp), DIMENSION (jpi,jpj,jpk) :: & 80 zt1, zt2, ztp1, ztp2, & 81 zs1, zs2, zsp1, zsp2, & 82 ztdta, ztdsa 73 zta, zsa, & 74 z_hdivn_x, z_hdivn_y, z_hdivn 75 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zt1, zt2, ztp1, ztp2 ! 3D workspace 76 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zs1, zs2, zsp1, zsp2 ! " " 83 77 !!---------------------------------------------------------------------- 84 78 … … 89 83 ENDIF 90 84 91 IF( neuler == 0 .AND. kt == nit000 ) THEN 92 z2=1. 93 ELSE 94 z2=2. 95 ENDIF 96 97 ! Save ta and sa trends 98 IF( l_trdtra ) THEN 99 ztdta(:,:,:) = ta(:,:,:) 100 ztdsa(:,:,:) = sa(:,:,:) 101 l_adv = 'mu2' 102 ENDIF 103 85 IF( neuler == 0 .AND. kt == nit000 ) THEN ; z2 = 1. 86 ELSE ; z2 = 2. 87 ENDIF 104 88 105 89 ! I. Horizontal advective fluxes … … 194 178 zt1(ji,jj,jk) = zeu * ( zalpha * zzt1 + (1.-zalpha) * zzt2 ) 195 179 zs1(ji,jj,jk) = zeu * ( zalpha * zzs1 + (1.-zalpha) * zzs2 ) 196 180 ! 197 181 z0v = SIGN( 0.5, pvn(ji,jj,jk) ) 198 182 zalpha = 0.5 - z0v … … 271 255 CALL lbc_lnk( zt2, 'V', -1. ) ; CALL lbc_lnk( zs2, 'V', -1. ) 272 256 273 ! Save MUSCL fluxes to compute i- & j- horizontal274 ! advection trends in the MLD275 IF( l_trdtra ) THEN276 ! save i- terms277 tladi(:,:,:) = zt1(:,:,:)278 sladi(:,:,:) = zs1(:,:,:)279 ! save j- terms280 tladj(:,:,:) = zt2(:,:,:)281 sladj(:,:,:) = zs2(:,:,:)282 ENDIF283 284 257 ! Compute & add the horizontal advective trend 285 258 … … 305 278 306 279 ! Save the horizontal advective trends for diagnostic 307 308 IF( l_trdtra ) THEN 309 ! Recompute the horizontal advection zta & zsa trends computed 310 ! at the step 2. above in making the difference between the new 311 ! trends and the previous one ta()/sa - ztdta()/ztdsa() and add 312 ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 313 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:) 314 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 315 316 CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 317 318 ! Save the new ta and sa trends 319 ztdta(:,:,:) = ta(:,:,:) 320 ztdsa(:,:,:) = sa(:,:,:) 321 322 ENDIF 323 324 IF(ln_ctl) THEN 325 CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl2 had - Ta: ', mask1=tmask, & 326 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 327 ENDIF 280 IF( l_trdtra ) THEN 281 ztrdt(:,:,:) = 0.e0 ; ztrds(:,:,:) = 0.e0 282 ! 283 ! T/S ZONAL advection trends 284 DO jk = 1, jpkm1 285 DO jj = 2, jpjm1 286 DO ji = fs_2, fs_jpim1 ! vector opt. 287 !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 288 ! N.B. This computation is not valid along OBCs (if any) 289 #if defined key_zco 290 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 291 z_hdivn_x = ( e2u(ji ,jj) * pun(ji ,jj,jk) & 292 & - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 293 #else 294 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 295 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * pun(ji ,jj,jk) & 296 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 297 #endif 298 ztrdt(ji,jj,jk) = - zbtr * ( zt1(ji,jj,jk) - zt1(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 299 ztrds(ji,jj,jk) = - zbtr * ( zs1(ji,jj,jk) - zs1(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 300 END DO 301 END DO 302 END DO 303 CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 304 305 ! T/S MERIDIONAL advection trends 306 DO jk = 1, jpkm1 307 DO jj = 2, jpjm1 308 DO ji = fs_2, fs_jpim1 ! vector opt. 309 !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 310 ! N.B. This computation is not valid along OBCs (if any) 311 #if defined key_zco 312 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 313 z_hdivn_y = ( e1v(ji,jj ) * pvn(ji,jj ,jk) & 314 & - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 315 #else 316 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 317 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * pvn(ji,jj ,jk) & 318 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 319 #endif 320 ztrdt(ji,jj,jk) = - zbtr * ( zt2(ji,jj,jk) - zt2(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y 321 ztrds(ji,jj,jk) = - zbtr * ( zs2(ji,jj,jk) - zs2(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 322 END DO 323 END DO 324 END DO 325 CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 326 327 ! Save the up-to-date ta and sa trends 328 ztrdt(:,:,:) = ta(:,:,:) 329 ztrds(:,:,:) = sa(:,:,:) 330 ! 331 ENDIF 332 333 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl2 had - Ta: ', mask1=tmask, & 334 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra') 328 335 329 336 ! "zonal" mean advective heat and salt transport … … 451 458 452 459 ! Save the vertical advective trends for diagnostic 453 454 460 IF( l_trdtra ) THEN 455 461 ! Recompute the vertical advection zta & zsa trends computed 456 462 ! at the step 2. above in making the difference between the new 457 ! trends and the previous one: ta()/sa - zt dta()/ztdsa() and substract463 ! trends and the previous one: ta()/sa - ztrdt()/ztrds() and substract 458 464 ! the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 459 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - tn(:,:,:) * hdivn(:,:,:) 460 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 461 462 CALL trd_mod(ztdta, ztdsa, jpttdzad, 'TRA', kt) 463 ENDIF 464 465 IF(ln_ctl) THEN 466 CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl2 zad - Ta: ', mask1=tmask, & 467 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 468 469 ENDIF 470 465 466 DO jk = 1, jpkm1 467 DO jj = 2, jpjm1 468 DO ji = fs_2, fs_jpim1 ! vector opt. 469 #if defined key_zco 470 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 471 z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 472 z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 473 #else 474 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 475 z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 476 z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 477 #endif 478 z_hdivn = (z_hdivn_x + z_hdivn_y) * zbtr 479 ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn 480 ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 481 END DO 482 END DO 483 END DO 484 CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 485 ! 486 ENDIF 487 488 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl2 zad - Ta: ', mask1=tmask, & 489 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 490 ! 471 491 END SUBROUTINE tra_adv_muscl2 472 492 -
trunk/NEMO/OPA_SRC/TRA/traadv_tvd.F90
r457 r503 4 4 !! Ocean active tracers: horizontal & vertical advective trend 5 5 !!============================================================================== 6 !! History : ! 95-12 (L. Mortier) Original code 7 !! ! 00-01 (H. Loukos) adapted to ORCA 8 !! ! 00-10 (MA Foujols E.Kestenare) include file not routine 9 !! ! 00-12 (E. Kestenare M. Levy) fix bug in trtrd indexes 10 !! ! 01-07 (E. Durand G. Madec) adaptation to ORCA config 11 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 12 !! 9.0 ! 04-01 (A. de Miranda, G. Madec, J.M. Molines ): advective bbl 13 !! 9.0 ! 08-04 (S. Cravatte) add the i-, j- & k- trends computation 14 !! " " ! 05-11 (V. Garnier) Surface pressure gradient organization 15 !!---------------------------------------------------------------------- 16 6 17 7 18 !!---------------------------------------------------------------------- … … 11 22 !! algorithm 12 23 !!---------------------------------------------------------------------- 13 !! * Modules used14 24 USE oce ! ocean dynamics and active tracers 15 25 USE dom_oce ! ocean space and time domain … … 28 38 PRIVATE 29 39 30 !! * Accessibility 31 PUBLIC tra_adv_tvd ! routine called by step.F90 40 PUBLIC tra_adv_tvd ! routine called by step.F90 32 41 33 42 !! * Substitutions … … 35 44 # include "vectopt_loop_substitute.h90" 36 45 !!---------------------------------------------------------------------- 37 !! OPA 9.0 , LOCEAN-IPSL (200 5)38 !! $Header$ 39 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt46 !! OPA 9.0 , LOCEAN-IPSL (2006) 47 !! $Header$ 48 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 40 49 !!---------------------------------------------------------------------- 41 50 … … 54 63 !! 55 64 !! ** Action : - update (ta,sa) with the now advective tracer trends 56 !! - save the trends in (ttrdh,strdh) ('key_trdtra') 65 !! - save the trends in (ztrdt,ztrds) ('key_trdtra') 66 !!---------------------------------------------------------------------- 67 USE oce , ztrdt => ua ! use ua as workspace 68 USE oce , ztrds => va ! use va as workspace 57 69 !! 58 !! History : 59 !! ! 95-12 (L. Mortier) Original code 60 !! ! 00-01 (H. Loukos) adapted to ORCA 61 !! ! 00-10 (MA Foujols E.Kestenare) include file not routine 62 !! ! 00-12 (E. Kestenare M. Levy) fix bug in trtrd indexes 63 !! ! 01-07 (E. Durand G. Madec) adaptation to ORCA config 64 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 65 !! 9.0 ! 04-01 (A. de Miranda, G. Madec, J.M. Molines ): advective bbl 66 !! 9.0 ! 08-04 (S. Cravatte) add the i-, j- & k- trends computation 67 !! " ! 05-11 (V. Garnier) Surface pressure gradient organization 68 !!---------------------------------------------------------------------- 69 !! * Modules used 70 USE trdmod_oce , ztay => tladj, & ! use tladj latter 71 & zsay => sladj, & ! use sladj latter 72 & ztaz => tladi, & ! use ua as workspace 73 & zsaz => sladi ! use ua as workspace 74 75 !! * Arguments 76 INTEGER , INTENT( in ) :: kt ! ocean time-step index 77 REAL(wp), INTENT( in ), DIMENSION(jpi,jpj,jpk) :: & 78 pun, pvn, pwn ! now ocean velocity fields 79 80 !! * Local declarations 70 INTEGER , INTENT(in) :: kt ! ocean time-step index 71 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pun ! ocean velocity u-component 72 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pvn ! ocean velocity v-component 73 REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) :: pwn ! ocean velocity w-component 74 !! 81 75 INTEGER :: ji, jj, jk ! dummy loop indices 82 76 REAL(wp) :: & ! temporary scalar 83 77 ztai, ztaj, ztak, & ! " " 84 zsai, zsaj, zsak ! " " 85 REAL(wp), DIMENSION (jpi,jpj,jpk) :: & 86 zti, ztu, ztv, ztw, & ! temporary workspace 87 zsi, zsu, zsv, zsw, & ! " " 88 ztdta, ztdsa ! " " 78 zsai, zsaj, zsak, & ! " " 79 z_hdivn_x, z_hdivn_y, z_hdivn 89 80 REAL(wp) :: & 90 z2dtt, zbtr, zeu, zev, zew, z2, & ! temporary scalar 81 z2dtt, zbtr, zeu, zev, & ! temporary scalar 82 zew, z2, zbtr1, & ! temporary scalar 91 83 zfp_ui, zfp_vj, zfp_wk, & ! " " 92 84 zfm_ui, zfm_vj, zfm_wk ! " " 85 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zti, ztu, ztv, ztw ! temporary workspace 86 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zsi, zsu, zsv, zsw ! " " 93 87 !!---------------------------------------------------------------------- 94 88 … … 101 95 ENDIF 102 96 103 IF( neuler == 0 .AND. kt == nit000 ) THEN 104 z2=1. 105 ELSE 106 z2=2. 97 IF( neuler == 0 .AND. kt == nit000 ) THEN ; z2 = 1. 98 ELSE ; z2 = 2. 107 99 ENDIF 108 109 ! Save ta and sa trends110 IF( l_trdtra ) THEN111 ztdta(:,:,:) = ta(:,:,:)112 ztdsa(:,:,:) = sa(:,:,:)113 l_adv = 'tvd'114 ENDIF115 116 100 117 101 ! 1. Bottom value : flux set to zero … … 177 161 DO ji = fs_2, fs_jpim1 ! vector opt. 178 162 zbtr = 1./ ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 179 180 163 ! i- j- horizontal & k- vertical advective trends 181 164 ztai = - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk ) ) * zbtr … … 185 168 zsaj = - ( zsv(ji,jj,jk) - zsv(ji ,jj-1,jk ) ) * zbtr 186 169 zsak = - ( zsw(ji,jj,jk) - zsw(ji ,jj ,jk+1) ) * zbtr 187 188 170 ! total intermediate advective trends 189 171 zti(ji,jj,jk) = ztai + ztaj + ztak … … 193 175 END DO 194 176 195 ! Save the intermediate vertical & j- horizontal advection trends 196 IF( l_trdtra ) THEN 177 178 ! Save the intermediate i / j / k advective trends for diagnostics 179 ! ------------------------------------------------------------------- 180 ! Warning : We should use zun instead of un in the computations below, but we 181 ! also use hdivn which is computed with un, vn (check ???). So we use un, vn 182 ! for consistency. Results are therefore approximate with key_trabbl_adv. 183 184 IF( l_trdtra ) THEN 185 ztrdt(:,:,:) = 0.e0 ; ztrds(:,:,:) = 0.e0 186 ! 187 ! T/S ZONAL advection trends 197 188 DO jk = 1, jpkm1 198 189 DO jj = 2, jpjm1 199 190 DO ji = fs_2, fs_jpim1 ! vector opt. 200 zbtr = 1./ ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 201 ztay(ji,jj,jk) = - ( ztv(ji,jj,jk) - ztv(ji ,jj-1,jk ) ) * zbtr 202 zsay(ji,jj,jk) = - ( zsv(ji,jj,jk) - zsv(ji ,jj-1,jk ) ) * zbtr 203 ztaz(ji,jj,jk) = - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) * zbtr 204 zsaz(ji,jj,jk) = - ( zsw(ji,jj,jk) - zsw(ji ,jj ,jk+1) ) * zbtr 191 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 192 ztrdt(ji,jj,jk) = - ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zbtr 193 ztrds(ji,jj,jk) = - ( zsu(ji,jj,jk) - zsu(ji-1,jj,jk) ) * zbtr 205 194 END DO 206 195 END DO 207 196 END DO 197 CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) ! save the trends 198 ! 199 ! T/S MERIDIONAL advection trends 200 DO jk = 1, jpkm1 201 DO jj = 2, jpjm1 202 DO ji = fs_2, fs_jpim1 ! vector opt. 203 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 204 ztrdt(ji,jj,jk) = - ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zbtr 205 ztrds(ji,jj,jk) = - ( zsv(ji,jj,jk) - zsv(ji,jj-1,jk) ) * zbtr 206 END DO 207 END DO 208 END DO 209 CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) ! save the trends 210 ! 211 ! T/S VERTICAL advection trends 212 DO jk = 1, jpkm1 213 DO jj = 2, jpjm1 214 DO ji = fs_2, fs_jpim1 ! vector opt. 215 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 216 ztrdt(ji,jj,jk) = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr 217 ztrds(ji,jj,jk) = - ( zsw(ji,jj,jk) - zsw(ji,jj,jk+1) ) * zbtr 218 END DO 219 END DO 220 END DO 221 CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) ! save the trends 222 ! 208 223 ENDIF 209 224 … … 244 259 ! antidiffusive flux on k 245 260 ! Surface value 246 ztw(:,:,1) = 0. 247 zsw(:,:,1) = 0. 261 ztw(:,:,1) = 0.e0 262 zsw(:,:,1) = 0.e0 248 263 249 264 ! Interior value … … 290 305 END DO 291 306 292 ! save the advective trends for diagnostic 293 ! tracers trends 294 IF( l_trdtra ) THEN 295 ! Compute the final vertical & j- horizontal advection trends 307 308 ! Save the advective trends for diagnostics 309 ! -------------------------------------------- 310 311 IF( l_trdtra ) THEN 312 ztrdt(:,:,:) = 0.e0 ; ztrds(:,:,:) = 0.e0 313 ! 314 ! T/S ZONAL advection trends 296 315 DO jk = 1, jpkm1 297 316 DO jj = 2, jpjm1 298 317 DO ji = fs_2, fs_jpim1 ! vector opt. 299 zbtr = 1./ ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 300 ztay(ji,jj,jk) = - ( ztv(ji,jj,jk) - ztv(ji ,jj-1,jk ) ) * zbtr & 301 & + ztay(ji,jj,jk) 302 zsay(ji,jj,jk) = - ( zsv(ji,jj,jk) - zsv(ji ,jj-1,jk ) ) * zbtr & 303 & + zsay(ji,jj,jk) 304 ztaz(ji,jj,jk) = - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) * zbtr & 305 & + ztaz(ji,jj,jk) 306 zsaz(ji,jj,jk) = - ( zsw(ji,jj,jk) - zsw(ji ,jj ,jk+1) ) * zbtr & 307 & + zsaz(ji,jj,jk) 318 !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 319 ! N.B. This computation is not valid along OBCs (if any) 320 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 321 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * pun(ji ,jj,jk) & 322 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 323 !-- Compute T/S zonal advection trends 324 ztrdt(ji,jj,jk) = - ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zbtr + tn(ji,jj,jk) * z_hdivn_x 325 ztrds(ji,jj,jk) = - ( zsu(ji,jj,jk) - zsu(ji-1,jj,jk) ) * zbtr + sn(ji,jj,jk) * z_hdivn_x 308 326 END DO 309 327 END DO 310 328 END DO 311 312 ! horizontal advection: 313 ! make the difference between the new trends ta()/sa() and the 314 ! previous one ztdta()/ztdsa() to have the total advection trends 315 ! to which we substract the vertical trends ztaz()/zsaz() 316 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - ztaz(:,:,:) 317 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - zsaz(:,:,:) 318 319 ! Add the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 320 ztdta(:,:,:) = ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:) 321 ztdsa(:,:,:) = ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 322 323 CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 324 325 ! vertical advection: 326 ! Substract the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 327 ztaz(:,:,:) = ztaz(:,:,:) - tn(:,:,:) * hdivn(:,:,:) 328 zsaz(:,:,:) = zsaz(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 329 330 CALL trd_mod(ztaz, zsaz, jpttdzad, 'TRA', kt) 331 329 CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt, cnbpas='bis') ! <<< ADD TO PREVIOUSLY COMPUTED 330 ! 331 ! T/S MERIDIONAL advection trends 332 DO jk = 1, jpkm1 333 DO jj = 2, jpjm1 334 DO ji = fs_2, fs_jpim1 ! vector opt. 335 !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 336 ! N.B. This computation is not valid along OBCs (if any) 337 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 338 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * pvn(ji,jj ,jk) & 339 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 340 !-- Compute T/S meridional advection trends 341 ztrdt(ji,jj,jk) = - ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zbtr + tn(ji,jj,jk) * z_hdivn_y 342 ztrds(ji,jj,jk) = - ( zsv(ji,jj,jk) - zsv(ji,jj-1,jk) ) * zbtr + sn(ji,jj,jk) * z_hdivn_y 343 END DO 344 END DO 345 END DO 346 CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt, cnbpas='bis') ! <<< ADD TO PREVIOUSLY COMPUTED 347 ! 348 ! T/S VERTICAL advection trends 349 DO jk = 1, jpkm1 350 DO jj = 2, jpjm1 351 DO ji = fs_2, fs_jpim1 ! vector opt. 352 zbtr1 = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 353 #if defined key_zco 354 zbtr = zbtr1 355 z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 356 z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 357 #else 358 zbtr = zbtr1 / fse3t(ji,jj,jk) 359 z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 360 z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 361 #endif 362 z_hdivn = (z_hdivn_x + z_hdivn_y) * zbtr 363 zbtr = zbtr1 / fse3t(ji,jj,jk) 364 ztrdt(ji,jj,jk) = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr - tn(ji,jj,jk) * z_hdivn 365 ztrds(ji,jj,jk) = - ( zsw(ji,jj,jk) - zsw(ji,jj,jk+1) ) * zbtr - sn(ji,jj,jk) * z_hdivn 366 END DO 367 END DO 368 END DO 369 CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt, cnbpas='bis') ! <<< ADD TO PREVIOUSLY COMPUTED 370 ! 332 371 ENDIF 333 372 334 IF(ln_ctl) THEN 335 CALL prt_ctl(tab3d_1=ta, clinfo1=' tvd adv - Ta: ', mask1=tmask, & 336 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 337 ENDIF 373 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' tvd adv - Ta: ', mask1=tmask, & 374 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 338 375 339 376 ! "zonal" mean advective heat and salt transport … … 342 379 pst_adv(:) = ptr_vj( zsv(:,:,:) ) 343 380 ENDIF 344 381 ! 345 382 END SUBROUTINE tra_adv_tvd 346 383 … … 358 395 !! drange (1995) multi-dimensional forward-in-time and upstream- 359 396 !! in-space based differencing for fluid 360 !!361 !! History :362 !! ! 97-04 (L. Mortier) Original code363 !! ! 00-02 (H. Loukos) rewritting for opa8364 !! ! 00-10 (M.A Foujols, E. Kestenare) lateral b.c.365 !! ! 01-03 (E. Kestenare) add key_passivetrc366 !! ! 01-07 (E. Durand G. Madec) adapted for T & S367 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module368 397 !!---------------------------------------------------------------------- 369 !! * Arguments 370 REAL(wp), INTENT( in ) :: & 371 prdt ! ??? 398 REAL(wp), INTENT( in ) :: prdt ! ??? 372 399 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT( inout ) :: & 373 400 pbef, & ! before field … … 376 403 pbb, & ! monotonic flux in the j direction 377 404 pcc ! monotonic flux in the k direction 378 379 !! * Local declarations 405 !! 380 406 INTEGER :: ji, jj, jk ! dummy loop indices 381 407 INTEGER :: ikm1 … … 496 522 CALL lbc_lnk( pbb, 'V', -1. ) ! changed sign 497 523 CALL lbc_lnk( pcc, 'W', 1. ) ! NO changed sign 498 524 ! 499 525 END SUBROUTINE nonosc 500 526 -
trunk/NEMO/OPA_SRC/TRA/trabbc.F90
r473 r503 4 4 !! Ocean active tracers: bottom boundary condition 5 5 !!============================================================================== 6 !! History : 8.1 ! 99-10 (G. Madec) original code 7 !! 8.5 ! 02-08 (G. Madec) free form + modules 8 !! 8.5 ! 02-11 (A. Bozec) tra_bbc_init: original code 9 !!---------------------------------------------------------------------- 6 10 #if defined key_trabbc || defined key_esopa 7 11 !!---------------------------------------------------------------------- … … 15 19 USE dom_oce ! ocean space and time domain 16 20 USE phycst ! physical constants 21 USE trdmod ! ocean trends 22 USE trdmod_oce ! ocean variables trends 17 23 USE in_out_manager ! I/O manager 18 24 USE prtctl ! Print control … … 21 27 PRIVATE 22 28 23 !! * Accessibility24 29 PUBLIC tra_bbc ! routine called by step.F90 25 30 … … 27 32 LOGICAL, PUBLIC, PARAMETER :: lk_trabbc = .TRUE. !: bbc flag 28 33 29 !! * Module variables 30 INTEGER :: & !!! ** bbc namelist (nambbc) ** 31 ngeo_flux = 1 ! Geothermal flux (0:no flux, 1:constant flux, 32 ! ! 2:read in file ) 33 REAL(wp) :: & !!! ** bbc namlist ** 34 ngeo_flux_const = 86.4e-3 ! Constant value of geothermal heat flux 35 36 INTEGER, DIMENSION(jpi,jpj) :: & 37 nbotlevt ! ocean bottom level index at T-pt 38 REAL(wp), DIMENSION(jpi,jpj) :: & 39 qgh_trd ! geothermal heating trend 34 !!* Namelist nambbc: bottom boundary condition 35 INTEGER :: ngeo_flux = 1 ! Geothermal flux (0:no flux, 1:constant flux, 2:read in file ) 36 REAL(wp) :: ngeo_flux_const = 86.4e-3 ! Constant value of geothermal heat flux 37 NAMELIST/nambbc/ngeo_flux, ngeo_flux_const 38 39 INTEGER , DIMENSION(jpi,jpj) :: nbotlevt ! ocean bottom level index at T-pt 40 REAL(wp), DIMENSION(jpi,jpj) :: qgh_trd ! geothermal heating trend 40 41 41 42 !! * Substitutions 42 43 # include "domzgr_substitute.h90" 43 44 !!---------------------------------------------------------------------- 44 !! OPA 9.0 , LOCEAN-IPSL (200 5)45 !! OPA 9.0 , LOCEAN-IPSL (2006) 45 46 !! $Header$ 46 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt47 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 47 48 !!---------------------------------------------------------------------- 48 49 … … 68 69 !! the ocean bottom boundary condition 69 70 !! 70 !! References : 71 !! Stein, C. A., and S. Stein, 1992, Nature, 359, 123-129. 72 !! 73 !! History : 74 !! 8.1 ! 99-10 (G. Madec) original code 75 !! 8.5 ! 02-08 (G. Madec) free form + modules 76 !!---------------------------------------------------------------------- 77 !! * Arguments 78 INTEGER, INTENT( in ) :: kt ! ocean time-step index 79 80 !! * Local declarations 71 !! References : Stein, C. A., and S. Stein, 1992, Nature, 359, 123-129. 72 !!---------------------------------------------------------------------- 73 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 74 USE oce, ONLY : ztrds => va ! use va as 3D workspace 75 !! 76 INTEGER, INTENT( in ) :: kt ! ocean time-step index 77 !! 81 78 #if defined key_vectopt_loop && ! defined key_mpp_omp 82 INTEGER :: ji ! dummy loop indices 83 #else 84 INTEGER :: ji, jj ! dummy loop indices 85 #endif 86 !!---------------------------------------------------------------------- 87 88 ! 0. Initialization 89 IF( kt == nit000 ) CALL tra_bbc_init 90 91 ! 1. Add the geothermal heat flux trend on temperature 79 INTEGER :: ji ! dummy loop indices 80 #else 81 INTEGER :: ji, jj ! dummy loop indices 82 #endif 83 !!---------------------------------------------------------------------- 84 85 IF( kt == nit000 ) CALL tra_bbc_init ! Initialization 86 87 IF( l_trdtra ) THEN ! Save ta and sa trends 88 ztrdt(:,:,:) = ta(:,:,:) 89 ztrds(:,:,:) = 0.e0 90 ENDIF 91 92 ! Add the geothermal heat flux trend on temperature 92 93 93 94 SELECT CASE ( ngeo_flux ) 94 95 ! 95 96 CASE ( 1:2 ) ! geothermal heat flux 96 97 97 #if defined key_vectopt_loop && ! defined key_mpp_omp 98 98 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) … … 106 106 END DO 107 107 #endif 108 109 IF(ln_ctl) THEN 110 CALL prt_ctl(tab3d_1=ta, clinfo1=' bbc - Ta: ', mask1=tmask, clinfo3='tra-ta') 108 END SELECT 109 110 IF( l_trdtra ) THEN ! Save the geothermal heat flux trend for diagnostics 111 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 112 CALL trd_mod( ztrdt, ztrds, jptra_trd_bbc, 'TRA', kt ) 111 113 ENDIF 112 113 END SELECT114 114 ! 115 IF(ln_ctl) CALL prt_ctl(tab3d_1=ta, clinfo1=' bbc - Ta: ', mask1=tmask, clinfo3='tra-ta') 116 ! 115 117 END SUBROUTINE tra_bbc 116 118 … … 132 134 !! ** Action : - compute the heat geothermal trend qgh_trd 133 135 !! - compute the bottom ocean level nbotlevt 134 !! 135 !! history : 136 !! 8.5 ! 02-11 (A. Bozec) original code 137 !!---------------------------------------------------------------------- 138 !! * Modules used 136 !!---------------------------------------------------------------------- 139 137 USE iom 140 141 !! * local declarations 138 !! 142 139 INTEGER :: ji, jj ! dummy loop indices 143 140 INTEGER :: inum ! temporary logical unit 144 145 NAMELIST/nambbc/ngeo_flux, ngeo_flux_const 146 !!---------------------------------------------------------------------- 147 148 ! Read Namelist nambbc : bottom momentum boundary condition 149 REWIND ( numnam ) 141 !!---------------------------------------------------------------------- 142 143 REWIND ( numnam ) ! Read Namelist nambbc : bottom momentum boundary condition 150 144 READ ( numnam, nambbc ) 151 145 152 ! Control print146 ! ! Control print 153 147 IF(lwp) WRITE(numout,*) 154 148 IF(lwp) WRITE(numout,*) 'tra_bbc : tempearture Bottom Boundary Condition (bbc)' … … 160 154 IF(lwp) WRITE(numout,*) 161 155 162 ! level of the ocean bottom at T-point 163 156 ! ! level of the ocean bottom at T-point 164 157 DO jj = 1, jpj 165 158 DO ji = 1, jpi … … 168 161 END DO 169 162 170 ! initialization of geothermal heat flux 171 172 SELECT CASE ( ngeo_flux ) 173 163 164 SELECT CASE ( ngeo_flux ) ! initialization of geothermal heat flux 165 ! 174 166 CASE ( 0 ) ! no geothermal heat flux 175 167 IF(lwp) WRITE(numout,*) 176 168 IF(lwp) WRITE(numout,*) ' *** no geothermal heat flux' 177 169 ! 178 170 CASE ( 1 ) ! constant flux 179 171 IF(lwp) WRITE(numout,*) ' *** constant heat flux = ', ngeo_flux_const 180 172 qgh_trd(:,:) = ngeo_flux_const 181 173 ! 182 174 CASE ( 2 ) ! variable geothermal heat flux 183 175 ! read the geothermal fluxes in mW/m2 184 176 ! 185 177 IF(lwp) WRITE(numout,*) ' *** variable geothermal heat flux' 186 178 CALL iom_open ( 'geothermal_heating.nc', inum ) 187 179 CALL iom_get ( inum, jpdom_data, 'heatflow', qgh_trd ) 188 180 CALL iom_close (inum) 189 181 ! 190 182 qgh_trd(:,:) = qgh_trd(:,:) * 1.e-3 ! conversion in W/m2 191 183 ! 192 184 CASE DEFAULT 193 185 WRITE(ctmp1,*) ' bad flag value for ngeo_flux = ', ngeo_flux 194 186 CALL ctl_stop( ctmp1 ) 187 ! 195 188 END SELECT 196 189 … … 198 191 199 192 SELECT CASE ( ngeo_flux ) 200 193 ! 201 194 CASE ( 1:2 ) ! geothermal heat flux 202 203 195 #if defined key_vectopt_loop && ! defined key_mpp_omp 204 196 DO ji = 1, jpij ! vector opt. (forced unrolling) … … 212 204 END DO 213 205 #endif 214 215 206 END SELECT 216 207 ! 217 208 END SUBROUTINE tra_bbc_init 218 209 -
trunk/NEMO/OPA_SRC/TRA/trabbl.F90
r481 r503 4 4 !! Ocean physics : advective and/or diffusive bottom boundary layer scheme 5 5 !!============================================================================== 6 !! History : 8.0 ! 96-06 (L. Mortier) Original code 7 !! 8.0 ! 97-11 (G. Madec) Optimization 8 !! 8.5 ! 02-08 (G. Madec) free form + modules 9 !!---------------------------------------------------------------------- 6 10 #if defined key_trabbl_dif || defined key_trabbl_adv || defined key_esopa 7 11 !!---------------------------------------------------------------------- 8 12 !! 'key_trabbl_dif' or diffusive bottom boundary layer 9 13 !! 'key_trabbl_adv' advective bottom boundary layer 14 !!---------------------------------------------------------------------- 10 15 !!---------------------------------------------------------------------- 11 16 !! tra_bbl_dif : update the active tracer trends due to the bottom … … 15 20 !! tra_bbl_init : initialization, namlist read, parameters control 16 21 !!---------------------------------------------------------------------- 17 !! * Modules used18 USE oce ! ocean dynamics and active tracers19 USE dom_oce ! ocean space and time domain20 USE trdmod_oce 21 USE in_out_manager 22 USE lbclnk 23 USE prtctl 22 USE oce ! ocean dynamics and active tracers 23 USE dom_oce ! ocean space and time domain 24 USE trdmod ! ocean active tracers trends 25 USE trdmod_oce ! ocean variables trends 26 USE in_out_manager ! I/O manager 27 USE lbclnk ! ocean lateral boundary conditions 28 USE prtctl ! Print control 24 29 25 30 IMPLICIT NONE 26 31 PRIVATE 27 32 28 !! * Routine accessibility29 33 PUBLIC tra_bbl_dif ! routine called by step.F90 30 34 PUBLIC tra_bbl_adv ! routine called by step.F90 31 35 32 !! * Shared module variables33 REAL(wp), PUBLIC :: & !!: * bbl namelist *34 atrbbl = 1.e+3 !: lateral coeff. for bottom boundary35 ! ! layer scheme (m2/s) 36 !!* Namelist nambbl: bottom boundary layer 37 REAL(wp), PUBLIC :: atrbbl = 1.e+3 !: lateral coeff. for bottom boundary layer scheme (m2/s) 38 NAMELIST/nambbl/ atrbbl 39 36 40 # if defined key_trabbl_dif 37 LOGICAL, PUBLIC, PARAMETER :: & !: 38 lk_trabbl_dif = .TRUE. !: diffusive bottom boundary layer flag 41 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl_dif = .TRUE. !: diffusive bottom boundary layer flag 39 42 # else 40 LOGICAL, PUBLIC, PARAMETER :: & !: 41 lk_trabbl_dif = .FALSE. !: diffusive bottom boundary layer flag 43 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl_dif = .FALSE. !: diffusive bottom boundary layer flag 42 44 # endif 43 45 44 46 # if defined key_trabbl_adv 45 LOGICAL, PUBLIC, PARAMETER :: & !: 46 lk_trabbl_adv = .TRUE. !: advective bottom boundary layer flag 47 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: & !: 48 u_bbl, v_bbl, & !: velocity involved in exhanges in the advective BBL 49 w_bbl !: vertical increment of velocity due to advective BBL 50 ! ! only affect tracer vertical advection 47 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl_adv = .TRUE. !: advective bottom boundary layer flag 48 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: u_bbl !: 3 components of the velocity 49 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: v_bbl !: associated with advective BBL 50 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: w_bbl !: (only affect tracer) 51 51 # else 52 LOGICAL, PUBLIC, PARAMETER :: & !: 53 lk_trabbl_adv = .FALSE. !: advective bottom boundary layer flag 52 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl_adv = .FALSE. !: advective bottom boundary layer flag 54 53 # endif 55 54 56 !! * Module variables 57 INTEGER, DIMENSION(jpi,jpj) :: & !: 58 mbkt, & ! vertical index of the bottom ocean T-level 59 mbku, mbkv ! vertical index of the bottom ocean U/V-level 55 INTEGER, DIMENSION(jpi,jpj) :: mbkt ! vertical index of the bottom ocean T-level 56 INTEGER, DIMENSION(jpi,jpj) :: mbku, mbkv ! vertical index of the bottom ocean U/V-level 60 57 61 58 !! * Substitutions … … 63 60 # include "vectopt_loop_substitute.h90" 64 61 !!---------------------------------------------------------------------- 65 !! OPA 9.0 , LOCEAN-IPSL (200 5)62 !! OPA 9.0 , LOCEAN-IPSL (2006) 66 63 !! $Header$ 67 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt64 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 68 65 !!---------------------------------------------------------------------- 69 66 … … 102 99 !! ** Action : - update (ta,sa) at the bottom level with the bottom 103 100 !! boundary layer trend 104 !! - save the trends in tldfbbl/sldfbbl ('key_trdtra') 105 !! 106 !! References : 107 !! Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 108 !! 109 !! History : 110 !! 8.0 ! 96-06 (L. Mortier) Original code 111 !! 8.0 ! 97-11 (G. Madec) Optimization 112 !! 8.5 ! 02-08 (G. Madec) free form + modules 113 !! 9.0 ! 04-08 (C. Talandier) New trends organization 114 !!---------------------------------------------------------------------- 115 !! * Modules used 116 USE oce, ONLY : ztdta => ua, & ! use ua as 3D workspace 117 ztdsa => va ! use va as 3D workspace 118 USE eosbn2 ! equation of state 119 120 !! * Arguments 121 INTEGER, INTENT( in ) :: kt ! ocean time-step 122 123 !! * Local declarations 124 INTEGER :: ji, jj ! dummy loop indices 125 INTEGER :: ik 126 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers 101 !! - save the trends in ztrdt/ztrds ('key_trdtra') 102 !! 103 !! References : Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 104 !!---------------------------------------------------------------------- 105 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 106 USE oce, ONLY : ztrds => va ! use va as 3D workspace 107 USE eosbn2 ! equation of state 108 !! 109 INTEGER, INTENT( in ) :: kt ! ocean time-step 110 !! 111 INTEGER :: ji, jj ! dummy loop indices 112 INTEGER :: ik 113 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers 127 114 INTEGER :: iku1, iku2, ikv1,ikv2 ! temporary intergers 128 115 REAL(wp) :: ze3u, ze3v ! temporary scalars 129 INTEGER :: iku, ikv116 INTEGER :: iku, ikv 130 117 REAL(wp) :: & 131 118 zsign, zt, zs, zh, zalbet, & ! temporary scalars 132 119 zgdrho, zbtr, zta, zsa 133 120 REAL(wp), DIMENSION(jpi,jpj) :: & 134 zki, zkj, zkw, zkx, zky, zkz, & ! temporaryworkspace arrays121 zki, zkj, zkw, zkx, zky, zkz, & ! 2D workspace arrays 135 122 ztnb, zsnb, zdep, & 136 123 ztbb, zsbb, zahu, zahv 137 REAL(wp) :: & 138 fsalbt, pft, pfs, pfh ! statement function 124 REAL(wp) :: fsalbt, pft, pfs, pfh ! statement function 139 125 !!---------------------------------------------------------------------- 140 126 ! ratio alpha/beta … … 161 147 IF( kt == nit000 ) CALL tra_bbl_init 162 148 163 ! Save ta and sa trends 164 IF( l_trdtra ) THEN 165 ztdta(:,:,:) = ta(:,:,:) 166 ztdsa(:,:,:) = sa(:,:,:) 149 IF( l_trdtra ) THEN ! Save ta and sa trends 150 ztrdt(:,:,:) = ta(:,:,:) 151 ztrds(:,:,:) = sa(:,:,:) 167 152 ENDIF 168 153 … … 170 155 ! ----------------------------------------------------------------- 171 156 ! mbathy= number of w-level, minimum value=1 (cf dommsk.F) 172 173 157 # if defined key_vectopt_loop && ! defined key_mpp_omp 174 158 jj = 1 … … 387 371 388 372 IF( cp_cfg == "orca" ) THEN 389 373 ! 390 374 SELECT CASE ( jp_cfg ) 391 375 ! ! ======================= … … 397 381 zkx( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 4.e0 * zkx( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) 398 382 zky( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 4.e0 * zky( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) 399 383 ! 400 384 ! Red Sea enhancement of BBL 401 385 ij0 = 88 ; ij1 = 88 … … 403 387 zkx( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 10.e0 * zkx( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) 404 388 zky( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 10.e0 * zky( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) 405 389 ! 406 390 ! ! ======================= 407 391 CASE ( 4 ) ! ORCA_R4 configuration … … 412 396 zkx( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 4.e0 * zkx( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) 413 397 zky( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 4.e0 * zky( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) 414 398 ! 415 399 END SELECT 416 400 ! 417 401 ENDIF 418 402 … … 439 423 END DO 440 424 441 ! save the trends for diagnostic 442 ! BBL lateral diffusion tracers trends 443 IF( l_trdtra ) THEN 444 # if defined key_vectopt_loop && ! defined key_mpp_omp 445 jj = 1 446 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 447 # else 448 DO jj = 2, jpjm1 449 DO ji = 2, jpim1 450 # endif 451 ik = max( mbathy(ji,jj)-1, 1 ) 452 tldfbbl(ji,jj) = ta(ji,jj,ik) - ztdta(ji,jj,ik) 453 sldfbbl(ji,jj) = sa(ji,jj,ik) - ztdsa(ji,jj,ik) 454 # if ! defined key_vectopt_loop || defined key_mpp_omp 455 END DO 456 # endif 457 END DO 458 425 IF( l_trdtra ) THEN ! save the BBL lateral diffusion trends for diagnostic 426 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 427 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 428 CALL trd_mod(ztrdt, ztrds, jptra_trd_bbl, 'TRA', kt) 459 429 ENDIF 460 430 461 IF(ln_ctl) THEN 462 CALL prt_ctl(tab3d_1=ta, clinfo1=' bbl - Ta: ', mask1=tmask, & 463 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 464 ENDIF 465 431 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' bbl - Ta: ', mask1=tmask, & 432 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 433 ! 466 434 END SUBROUTINE tra_bbl_dif 467 435 … … 489 457 !! ** Method : Read the nambbl namelist and check the parameters 490 458 !! called by tra_bbl at the first timestep (nit000) 491 !! 492 !! History : 493 !! 8.5 ! 02-08 (G. Madec) Original code 494 !!---------------------------------------------------------------------- 495 !! * Local declarations 459 !!---------------------------------------------------------------------- 496 460 INTEGER :: ji, jj ! dummy loop indices 497 461 REAL(wp), DIMENSION(jpi,jpj) :: zmbk 498 499 NAMELIST/nambbl/ atrbbl 500 !!---------------------------------------------------------------------- 501 502 ! Read Namelist nambbl : bottom boundary layer scheme 503 ! -------------------- 504 REWIND ( numnam ) 462 !!---------------------------------------------------------------------- 463 464 REWIND ( numnam ) ! Read Namelist nambbl : bottom boundary layer scheme 505 465 READ ( numnam, nambbl ) 506 466 507 508 ! Parameter control and print 509 ! --------------------------- 510 IF(lwp) THEN 467 IF(lwp) THEN ! Parameter control and print 511 468 WRITE(numout,*) 512 469 WRITE(numout,*) 'tra_bbl_init : ' 513 470 WRITE(numout,*) '~~~~~~~~~~~~' 514 IF (lk_trabbl_dif ) THEN 515 WRITE(numout,*) ' * Diffusive Bottom Boundary Layer' 516 ENDIF 517 IF( lk_trabbl_adv ) THEN 518 WRITE(numout,*) ' * Advective Bottom Boundary Layer' 519 ENDIF 520 WRITE(numout,*) ' Namelist nambbl : set bbl parameters' 521 WRITE(numout,*) 471 IF (lk_trabbl_dif ) WRITE(numout,*) ' * Diffusive Bottom Boundary Layer' 472 IF( lk_trabbl_adv ) WRITE(numout,*) ' * Advective Bottom Boundary Layer' 473 WRITE(numout,*) ' Namelist nambbl : set bbl parameters' 522 474 WRITE(numout,*) ' bottom boundary layer coef. atrbbl = ', atrbbl 523 WRITE(numout,*)524 475 ENDIF 525 476 … … 545 496 546 497 # if defined key_trabbl_adv 547 ! initialisation of w_bbl to zero 548 w_bbl(:,:,:) = 0.e0 498 w_bbl(:,:,:) = 0.e0 ! initialisation of w_bbl to zero 549 499 # endif 550 500 ! 551 501 END SUBROUTINE tra_bbl_init 552 502 … … 558 508 LOGICAL, PUBLIC, PARAMETER :: lk_trabbl_adv = .FALSE. !: adv bbl flag 559 509 CONTAINS 560 SUBROUTINE tra_bbl_dif (kt ) ! Empty routine 561 INTEGER, INTENT(in) :: kt 510 SUBROUTINE tra_bbl_dif( kt ) ! Empty routine 562 511 WRITE(*,*) 'tra_bbl_dif: You should not have seen this print! error?', kt 563 512 END SUBROUTINE tra_bbl_dif 564 SUBROUTINE tra_bbl_adv (kt ) ! Empty routine 565 INTEGER, INTENT(in) :: kt 513 SUBROUTINE tra_bbl_adv( kt ) ! Empty routine 566 514 WRITE(*,*) 'tra_bbl_adv: You should not have seen this print! error?', kt 567 515 END SUBROUTINE tra_bbl_adv -
trunk/NEMO/OPA_SRC/TRA/trabbl_adv.h90
r481 r503 2 2 !! *** trabbl_adv.h90 *** 3 3 !!---------------------------------------------------------------------- 4 !! History : 8.5 ! 02-12 (A. de Miranda, G. Madec) Original Code 5 !! 9.0 ! 04-01 (A. de Miranda, G. Madec, J.M. Molines ) 6 !!---------------------------------------------------------------------- 4 7 5 8 !!---------------------------------------------------------------------- 6 9 !! OPA 9.0 , LOCEAN-IPSL (2005) 7 10 !! $Header$ 8 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt11 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 9 12 !!---------------------------------------------------------------------- 10 13 … … 43 46 !! ** Action : - update (ta,sa) at the bottom level with the bottom 44 47 !! boundary layer trend 45 !! - save the lateral diffusion trends in tldfbbl/sldfbbl ('key_trdtra')46 !! - save the horizontal advection trends in tladbbl/sladbbl ('key_trdtra')47 48 !! 48 !! References : 49 !! Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 49 !! References : Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 50 !!---------------------------------------------------------------------- 51 USE eosbn2 ! equation of state 52 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 53 USE oce, ONLY : ztrds => va ! use va as 3D workspace 50 54 !! 51 !! History : 52 !! 8.5 ! 02-12 (A. de Miranda, G. Madec) Original Code 53 !! 9.0 ! 04-01 (A. de Miranda, G. Madec, J.M. Molines ) 54 !! 9.0 ! 04-08 (C. Talandier) New trends organization 55 !!---------------------------------------------------------------------- 56 !! * Modules used 57 USE eosbn2 ! equation of state 58 USE oce, ONLY : ztdta => ua, & ! use ua as 3D workspace 59 ztdsa => va ! use va as 3D workspace 60 61 !! * Arguments 62 INTEGER, INTENT( in ) :: kt ! ocean time-step 63 64 !! * Local declarations 65 INTEGER :: ji, jj, jk ! dummy loop indices 66 INTEGER :: ik, iku, ikv ! temporary integers 67 68 REAL(wp) :: & 69 zsign, zt, zs, zh, zalbet, & ! temporary scalars 70 zgdrho, zbtr, zta, zsa ! " " 71 REAL(wp), DIMENSION(jpi,jpj) :: & 72 ztnb, zsnb, zdep, ztbb, zsbb 73 REAL(wp), DIMENSION(jpi,jpj) :: & ! temporary workspace arrays 74 zalphax, zwu, zunb, & ! " " 75 zalphay, zwv, zvnb, & ! " " 76 zwx, zwy, zww, zwz ! " " 77 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 78 zhdivn ! temporary workspace arrays 79 REAL(wp) :: & 80 zfui, zfvj, zbt, zsigna, & ! temporary scalars 81 iku1, iku2, ikv1, ikv2, & ! temporary scalars 82 ze3u,ze3v 83 REAL(wp) :: & 84 fsalbt, pft, pfs, pfh ! statement function 55 INTEGER, INTENT( in ) :: kt ! ocean time-step 56 !! 57 INTEGER :: ji, jj, jk ! dummy loop indices 58 INTEGER :: ik ! temporary integers 59 INTEGER :: iku, iku1, iku2 ! " " 60 INTEGER :: ikv, ikv1, ikv2 ! " " 61 REAL(wp) :: zsign, zh, zalbet ! temporary scalars 62 REAL(wp) :: zgdrho, zbtr ! " " 63 REAL(wp) :: zbt, zsigna ! " " 64 REAL(wp) :: zfui, ze3u, zt, zta ! " " 65 REAL(wp) :: zfvj, ze3v, zs, zsa ! " " 66 REAL(wp), DIMENSION(jpi,jpj) :: zalphax, zwu, zunb ! temporary 2D workspace 67 REAL(wp), DIMENSION(jpi,jpj) :: zalphay, zwv, zvnb ! " " 68 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zww, zwz ! " " 69 REAL(wp), DIMENSION(jpi,jpj) :: ztbb, zsbb ! " " 70 REAL(wp), DIMENSION(jpi,jpj) :: ztnb, zsnb, zdep ! " " 71 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhdivn ! temporary 3D workspace 72 REAL(wp) :: fsalbt, pft, pfs, pfh ! statement function 85 73 !!---------------------------------------------------------------------- 86 74 ! ratio alpha/beta … … 108 96 IF( kt == nit000 ) CALL tra_bbl_init ! initialization at first time-step 109 97 110 ! Save ta and sa trends 111 IF( l_trdtra ) THEN 112 ztdta(:,:,:) = ta(:,:,:) 113 ztdsa(:,:,:) = sa(:,:,:) 98 IF( l_trdtra ) THEN ! Save ta and sa trends 99 ztrdt(:,:,:) = ta(:,:,:) 100 ztrds(:,:,:) = sa(:,:,:) 114 101 ENDIF 115 102 … … 146 133 147 134 SELECT CASE ( neos ) 148 135 ! 149 136 CASE ( 0 ) ! Jackett and McDougall (1994) formulation 150 137 ! 151 138 DO jj = 1, jpjm1 152 DO ji = 1, fs_jpim1 ! vector opt.153 ! ... temperature, salinity anomalie and depth154 zt = 0.5 * ( ztnb(ji,jj) + ztnb(ji+1,jj) )155 zs = 0.5 * ( zsnb(ji,jj) + zsnb(ji+1,jj) ) - 35.0156 zh = 0.5 * ( zdep(ji,jj) + zdep(ji+1,jj) )157 ! ... masked ratio alpha/beta158 zalbet = fsalbt( zt, zs, zh ) * umask(ji,jj,1)159 ! ... local density gradient along i-bathymetric slope160 zgdrho = zalbet * ( ztnb(ji+1,jj) - ztnb(ji,jj) ) &161 & - ( zsnb(ji+1,jj) - zsnb(ji,jj) )162 zgdrho = zgdrho * umask(ji,jj,1)163 ! ... sign of local i-gradient of density multiplied by the i-slope164 zsign = SIGN( 0.5, -zgdrho * ( zdep(ji+1,jj) - zdep(ji,jj) ) )165 zsigna= SIGN( 0.5, zunb(ji,jj) * ( zdep(ji+1,jj) - zdep(ji,jj) ) )166 zalphax(ji,jj)=( 0.5 + zsigna ) * ( 0.5 - zsign ) * umask(ji,jj,1)167 END DO168 END DO 169 139 DO ji = 1, fs_jpim1 ! vector opt. 140 ! ... temperature, salinity anomalie and depth 141 zt = 0.5 * ( ztnb(ji,jj) + ztnb(ji+1,jj) ) 142 zs = 0.5 * ( zsnb(ji,jj) + zsnb(ji+1,jj) ) - 35.0 143 zh = 0.5 * ( zdep(ji,jj) + zdep(ji+1,jj) ) 144 ! ... masked ratio alpha/beta 145 zalbet = fsalbt( zt, zs, zh ) * umask(ji,jj,1) 146 ! ... local density gradient along i-bathymetric slope 147 zgdrho = zalbet * ( ztnb(ji+1,jj) - ztnb(ji,jj) ) & 148 & - ( zsnb(ji+1,jj) - zsnb(ji,jj) ) 149 zgdrho = zgdrho * umask(ji,jj,1) 150 ! ... sign of local i-gradient of density multiplied by the i-slope 151 zsign = SIGN( 0.5, -zgdrho * ( zdep(ji+1,jj) - zdep(ji,jj) ) ) 152 zsigna= SIGN( 0.5, zunb(ji,jj) * ( zdep(ji+1,jj) - zdep(ji,jj) ) ) 153 zalphax(ji,jj)=( 0.5 + zsigna ) * ( 0.5 - zsign ) * umask(ji,jj,1) 154 END DO 155 END DO 156 ! 170 157 DO jj = 1, jpjm1 171 DO ji = 1, fs_jpim1 ! vector opt. 172 ! ... temperature, salinity anomalie and depth 173 zt = 0.5 * ( ztnb(ji,jj+1) + ztnb(ji,jj) ) 174 zs = 0.5 * ( zsnb(ji,jj+1) + zsnb(ji,jj) ) - 35.0 175 zh = 0.5 * ( zdep(ji,jj+1) + zdep(ji,jj) ) 176 ! ... masked ratio alpha/beta 177 zalbet = fsalbt( zt, zs, zh ) * vmask(ji,jj,1) 178 ! ... local density gradient along j-bathymetric slope 179 zgdrho = zalbet * ( ztnb(ji,jj+1) - ztnb(ji,jj) ) & 180 & - ( zsnb(ji,jj+1) - zsnb(ji,jj) ) 181 zgdrho = zgdrho*vmask(ji,jj,1) 182 ! ... sign of local j-gradient of density multiplied by the j-slope 183 zsign = SIGN( 0.5, -zgdrho * ( zdep(ji,jj+1) - zdep(ji,jj) ) ) 184 zsigna= SIGN( 0.5, zvnb(ji,jj) * ( zdep(ji,jj+1) - zdep(ji,jj) ) ) 185 zalphay(ji,jj)=( 0.5 + zsigna ) * ( 0.5 - zsign ) * vmask(ji,jj,1) 186 END DO 187 END DO 188 189 158 DO ji = 1, fs_jpim1 ! vector opt. 159 ! ... temperature, salinity anomalie and depth 160 zt = 0.5 * ( ztnb(ji,jj+1) + ztnb(ji,jj) ) 161 zs = 0.5 * ( zsnb(ji,jj+1) + zsnb(ji,jj) ) - 35.0 162 zh = 0.5 * ( zdep(ji,jj+1) + zdep(ji,jj) ) 163 ! ... masked ratio alpha/beta 164 zalbet = fsalbt( zt, zs, zh ) * vmask(ji,jj,1) 165 ! ... local density gradient along j-bathymetric slope 166 zgdrho = zalbet * ( ztnb(ji,jj+1) - ztnb(ji,jj) ) & 167 & - ( zsnb(ji,jj+1) - zsnb(ji,jj) ) 168 zgdrho = zgdrho*vmask(ji,jj,1) 169 ! ... sign of local j-gradient of density multiplied by the j-slope 170 zsign = SIGN( 0.5, -zgdrho * ( zdep(ji,jj+1) - zdep(ji,jj) ) ) 171 zsigna= SIGN( 0.5, zvnb(ji,jj) * ( zdep(ji,jj+1) - zdep(ji,jj) ) ) 172 zalphay(ji,jj)=( 0.5 + zsigna ) * ( 0.5 - zsign ) * vmask(ji,jj,1) 173 END DO 174 END DO 175 ! 190 176 CASE ( 1 ) ! Linear formulation function of temperature only 191 177 ! 192 178 DO jj = 1, jpjm1 193 179 DO ji = 1, fs_jpim1 ! vector opt. … … 207 193 END DO 208 194 END DO 209 195 ! 210 196 CASE ( 2 ) ! Linear formulation function of temperature and salinity 197 ! 211 198 DO jj = 1, jpjm1 212 199 DO ji = 1, fs_jpim1 ! vector opt. … … 228 215 END DO 229 216 END DO 230 217 ! 231 218 CASE DEFAULT 232 233 219 WRITE(ctmp1,*) ' bad flag value for neos = ', neos 234 220 CALL ctl_stop( ctmp1 ) 235 221 ! 236 222 END SELECT 237 223 … … 359 345 ! BBL lateral advection tracers trends 360 346 IF( l_trdtra ) THEN 361 # if defined key_vectopt_loop && ! defined key_mpp_omp 362 jj = 1 363 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 364 # else 365 DO jj = 2, jpjm1 366 DO ji = 2, jpim1 367 # endif 368 ik = mbkt(ji,jj) 369 tladbbl(ji,jj) = ta(ji,jj,ik) - ztdta(ji,jj,ik) 370 sladbbl(ji,jj) = sa(ji,jj,ik) - ztdsa(ji,jj,ik) 371 # if ! defined key_vectopt_loop || defined key_mpp_omp 372 END DO 373 # endif 374 END DO 375 347 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 348 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 349 CALL trd_mod(ztrdt, ztrds, jptra_trd_bbl, 'TRA', kt) 376 350 ENDIF 377 351 378 IF(ln_ctl) THEN 379 CALL prt_ctl(tab3d_1=ta, clinfo1=' bbl - Ta: ', mask1=tmask, & 380 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 381 ENDIF 382 352 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' bbl - Ta: ', mask1=tmask, & 353 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 383 354 384 355 ! 6. Vertical advection velocities … … 475 446 ! 7. compute additional vertical velocity to be used in t boxes 476 447 ! ------------------------------------------------------------- 477 478 448 ! ... Computation from the bottom 479 449 ! Note that w_bbl(:,:,jpk) has been set to 0 in tra_bbl_init … … 488 458 ! Boundary condition on w_bbl (unchanged sign) 489 459 CALL lbc_lnk( w_bbl, 'W', 1. ) 490 460 ! 491 461 END SUBROUTINE tra_bbl_adv -
trunk/NEMO/OPA_SRC/TRA/tradmp.F90
r473 r503 4 4 !! Ocean physics: internal restoring trend on active tracers (T and S) 5 5 !!====================================================================== 6 !! History : 5.0 ! 91-03 (O. Marti, G. Madec) Original code 7 !! ! 92-06 (M. Imbard) doctor norme 8 !! ! 96-01 (G. Madec) statement function for e3 9 !! ! 97-05 (G. Madec) macro-tasked on jk-slab 10 !! ! 98-07 (M. Imbard, G. Madec) ORCA version 11 !! 7.0 ! 01-02 (M. Imbard) cofdis, Original code 12 !! 8.1 ! 01-02 (G. Madec, E. Durand) cleaning 13 !! 8.5 ! 02-08 (G. Madec, E. Durand) free form + modules 14 !!---------------------------------------------------------------------- 6 15 #if defined key_tradmp || defined key_esopa 7 16 !!---------------------------------------------------------------------- 8 17 !! key_tradmp internal damping 18 !!---------------------------------------------------------------------- 9 19 !!---------------------------------------------------------------------- 10 20 !! tra_dmp : update the tracer trend with the internal damping … … 14 24 !! cofdis : compute the distance to the coastline 15 25 !!---------------------------------------------------------------------- 16 !! * Modules used17 26 USE oce ! ocean dynamics and tracers variables 18 27 USE dom_oce ! ocean space and time domain variables … … 31 40 PRIVATE 32 41 33 !! * Routine accessibility 34 PUBLIC tra_dmp ! routine called by step.F90 35 36 !! * Shared module variables 37 LOGICAL , PUBLIC & 42 PUBLIC tra_dmp ! routine called by step.F90 43 38 44 #if ! defined key_agrif 39 , PARAMETER & 45 LOGICAL, PUBLIC, PARAMETER :: lk_tradmp = .TRUE. !: internal damping flag 46 #else 47 LOGICAL, PUBLIC :: lk_tradmp = .TRUE. !: internal damping flag 40 48 #endif 41 :: lk_tradmp = .TRUE. !: internal damping flag 42 43 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: & 44 strdmp, & ! damping salinity trend (psu/s) 45 resto ! restoring coeff. on T and S (s-1) 46 47 !! * Module variables 48 INTEGER :: & !!! * newtonian damping namelist (mandmp) * 49 ndmp = -1 , & ! = 0/-1/'latitude' for damping over T and S 50 ndmpf = 2 , & ! = 1 create a damping.coeff NetCDF file 51 nmldmp = 0 ! = 0/1/2 flag for damping in the mixed layer 52 REAL(wp) :: & !!! * newtonian damping namelist * 53 sdmp = 50., & ! surface time scale for internal damping (days) 54 bdmp = 360., & ! bottom time scale for internal damping (days) 55 hdmp = 800. ! depth of transition between sdmp and bdmp (meters) 49 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: strdmp !: damping salinity trend (psu/s) 50 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: resto !: restoring coeff. on T and S (s-1) 51 52 !!* newtonian damping namelist (mandmp) 53 INTEGER :: ndmp = -1 ! = 0/-1/'latitude' for damping over T and S 54 INTEGER :: ndmpf = 2 ! = 1 create a damping.coeff NetCDF file 55 INTEGER :: nmldmp = 0 ! = 0/1/2 flag for damping in the mixed layer 56 REAL(wp) :: sdmp = 50. ! surface time scale for internal damping (days) 57 REAL(wp) :: bdmp = 360. ! bottom time scale for internal damping (days) 58 REAL(wp) :: hdmp = 800. ! depth of transition between sdmp and bdmp (meters) 59 NAMELIST/namtdp/ ndmp, ndmpf, nmldmp, sdmp, bdmp, hdmp 56 60 57 61 !! * Substitutions … … 59 63 # include "vectopt_loop_substitute.h90" 60 64 !!---------------------------------------------------------------------- 61 !! OPA 9.0 , LOCEAN-IPSL (200 5)65 !! OPA 9.0 , LOCEAN-IPSL (2006) 62 66 !! $Header$ 63 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt67 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 64 68 !!---------------------------------------------------------------------- 65 69 … … 85 89 !! damping trends. 86 90 !! - save the trends in (ttrd,strd) ('key_trdtra') 87 !! 88 !! History : 89 !! 7.0 ! (G. Madec) Original code 90 !! ! 96-01 (G. Madec) 91 !! ! 97-05 (G. Madec) macro-tasked on jk-slab 92 !! 8.5 ! 02-08 (G. Madec) free form + modules 93 !! 9.0 ! 04-08 (C. Talandier) New trends organization 94 !!---------------------------------------------------------------------- 95 !! * Modules used 96 USE oce, ONLY : ztdta => ua, & ! use ua as 3D workspace 97 ztdsa => va ! use va as 3D workspace 98 99 !! * Arguments 100 INTEGER, INTENT( in ) :: kt ! ocean time-step index 101 102 !! * Local declarations 91 !!---------------------------------------------------------------------- 92 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 93 USE oce, ONLY : ztrds => va ! use va as 3D workspace 94 !! 95 INTEGER, INTENT( in ) :: kt ! ocean time-step index 96 !! 103 97 INTEGER :: ji, jj, jk ! dummy loop indices 104 98 REAL(wp) :: ztest, zta, zsa ! temporary scalars 105 99 !!---------------------------------------------------------------------- 106 100 107 ! 0. Initialization (first time-step only) 108 ! -------------- 109 IF( kt == nit000 ) CALL tra_dmp_init 110 111 ! Save ta and sa trends 112 IF( l_trdtra ) THEN 113 ztdta(:,:,:) = ta(:,:,:) 114 ztdsa(:,:,:) = sa(:,:,:) 101 IF( kt == nit000 ) CALL tra_dmp_init ! Initialization 102 103 IF( l_trdtra ) THEN ! Save ta and sa trends 104 ztrdt(:,:,:) = ta(:,:,:) 105 ztrds(:,:,:) = sa(:,:,:) 115 106 ENDIF 116 107 … … 120 111 121 112 SELECT CASE ( nmldmp ) 122 113 ! 123 114 CASE( 0 ) ! newtonian damping throughout the water column 124 115 DO jk = 1, jpkm1 … … 135 126 END DO 136 127 END DO 137 128 ! 138 129 CASE ( 1 ) ! no damping in the turbocline (avt > 5 cm2/s) 139 130 DO jk = 1, jpkm1 … … 156 147 END DO 157 148 END DO 158 149 ! 159 150 CASE ( 2 ) ! no damping in the mixed layer 160 151 DO jk = 1, jpkm1 … … 176 167 END DO 177 168 END DO 178 169 ! 179 170 END SELECT 180 171 181 ! save the trends for diagnostic 182 ! damping salinity trends 183 IF( l_trdtra ) THEN 184 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) 185 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) 186 CALL trd_mod(ztdta, ztdsa, jpttddoe, 'TRA', kt) 172 IF( l_trdtra ) THEN ! save the damping tracer trends for diagnostic 173 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 174 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 175 CALL trd_mod(ztrdt, ztrds, jptra_trd_dmp, 'TRA', kt) 187 176 ENDIF 188 189 IF(ln_ctl) THEN ! print mean trends (used for debugging) 190 CALL prt_ctl(tab3d_1=ta, clinfo1=' dmp - Ta: ', mask1=tmask, & 191 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 192 ENDIF 193 194 177 ! ! Control print 178 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' dmp - Ta: ', mask1=tmask, & 179 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 180 ! 195 181 END SUBROUTINE tra_dmp 196 182 … … 204 190 !! ** Method : read the nammbf namelist and check the parameters 205 191 !! called by tra_dmp at the first timestep (nit000) 206 !! 207 !! History : 208 !! 8.5 ! 02-08 (G. Madec) Original code 209 !!---------------------------------------------------------------------- 210 !! * Local declarations 211 NAMELIST/namtdp/ ndmp, ndmpf, nmldmp, sdmp, bdmp, hdmp 212 !!---------------------------------------------------------------------- 213 214 ! Read Namelist namtdp : temperature and salinity damping term 215 ! -------------------- 216 REWIND ( numnam ) 192 !!---------------------------------------------------------------------- 193 194 REWIND ( numnam ) ! Read Namelist namtdp : temperature and salinity damping term 217 195 READ ( numnam, namtdp ) 218 196 IF( lzoom ) nmldmp = 0 ! restoring to climatology at closed north or south boundaries 219 197 220 ! Parameter control and print 221 ! --------------------------- 222 IF(lwp) THEN 198 IF(lwp) THEN ! Namelist print 223 199 WRITE(numout,*) 224 200 WRITE(numout,*) 'tra_dmp : T and S newtonian damping' 225 201 WRITE(numout,*) '~~~~~~~' 226 WRITE(numout,*) ' Namelist namtdp : set damping parameter' 227 WRITE(numout,*) 228 WRITE(numout,*) ' T and S damping option ndmp = ', ndmp 229 WRITE(numout,*) ' create a damping.coeff file ndmpf = ', ndmpf 230 WRITE(numout,*) ' mixed layer damping option nmldmp = ', nmldmp, '(zoom: forced to 0)' 231 WRITE(numout,*) ' surface time scale (days) sdmp = ', sdmp 232 WRITE(numout,*) ' bottom time scale (days) bdmp = ', bdmp 233 WRITE(numout,*) ' depth of transition (meters) hdmp = ', hdmp 234 WRITE(numout,*) 202 WRITE(numout,*) ' Namelist namtdp : set damping parameter' 203 WRITE(numout,*) ' T and S damping option ndmp = ', ndmp 204 WRITE(numout,*) ' create a damping.coeff file ndmpf = ', ndmpf 205 WRITE(numout,*) ' mixed layer damping option nmldmp = ', nmldmp, '(zoom: forced to 0)' 206 WRITE(numout,*) ' surface time scale (days) sdmp = ', sdmp 207 WRITE(numout,*) ' bottom time scale (days) bdmp = ', bdmp 208 WRITE(numout,*) ' depth of transition (meters) hdmp = ', hdmp 235 209 ENDIF 236 210 237 211 SELECT CASE ( ndmp ) 238 239 CASE ( -1 ) ! ORCA: damping in Red & Med Seas only 240 IF(lwp) WRITE(numout,*) ' tracer damping in the Med & Red seas only' 241 242 CASE ( 1:90 ) ! Damping poleward of 'ndmp' degrees 243 IF(lwp) WRITE(numout,*) ' tracer damping poleward of', ndmp, ' degrees' 244 212 CASE ( -1 ) ; IF(lwp) WRITE(numout,*) ' tracer damping in the Med & Red seas only' 213 CASE ( 1:90 ) ; IF(lwp) WRITE(numout,*) ' tracer damping poleward of', ndmp, ' degrees' 245 214 CASE DEFAULT 246 215 WRITE(ctmp1,*) ' bad flag value for ndmp = ', ndmp 247 216 CALL ctl_stop(ctmp1) 248 249 217 END SELECT 250 218 251 252 219 SELECT CASE ( nmldmp ) 253 254 CASE ( 0 ) ! newtonian damping throughout the water column 255 IF(lwp) WRITE(numout,*) ' tracer damping throughout the water column' 256 257 CASE ( 1 ) ! no damping in the turbocline (avt > 5 cm2/s) 258 IF(lwp) WRITE(numout,*) ' no tracer damping in the turbocline' 259 260 CASE ( 2 ) ! no damping in the mixed layer 261 IF(lwp) WRITE(numout,*) ' no tracer damping in the mixed layer' 262 220 CASE ( 0 ) ; IF(lwp) WRITE(numout,*) ' tracer damping throughout the water column' 221 CASE ( 1 ) ; IF(lwp) WRITE(numout,*) ' no tracer damping in the turbocline (avt > 5 cm2/s)' 222 CASE ( 2 ) ; IF(lwp) WRITE(numout,*) ' no tracer damping in the mixed layer' 263 223 CASE DEFAULT 264 224 WRITE(ctmp1,*) ' bad flag value for nmldmp = ', nmldmp 265 225 CALL ctl_stop(ctmp1) 266 267 226 END SELECT 268 227 269 IF( .NOT.lk_dtasal .OR. .NOT.lk_dtatem ) & 270 & CALL ctl_stop( ' no temperature and/or salinity data ', & 271 & ' define key_dtatem and key_dtasal' ) 228 IF( .NOT.lk_dtasal .OR. .NOT.lk_dtatem ) & 229 & CALL ctl_stop( 'no temperature and/or salinity data define key_dtatem and key_dtasal' ) 272 230 273 231 strdmp(:,:,:) = 0.e0 ! internal damping salinity trend (used in ocesbc) 274 232 275 ! Damping coefficients initialization 276 ! ----------------------------------- 277 278 IF( lzoom ) THEN 279 CALL dtacof_zoom 280 ELSE 281 CALL dtacof 233 ! ! Damping coefficients initialization 234 IF( lzoom ) THEN ; CALL dtacof_zoom 235 ELSE ; CALL dtacof 282 236 ENDIF 283 237 ! 284 238 END SUBROUTINE tra_dmp_init 285 239 … … 297 251 !! 298 252 !! ** Action : - resto, the damping coeff. for T and S 299 !! 300 !! History : 301 !! 9.0 ! 03-09 (G. Madec) Original code 302 !!---------------------------------------------------------------------- 303 !! * Local declarations 304 INTEGER :: ji, jj, jk, jn ! dummy loop indices 305 REAL(wp) :: & 306 zlat, zlat0, zlat1, zlat2 ! temporary scalar 307 REAL(wp), DIMENSION(6) :: & 308 zfact ! temporary workspace 253 !!---------------------------------------------------------------------- 254 INTEGER :: ji, jj, jk, jn ! dummy loop indices 255 REAL(wp) :: zlat, zlat0, zlat1, zlat2 ! temporary scalar 256 REAL(wp), DIMENSION(6) :: zfact ! temporary workspace 309 257 !!---------------------------------------------------------------------- 310 258 … … 321 269 ! damping along the forced closed boundary over 6 grid-points 322 270 DO jn = 1, 6 323 IF( lzoom_w ) resto( mi0(jn+jpizoom):mi1(jn+jpizoom), : , : ) = zfact(jn) ! west closed 324 IF( lzoom_s ) resto( : , mj0(jn+jpjzoom):mj1(jn+jpjzoom), : ) = zfact(jn) ! south closed 325 IF( lzoom_e ) resto( mi0(jpiglo+jpizoom-1-jn):mi1(jpiglo+jpizoom-1-jn) , : , : ) & 326 & = zfact(jn) ! east closed 327 IF( lzoom_n ) resto( : , mj0(jpjglo+jpjzoom-1-jn):mj1(jpjglo+jpjzoom-1-jn) , : ) & 328 & = zfact(jn) ! north closed 271 IF( lzoom_w ) resto( mi0(jn+jpizoom):mi1(jn+jpizoom), : , : ) = zfact(jn) ! west closed 272 IF( lzoom_s ) resto( : , mj0(jn+jpjzoom):mj1(jn+jpjzoom), : ) = zfact(jn) ! south closed 273 IF( lzoom_e ) resto( mi0(jpiglo+jpizoom-1-jn):mi1(jpiglo+jpizoom-1-jn) , : , : ) = zfact(jn) ! east closed 274 IF( lzoom_n ) resto( : , mj0(jpjglo+jpjzoom-1-jn):mj1(jpjglo+jpjzoom-1-jn) , : ) = zfact(jn) ! north closed 329 275 END DO 330 276 331 277 332 278 IF( lzoom_arct .AND. lzoom_anta ) THEN 333 279 ! 334 280 ! ==================================================== 335 281 ! ORCA configuration : arctic zoom or antarctic zoom … … 364 310 END DO 365 311 END DO 366 312 ! 367 313 ENDIF 368 314 369 315 ! ... Mask resto array 370 316 resto(:,:,:) = resto(:,:,:) * tmask(:,:,:) 371 317 ! 372 318 END SUBROUTINE dtacof_zoom 319 373 320 374 321 SUBROUTINE dtacof … … 383 330 !! 384 331 !! ** Action : - resto, the damping coeff. for T and S 385 !! 386 !! History : 387 !! 5.0 ! 91-03 (O. Marti, G. Madec) Original code 388 !! ! 92-06 (M. Imbard) doctor norme 389 !! ! 96-01 (G. Madec) statement function for e3 390 !! ! 98-07 (M. Imbard, G. Madec) ORCA version 391 !! ! 00-08 (G. Madec, D. Ludicone) 392 !!---------------------------------------------------------------------- 393 !! * Modules used 332 !!---------------------------------------------------------------------- 394 333 USE iom 395 334 USE ioipsl 396 397 !! * Local declarations 335 !! 398 336 INTEGER :: ji, jj, jk ! dummy loop indices 399 337 INTEGER :: itime 400 338 INTEGER :: ii0, ii1, ij0, ij1 ! " " 401 INTEGER :: & 402 idmp, & ! logical unit for file restoring damping term 403 icot ! logical unit for file distance to the coast 339 INTEGER :: idmp ! logical unit for file restoring damping term 340 INTEGER :: icot ! logical unit for file distance to the coast 404 341 CHARACTER (len=32) :: clname3 405 REAL(wp) :: & 406 zdate0, zinfl, zlon, & ! temporary scalars 407 zlat, zlat0, zlat1, zlat2, & ! " " 408 zsdmp, zbdmp ! " " 409 REAL(wp), DIMENSION(jpk) :: & 410 zhfac 411 REAL(wp), DIMENSION(jpi,jpj) :: & 412 zmrs 413 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 414 zdct 342 REAL(wp) :: zdate0, zinfl, zlon ! temporary scalars 343 REAL(wp) :: zlat, zlat0, zlat1, zlat2 ! " " 344 REAL(wp) :: zsdmp, zbdmp ! " " 345 REAL(wp), DIMENSION(jpk) :: zhfac 346 REAL(wp), DIMENSION(jpi,jpj) :: zmrs 347 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdct 415 348 !!---------------------------------------------------------------------- 416 349 … … 494 427 DO ji = 1, jpi 495 428 zdct(ji,jj,jk) = MIN( zinfl, zdct(ji,jj,jk) ) 496 497 429 ! ... Decrease the value in the vicinity of the coast 498 resto(ji,jj,jk) = resto(ji,jj,1)*0.5 & 499 & * ( 1. - COS( rpi*zdct(ji,jj,jk)/zinfl) ) 500 430 resto(ji,jj,jk) = resto(ji,jj,1) * 0.5 * ( 1. - COS( rpi*zdct(ji,jj,jk)/zinfl) ) 501 431 ! ... Vertical variation from zsdmp (sea surface) to zbdmp (bottom) 502 resto(ji,jj,jk) = resto(ji,jj,jk) & 503 & * ( zbdmp + (zsdmp-zbdmp)*EXP(-fsdept(ji,jj,jk)/hdmp) ) 432 resto(ji,jj,jk) = resto(ji,jj,jk) * ( zbdmp + (zsdmp-zbdmp)*EXP(-fsdept(ji,jj,jk)/hdmp) ) 504 433 END DO 505 434 END DO 506 435 END DO 507 436 ! 508 437 ENDIF 509 438 … … 524 453 CASE ( 4 ) ! ORCA_R4 configuration 525 454 ! ! ======================= 526 527 455 ! Mediterranean Sea 528 456 ij0 = 50 ; ij1 = 56 … … 539 467 zhfac (jk) = 1./rday 540 468 END DO 541 542 469 ! ! ======================= 543 470 CASE ( 2 ) ! ORCA_R2 configuration 544 471 ! ! ======================= 545 546 472 ! Mediterranean Sea 547 473 ij0 = 96 ; ij1 = 110 … … 576 502 zhfac (jk) = 1./rday 577 503 END DO 578 579 504 ! ! ======================= 580 505 CASE ( 05 ) ! ORCA_R05 configuration 581 506 ! ! ======================= 582 583 507 ! Mediterranean Sea 584 508 ii0 = 568 ; ii1 = 574 … … 608 532 zhfac (jk) = ( zbdmp + (zsdmp-zbdmp) * EXP(-fsdept(1,1,jk)/hdmp) ) 609 533 END DO 610 611 534 ! ! ======================== 612 535 CASE ( 025 ) ! ORCA_R025 configuration 613 536 ! ! ======================== 614 537 CALL ctl_stop( ' Not yet implemented in ORCA_R025' ) 615 538 ! 616 539 END SELECT 617 540 … … 644 567 CALL ymds2ju( 0 , 1 , 1 , 0.e0 , zdate0 ) 645 568 CALL restini( 'NONE', jpi , jpj , glamt, gphit, & 646 647 569 & jpk , gdept_0, clname3, itime, zdate0, & 570 & rdt , idmp, domain_id=nidom ) 648 571 CALL restput( idmp, 'Resto', jpi, jpj, jpk, & 649 572 & 0 , resto ) 650 573 CALL restclo( idmp ) 651 574 ENDIF 652 575 ! 653 576 END SUBROUTINE dtacof 654 577 … … 673 596 !! ** Action : - pdct, distance to the coastline (argument) 674 597 !! - NetCDF file 'dist.coast.nc' 675 !! 676 !! History : 677 !! 7.0 ! 01-02 (M. Imbard) Original code 678 !! 8.1 ! 01-02 (G. Madec, E. Durand) 679 !! 8.5 ! 02-08 (G. Madec, E. Durand) Free form, F90 680 !!---------------------------------------------------------------------- 681 !! * Modules used 682 USE ioipsl 683 684 !! * Arguments 685 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) :: & 686 pdct ! distance to the coastline 687 688 !! * local declarations 689 INTEGER :: ji, jj, jk, jl ! dummy loop indices 690 INTEGER :: iju, ijt ! temporary integers 691 INTEGER :: icoast, itime 692 INTEGER :: & 693 icot ! logical unit for file distance to the coast 694 LOGICAL, DIMENSION(jpi,jpj) :: & 695 llcotu, llcotv, llcotf ! ??? 598 !!---------------------------------------------------------------------- 599 USE ioipsl ! IOipsl librairy 600 !! 601 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) :: pdct ! distance to the coastline 602 !! 603 INTEGER :: ji, jj, jk, jl ! dummy loop indices 604 INTEGER :: iju, ijt ! temporary integers 605 INTEGER :: icoast, itime 606 INTEGER :: icot ! logical unit for file distance to the coast 607 LOGICAL, DIMENSION(jpi,jpj) :: llcotu, llcotv, llcotf ! ??? 696 608 CHARACTER (len=32) :: clname 697 609 REAL(wp) :: zdate0 698 REAL(wp), DIMENSION(jpi,jpj) :: & 699 zxt, zyt, zzt, & ! cartesian coordinates for T-points 700 zmask 701 REAL(wp), DIMENSION(3*jpi*jpj) :: & 702 zxc, zyc, zzc, zdis ! temporary workspace 610 REAL(wp), DIMENSION(jpi,jpj) :: zxt, zyt, zzt, zmask ! cartesian coordinates for T-points 611 REAL(wp), DIMENSION(3*jpi*jpj) :: zxc, zyc, zzc, zdis ! temporary workspace 703 612 !!---------------------------------------------------------------------- 704 613 … … 832 741 DO jl = 1, icoast 833 742 zdis(jl) = ( zxt(ji,jj) - zxc(jl) )**2 & 834 835 743 & + ( zyt(ji,jj) - zyc(jl) )**2 & 744 & + ( zzt(ji,jj) - zzc(jl) )**2 836 745 END DO 837 746 pdct(ji,jj,jk) = ra * SQRT( MINVAL( zdis(1:icoast) ) ) … … 850 759 CALL ymds2ju( 0 , 1 , 1 , 0.e0 , zdate0 ) 851 760 CALL restini( 'NONE', jpi , jpj , glamt, gphit , & 852 853 761 & jpk , gdept_0, clname, itime, zdate0, & 762 & rdt , icot ) 854 763 CALL restput( icot, 'Tcoast', jpi, jpj, jpk, 0, pdct ) 855 764 CALL restclo( icot ) -
trunk/NEMO/OPA_SRC/TRA/traldf.F90
r474 r503 4 4 !! Ocean Active tracers : lateral diffusive trends 5 5 !!===================================================================== 6 !! History : 7 !! 9.0 ! 05-11 (G. Madec) Original code 6 !! History : 9.0 ! 05-11 (G. Madec) Original code 7 !!---------------------------------------------------------------------- 8 8 9 !!---------------------------------------------------------------------- 9 10 !! tra_ldf : update the tracer trend with the lateral diffusion … … 11 12 !! ldf_ano : compute lateral diffusion for constant T-S profiles 12 13 !!---------------------------------------------------------------------- 13 !! * Modules used14 14 USE oce ! ocean dynamics and tracers 15 15 USE dom_oce ! ocean space and time domain … … 31 31 PRIVATE 32 32 33 !! * Routine accessibility 34 PUBLIC tra_ldf ! called by step.F90 35 36 !! * module variables 37 INTEGER :: & 38 nldf = 0 ! type of lateral diffusion used 39 ! ! defined from ln_traldf_... namlist logicals) 33 PUBLIC tra_ldf ! called by step.F90 34 35 INTEGER :: nldf = 0 ! type of lateral diffusion used defined from ln_traldf_... namlist logicals) 40 36 #if defined key_traldf_ano 41 REAL, DIMENSION(jpi,jpj,jpk) :: & 42 t0_ldf, s0_ldf ! lateral diffusion trends of T & S 43 ! ! for a constant vertical profile 37 REAL, DIMENSION(jpi,jpj,jpk) :: t0_ldf, s0_ldf ! lateral diffusion trends of T & S 38 ! ! for a constant vertical profile 44 39 #endif 45 40 … … 47 42 # include "domzgr_substitute.h90" 48 43 # include "vectopt_loop_substitute.h90" 49 !!--------------------------------------------------------------------------------- 50 !! OPA 9.0 , LOCEAN-IPSL (2005) 51 !!--------------------------------------------------------------------------------- 44 !!---------------------------------------------------------------------- 45 !! OPA 9.0 , LOCEAN-IPSL (2006) 46 !! $Header$ 47 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 48 !!---------------------------------------------------------------------- 52 49 53 50 CONTAINS … … 60 57 !! 61 58 !!---------------------------------------------------------------------- 62 !! * Arguments 63 INTEGER, INTENT( in ) :: kt ! ocean time-step index 64 65 !! * local declarations 66 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 67 ztrdt, ztrds ! 3D temporary workspace 68 !!---------------------------------------------------------------------- 69 70 IF( kt == nit000 ) CALL ldf_ctl ! initialisation & control of options 59 INTEGER, INTENT( in ) :: kt ! ocean time-step index 60 !! 61 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdt, ztrds ! 3D temporary workspace 62 !!---------------------------------------------------------------------- 63 64 IF( kt == nit000 ) CALL ldf_ctl ! initialisation & control of options 71 65 72 66 IF( l_trdtra ) THEN ! temporary save of ta and sa trends … … 76 70 77 71 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend 78 CASE ( -1 ) ! esopa: test all possibility with control print 72 CASE ( 0 ) ; CALL tra_ldf_lap ( kt ) ! iso-level laplacian 73 CASE ( 1 ) ; CALL tra_ldf_iso ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 74 CASE ( 2 ) ; CALL tra_ldf_bilap ( kt ) ! iso-level bilaplacian 75 CASE ( 3 ) ; CALL tra_ldf_bilapg( kt ) ! s-coord. horizontal bilaplacian 76 ! 77 CASE ( -1 ) ! esopa: test all possibility with control print 79 78 CALL tra_ldf_lap ( kt ) 80 79 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf0 - Ta: ', mask1=tmask, & … … 89 88 CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf3 - Ta: ', mask1=tmask, & 90 89 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 91 92 CASE ( 0 ) ! iso-level laplacian93 CALL tra_ldf_lap ( kt )94 CASE ( 1 ) ! rotated laplacian (except dk[ dk[.] ] part)95 CALL tra_ldf_iso ( kt )96 CASE ( 2 ) ! iso-level bilaplacian97 CALL tra_ldf_bilap ( kt )98 CASE ( 3 ) ! s-coord. horizontal bilaplacian99 CALL tra_ldf_bilapg ( kt )100 90 END SELECT 101 91 102 92 #if defined key_traldf_ano 103 ! ! anomaly: substract the reference diffusivity 104 ta(:,:,:) = ta(:,:,:) - t0_ldf(:,:,:) 93 ta(:,:,:) = ta(:,:,:) - t0_ldf(:,:,:) ! anomaly: substract the reference diffusivity 105 94 sa(:,:,:) = sa(:,:,:) - s0_ldf(:,:,:) 106 95 #endif 107 108 ! ! save the horizontal diffusive trends for further diagnostics 109 IF( l_trdtra ) THEN 96 IF( l_trdtra ) THEN ! save the horizontal diffusive trends for further diagnostics 110 97 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 111 98 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 112 CALL trd_mod( ztrdt, ztrds, jpttdldf, 'TRA', kt ) 113 ENDIF 114 99 CALL trd_mod( ztrdt, ztrds, jptra_trd_ldf, 'TRA', kt ) 100 ENDIF 115 101 ! ! print mean trends (used for debugging) 116 102 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf - Ta: ', mask1=tmask, & 117 103 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 118 104 ! 119 105 END SUBROUTINE tra_ldf 120 106 … … 132 118 !! nldf == 2 bilaplacian operator 133 119 !! nldf == 3 Rotated bilaplacian 134 !! 135 !!---------------------------------------------------------------------- 136 !! * Local declarations 120 !!---------------------------------------------------------------------- 137 121 INTEGER :: ioptio, ierr ! temporary integers 138 122 ! … … 150 134 ! READ ( numnam, nam_traldf ) 151 135 152 IF(lwp) THEN 136 IF(lwp) THEN ! Namelist print 153 137 WRITE(numout,*) 154 138 WRITE(numout,*) 'tra:ldf_ctl : lateral tracer diffusive operator' 155 139 WRITE(numout,*) '~~~~~~~~~~~' 156 WRITE(numout,*) ' Namelist nam_traldf : set lateral mixing parameters (type, direction, coefficients)' 157 WRITE(numout,*) ' laplacian operator ln_traldf_lap = ', ln_traldf_lap 158 WRITE(numout,*) ' bilaplacian operator ln_traldf_bilap = ', ln_traldf_bilap 159 WRITE(numout,*) ' iso-level ln_traldf_level = ', ln_traldf_level 160 WRITE(numout,*) ' horizontal (geopotential) ln_traldf_hor = ', ln_traldf_hor 161 WRITE(numout,*) ' iso-neutral ln_traldf_iso = ', ln_traldf_iso 162 ENDIF 163 164 ! Parameter control 165 166 ! control the input 140 WRITE(numout,*) ' Namelist nam_traldf : set lateral mixing parameters (type, direction, coefficients)' 141 WRITE(numout,*) ' laplacian operator ln_traldf_lap = ', ln_traldf_lap 142 WRITE(numout,*) ' bilaplacian operator ln_traldf_bilap = ', ln_traldf_bilap 143 WRITE(numout,*) ' iso-level ln_traldf_level = ', ln_traldf_level 144 WRITE(numout,*) ' horizontal (geopotential) ln_traldf_hor = ', ln_traldf_hor 145 WRITE(numout,*) ' iso-neutral ln_traldf_iso = ', ln_traldf_iso 146 ENDIF 147 148 ! ! control the input 167 149 ioptio = 0 168 150 IF( ln_traldf_lap ) ioptio = ioptio + 1 169 151 IF( ln_traldf_bilap ) ioptio = ioptio + 1 170 IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE of the 2 lap/bilap operator type on tracer' )152 IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE of the 2 lap/bilap operator type on tracer' ) 171 153 ioptio = 0 172 154 IF( ln_traldf_level ) ioptio = ioptio + 1 173 155 IF( ln_traldf_hor ) ioptio = ioptio + 1 174 156 IF( ln_traldf_iso ) ioptio = ioptio + 1 175 IF( ioptio /= 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' )157 IF( ioptio /= 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 176 158 177 159 ! defined the type of lateral diffusion from ln_traldf_... logicals … … 213 195 ENDIF 214 196 215 IF( ierr == 1 ) CALL ctl_stop( ' iso-level in z-coordinate - partial step, not allowed' )216 IF( ierr == 2 ) CALL ctl_stop( ' isoneutral bilaplacian operator does not exist' )217 IF( lk_traldf_eiv .AND. .NOT.ln_traldf_iso ) &218 & CALL ctl_stop( ' eddy induced velocity on tracers',&219 & 197 IF( ierr == 1 ) CALL ctl_stop( ' iso-level in z-coordinate - partial step, not allowed' ) 198 IF( ierr == 2 ) CALL ctl_stop( ' isoneutral bilaplacian operator does not exist' ) 199 IF( lk_traldf_eiv .AND. .NOT.ln_traldf_iso ) & 200 CALL ctl_stop( ' eddy induced velocity on tracers', & 201 & ' the eddy induced velocity on tracers requires isopycnal laplacian diffusion' ) 220 202 IF( nldf == 1 .OR. nldf == 3 ) THEN ! rotation 221 IF( .NOT.lk_ldfslp ) CALL ctl_stop( ' the rotation of the diffusive tensor require key_ldfslp' )203 IF( .NOT.lk_ldfslp ) CALL ctl_stop( ' the rotation of the diffusive tensor require key_ldfslp' ) 222 204 ENDIF 223 205 … … 236 218 ENDIF 237 219 238 239 220 ! Reference T & S diffusivity (if necessary) 240 221 ! =========================== 241 242 222 CALL ldf_ano 243 223 ! 244 224 END SUBROUTINE ldf_ctl 245 225 … … 254 234 !! 255 235 !! ** Purpose : initializations of 256 !! 257 !!---------------------------------------------------------------------- 258 !! * Modules used 236 !!---------------------------------------------------------------------- 259 237 USE zdf_oce ! vertical mixing 260 238 USE trazdf ! vertical mixing: double diffusion 261 239 USE zdfddm ! vertical mixing: double diffusion 262 263 !! * local declarations 264 INTEGER :: jk ! Dummy loop indice 265 LOGICAL :: llsave ! 266 REAL(wp) :: zt0, zs0, z12 ! temporary scalar 267 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 268 zt_ref, ztb, zavt, & ! 3D temporary workspace 269 zs_ref, zsb ! 3D temporary workspace 240 !! 241 INTEGER :: jk ! Dummy loop indice 242 LOGICAL :: llsave ! 243 REAL(wp) :: zt0, zs0, z12 ! temporary scalar 244 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zt_ref, ztb, zavt ! 3D workspace 245 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zs_ref, zsb ! 3D workspace 270 246 !!---------------------------------------------------------------------- 271 247 … … 329 305 sa (:,:,:) = va (:,:,:) 330 306 avt (:,:,:) = zavt(:,:,:) 331 307 ! 332 308 END SUBROUTINE ldf_ano 333 309 -
trunk/NEMO/OPA_SRC/TRA/traldf_iso.F90
r457 r503 1 1 MODULE traldf_iso 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE traldf_iso *** 4 4 !! Ocean active tracers: horizontal component of the lateral tracer mixing trend 5 !!============================================================================== 5 !!====================================================================== 6 !! History : ! 94-08 (G. Madec, M. Imbard) 7 !! ! 97-05 (G. Madec) split into traldf and trazdf 8 !! 8.5 ! 02-08 (G. Madec) Free form, F90 9 !! 9.0 ! 05-11 (G. Madec) merge traldf and trazdf :-) 10 !!---------------------------------------------------------------------- 6 11 #if defined key_ldfslp || defined key_esopa 7 12 !!---------------------------------------------------------------------- 8 13 !! 'key_ldfslp' slope of the lateral diffusive direction 14 !!---------------------------------------------------------------------- 9 15 !!---------------------------------------------------------------------- 10 16 !! tra_ldf_iso : update the tracer trend with the horizontal … … 14 20 !! vector optimization, use k-j-i loops. 15 21 !!---------------------------------------------------------------------- 16 !! * Modules used17 22 USE oce ! ocean dynamics and active tracers 18 23 USE dom_oce ! ocean space and time domain … … 26 31 USE prtctl ! Print control 27 32 28 29 33 IMPLICIT NONE 30 34 PRIVATE 31 35 32 !! * Accessibility 33 PUBLIC tra_ldf_iso ! routine called by step.F90 36 PUBLIC tra_ldf_iso ! routine called by step.F90 34 37 35 38 !! * Substitutions … … 39 42 !!---------------------------------------------------------------------- 40 43 !! OPA 9.0 , LOCEAN-IPSL (2005) 44 !! $Header$ 45 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 41 46 !!---------------------------------------------------------------------- 42 47 … … 81 86 !! ta = ta + difft 82 87 !! 83 !! ** Action : 84 !! Update (ta,sa) arrays with the before rotated diffusion trend 85 !! (except the dk[ dk[.] ] term) 86 !! 87 !! History : 88 !! ! 94-08 (G. Madec, M. Imbard) 89 !! ! 97-05 (G. Madec) split into traldf and trazdf 90 !! 8.5 ! 02-08 (G. Madec) Free form, F90 91 !! 9.0 ! 04-08 (C. Talandier) New trends organization 92 !! ! 05-11 (G. Madec) merge traldf and trazdf :-) 93 !!---------------------------------------------------------------------- 94 !! * Modules used 95 USE oce , zftv => ua, & ! use ua as workspace 96 & zfsv => va ! use va as workspace 97 98 !! * Arguments 99 INTEGER, INTENT( in ) :: kt ! ocean time-step index 100 101 !! * Local declarations 102 INTEGER :: ji, jj, jk ! dummy loop indices 103 INTEGER :: iku, ikv ! temporary integer 104 REAL(wp) :: & 105 zabe1, zabe2, zcof1, zcof2, & ! temporary scalars 106 zmsku, zta, & ! " " 107 zmskv, zsa, zbtr, & ! " " 108 zcoef0, zcoef3, zcoef4 ! " " 109 REAL(wp), DIMENSION(jpi,jpj) :: & ! temporary workspace 110 zdkt , zdk1t, zftu, & ! " " 111 zdks , zdk1s, zfsu ! " " 112 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 113 zdit, zdjt, ztfw, & ! temporary workspace 114 zdis, zdjs, zsfw ! " " 88 !! ** Action : Update (ta,sa) arrays with the before rotated diffusion 89 !! trend (except the dk[ dk[.] ] term) 90 !!---------------------------------------------------------------------- 91 USE oce , zftv => ua ! use ua as workspace 92 USE oce , zfsv => va ! use va as workspace 93 !! 94 INTEGER, INTENT( in ) :: kt ! ocean time-step index 95 !! 96 INTEGER :: ji, jj, jk ! dummy loop indices 97 INTEGER :: iku, ikv ! temporary integer 98 REAL(wp) :: zmsku, zabe1, zcof1, zcoef3, zta ! temporary scalars 99 REAL(wp) :: zmskv, zabe2, zcof2, zcoef4, zsa ! " " 100 REAL(wp) :: zcoef0, zbtr ! " " 101 REAL(wp), DIMENSION(jpi,jpj) :: zdkt , zdk1t, zftu ! 2D workspace 102 REAL(wp), DIMENSION(jpi,jpj) :: zdks , zdk1s, zfsu ! " " 103 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdit, zdjt, ztfw ! 3D workspace 104 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdis, zdjs, zsfw ! " " 115 105 !!---------------------------------------------------------------------- 116 106 … … 130 120 zdjs (1,:,:) = 0.e0 ; zdjs (jpi,:,:) = 0.e0 131 121 !!end 132 133 122 134 123 ! Horizontal temperature and salinity gradient … … 217 206 ! II.4 Second derivative (divergence) and add to the general trend 218 207 ! ---------------------------------------------------------------- 219 220 208 DO jj = 2 , jpjm1 221 209 DO ji = fs_2, fs_jpim1 ! vector opt. … … 231 219 ! ! =============== 232 220 233 IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 234 ! "zonal" mean lateral diffusive heat and salt transports 221 IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN ! Poleward diffusive heat and salt transports 235 222 pht_ldf(:) = ptr_vj( zftv(:,:,:) ) 236 223 pst_ldf(:) = ptr_vj( zfsv(:,:,:) ) … … 297 284 END DO 298 285 END DO 299 286 ! 300 287 END SUBROUTINE tra_ldf_iso 301 288 … … 306 293 CONTAINS 307 294 SUBROUTINE tra_ldf_iso( kt ) ! Empty routine 308 INTEGER :: kt309 295 WRITE(*,*) 'tra_ldf_iso: You should not have seen this print! error?', kt 310 296 END SUBROUTINE tra_ldf_iso -
trunk/NEMO/OPA_SRC/TRA/tranpc.F90
r247 r503 4 4 !! Ocean active tracers: non penetrative convection scheme 5 5 !!============================================================================== 6 !! History : 1.0 ! 90-09 (G. Madec) Original code 7 !! ! 91-11 (G. Madec) 8 !! ! 92-06 (M. Imbard) periodic conditions on t and s 9 !! ! 93-03 (M. Guyon) symetrical conditions 10 !! ! 96-01 (G. Madec) statement function for e3 11 !! suppression of common work arrays 12 !! 8.5 ! 02-06 (G. Madec) free form F90 13 !!---------------------------------------------------------------------- 6 14 7 15 !!---------------------------------------------------------------------- … … 9 17 !! tra_npc_init : initialization and control of the scheme 10 18 !!---------------------------------------------------------------------- 11 !! * Modules used12 19 USE oce ! ocean dynamics and active tracers 13 20 USE dom_oce ! ocean space and time domain … … 21 28 PRIVATE 22 29 23 !! * Routine accessibility 24 PUBLIC tra_npc ! routine called by step.F90 25 26 !! * Module variable 27 INTEGER :: & 28 nnpc1 = 1, & ! nnpc1 non penetrative convective scheme frequency 29 nnpc2 = 15 ! nnpc2 non penetrative convective scheme print frequency 30 PUBLIC tra_npc ! routine called by step.F90 31 32 !!* Namelist namnpc: non penetrative convection algorithm 33 INTEGER :: nnpc1 = 1 ! nnpc1 non penetrative convective scheme frequency 34 INTEGER :: nnpc2 = 15 ! nnpc2 non penetrative convective scheme print frequency 35 NAMELIST/namnpc/ nnpc1, nnpc2 30 36 31 37 !! * Substitutions … … 34 40 !! OPA 9.0 , LOCEAN-IPSL (2005) 35 41 !! $Header$ 36 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt42 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 37 43 !!---------------------------------------------------------------------- 38 44 … … 50 56 !! iterations. instabilities are treated when the vertical density 51 57 !! gradient is less than 1.e-5. 52 !! 53 !! 'key_trdtra' defined: the trend associated with this 54 !! algorithm is saved. 55 !! 56 !! macro-tasked on vertical slab (jj-loop) 58 !! l_trdtra=T: the trend associated with this algorithm is saved. 57 59 !! 58 60 !! ** Action : - (tn,sn) after the application od the npc scheme 59 61 !! - save the associated trends (ttrd,strd) ('key_trdtra') 60 62 !! 61 !! References : 62 !! Madec, et al., 1991, JPO, 21, 9, 1349-1371. 63 !! 64 !! History : 65 !! 1.0 ! 90-09 (G. Madec) Original code 66 !! ! 91-11 (G. Madec) 67 !! ! 92-06 (M. Imbard) periodic conditions on t and s 68 !! ! 93-03 (M. Guyon) symetrical conditions 69 !! ! 96-01 (G. Madec) statement function for e3 70 !! suppression of common work arrays 71 !! 8.5 ! 02-06 (G. Madec) free form F90 72 !! 9.0 ! 04-08 (C. Talandier) New trends organization 73 !!---------------------------------------------------------------------- 74 !! * Modules used 75 USE oce, ONLY : ztdta => ua, & ! use ua as 3D workspace 76 ztdsa => va ! use va as 3D workspace 77 78 !! * Arguments 79 INTEGER, INTENT( in ) :: kt ! ocean time-step index 80 81 !! * Local declarations 82 INTEGER :: ji, jj, jk ! dummy loop indices 83 INTEGER :: & 84 inpcc , & ! number of statically instable water column 85 inpci , & ! number of iteration for npc scheme 86 jiter, jkdown, jkp, & ! ??? 87 ikbot, ik, ikup, ikdown ! ??? 88 REAL(wp) :: & ! temporary arrays 89 ze3tot, zta, zsa, zraua, ze3dwn 90 REAL(wp), DIMENSION(jpi,jpk) :: & 91 zwx, zwy, zwz ! temporary arrays 92 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 93 zrhop ! temporary arrays 94 !!---------------------------------------------------------------------- 95 96 IF( kt == nit000 ) CALL tra_npc_init 97 63 !! References : Madec, et al., 1991, JPO, 21, 9, 1349-1371. 64 !!---------------------------------------------------------------------- 65 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 66 USE oce, ONLY : ztrds => va ! use va as 3D workspace 67 !! 68 INTEGER, INTENT(in) :: kt ! ocean time-step index 69 !! 70 INTEGER :: ji, jj, jk ! dummy loop indices 71 INTEGER :: inpcc ! number of statically instable water column 72 INTEGER :: inpci ! number of iteration for npc scheme 73 INTEGER :: jiter, jkdown, jkp ! ??? 74 INTEGER :: ikbot, ik, ikup, ikdown ! ??? 75 REAL(wp) :: ze3tot, zta, zsa, zraua, ze3dwn 76 REAL(wp), DIMENSION(jpi,jpk) :: zwx, zwy, zwz ! 2D arrays 77 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrhop ! 3D arrays 78 !!---------------------------------------------------------------------- 79 80 IF( kt == nit000 ) CALL tra_npc_init ! Initialisation 98 81 99 82 IF( MOD( kt, nnpc1 ) == 0 ) THEN … … 102 85 inpci = 0 103 86 104 ! 0. Potential density 105 ! -------------------- 106 107 CALL eos( tn, sn, rhd, zrhop ) 108 109 ! Save tn and sn trends 110 IF( l_trdtra ) THEN 111 ztdta(:,:,:) = tn(:,:,:) 112 ztdsa(:,:,:) = sn(:,:,:) 87 CALL eos( tn, sn, rhd, zrhop ) ! Potential density 88 89 90 IF( l_trdtra ) THEN ! Save tn and sn trends 91 ztrdt(:,:,:) = tn(:,:,:) 92 ztrds(:,:,:) = sn(:,:,:) 113 93 ENDIF 114 94 … … 116 96 DO jj = 1, jpj ! Vertical slab 117 97 ! ! =============== 118 119 ! 1. Static instability pointer 120 ! ----------------------------- 121 98 ! Static instability pointer 99 ! ---------------------------- 122 100 DO jk = 1, jpkm1 123 101 DO ji = 1, jpi … … 134 112 END DO 135 113 ! even if south-symmetric b. c. used, do not considere jj=1 136 IF( jj == 1 ) zwx(:,:) = 0.e0114 IF( jj == 1 ) zwx(:,:) = 0.e0 137 115 138 116 DO jk = 1, jpkm1 139 117 DO ji = 1, jpi 140 118 zwx(ji,jk) = 1. 141 IF( zwx(ji,jk) < 1.e-5 ) zwx(ji,jk) =0.142 END DO 143 END DO 144 145 zwy(:,1) = 0. 119 IF( zwx(ji,jk) < 1.e-5 ) zwx(ji,jk) = 0.e0 120 END DO 121 END DO 122 123 zwy(:,1) = 0.e0 146 124 DO ji = 1, jpi 147 125 DO jk = 1, jpkm1 … … 150 128 END DO 151 129 152 zwz(1,1) = 0. 130 zwz(1,1) = 0.e0 153 131 DO ji = 1, jpi 154 132 zwz(1,1) = zwz(1,1) + zwy(ji,1) … … 161 139 ! ------------------------------------------------------------------ 162 140 163 IF (zwz(1,1) /= 0.) THEN 164 165 ! -->> the density profil is statically instable : 166 141 IF( zwz(1,1) /= 0.e0 ) THEN ! -->> the density profil is statically instable : 167 142 DO ji = 1, jpi 168 IF( zwy(ji,1) /= 0. ) THEN 169 170 ! ikbot: ocean bottom level 171 172 ikbot = mbathy(ji,jj) 173 174 ! vertical iteration 175 176 DO jiter = 1, jpk 177 143 IF( zwy(ji,1) /= 0.e0 ) THEN 144 ! 145 ikbot = mbathy(ji,jj) ! ikbot: ocean bottom level 146 ! 147 DO jiter = 1, jpk ! vertical iteration 148 ! 178 149 ! search of ikup : the first static instability from the sea surface 179 150 ! 180 151 ik = 0 181 152 220 CONTINUE … … 183 154 IF( ik >= ikbot-1 ) GO TO 200 184 155 zwx(ji,ik) = zrhop(ji,jj,ik) - zrhop(ji,jj,ik+1) 185 IF( zwx(ji,ik) <= 0. ) GO TO 220156 IF( zwx(ji,ik) <= 0.e0 ) GO TO 220 186 157 ikup = ik 187 158 ! the density profil is instable below ikup 188 189 159 ! ikdown : bottom of the instable portion of the density profil 190 191 160 ! search of ikdown and vertical mixing from ikup to ikdown 192 161 ! 193 162 ze3tot= fse3t(ji,jj,ikup) 194 163 zta = tn (ji,jj,ikup) 195 164 zsa = sn (ji,jj,ikup) 196 165 zraua = zrhop(ji,jj,ikup) 197 166 ! 198 167 DO jkdown = ikup+1, ikbot-1 199 168 IF( zraua <= zrhop(ji,jj,jkdown) ) THEN … … 210 179 ikdown = ikbot-1 211 180 240 CONTINUE 212 181 ! 213 182 DO jkp = ikup, ikdown-1 214 183 tn(ji,jj,jkp) = zta … … 221 190 zrhop(ji,jj,ikdown) = zraua 222 191 ENDIF 223 224 192 END DO 225 193 ENDIF 226 194 200 CONTINUE 227 195 END DO 228 229 196 ! <<-- no more static instability on slab jj 230 231 197 ENDIF 232 198 ! ! =============== 233 199 END DO ! End of slab 234 200 ! ! =============== 235 236 237 ! save the trends for diagnostic 238 ! Non penetrative mixing trends 239 IF( l_trdtra ) THEN 240 ztdta(:,:,:) = tn(:,:,:) - ztdta(:,:,:) 241 ztdsa(:,:,:) = sn(:,:,:) - ztdsa(:,:,:) 242 243 CALL trd_mod(ztdta, ztdsa, jpttdnpc, 'TRA', kt) 201 ! 202 IF( l_trdtra ) THEN ! save the Non penetrative mixing trends for diagnostic 203 ztrdt(:,:,:) = tn(:,:,:) - ztrdt(:,:,:) 204 ztrds(:,:,:) = sn(:,:,:) - ztrds(:,:,:) 205 CALL trd_mod(ztrdt, ztrds, jptra_trd_npc, 'TRA', kt) 244 206 ENDIF 245 207 … … 252 214 ! 2. non penetrative convective scheme statistics 253 215 ! ----------------------------------------------- 254 255 216 IF( nnpc2 /= 0 .AND. MOD( kt, nnpc2 ) == 0 ) THEN 256 217 IF(lwp) WRITE(numout,*)' kt=',kt, ' number of statically instable', & 257 ' water column : ',inpcc, ' number of iteration : ',inpci218 & ' water column : ',inpcc, ' number of iteration : ',inpci 258 219 ENDIF 259 220 ! 260 221 ENDIF 261 222 ! 262 223 END SUBROUTINE tra_npc 263 224 … … 268 229 !! 269 230 !! ** Purpose : initializations of the non-penetrative adjustment scheme 270 !! 271 !! History : 272 !! 8.5 ! 02-12 (G. Madec) F90 : free form 273 !!---------------------------------------------------------------------- 274 !! * Namelist 275 NAMELIST/namnpc/ nnpc1, nnpc2 276 !!---------------------------------------------------------------------- 277 278 ! Namelist namzdf : vertical diffusion 279 REWIND( numnam ) 231 !!---------------------------------------------------------------------- 232 ! 233 REWIND( numnam ) ! Namelist namzdf : vertical diffusion 280 234 READ ( numnam, namnpc ) 281 282 ! Parameter print 283 ! --------------- 284 IF(lwp) THEN 235 ! 236 IF(lwp) THEN ! Namelist print 285 237 WRITE(numout,*) 286 238 WRITE(numout,*) 'tra_npc_init : Non Penetrative Convection (npc) scheme' 287 239 WRITE(numout,*) '~~~~~~~~~~~~' 288 WRITE(numout,*) ' Namelist namnpc : set npc scheme parameters' 289 WRITE(numout,*) 290 WRITE(numout,*) ' npc scheme frequency nnpc1 = ', nnpc1 291 WRITE(numout,*) ' npc scheme print frequency nnpc2 = ', nnpc2 292 WRITE(numout,*) 240 WRITE(numout,*) ' Namelist namnpc : set npc scheme parameters' 241 WRITE(numout,*) ' npc scheme frequency nnpc1 = ', nnpc1 242 WRITE(numout,*) ' npc scheme print frequency nnpc2 = ', nnpc2 293 243 ENDIF 294 295 296 ! Parameter controls 297 ! ------------------ 298 IF ( nnpc1 == 0 ) THEN 244 ! 245 IF ( nnpc1 == 0 ) THEN ! Parameter controls 299 246 IF(lwp) WRITE(numout,cform_war) 300 247 IF(lwp) WRITE(numout,*) ' nnpc1 = ', nnpc1, ' is forced to 1' … … 302 249 nwarn = nwarn + 1 303 250 ENDIF 304 251 ! 305 252 END SUBROUTINE tra_npc_init 306 253 -
trunk/NEMO/OPA_SRC/TRA/tranxt.F90
r457 r503 4 4 !! Ocean active tracers: time stepping on temperature and salinity 5 5 !!====================================================================== 6 !! History : 7 !! 7.0 ! 91-11 (G. Madec) Original code 8 !! ! 93-03 (M. Guyon) symetrical conditions 9 !! ! 96-02 (G. Madec & M. Imbard) opa release 8.0 10 !! 8.0 ! 96-04 (A. Weaver) Euler forward step 11 !! 8.2 ! 99-02 (G. Madec, N. Grima) semi-implicit pressure grad. 12 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 13 !! ! 02-11 (C. Talandier, A-M Treguier) Open boundaries 14 !! 9.0 ! 06-02 (L. Debreu, C. Mazauric) Agrif implementation 6 !! History : 7.0 ! 91-11 (G. Madec) Original code 7 !! ! 93-03 (M. Guyon) symetrical conditions 8 !! ! 96-02 (G. Madec & M. Imbard) opa release 8.0 9 !! 8.0 ! 96-04 (A. Weaver) Euler forward step 10 !! 8.2 ! 99-02 (G. Madec, N. Grima) semi-implicit pressure grad. 11 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 12 !! ! 02-11 (C. Talandier, A-M Treguier) Open boundaries 13 !! ! 05-04 (C. Deltel) Add Asselin trend in the ML budget 14 !! 9.0 ! 06-02 (L. Debreu, C. Mazauric) Agrif implementation 15 !!---------------------------------------------------------------------- 16 15 17 !!---------------------------------------------------------------------- 16 18 !! tra_nxt : time stepping on temperature and salinity 17 19 !!---------------------------------------------------------------------- 18 !! * Modules used19 20 USE oce ! ocean dynamics and tracers variables 20 21 USE dom_oce ! ocean space and time domain variables … … 23 24 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 24 25 USE obctra ! open boundary condition (obc_tra routine) 26 USE trdmod ! ocean active tracers trends 27 USE trdmod_oce ! ocean variables trends 25 28 USE prtctl ! Print control 26 29 USE agrif_opa_update … … 31 34 32 35 !! * Routine accessibility 33 PUBLIC tra_nxt! routine called by step.F9034 !!---------------------------------------------------------------------- 35 !! OPA 9.0 , LOCEAN-IPSL (200 5)36 PUBLIC tra_nxt ! routine called by step.F90 37 !!---------------------------------------------------------------------- 38 !! OPA 9.0 , LOCEAN-IPSL (2006) 36 39 !! $Header$ 37 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt40 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 38 41 !!---------------------------------------------------------------------- 39 42 … … 67 70 !! ** Action : - update (tb,sb) and (tn,sn) 68 71 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 69 !!70 72 !!---------------------------------------------------------------------- 71 !! * Arguments 72 INTEGER, INTENT( in ) :: kt ! ocean time-step index 73 74 !! * Local declarations 75 INTEGER :: ji, jj, jk ! dummy loop indices 76 REAL(wp) :: zt, zs ! temporary scalars 77 REAL(wp) :: zfact ! temporary scalar 73 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 74 USE oce, ONLY : ztrds => va ! use va as 3D workspace 75 !! 76 INTEGER, INTENT(in) :: kt ! ocean time-step index 77 !! 78 INTEGER :: ji, jj, jk ! dummy loop indices 79 REAL(wp) :: zt, zs ! temporary scalars 80 REAL(wp) :: zfact ! temporary scalar 78 81 !!---------------------------------------------------------------------- 79 82 80 83 IF( l_trdtra ) THEN 84 ztrdt(:,:,jpk) = 0.e0 85 ztrds(:,:,jpk) = 0.e0 86 ENDIF 81 87 ! 0. Lateral boundary conditions on ( ta, sa ) (T-point, unchanged sign) 82 88 ! ---------------------------------============ … … 84 90 CALL lbc_lnk( sa, 'T', 1. ) 85 91 86 87 92 ! ! =============== 88 93 DO jk = 1, jpkm1 ! Horizontal slab … … 93 98 IF( ln_zdfexp ) THEN 94 99 zfact = 2. * rdttra(jk) 95 IF( neuler == 0 .AND. kt == nit000 ) zfact = rdttra(jk)100 IF( neuler == 0 .AND. kt == nit000 ) zfact = rdttra(jk) 96 101 ta(:,:,jk) = ( tb(:,:,jk) + zfact * ta(:,:,jk) ) * tmask(:,:,jk) 97 102 sa(:,:,jk) = ( sb(:,:,jk) + zfact * sa(:,:,jk) ) * tmask(:,:,jk) 103 IF(l_trdtra) CALL ctl_stop( 'tranxt: Asselin ML trend not yet accounted for.' ) 98 104 ENDIF 99 105 … … 102 108 END DO ! End of slab 103 109 ! ! =============== 104 105 110 ! Update tracers on open boundaries. 106 111 CALL obc_tra( kt ) 107 108 112 ! ! =============== 109 113 DO jk = 1, jpkm1 ! Horizontal slab … … 114 118 END DO ! End of slab 115 119 ! ! =============== 116 117 120 ! Update tracers on open boundaries. 118 121 CALL Agrif_tra( kt ) 119 120 122 ! ! =============== 121 123 DO jk = 1, jpkm1 ! Horizontal slab 122 124 ! ! =============== 123 125 #endif 124 125 126 126 ! 2. Time filter and swap of arrays 127 127 ! --------------------------------- … … 141 141 END DO 142 142 END DO 143 IF( l_trdtra ) THEN 144 ztrdt(:,:,jk) = 0.e0 145 ztrds(:,:,jk) = 0.e0 146 END IF 143 147 ELSE 144 148 DO jj = 1, jpj … … 148 152 tb(ji,jj,jk) = atfp * ( tb(ji,jj,jk) + ta(ji,jj,jk) ) + atfp1 * tn(ji,jj,jk) 149 153 sb(ji,jj,jk) = atfp * ( sb(ji,jj,jk) + sa(ji,jj,jk) ) + atfp1 * sn(ji,jj,jk) 154 IF( l_trdtra ) THEN ! ChD ceci est a optimiser, mais ca marche 155 ztrdt(ji,jj,jk) = tb(ji,jj,jk) - tn(ji,jj,jk) 156 ztrds(ji,jj,jk) = sb(ji,jj,jk) - sn(ji,jj,jk) 157 END IF 150 158 tn(ji,jj,jk) = ta(ji,jj,jk) 151 159 sn(ji,jj,jk) = sa(ji,jj,jk) … … 165 173 END DO 166 174 END DO 175 IF( l_trdtra ) THEN 176 ztrdt(:,:,jk) = 0.e0 177 ztrds(:,:,jk) = 0.e0 178 END IF 167 179 ELSE 180 IF( l_trdtra ) THEN 181 DO jj = 1, jpj 182 DO ji = 1, jpi 183 ztrdt(ji,jj,jk) = atfp * ( tb(ji,jj,jk) - 2*tn(ji,jj,jk) + ta(ji,jj,jk) ) 184 ztrds(ji,jj,jk) = atfp * ( sb(ji,jj,jk) - 2*sn(ji,jj,jk) + sa(ji,jj,jk) ) 185 END DO 186 END DO 187 END IF 168 188 DO jj = 1, jpj 169 189 DO ji = 1, jpi … … 180 200 ! ! =============== 181 201 182 IF(ln_ctl) THEN ! print mean field (used for debugging) 183 CALL prt_ctl(tab3d_1=tn, clinfo1=' nxt - Tn: ', mask1=tmask, & 184 & tab3d_2=sn, clinfo2=' Sn: ', mask2=tmask) 185 ENDIF 186 202 IF( l_trdtra ) THEN ! Take the Asselin trend into account 203 ztrdt(:,:,:) = ztrdt(:,:,:) / ( 2.*rdt ) 204 ztrds(:,:,:) = ztrds(:,:,:) / ( 2.*rdt ) 205 CALL trd_mod( ztrdt, ztrds, jptra_trd_atf, 'TRA', kt ) 206 END IF 207 208 IF(ln_ctl) CALL prt_ctl( tab3d_1=tn, clinfo1=' nxt - Tn: ', mask1=tmask, & 209 & tab3d_2=sn, clinfo2= ' Sn: ', mask2=tmask ) 187 210 #if defined key_agrif 188 211 IF (.NOT.Agrif_Root()) CALL Agrif_Update_Tra( kt ) 189 212 #endif 190 213 ! 191 214 END SUBROUTINE tra_nxt 192 215 -
trunk/NEMO/OPA_SRC/TRA/traqsr.F90
r474 r503 4 4 !! Ocean physics: solar radiation penetration in the top ocean levels 5 5 !!====================================================================== 6 !! History : 7 !! 6.0 ! 90-10 (B. Blanke) Original code8 !! 7.0 ! 91-11 (G. Madec)9 !! ! 96-01 (G. Madec) s-coordinates10 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module11 !! 9.0 ! 04-08 (C. Talandier) New trends organization12 !! 9.0 ! 05-11 (G. Madec) zco, zps, sco coordinate 6 !! History : 6.0 ! 90-10 (B. Blanke) Original code 7 !! 7.0 ! 91-11 (G. Madec) 8 !! ! 96-01 (G. Madec) s-coordinates 9 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 10 !! 9.0 ! 05-11 (G. Madec) zco, zps, sco coordinate 11 !!---------------------------------------------------------------------- 12 13 13 !!---------------------------------------------------------------------- 14 14 !! tra_qsr : trend due to the solar radiation penetration 15 15 !! tra_qsr_init : solar radiation penetration initialization 16 16 !!---------------------------------------------------------------------- 17 !! * Modules used18 17 USE oce ! ocean dynamics and active tracers 19 18 USE dom_oce ! ocean space and time domain … … 29 28 PRIVATE 30 29 31 !! * Routine accessibility 32 PUBLIC tra_qsr ! routine called by step.F90 (ln_traqsr=T) 33 PUBLIC tra_qsr_init ! routine called by opa.F90 34 35 !! * Shared module variables 36 LOGICAL, PUBLIC :: ln_traqsr = .TRUE. !: qsr flag (Default=T) 37 38 !! * Module variables 39 REAL(wp), PUBLIC :: & !!! * penetrative solar radiation namelist * 40 rabs = 0.58_wp, & ! fraction associated with xsi1 41 xsi1 = 0.35_wp, & ! first depth of extinction 42 xsi2 = 23.0_wp ! second depth of extinction 43 ! ! (default values: water type Ib) 44 LOGICAL :: & 45 ln_qsr_sms = .false. ! flag to use or not the biological 46 ! ! fluxes for light 30 PUBLIC tra_qsr ! routine called by step.F90 (ln_traqsr=T) 31 PUBLIC tra_qsr_init ! routine called by opa.F90 32 33 !!* Namelist namqsr: penetrative solar radiation 34 LOGICAL , PUBLIC :: ln_traqsr = .TRUE. !: qsr flag (Default=T) 35 REAL(wp), PUBLIC :: rabs = 0.58_wp ! fraction associated with xsi1 36 REAL(wp), PUBLIC :: xsi1 = 0.35_wp ! first depth of extinction 37 REAL(wp), PUBLIC :: xsi2 = 23.0_wp ! second depth of extinction (default values: water type Ib) 38 LOGICAL , PUBLIC :: ln_qsr_sms = .false. ! flag to use or not the biological fluxes for light 39 NAMELIST/namqsr/ ln_traqsr, rabs, xsi1, xsi2, ln_qsr_sms 47 40 48 INTEGER :: & 49 nksr ! number of levels 50 REAL(wp), DIMENSION(jpk) :: & 51 gdsr ! profile of the solar flux penetration 41 INTEGER :: nksr ! number of levels 42 REAL(wp), DIMENSION(jpk) :: gdsr ! profile of the solar flux penetration 52 43 53 44 !! * Substitutions … … 57 48 !! OPA 9.0 , LOCEAN-IPSL (2005) 58 49 !! $Header$ 59 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt50 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 60 51 !!---------------------------------------------------------------------- 61 52 … … 86 77 !! ** Action : - update ta with the penetrative solar radiation trend 87 78 !! - save the trend in ttrd ('key_trdtra') 88 !! 89 !!---------------------------------------------------------------------- 90 !! * Modules used 91 USE oce, ONLY : ztrdt => ua, & ! use ua as 3D workspace 92 ztrds => va ! use va as 3D workspace 93 94 !! * Arguments 95 INTEGER, INTENT( in ) :: kt ! ocean time-step 96 97 !! * Local declarations 98 INTEGER :: ji, jj, jk ! dummy loop indexes 99 REAL(wp) :: zc0 , zta ! temporary scalars 79 !!---------------------------------------------------------------------- 80 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 81 USE oce, ONLY : ztrds => va ! use va as 3D workspace 82 !! 83 INTEGER, INTENT(in) :: kt ! ocean time-step 84 !! 85 INTEGER :: ji, jj, jk ! dummy loop indexes 86 REAL(wp) :: zc0 , zta ! temporary scalars 100 87 !!---------------------------------------------------------------------- 101 88 102 89 IF( kt == nit000 ) THEN 103 IF ( lwp )WRITE(numout,*)104 IF ( lwp )WRITE(numout,*) 'tra_qsr : penetration of the surface solar radiation'105 IF ( lwp )WRITE(numout,*) '~~~~~~~'90 IF(lwp) WRITE(numout,*) 91 IF(lwp) WRITE(numout,*) 'tra_qsr : penetration of the surface solar radiation' 92 IF(lwp) WRITE(numout,*) '~~~~~~~' 106 93 CALL tra_qsr_init 107 94 ENDIF 108 95 109 ! Save ta and sa trends 110 IF( l_trdtra ) THEN 96 IF( l_trdtra ) THEN ! Save ta and sa trends 111 97 ztrdt(:,:,:) = ta(:,:,:) 112 98 ztrds(:,:,:) = 0.e0 … … 122 108 DO jj = 2, jpjm1 123 109 DO ji = fs_2, fs_jpim1 ! vector opt. 124 125 110 zc0 = ro0cpr / fse3t(ji,jj,jk) ! compute the qsr trend 126 111 zta = zc0 * ( etot3(ji,jj,jk ) * tmask(ji,jj,jk) & 127 112 & - etot3(ji,jj,jk+1) * tmask(ji,jj,jk+1) ) 128 129 113 ta(ji,jj,jk) = ta(ji,jj,jk) + zta ! add qsr trend to the temperature trend 130 131 114 END DO 132 115 END DO … … 179 162 ENDIF 180 163 181 ! qsr tracers trends saved the trends for diagnostics 182 IF( l_trdtra ) THEN 164 IF( l_trdtra ) THEN ! qsr tracers trends saved for diagnostics 183 165 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 184 CALL trd_mod( ztrdt, ztrds, jpttdqsr, 'TRA', kt ) 185 ENDIF 186 166 CALL trd_mod( ztrdt, ztrds, jptra_trd_qsr, 'TRA', kt ) 167 ENDIF 187 168 ! ! print mean trends (used for debugging) 188 169 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' qsr - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 189 170 ! 190 171 END SUBROUTINE tra_qsr 191 172 … … 206 187 !! ** Action : - initialize xsr1, xsr2 and rabs 207 188 !! 208 !! Reference : 209 !! Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp. 210 !!---------------------------------------------------------------------- 211 INTEGER :: ji,jj,jk, & ! dummy loop index 212 indic ! temporary integer 213 REAL(wp) :: zc0 , zc1 , zc2 , & ! temporary scalars 214 & zcst, zdp1, zdp2 ! " " 215 216 NAMELIST/namqsr/ ln_traqsr, rabs, xsi1, xsi2, ln_qsr_sms 217 !!---------------------------------------------------------------------- 218 219 ! Read Namelist namqsr : ratio and length of penetration 220 ! -------------------- 221 REWIND ( numnam ) 189 !! Reference : Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp. 190 !!---------------------------------------------------------------------- 191 INTEGER :: ji, jj, jk ! dummy loop index 192 INTEGER :: indic ! temporary integer 193 REAL(wp) :: zc0 , zc1 , zc2 ! temporary scalars 194 REAL(wp) :: zcst, zdp1, zdp2 ! " " 195 !!---------------------------------------------------------------------- 196 197 REWIND ( numnam ) ! Read Namelist namqsr : ratio and length of penetration 222 198 READ ( numnam, namqsr ) 223 199 224 ! Parameter control and print 225 ! --------------------------- 226 IF( ln_traqsr ) THEN 200 IF( ln_traqsr ) THEN ! Parameter control and print 227 201 IF(lwp) THEN 228 202 WRITE(numout,*) … … 248 222 CALL ctl_stop( ' 0<rabs<1, 0<xsi1, or 0<xsi2 not satisfied' ) 249 223 250 ! Initialization of gdsr 251 ! ---------------------- 224 ! ! Initialization of gdsr 252 225 IF( ln_zco .OR. ln_zps ) THEN 253 226 ! 254 227 ! z-coordinate with or without partial step : same w-level everywhere inside the ocean 255 228 gdsr(:) = 0.e0 … … 283 256 END DO 284 257 ENDIF 285 258 ! 286 259 ENDIF 287 260 … … 302 275 END DO 303 276 END DO 304 305 277 ENDIF 278 ! 306 279 END SUBROUTINE tra_qsr_init 307 280 -
trunk/NEMO/OPA_SRC/TRA/trasbc.F90
r457 r503 4 4 !! Ocean active tracers: surface boundary condition 5 5 !!============================================================================== 6 !! History : 7 !! 8.2 ! 98-10 (G. Madec, G. Roullet, M. Imbard) Original code8 !! 8.2 ! 01-02 (D. Ludicone) sea ice and free surface9 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module10 !! 9.0 ! 04-08 (C. Talandier) New trends organization 6 !! History : 8.2 ! 98-10 (G. Madec, G. Roullet, M. Imbard) Original code 7 !! 8.2 ! 01-02 (D. Ludicone) sea ice and free surface 8 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 9 !!---------------------------------------------------------------------- 10 11 11 !!---------------------------------------------------------------------- 12 12 !! tra_sbc : update the tracer trend at ocean surface 13 13 !!---------------------------------------------------------------------- 14 !! * Modules used15 14 USE oce ! ocean dynamics and active tracers 16 15 USE dom_oce ! ocean space domain variables … … 26 25 PRIVATE 27 26 28 !! * Routine accessibility 29 PUBLIC tra_sbc ! routine called by step.F90 27 PUBLIC tra_sbc ! routine called by step.F90 30 28 31 29 !! * Substitutions … … 35 33 !! OPA 9.0 , LOCEAN-IPSL (2005) 36 34 !! $Header$ 37 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt35 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 38 36 !!---------------------------------------------------------------------- 39 37 … … 78 76 !! with the tracer surface boundary condition 79 77 !! - save the trend it in ttrd ('key_trdtra') 78 !!---------------------------------------------------------------------- 79 USE oce, ONLY : ztrdt => ua ! use ua as 3D workspace 80 USE oce, ONLY : ztrds => va ! use va as 3D workspace 80 81 !! 81 !!---------------------------------------------------------------------- 82 !! * Modules used 83 USE oce, ONLY : ztdta => ua, & ! use ua as 3D workspace 84 ztdsa => va ! use va as 3D workspace 85 86 !! * Arguments 87 INTEGER, INTENT( in ) :: kt ! ocean time-step index 88 89 !! * Local declarations 82 INTEGER, INTENT(in) :: kt ! ocean time-step index 83 !! 90 84 INTEGER :: ji, jj ! dummy loop indices 91 85 REAL(wp) :: zta, zsa, zsrau, zse3t ! temporary scalars … … 98 92 ENDIF 99 93 100 ! 0. initialization 101 zsrau = 1. / rauw 94 zsrau = 1. / rauw ! initialization 102 95 #if defined key_zco 103 96 zse3t = 1. / e3t_0(1) 104 97 #endif 105 98 106 ! Save ta and sa trends 107 IF( l_trdtra ) THEN 108 ztdta(:,:,:) = ta(:,:,:) 109 ztdsa(:,:,:) = sa(:,:,:) 99 IF( l_trdtra ) THEN ! Save ta and sa trends 100 ztrdt(:,:,:) = ta(:,:,:) 101 ztrds(:,:,:) = sa(:,:,:) 110 102 ENDIF 111 103 112 104 IF( .NOT.ln_traqsr ) qsr(:,:) = 0.e0 ! no solar radiation penetration 113 105 114 ! 1.Concentration dillution effect on (t,s)106 ! Concentration dillution effect on (t,s) 115 107 DO jj = 2, jpj 116 108 DO ji = fs_2, fs_jpim1 ! vector opt. … … 118 110 zse3t = 1. / fse3t(ji,jj,1) 119 111 #endif 120 ! temperature : heat flux 121 zta = ro0cpr * ( qt(ji,jj) - qsr(ji,jj) ) * zse3t 122 123 ! salinity : concent./dilut. effect 124 zsa = emps(ji,jj) * zsrau * sn(ji,jj,1) * zse3t 125 126 ! add the trend to the general tracer trend 127 ta(ji,jj,1) = ta(ji,jj,1) + zta 112 zta = ro0cpr * ( qt(ji,jj) - qsr(ji,jj) ) * zse3t ! temperature : heat flux 113 zsa = emps(ji,jj) * zsrau * sn(ji,jj,1) * zse3t ! salinity : concent./dilut. effect 114 ta(ji,jj,1) = ta(ji,jj,1) + zta ! add the trend to the general tracer trend 128 115 sa(ji,jj,1) = sa(ji,jj,1) + zsa 129 116 END DO 130 117 END DO 131 118 132 ! save the trends for diagnostic 133 ! sea surface boundary condition tracers trends 134 IF( l_trdtra ) THEN 135 ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) 136 ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) 137 CALL trd_mod(ztdta, ztdsa, jpttdnsr, 'TRA', kt) 119 IF( l_trdtra ) THEN ! save the sbc trends for diagnostic 120 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 121 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 122 CALL trd_mod(ztrdt, ztrds, jptra_trd_nsr, 'TRA', kt) 138 123 ENDIF 139 140 IF(ln_ctl) THEN ! print mean trends (used for debugging) 141 CALL prt_ctl(tab3d_1=ta, clinfo1=' sbc - Ta: ', mask1=tmask, & 142 & tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 143 ENDIF 144 124 ! 125 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' sbc - Ta: ', mask1=tmask, & 126 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 127 ! 145 128 END SUBROUTINE tra_sbc 146 129 -
trunk/NEMO/OPA_SRC/TRA/trazdf.F90
r458 r503 4 4 !! Ocean active tracers: vertical component of the tracer mixing trend 5 5 !!============================================================================== 6 !! History : 7 !! 9.0 ! 05-11 (G. Madec) Original code 6 !! History : 9.0 ! 05-11 (G. Madec) Original code 7 !!---------------------------------------------------------------------- 8 8 9 !!---------------------------------------------------------------------- 9 10 !! tra_zdf : Update the tracer trend with the vertical diffusion 10 11 !! zdf_ctl : ??? 11 12 !!---------------------------------------------------------------------- 12 !! * Modules used13 13 USE oce ! ocean dynamics and tracers variables 14 14 USE dom_oce ! ocean space and time domain variables … … 28 28 PRIVATE 29 29 30 !! * Routine accessibility31 30 PUBLIC tra_zdf ! routine called by step.F90 32 31 33 !! * module variables 34 INTEGER :: & 35 nzdf = 0 ! type vertical diffusion algorithm used 32 INTEGER :: nzdf = 0 ! type vertical diffusion algorithm used 36 33 ! ! defined from ln_zdf... namlist logicals) 37 34 38 !! * Module variables 39 REAL(wp), DIMENSION(jpk) :: & 40 r2dt ! vertical profile time-step, = 2 rdttra 41 ! ! except at nit000 (=rdttra) if neuler=0 35 REAL(wp), DIMENSION(jpk) :: r2dt ! vertical profile time-step, = 2 rdttra 36 ! ! except at nit000 (=rdttra) if neuler=0 42 37 43 38 !! * Substitutions … … 47 42 !!---------------------------------------------------------------------- 48 43 !! OPA 9.0 , LOCEAN-IPSL (2005) 44 !! $Header$ 45 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 49 46 !!---------------------------------------------------------------------- 50 47 … … 56 53 !! 57 54 !! ** Purpose : compute the vertical ocean tracer physics. 58 !! ** Method :59 !! ** Action :60 !!61 55 !!--------------------------------------------------------------------- 62 !! * Arguments63 56 INTEGER, INTENT( in ) :: kt ! ocean time-step index 64 57 65 !! * local declarations66 58 INTEGER :: jk ! Dummy loop indices 67 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 68 ztrdt, ztrds ! 3D temporary workspace 59 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrdt, ztrds ! 3D workspace 69 60 !!--------------------------------------------------------------------- 70 61 … … 77 68 r2dt(:) = 2. * rdttra(:) ! = 2 rdttra (leapfrog) 78 69 ENDIF 79 80 70 81 71 IF( l_trdtra ) THEN ! temporary save of ta and sa trends … … 101 91 ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 102 92 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 103 CALL trd_mod( ztrdt, ztrds, jpt tdzdf, 'TRA', kt )93 CALL trd_mod( ztrdt, ztrds, jptra_trd_zdf, 'TRA', kt ) 104 94 ENDIF 105 95 … … 111 101 ztrds(:,:,jk) = ( ( sa(:,:,jk) - sb(:,:,jk) ) / r2dt(jk) ) - ztrds(:,:,jk) 112 102 END DO 113 CALL trd_mod( ztrdt, ztrds, jpt tdzdf, 'TRA', kt )103 CALL trd_mod( ztrdt, ztrds, jptra_trd_zdf, 'TRA', kt ) 114 104 ENDIF 115 105 … … 121 111 ztrds(:,:,jk) = ( ( sa(:,:,jk) - sb(:,:,jk) ) / r2dt(jk) ) - ztrds(:,:,jk) 122 112 END DO 123 CALL trd_mod( ztrdt, ztrds, jpt tdzdf, 'TRA', kt )113 CALL trd_mod( ztrdt, ztrds, jptra_trd_zdf, 'TRA', kt ) 124 114 ENDIF 125 115 … … 146 136 !! NB: rotation of lateral mixing operator or TKE or KPP scheme, 147 137 !! the implicit scheme is required. 148 !!149 138 !!---------------------------------------------------------------------- 150 !! * Module used151 139 USE zdftke 152 140 USE zdfkpp -
trunk/NEMO/OPA_SRC/TRA/trazdf_imp.F90
r457 r503 13 13 !! ! 00-08 (G. Madec) double diffusive mixing 14 14 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 15 !! 9.0 ! 04-08 (C. Talandier) New trends organization 16 !! " " ! 06-11 (G. Madec) New step reorganisation 15 !! 9.0 ! 06-11 (G. Madec) New step reorganisation 17 16 !!---------------------------------------------------------------------- 18 17 !! tra_zdf_imp : Update the tracer trend with the diagonal vertical … … 61 60 !! 62 61 !! ** Method : The vertical component of the lateral diffusive trends 63 !! is provided by a 2nd order operator rotated along neu ral or geo-62 !! is provided by a 2nd order operator rotated along neutral or geo- 64 63 !! potential surfaces to which an eddy induced advection can be 65 64 !! added. It is computed using before fields (forward in time) and -
trunk/NEMO/OPA_SRC/TRD/trdicp.F90
r249 r503 4 4 !! Ocean diagnostics: ocean tracers and dynamic trends 5 5 !!===================================================================== 6 !! History : ! 91-12 (G. Madec) 7 !! ! 92-06 (M. Imbard) add time step frequency 8 !! ! 96-01 (G. Madec) terrain following coordinates 9 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 10 !! 9.0 ! 04-08 (C. Talandier) New trends organization 11 !!---------------------------------------------------------------------- 6 12 #if defined key_trdtra || defined key_trddyn || defined key_esopa 7 13 !!---------------------------------------------------------------------- … … 9 15 !! 'key_trddyn' momentum trends diagnostics 10 16 !!---------------------------------------------------------------------- 11 12 !!---------------------------------------------------------------------- 13 !! trd : verify the basin averaged properties for tra/dyn 17 !!---------------------------------------------------------------------- 18 !! trd_icp : compute the basin averaged properties for tra/dyn 14 19 !! trd_dwr : print dynmaic trends in ocean.output file 15 20 !! trd_twr : print tracers trends in ocean.output file 16 21 !! trd_icp_init : initialization step 17 22 !!---------------------------------------------------------------------- 18 !! * Modules used19 23 USE oce ! ocean dynamics and tracers variables 20 24 USE dom_oce ! ocean space and time domain variables … … 31 35 PRIVATE 32 36 33 !! * Interfaces 34 INTERFACE trd 37 INTERFACE trd_icp 35 38 MODULE PROCEDURE trd_2d, trd_3d 36 39 END INTERFACE 37 40 38 !! * Routine accessibility 39 PUBLIC trd ! called by step.F90 40 PUBLIC trd_dwr ! called by step.F90 41 PUBLIC trd_twr ! called by step.F90 42 PUBLIC trd_icp_init ! called by opa.F90 43 44 !! * Shared module variables 45 #if defined key_trdtra && defined key_trddyn || defined key_esopa 46 LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .TRUE. !: tracers trend flag 47 LOGICAL, PUBLIC, PARAMETER :: lk_trddyn = .TRUE. !: momentum trend flag 48 #elif defined key_trdtra 49 LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .TRUE. !: tracers trend flag 50 LOGICAL, PUBLIC, PARAMETER :: lk_trddyn = .FALSE. !: momentum trend flag 51 #elif defined key_trddyn 52 LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .FALSE. !: tracers trend flag 53 LOGICAL, PUBLIC, PARAMETER :: lk_trddyn = .TRUE. !: momentum trend flag 54 #endif 41 PUBLIC trd_icp ! called by trdmod.F90 42 PUBLIC trd_dwr ! called by step.F90 43 PUBLIC trd_twr ! called by step.F90 44 PUBLIC trd_icp_init ! called by opa.F90 55 45 56 46 !! * Substitutions … … 60 50 !! OPA 9.0 , LOCEAN-IPSL (2005) 61 51 !! $Header$ 62 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt52 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 63 53 !!---------------------------------------------------------------------- 64 54 65 55 CONTAINS 66 56 67 SUBROUTINE trd_2d( ptrd2dx, ptrd2dy, ktrd , ctype)57 SUBROUTINE trd_2d( ptrd2dx, ptrd2dy, ktrd , ctype, clpas ) 68 58 !!--------------------------------------------------------------------- 69 59 !! *** ROUTINE trd_2d *** … … 71 61 !! ** Purpose : verify the basin averaged properties of tracers and/or 72 62 !! momentum equations at every time step frequency ntrd. 63 !!---------------------------------------------------------------------- 64 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: ptrd2dx ! Temperature or U trend 65 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: ptrd2dy ! Salinity or V trend 66 INTEGER , INTENT(in ) :: ktrd ! tracer trend index 67 CHARACTER(len=3) , INTENT(in ) :: ctype ! momentum ('DYN') or tracers ('TRA') trends 68 CHARACTER(len=3) , INTENT(in ), OPTIONAL :: clpas ! number of passage 73 69 !! 74 !! ** Method : 75 !! 76 !! History : 77 !! ! 91-12 (G. Madec) 78 !! ! 92-06 (M. Imbard) add time step frequency 79 !! ! 96-01 (G. Madec) terrain following coordinates 80 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 81 !! 9.0 ! 04-08 (C. Talandier) New trends organization 82 !!---------------------------------------------------------------------- 83 !! * Arguments 84 REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) :: & 85 ptrd2dx, & ! Temperature or U trend 86 ptrd2dy ! Salinity or V trend 87 88 INTEGER, INTENT( in ) :: ktrd ! tracer trend index 89 90 CHARACTER(len=3), INTENT( in ) :: & 91 ctype ! momentum or tracers trends type 92 ! ! 'DYN' or 'TRA' 93 94 !! * Local declarations 95 INTEGER :: ji, jj ! loop indices 96 REAL(wp) :: & 97 zbt, zbtu, zbtv, & ! temporary scalars 98 zmsku, zmskv ! " " 99 !!---------------------------------------------------------------------- 100 101 ! 1. Advective trends and forcing trend 102 ! ------------------------------------- 103 104 ! 1.1 Mask the forcing trend and substract it from the vertical diffusion trend 105 SELECT CASE (ctype) 106 107 CASE ('DYN') ! Momentum 70 INTEGER :: ji, jj ! loop indices 71 CHARACTER(len=3) :: cpas ! number of passage 72 REAL(wp) :: zmsku, zbtu, zbt ! temporary scalars 73 REAL(wp) :: zmskv, zbtv ! " " 74 !!---------------------------------------------------------------------- 75 76 ! Control of optional arguments 77 cpas = 'fst' 78 IF( PRESENT(clpas) ) cpas = clpas 79 80 ! 1. Mask trends 81 ! -------------- 82 83 SELECT CASE( ctype ) 84 ! 85 CASE( 'DYN' ) ! Momentum 108 86 DO jj = 1, jpjm1 109 87 DO ji = 1, jpim1 … … 116 94 ptrd2dx(jpi, : ) = 0.e0 ; ptrd2dy(jpi, : ) = 0.e0 117 95 ptrd2dx( : ,jpj) = 0.e0 ; ptrd2dy( : ,jpj) = 0.e0 118 119 CASE ('TRA') ! Tracers96 ! 97 CASE( 'TRA' ) ! Tracers 120 98 ptrd2dx(:,:) = ptrd2dx(:,:) * tmask_i(:,:) 121 99 ptrd2dy(:,:) = ptrd2dy(:,:) * tmask_i(:,:) 122 100 ! 123 101 END SELECT 124 102 125 ! 2. Basin averaged tracer trend126 ! ------------------------------ 127 128 SELECT CASE (ctype)129 130 CASE ('DYN') ! Momentum103 ! 2. Basin averaged tracer/momentum trends 104 ! ---------------------------------------- 105 106 SELECT CASE( ctype ) 107 ! 108 CASE( 'DYN' ) ! Momentum 131 109 umo(ktrd) = 0.e0 132 110 vmo(ktrd) = 0.e0 133 134 SELECT CASE (ktrd)135 136 CASE (jpdtdswf) ! surface forcing111 ! 112 SELECT CASE( ktrd ) 113 ! 114 CASE( jpdyn_trd_swf ) ! surface forcing 137 115 DO jj = 1, jpj 138 116 DO ji = 1, jpi … … 141 119 END DO 142 120 END DO 143 144 CASE (jpdtdbfr) ! bottom friction fluxes121 ! 122 CASE( jpdyn_trd_bfr ) ! bottom friction fluxes 145 123 DO jj = 1, jpj 146 124 DO ji = 1, jpi … … 149 127 END DO 150 128 END DO 151 129 ! 152 130 END SELECT 153 154 CASE ('TRA') ! Tracers 155 tmo(ktrd) = 0.e0 156 smo(ktrd) = 0.e0 131 ! 132 CASE( 'TRA' ) ! Tracers 133 IF( cpas == 'fst' ) THEN 134 tmo(ktrd) = 0.e0 135 smo(ktrd) = 0.e0 136 ENDIF 157 137 DO jj = 1, jpj 158 138 DO ji = 1, jpi … … 162 142 END DO 163 143 END DO 164 144 ! 165 145 END SELECT 166 146 167 ! 3. Basin averaged tracer square trend168 ! ------------------------------------- 147 ! 3. Basin averaged tracer/momentum square trends 148 ! ---------------------------------------------- 169 149 ! c a u t i o n: field now 170 150 171 SELECT CASE (ctype)172 173 CASE ('DYN') ! Momentum151 SELECT CASE( ctype ) 152 ! 153 CASE( 'DYN' ) ! Momentum 174 154 hke(ktrd) = 0.e0 175 155 DO jj = 1, jpj … … 182 162 END DO 183 163 END DO 184 185 CASE ('TRA') ! Tracers 186 t2(ktrd) = 0.e0 187 s2(ktrd) = 0.e0 164 ! 165 CASE( 'TRA' ) ! Tracers 166 IF( cpas == 'fst' ) THEN 167 t2(ktrd) = 0.e0 168 s2(ktrd) = 0.e0 169 ENDIF 188 170 DO jj = 1, jpj 189 171 DO ji = 1, jpi … … 193 175 END DO 194 176 END DO 195 177 ! 196 178 END SELECT 197 179 ! 198 180 END SUBROUTINE trd_2d 199 181 200 182 201 202 SUBROUTINE trd_3d(ptrd3dx, ptrd3dy, ktrd, ctype) 183 SUBROUTINE trd_3d( ptrd3dx, ptrd3dy, ktrd, ctype, clpas ) 203 184 !!--------------------------------------------------------------------- 204 185 !! *** ROUTINE trd_3d *** … … 206 187 !! ** Purpose : verify the basin averaged properties of tracers and/or 207 188 !! momentum equations at every time step frequency ntrd. 189 !!---------------------------------------------------------------------- 190 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: ptrd3dx ! Temperature or U trend 191 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: ptrd3dy ! Salinity or V trend 192 INTEGER, INTENT(in ) :: ktrd ! momentum or tracer trend index 193 CHARACTER(len=3), INTENT(in ) :: ctype ! momentum ('DYN') or tracers ('TRA') trends 194 CHARACTER(len=3), INTENT(in ), OPTIONAL :: clpas ! number of passage 208 195 !! 209 !! ** Method :210 !!211 !! History :212 !! ! 91-12 (G. Madec)213 !! ! 92-06 (M. Imbard) add time step frequency214 !! ! 96-01 (G. Madec) terrain following coordinates215 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module216 !! 9.0 ! 04-08 (C. Talandier) New trends organization217 !!----------------------------------------------------------------------218 !! * Arguments219 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: &220 ptrd3dx, & ! Temperature or U trend221 ptrd3dy ! Salinity or V trend222 223 INTEGER, INTENT( in ) :: ktrd ! momentum or tracer trend index224 225 CHARACTER(len=3), INTENT( in ) :: &226 ctype ! momentum or tracers trends type227 ! ! 'DYN' or 'TRA'228 229 !! * Local declarations230 196 INTEGER :: ji, jj, jk 231 REAL(wp) :: & 232 zbt, zbtu, zbtv, & ! temporary scalars 233 zmsku, zmskv 234 !!---------------------------------------------------------------------- 235 236 ! 1. Advective trends and forcing trend 237 ! ------------------------------------- 238 239 ! Mask the trends 240 SELECT CASE (ctype) 241 242 CASE ('DYN') ! Momentum 197 CHARACTER(len=3) :: cpas ! number of passage 198 REAL(wp) :: zbt, zbtu, zbtv, zmsku, zmskv ! temporary scalars 199 !!---------------------------------------------------------------------- 200 201 ! Control of optional arguments 202 cpas = 'fst' 203 IF( PRESENT(clpas) ) cpas = clpas 204 205 ! 1. Mask the trends 206 ! ------------------ 207 208 SELECT CASE( ctype ) 209 ! 210 CASE( 'DYN' ) ! Momentum 243 211 DO jk = 1, jpk 244 212 DO jj = 1, jpjm1 … … 248 216 ptrd3dx(ji,jj,jk) = ptrd3dx(ji,jj,jk) * zmsku 249 217 ptrd3dy(ji,jj,jk) = ptrd3dy(ji,jj,jk) * zmskv 250 ENDDO 251 ENDDO 252 ENDDO 253 218 END DO 219 END DO 220 END DO 254 221 ptrd3dx(jpi, : ,:) = 0.e0 ; ptrd3dy(jpi, : ,:) = 0.e0 255 222 ptrd3dx( : ,jpj,:) = 0.e0 ; ptrd3dy( : ,jpj,:) = 0.e0 256 257 CASE ('TRA') ! Tracers223 ! 224 CASE( 'TRA' ) ! Tracers 258 225 DO jk = 1, jpk 259 226 ptrd3dx(:,:,jk) = ptrd3dx(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 260 227 ptrd3dy(:,:,jk) = ptrd3dy(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 261 END DO262 228 END DO 229 ! 263 230 END SELECT 264 231 265 ! 2. Basin averaged tracer/momentum trend 266 ! --------------------------------------- 232 ! 2. Basin averaged tracer/momentum trends 233 ! ---------------------------------------- 267 234 268 SELECT CASE (ctype)269 270 CASE ('DYN') ! Momentum235 SELECT CASE( ctype ) 236 ! 237 CASE( 'DYN' ) ! Momentum 271 238 umo(ktrd) = 0.e0 272 239 vmo(ktrd) = 0.e0 … … 281 248 END DO 282 249 END DO 283 284 CASE ('TRA') ! Tracers 285 tmo(ktrd) = 0.e0 286 smo(ktrd) = 0.e0 250 ! 251 CASE( 'TRA' ) ! Tracers 252 IF( cpas == 'fst' ) THEN 253 tmo(ktrd) = 0.e0 254 smo(ktrd) = 0.e0 255 ENDIF 287 256 DO jk = 1, jpkm1 288 257 DO jj = 1, jpj … … 294 263 END DO 295 264 END DO 296 265 ! 297 266 END SELECT 298 267 299 ! 3. Basin averaged tracer/momentum square trend 300 ! ---------------------------------------------- 268 ! 3. Basin averaged tracer/momentum square trends 269 ! ----------------------------------------------- 301 270 ! c a u t i o n: field now 302 271 303 SELECT CASE (ctype)304 305 CASE ('DYN') ! Momentum272 SELECT CASE( ctype ) 273 ! 274 CASE( 'DYN' ) ! Momentum 306 275 hke(ktrd) = 0.e0 307 276 DO jk = 1, jpk … … 316 285 END DO 317 286 END DO 318 319 CASE ('TRA') ! Tracers 320 t2(ktrd) = 0.e0 321 s2(ktrd) = 0.e0 287 ! 288 CASE( 'TRA' ) ! Tracers 289 IF( cpas == 'fst' ) THEN 290 t2(ktrd) = 0.e0 291 s2(ktrd) = 0.e0 292 ENDIF 322 293 DO jk = 1, jpk 323 294 DO jj = 1, jpj … … 329 300 END DO 330 301 END DO 331 302 ! 332 303 END SELECT 333 304 ! 334 305 END SUBROUTINE trd_3d 335 306 … … 340 311 !! *** ROUTINE trd_icp_init *** 341 312 !! 342 !! ** Purpose : 343 !! 344 !! ** Method : 345 !! 346 !! History : 347 !! 9.0 ! 03-09 (G. Madec) Original code 348 !! ! 04-08 (C. Talandier) New trends organization 349 !!---------------------------------------------------------------------- 350 !! * Local declarations 351 INTEGER :: ji, jj, jk 352 313 !! ** Purpose : Read the namtrd namelist 314 !!---------------------------------------------------------------------- 315 INTEGER :: ji, jj, jk 353 316 REAL(wp) :: zmskt 354 317 #if defined key_trddyn 355 REAL(wp) :: zmsku, zmskv318 REAL(wp) :: zmsku, zmskv 356 319 #endif 357 358 NAMELIST/namtrd/ ntrd, nctls 359 !!---------------------------------------------------------------------- 360 361 ! namelist namtrd : trend diagnostic 362 REWIND( numnam ) 363 READ ( numnam, namtrd ) 320 !!---------------------------------------------------------------------- 364 321 365 322 IF(lwp) THEN … … 367 324 WRITE(numout,*) 'trd_icp_init : integral constraints properties trends' 368 325 WRITE(numout,*) '~~~~~~~~~~~~~' 369 WRITE(numout,*) ' '370 WRITE(numout,*) ' Namelist namtrd : '371 WRITE(numout,*) ' time step frequency trend ntrd = ', ntrd372 326 ENDIF 373 374 ! initialisation of BBL tracers lateral diffusion to zero375 tldfbbl(:,:) = 0.e0 ; sldfbbl(:,:) = 0.e0376 ! initialisation of BBL tracers lateral advection to zero377 tladbbl(:,:) = 0.e0 ; sladbbl(:,:) = 0.e0378 ! initialisation of workspace379 tladi(:,:,:) = 0.e0 ; tladj(:,:,:) = 0.e0380 sladi(:,:,:) = 0.e0 ; sladj(:,:,:) = 0.e0381 327 382 328 ! Total volume at t-points: … … 392 338 IF( lk_mpp ) CALL mpp_sum( tvolt ) ! sum over the global domain 393 339 394 IF(lwp) THEN 395 WRITE(numout,*) 396 WRITE(numout,*) ' total ocean volume at T-point tvolt = ',tvolt 397 ENDIF 340 IF(lwp) WRITE(numout,*) ' total ocean volume at T-point tvolt = ',tvolt 398 341 399 342 #if defined key_trddyn … … 419 362 420 363 IF(lwp) THEN 421 WRITE(numout,*) ' total ocean volume at U-point tvolu = ',tvolu 422 WRITE(numout,*) ' total ocean volume at V-point tvolv = ',tvolv 423 WRITE(numout,*) ' ' 364 WRITE(numout,*) ' total ocean volume at U-point tvolu = ',tvolu 365 WRITE(numout,*) ' total ocean volume at V-point tvolv = ',tvolv 424 366 ENDIF 425 367 #endif 426 368 ! 427 369 END SUBROUTINE trd_icp_init 428 429 370 430 371 … … 434 375 !! 435 376 !! ** Purpose : write dynamic trends in ocean.output 377 !!---------------------------------------------------------------------- 378 INTEGER, INTENT(in) :: kt ! ocean time-step index 436 379 !! 437 !! ** Method : 438 !! 439 !! History : 440 !! 9.0 ! 03-09 (G. Madec) Original code 441 !! ! 04-08 (C. Talandier) New trends organization 442 !!---------------------------------------------------------------------- 443 !! * Arguments 444 INTEGER, INTENT( in ) :: kt ! ocean time-step index 445 INTEGER :: ji, jj, jk 446 REAL(wp) :: & 447 ze1e2w,zcof, & ! " " 448 zbe1ru, zbe2rv, & ! " " 449 zbtr, ztz, zth 450 451 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 452 zkepe, zkx, zky, zkz ! temporary arrays 380 INTEGER :: ji, jj, jk 381 REAL(wp) :: ze1e2w, zcof, zbe1ru, zbe2rv, zbtr, ztz, zth ! " scalars 382 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zkepe, zkx, zky, zkz ! temporary arrays 453 383 !!---------------------------------------------------------------------- 454 384 … … 462 392 ! c a u t i o n here, trends are computed at kt+1 (now , but after the swap) 463 393 464 zkx(:,:,:) = 0.e0465 zky(:,:,:) = 0.e0466 zkz(:,:,:) = 0.e0394 zkx(:,:,:) = 0.e0 395 zky(:,:,:) = 0.e0 396 zkz(:,:,:) = 0.e0 467 397 zkepe(:,:,:) = 0.e0 468 398 469 399 CALL eos( tn, sn, rhd, rhop ) ! now potential and in situ densities 470 400 471 ! 4.1Density flux at w-point401 ! Density flux at w-point 472 402 DO jk = 2, jpk 473 403 DO jj = 1, jpj … … 478 408 END DO 479 409 END DO 480 zkz (:,:, 1) = 0.e0410 zkz(:,:,1) = 0.e0 481 411 482 412 ! Density flux at u and v-points … … 524 454 ! --------------------------------- 525 455 IF( lk_mpp ) THEN 526 527 CALL mpp_sum( umo , 11)528 CALL mpp_sum( vmo , 11)529 CALL mpp_sum( hke , 10)530 END 456 CALL mpp_sum( peke ) 457 CALL mpp_sum( umo , jptot_dyn ) 458 CALL mpp_sum( vmo , jptot_dyn ) 459 CALL mpp_sum( hke , jptot_dyn ) 460 ENDIF 531 461 532 462 ! I.2 Print dynamic trends in the ocean.output file … … 537 467 WRITE (numout,*) 538 468 WRITE (numout,9500) kt 539 WRITE (numout,9501) umo( 1) / tvolu, vmo( 1) / tvolv540 WRITE (numout,9502) umo( 2) / tvolu, vmo( 2) / tvolv541 WRITE (numout,9503) umo( 3) / tvolu, vmo( 3) / tvolv542 WRITE (numout,9504) umo( 4) / tvolu, vmo( 4) / tvolv543 WRITE (numout,9505) umo( 5) / tvolu, vmo( 5) / tvolv544 WRITE (numout,9506) umo( 6) / tvolu, vmo( 6) / tvolv545 WRITE (numout,9507) umo( 7) / tvolu, vmo( 7) / tvolv546 WRITE (numout,9508) umo( 8) / tvolu, vmo( 8) / tvolv547 WRITE (numout,9509) umo( 10) / tvolu, vmo(10) / tvolv548 WRITE (numout,9510) umo( 9) / tvolu, vmo( 9) / tvolv549 WRITE (numout,9511) umo( 11) / tvolu, vmo(11) / tvolv469 WRITE (numout,9501) umo(jpicpd_hpg) / tvolu, vmo(jpicpd_hpg) / tvolv 470 WRITE (numout,9502) umo(jpicpd_keg) / tvolu, vmo(jpicpd_keg) / tvolv 471 WRITE (numout,9503) umo(jpicpd_rvo) / tvolu, vmo(jpicpd_rvo) / tvolv 472 WRITE (numout,9504) umo(jpicpd_pvo) / tvolu, vmo(jpicpd_pvo) / tvolv 473 WRITE (numout,9505) umo(jpicpd_ldf) / tvolu, vmo(jpicpd_ldf) / tvolv 474 WRITE (numout,9506) umo(jpicpd_zad) / tvolu, vmo(jpicpd_zad) / tvolv 475 WRITE (numout,9507) umo(jpicpd_zdf) / tvolu, vmo(jpicpd_zdf) / tvolv 476 WRITE (numout,9508) umo(jpicpd_spg) / tvolu, vmo(jpicpd_spg) / tvolv 477 WRITE (numout,9509) umo(jpicpd_swf) / tvolu, vmo(jpicpd_swf) / tvolv 478 WRITE (numout,9510) umo(jpicpd_dat) / tvolu, vmo(jpicpd_dat) / tvolv 479 WRITE (numout,9511) umo(jpicpd_bfr) / tvolu, vmo(jpicpd_bfr) / tvolv 550 480 WRITE (numout,9512) 551 481 WRITE (numout,9513) & 552 & ( umo(1) + umo(2) + umo(3) + umo( 4) + umo( 5) + umo(6) & 553 & + umo(7) + umo(8) + umo(9) + umo(10) + umo(11) ) / tvolu, & 554 & ( vmo(1) + vmo(2) + vmo(3) + vmo( 4) + vmo( 5) + vmo(6) & 555 & + vmo(7) + vmo(8) + vmo(9) + vmo(10) + vmo(11) ) / tvolv 482 & ( umo(jpicpd_hpg) + umo(jpicpd_keg) + umo(jpicpd_rvo) + umo(jpicpd_pvo) + umo(jpicpd_ldf) & 483 & + umo(jpicpd_zad) + umo(jpicpd_zdf) + umo(jpicpd_spg) + umo(jpicpd_dat) + umo(jpicpd_swf) & 484 & + umo(jpicpd_bfr) ) / tvolu, & 485 & ( vmo(jpicpd_hpg) + vmo(jpicpd_keg) + vmo(jpicpd_rvo) + vmo(jpicpd_pvo) + vmo(jpicpd_ldf) & 486 & + vmo(jpicpd_zad) + vmo(jpicpd_zdf) + vmo(jpicpd_spg) + vmo(jpicpd_dat) + vmo(jpicpd_swf) & 487 & + vmo(jpicpd_bfr) ) / tvolv 556 488 ENDIF 557 489 … … 565 497 9507 FORMAT(' vertical diffusion u= ', e20.13, ' v= ', e20.13) 566 498 9508 FORMAT(' surface pressure gradient u= ', e20.13, ' v= ', e20.13) 567 9509 FORMAT(' forcing termu= ', e20.13, ' v= ', e20.13)499 9509 FORMAT(' surface wind forcing u= ', e20.13, ' v= ', e20.13) 568 500 9510 FORMAT(' dampimg term u= ', e20.13, ' v= ', e20.13) 569 501 9511 FORMAT(' bottom flux u= ', e20.13, ' v= ', e20.13) … … 575 507 WRITE (numout,*) 576 508 WRITE (numout,9520) kt 577 WRITE (numout,9521) hke( 1) / tvolt578 WRITE (numout,9522) hke( 2) / tvolt579 WRITE (numout,9523) hke( 3) / tvolt580 WRITE (numout,9524) hke( 4) / tvolt581 WRITE (numout,9525) hke( 5) / tvolt582 WRITE (numout,9526) hke( 6) / tvolt583 WRITE (numout,9527) hke( 7) / tvolt584 WRITE (numout,9528) hke( 8) / tvolt585 WRITE (numout,9529) hke( 10) / tvolt586 WRITE (numout,9530) hke( 9) / tvolt509 WRITE (numout,9521) hke(jpicpd_hpg) / tvolt 510 WRITE (numout,9522) hke(jpicpd_keg) / tvolt 511 WRITE (numout,9523) hke(jpicpd_rvo) / tvolt 512 WRITE (numout,9524) hke(jpicpd_pvo) / tvolt 513 WRITE (numout,9525) hke(jpicpd_ldf) / tvolt 514 WRITE (numout,9526) hke(jpicpd_zad) / tvolt 515 WRITE (numout,9527) hke(jpicpd_zdf) / tvolt 516 WRITE (numout,9528) hke(jpicpd_spg) / tvolt 517 WRITE (numout,9529) hke(jpicpd_swf) / tvolt 518 WRITE (numout,9530) hke(jpicpd_dat) / tvolt 587 519 WRITE (numout,9531) 588 520 WRITE (numout,9532) & 589 & ( hke( 1) + hke(2) + hke(3) + hke(4) + hke(5) + hke(6) &590 & + hke( 7) + hke(8) + hke(9) + hke(10) ) / tvolt521 & ( hke(jpicpd_hpg) + hke(jpicpd_keg) + hke(jpicpd_rvo) + hke(jpicpd_pvo) + hke(jpicpd_ldf) & 522 & + hke(jpicpd_zad) + hke(jpicpd_zdf) + hke(jpicpd_spg) + hke(jpicpd_dat) + hke(jpicpd_swf) ) / tvolt 591 523 ENDIF 592 524 … … 600 532 9527 FORMAT(' vertical diffusion u2= ', e20.13) 601 533 9528 FORMAT(' surface pressure gradient u2= ', e20.13) 602 9529 FORMAT(' forcing termu2= ', e20.13)534 9529 FORMAT(' surface wind forcing u2= ', e20.13) 603 535 9530 FORMAT(' dampimg term u2= ', e20.13) 604 536 9531 FORMAT(' --------------------------------------------------') … … 609 541 WRITE (numout,*) 610 542 WRITE (numout,9540) kt 611 WRITE (numout,9541) ( hke(2) + hke(3) + hke(6) ) / tvolt 612 WRITE (numout,9542) ( hke(2) + hke(6) ) / tvolt 613 WRITE (numout,9543) ( hke(4) ) / tvolt 614 WRITE (numout,9544) ( hke(3) ) / tvolt 615 WRITE (numout,9545) ( hke(8) ) / tvolt 616 WRITE (numout,9546) ( hke(5) ) / tvolt 617 WRITE (numout,9547) ( hke(7) ) / tvolt 618 WRITE (numout,9548) ( hke(1) ) / tvolt, rpktrd / tvolt 543 WRITE (numout,9541) ( hke(jpicpd_keg) + hke(jpicpd_rvo) + hke(jpicpd_zad) ) / tvolt 544 WRITE (numout,9542) ( hke(jpicpd_keg) + hke(jpicpd_zad) ) / tvolt 545 WRITE (numout,9543) ( hke(jpicpd_pvo) ) / tvolt 546 WRITE (numout,9544) ( hke(jpicpd_rvo) ) / tvolt 547 WRITE (numout,9545) ( hke(jpicpd_spg) ) / tvolt 548 WRITE (numout,9546) ( hke(jpicpd_ldf) ) / tvolt 549 WRITE (numout,9547) ( hke(jpicpd_zdf) ) / tvolt 550 WRITE (numout,9548) ( hke(jpicpd_hpg) ) / tvolt, rpktrd / tvolt 551 WRITE (numout,*) 552 WRITE (numout,*) 619 553 ENDIF 620 554 621 555 9540 FORMAT(' energetic consistency at it= ', i6, ' :', /' =========================================') 622 556 9541 FORMAT(' 0 = non linear term(true if key_vorenergy or key_combined): ', e20.13) 623 9542 FORMAT(' 0 = ke gradient + vertical advection : ', e20.13)557 9542 FORMAT(' 0 = ke gradient + vertical advection : ', e20.13) 624 558 9543 FORMAT(' 0 = coriolis term (true if key_vorenergy or key_combined): ', e20.13) 625 9544 FORMAT(' 0 = uh.( rot(u) x uh ) (true if enstrophy conser.) : ', e20.13)626 9545 FORMAT(' 0 = surface pressure gradient : ', e20.13)627 9546 FORMAT(' 0 > horizontal diffusion : ', e20.13)628 9547 FORMAT(' 0 > vertical diffusion : ', e20.13)629 9548 FORMAT(' pressure gradient u2 = - 1/rau0 u.dz(rhop) : ', e20.13, ' u.dz(rhop) =', e20.13)630 559 9544 FORMAT(' 0 = uh.( rot(u) x uh ) (true if enstrophy conser.) : ', e20.13) 560 9545 FORMAT(' 0 = surface pressure gradient : ', e20.13) 561 9546 FORMAT(' 0 > horizontal diffusion : ', e20.13) 562 9547 FORMAT(' 0 > vertical diffusion : ', e20.13) 563 9548 FORMAT(' pressure gradient u2 = - 1/rau0 u.dz(rhop) : ', e20.13, ' u.dz(rhop) =', e20.13) 564 ! 631 565 ! Save potential to kinetic energy conversion for next time step 632 566 rpktrd = peke 633 567 ! 634 568 ENDIF 635 569 ! 636 570 END SUBROUTINE trd_dwr 637 638 639 571 640 572 … … 644 576 !! 645 577 !! ** Purpose : write active tracers trends in ocean.output 646 !! 647 !! ** Method : 648 !! 649 !! History : 650 !! 9.0 ! 03-09 (G. Madec) Original code 651 !! ! 04-08 (C. Talandier) New trends organization 652 !!---------------------------------------------------------------------- 653 !! * Arguments 654 INTEGER, INTENT( in ) :: kt ! ocean time-step index 655 578 !!---------------------------------------------------------------------- 579 INTEGER, INTENT(in) :: kt ! ocean time-step index 656 580 !!---------------------------------------------------------------------- 657 581 … … 664 588 ! ------------------------------- 665 589 IF( lk_mpp ) THEN 666 CALL mpp_sum( tmo, 10)667 CALL mpp_sum( smo, 10)668 CALL mpp_sum( t2 , 10)669 CALL mpp_sum( s2 , 10)590 CALL mpp_sum( tmo, jptot_tra ) 591 CALL mpp_sum( smo, jptot_tra ) 592 CALL mpp_sum( t2 , jptot_tra ) 593 CALL mpp_sum( s2 , jptot_tra ) 670 594 ENDIF 671 595 … … 677 601 WRITE (numout,*) 678 602 WRITE (numout,9400) kt 679 WRITE (numout,9401) tmo(1) / tvolt, smo(1)/ tvolt680 WRITE (numout,9402) tmo(2) / tvolt, smo(2) / tvolt681 WRITE (numout,9403) tmo(3) / tvolt, smo(3) / tvolt682 WRITE (numout,9404) tmo(4) / tvolt, smo(4) / tvolt683 WRITE (numout,9405) tmo(5) / tvolt, smo(5) / tvolt684 WRITE (numout,9406) tmo(6) / tvolt, smo(6) / tvolt685 WRITE (numout,9407) tmo(7) / tvolt686 WRITE (numout,9408) tmo(8) / tvolt, smo(8) / tvolt687 WRITE (numout,9409) 688 WRITE (numout,9410) ( tmo( 1) + tmo(2) + tmo(3) + tmo(4)&689 & + tmo( 5) + tmo(6) + tmo(7) + tmo(8) ) / tvolt, &690 & ( smo( 1) + smo(2) + smo(3) + smo(4)&691 & + smo( 5) + smo(6) + smo(8) ) / tvolt603 WRITE (numout,9401) (tmo(jpicpt_xad)+tmo(jpicpt_yad))/ tvolt, (smo(jpicpt_xad)+smo(jpicpt_yad))/ tvolt 604 WRITE (numout,9402) tmo(jpicpt_zad) / tvolt, smo(jpicpt_zad) / tvolt 605 WRITE (numout,9403) tmo(jpicpt_ldf) / tvolt, smo(jpicpt_ldf) / tvolt 606 WRITE (numout,9404) tmo(jpicpt_zdf) / tvolt, smo(jpicpt_zdf) / tvolt 607 WRITE (numout,9405) tmo(jpicpt_npc) / tvolt, smo(jpicpt_npc) / tvolt 608 WRITE (numout,9406) tmo(jpicpt_dmp) / tvolt, smo(jpicpt_dmp) / tvolt 609 WRITE (numout,9407) tmo(jpicpt_qsr) / tvolt 610 WRITE (numout,9408) tmo(jpicpt_nsr) / tvolt, smo(jpicpt_nsr) / tvolt 611 WRITE (numout,9409) 612 WRITE (numout,9410) ( tmo(jpicpt_xad) + tmo(jpicpt_yad) + tmo(jpicpt_zad) + tmo(jpicpt_ldf) + tmo(jpicpt_zdf) & 613 & + tmo(jpicpt_npc) + tmo(jpicpt_dmp) + tmo(jpicpt_qsr) + tmo(jpicpt_nsr) ) / tvolt, & 614 & ( smo(jpicpt_xad) + smo(jpicpt_yad) + smo(jpicpt_zad) + smo(jpicpt_ldf) + smo(jpicpt_zdf) & 615 & + smo(jpicpt_npc) + smo(jpicpt_dmp) + smo(jpicpt_nsr) ) / tvolt 692 616 ENDIF 693 617 … … 698 622 9403 FORMAT(' horizontal diffusion ',e20.13,' ',e20.13) 699 623 9404 FORMAT(' vertical diffusion ',e20.13,' ',e20.13) 700 9405 FORMAT(' STATICinstability mixing ',e20.13,' ',e20.13)624 9405 FORMAT(' static instability mixing ',e20.13,' ',e20.13) 701 625 9406 FORMAT(' damping term ',e20.13,' ',e20.13) 702 9407 FORMAT(' penetrative qsr ',e20.13 ,' ',e20.13)703 9408 FORMAT(' forcing term',e20.13,' ',e20.13)626 9407 FORMAT(' penetrative qsr ',e20.13) 627 9408 FORMAT(' non solar radiation ',e20.13,' ',e20.13) 704 628 9409 FORMAT(' -------------------------------------------------------------------------') 705 629 9410 FORMAT(' total trend ',e20.13,' ',e20.13) … … 710 634 WRITE (numout,*) 711 635 WRITE (numout,9420) kt 712 WRITE (numout,9421) t2(1) / tvolt, s2(1)/ tvolt713 WRITE (numout,9422) t2(2) / tvolt, s2(2) / tvolt714 WRITE (numout,9423) t2(3) / tvolt, s2(3) / tvolt715 WRITE (numout,9424) t2(4) / tvolt, s2(4) / tvolt716 WRITE (numout,9425) t2(5) / tvolt, s2(5) / tvolt717 WRITE (numout,9426) t2(6) / tvolt, s2(6) / tvolt718 WRITE (numout,9427) t2(7) / tvolt719 WRITE (numout,9428) t2(8) / tvolt, s2(8) / tvolt636 WRITE (numout,9421) ( t2(jpicpt_xad)+t2(jpicpt_yad) )/ tvolt, ( s2(jpicpt_xad)+s2(jpicpt_yad) )/ tvolt 637 WRITE (numout,9422) t2(jpicpt_zad) / tvolt, s2(jpicpt_zad) / tvolt 638 WRITE (numout,9423) t2(jpicpt_ldf) / tvolt, s2(jpicpt_ldf) / tvolt 639 WRITE (numout,9424) t2(jpicpt_zdf) / tvolt, s2(jpicpt_zdf) / tvolt 640 WRITE (numout,9425) t2(jpicpt_npc) / tvolt, s2(jpicpt_npc) / tvolt 641 WRITE (numout,9426) t2(jpicpt_dmp) / tvolt, s2(jpicpt_dmp) / tvolt 642 WRITE (numout,9427) t2(jpicpt_qsr) / tvolt 643 WRITE (numout,9428) t2(jpicpt_nsr) / tvolt, s2(jpicpt_nsr) / tvolt 720 644 WRITE (numout,9429) 721 WRITE (numout,9430) ( t2( 1) + t2(2) + t2(3) + t2(4)&722 & + t2( 5) + t2(6) + t2(7) + t2(8) ) / tvolt, &723 & ( s2( 1) + s2(2) + s2(3) + s2(4)&724 & + s2( 5) + s2(6) + s2(8) ) / tvolt645 WRITE (numout,9430) ( t2(jpicpt_xad) + t2(jpicpt_yad) + t2(jpicpt_zad) + t2(jpicpt_ldf) + t2(jpicpt_zdf) & 646 & + t2(jpicpt_npc) + t2(jpicpt_dmp) + t2(jpicpt_qsr) + t2(jpicpt_nsr) ) / tvolt, & 647 & ( s2(jpicpt_xad) + s2(jpicpt_yad) + s2(jpicpt_zad) + s2(jpicpt_ldf) + s2(jpicpt_zdf) & 648 & + s2(jpicpt_npc) + s2(jpicpt_dmp) + s2(jpicpt_nsr) ) / tvolt 725 649 ENDIF 726 650 … … 731 655 9423 FORMAT(' horizontal diffusion * t ', e20.13, ' ', e20.13) 732 656 9424 FORMAT(' vertical diffusion * t ', e20.13, ' ', e20.13) 733 9425 FORMAT(' STATICinstability mixing * t ', e20.13, ' ', e20.13)657 9425 FORMAT(' static instability mixing * t ', e20.13, ' ', e20.13) 734 658 9426 FORMAT(' damping term * t ', e20.13, ' ', e20.13) 735 9427 FORMAT(' penetrative qsr * t ', e20.13 , ' ', e20.13)736 9428 FORMAT(' forcing term* t ', e20.13, ' ', e20.13)659 9427 FORMAT(' penetrative qsr * t ', e20.13) 660 9428 FORMAT(' non solar radiation * t ', e20.13, ' ', e20.13) 737 661 9429 FORMAT(' -----------------------------------------------------------------------------') 738 662 9430 FORMAT(' total trend *t = ', e20.13, ' *s = ', e20.13) … … 743 667 WRITE (numout,*) 744 668 WRITE (numout,9440) kt 745 WRITE (numout,9441) ( tmo(1)+tmo(2) )/tvolt, ( smo(1)+smo(2) )/tvolt 746 WRITE (numout,9442) tmo(3)/tvolt, smo(3)/tvolt 747 WRITE (numout,9443) tmo(4)/tvolt, smo(4)/tvolt 748 WRITE (numout,9444) tmo(5)/tvolt, smo(5)/tvolt 749 WRITE (numout,9445) ( t2(1)+t2(2) )/tvolt, ( s2(1)+s2(2) )/tvolt 750 WRITE (numout,9446) t2(3)/tvolt, s2(3)/tvolt 751 WRITE (numout,9447) t2(4)/tvolt, s2(4)/tvolt 752 WRITE (numout,9448) t2(5)/tvolt, s2(5)/tvolt 669 WRITE (numout,9441) ( tmo(jpicpt_xad)+tmo(jpicpt_yad)+tmo(jpicpt_zad) )/tvolt, & 670 & ( smo(jpicpt_xad)+smo(jpicpt_yad)+smo(jpicpt_zad) )/tvolt 671 WRITE (numout,9442) tmo(jpicpt_zl1)/tvolt, smo(jpicpt_zl1)/tvolt 672 WRITE (numout,9443) tmo(jpicpt_ldf)/tvolt, smo(jpicpt_ldf)/tvolt 673 WRITE (numout,9444) tmo(jpicpt_zdf)/tvolt, smo(jpicpt_zdf)/tvolt 674 WRITE (numout,9445) tmo(jpicpt_npc)/tvolt, smo(jpicpt_npc)/tvolt 675 WRITE (numout,9446) ( t2(jpicpt_xad)+t2(jpicpt_yad)+t2(jpicpt_zad) )/tvolt, & 676 & ( s2(jpicpt_xad)+s2(jpicpt_yad)+s2(jpicpt_zad) )/tvolt 677 WRITE (numout,9447) t2(jpicpt_ldf)/tvolt, s2(jpicpt_ldf)/tvolt 678 WRITE (numout,9448) t2(jpicpt_zdf)/tvolt, s2(jpicpt_zdf)/tvolt 679 WRITE (numout,9449) t2(jpicpt_npc)/tvolt, s2(jpicpt_npc)/tvolt 753 680 ENDIF 754 681 … … 756 683 ' : temperature',' salinity',/, & 757 684 ' ==================================') 758 9441 FORMAT(' 0 = horizontal+vertical advection ',e20.13,' ',e20.13) 759 9442 FORMAT(' 0 = horizontal diffusion ',e20.13,' ',e20.13) 760 9443 FORMAT(' 0 = vertical diffusion ',e20.13,' ',e20.13) 761 9444 FORMAT(' 0 = static instability mixing ',e20.13,' ',e20.13) 762 9445 FORMAT(' 0 = horizontal+vertical advection * t ',e20.13,' ',e20.13) 763 9446 FORMAT(' 0 > horizontal diffusion * t ',e20.13,' ',e20.13) 764 9447 FORMAT(' 0 > vertical diffusion * t ',e20.13,' ',e20.13) 765 9448 FORMAT(' 0 > static instability mixing * t ',e20.13,' ',e20.13) 766 685 9441 FORMAT(' 0 = horizontal+vertical advection + ',e20.13,' ',e20.13) 686 9442 FORMAT(' 1st lev vertical advection ',e20.13,' ',e20.13) 687 9443 FORMAT(' 0 = horizontal diffusion ',e20.13,' ',e20.13) 688 9444 FORMAT(' 0 = vertical diffusion ',e20.13,' ',e20.13) 689 9445 FORMAT(' 0 = static instability mixing ',e20.13,' ',e20.13) 690 9446 FORMAT(' 0 = horizontal+vertical advection * t ',e20.13,' ',e20.13) 691 9447 FORMAT(' 0 > horizontal diffusion * t ',e20.13,' ',e20.13) 692 9448 FORMAT(' 0 > vertical diffusion * t ',e20.13,' ',e20.13) 693 9449 FORMAT(' 0 > static instability mixing * t ',e20.13,' ',e20.13) 694 ! 767 695 ENDIF 768 696 ! 769 697 END SUBROUTINE trd_twr 770 698 … … 773 701 !! Default case : Empty module 774 702 !!---------------------------------------------------------------------- 775 LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .FALSE. !: tracers trend flag776 LOGICAL, PUBLIC, PARAMETER :: lk_trddyn = .FALSE. !: momentum trend flag777 703 CONTAINS 778 SUBROUTINE trd_2d(ptrd2dx, ptrd2dy, ktrd , ctype) ! Empty routine 779 REAL, DIMENSION(:,:,:), INTENT( inout ) :: & 780 ptrd2dx, & ! Temperature or U trend 781 ptrd2dy ! Salinity or V trend 782 INTEGER, INTENT( in ) :: ktrd ! momentum or tracer trend index 783 CHARACTER(len=3), INTENT( in ) :: & 784 ctype ! momentum or tracers trends type 785 WRITE(*,*) 'trd_2d: You should not have seen this print! error ?', ptrd2dx(1,1,1) 786 WRITE(*,*) ' " ": You should not have seen this print! error ?', ptrd2dy(1,1,1) 787 WRITE(*,*) ' " ": You should not have seen this print! error ?', ktrd 788 WRITE(*,*) ' " ": You should not have seen this print! error ?', ctype 704 SUBROUTINE trd_2d( ptrd2dx, ptrd2dy, ktrd , ctype ) ! Empty routine 705 REAL, DIMENSION(:,:) :: ptrd2dx, ptrd2dy 706 WRITE(*,*) 'trd_2d: You should not have seen this print! error ?', ptrd2dx(1,1), ptrd2dy(1,1), ktrd, ctype 789 707 END SUBROUTINE trd_2d 790 SUBROUTINE trd_3d(ptrd3dx, ptrd3dy, ktrd , ctype) ! Empty routine 791 REAL, DIMENSION(:,:,:), INTENT( inout ) :: & 792 ptrd3dx, & ! Temperature or U trend 793 ptrd3dy ! Salinity or V trend 794 INTEGER, INTENT( in ) :: ktrd ! momentum or tracer trend index 795 CHARACTER(len=3), INTENT( in ) :: & 796 ctype ! momentum or tracers trends type 797 WRITE(*,*) 'trd_3d: You should not have seen this print! error ?', ptrd3dx(1,1,1) 798 WRITE(*,*) ' " ": You should not have seen this print! error ?', ptrd3dy(1,1,1) 799 WRITE(*,*) ' " ": You should not have seen this print! error ?', ktrd 800 WRITE(*,*) ' " ": You should not have seen this print! error ?', ctype 708 SUBROUTINE trd_3d( ptrd3dx, ptrd3dy, ktrd , ctype ) ! Empty routine 709 REAL, DIMENSION(:,:,:) :: ptrd3dx, ptrd3dy 710 WRITE(*,*) 'trd_3d: You should not have seen this print! error ?', ptrd3dx(1,1,1), ptrd3dy(1,1,1), ktrd, ctype 801 711 END SUBROUTINE trd_3d 802 712 SUBROUTINE trd_icp_init ! Empty routine 803 713 END SUBROUTINE trd_icp_init 804 714 SUBROUTINE trd_dwr( kt ) ! Empty routine 805 INTEGER, INTENT(in) :: kt806 715 WRITE(*,*) 'trd_dwr: You should not have seen this print! error ?', kt 807 716 END SUBROUTINE trd_dwr 808 717 SUBROUTINE trd_twr( kt ) ! Empty routine 809 INTEGER, INTENT(in) :: kt810 718 WRITE(*,*) 'trd_twr: You should not have seen this print! error ?', kt 811 719 END SUBROUTINE trd_twr -
trunk/NEMO/OPA_SRC/TRD/trdicp_oce.F90
r247 r503 6 6 7 7 !!---------------------------------------------------------------------- 8 !! OPA 9.0 , LOCEAN-IPSL (2005)9 !! $Header$10 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt11 !!----------------------------------------------------------------------12 !!----------------------------------------------------------------------13 8 !! 'key_trdtra' or tracer trends diagnostics 14 9 !! 'key_trddyn' momentum trends diagnostics 15 10 !!---------------------------------------------------------------------- 16 !! * Modules used17 11 USE par_oce ! ocean parameters 18 12 … … 20 14 PUBLIC 21 15 22 !! Namelist parameters 23 !!---------------------------------------------------------------------- 24 INTEGER :: & !!: namdia : diagnostics on dynamics and/or tracer trends 25 ntrd = 10 , & !: time step frequency dynamics and tracers trends 26 nctls = 0 !: control surface type for trends vertical integration 16 !! * Shared module variables 17 #if defined key_trdtra && defined key_trddyn || defined key_esopa 18 LOGICAL, PARAMETER :: lk_trdtra = .TRUE. !: tracers trend flag 19 LOGICAL, PARAMETER :: lk_trddyn = .TRUE. !: momentum trend flag 20 #elif defined key_trdtra 21 LOGICAL, PARAMETER :: lk_trdtra = .TRUE. !: tracers trend flag 22 LOGICAL, PARAMETER :: lk_trddyn = .FALSE. !: momentum trend flag 23 #elif defined key_trddyn 24 LOGICAL, PARAMETER :: lk_trdtra = .FALSE. !: tracers trend flag 25 LOGICAL, PARAMETER :: lk_trddyn = .TRUE. !: momentum trend flag 26 #else 27 LOGICAL, PARAMETER :: lk_trdtra = .FALSE. !: tracers trend flag 28 LOGICAL, PARAMETER :: lk_trddyn = .FALSE. !: momentum trend flag 29 #endif 27 30 28 31 !! Tracers trends diagnostics parameters 29 32 !!--------------------------------------------------------------------- 30 INTEGER, PARAMETER :: & !: trends index 31 jpttdlad = 1, & !: tracer horizontal advection 32 jpttdzad = 2, & !: tracer vertical advection 33 jpttdldf = 3, & !: tracer horizontal diffusion 34 jpttdzdf = 4, & !: tracer vertical diffusion 35 jpttdnpc = 5, & !: tracer non penetrative convection 36 jpttddoe = 6, & !: tracer D.amping O.r vertical E.iv 37 jpttdqsr = 7, & !: tracer penetrative solar radiation 38 jpttdnsr = 8 !: tracer non solar radiation 33 INTEGER, PARAMETER :: & !: => tracer trends indexes <= 34 jpicpt_xad = 1, & !: x- horizontal advection 35 jpicpt_yad = 2, & !: y- horizontal advection 36 jpicpt_zad = 3, & !: z- vertical advection 37 jpicpt_ldf = 4, & !: lateral diffusion 38 jpicpt_zdf = 5, & !: vertical diffusion (Kz) 39 jpicpt_bbc = 6, & !: Bottom Boundary Condition (geoth. flux) 40 jpicpt_bbl = 7, & !: Bottom Boundary Layer (diffusive/convective) 41 jpicpt_npc = 8, & !: static instability mixing 42 jpicpt_dmp = 9, & !: damping 43 jpicpt_qsr = 10, & !: penetrative solar radiation 44 jpicpt_nsr = 11, & !: non solar radiation 45 jpicpt_zl1 = 12 !: first level vertical flux 39 46 47 INTEGER, PARAMETER :: & !: => Total tracer trends indexes <= 48 jptot_tra = 12 !: change it when adding/removing one indice above 49 40 50 !! Momentum trends diagnostics parameters 41 51 !!--------------------------------------------------------------------- 42 INTEGER, PARAMETER :: & !: trends index43 jpdtdhpg = 1, & !: dynamichydrostatic pressure gradient44 jpdtdkeg = 2, & !: dynamickinetic energy gradient45 jpdtdrvo = 3, & !: dynamicrelative vorticity46 jpdtdpvo = 4, & !: dynamicplanetary vorticity47 jpdtdldf = 5, & !: dynamiclateral diffusion48 jpdtdzad = 6, & !: dynamicvertical advection49 jpdtdzdf = 7, & !: dynamicvertical diffusion50 jpdtdspg = 8, & !: dynamicsurface pressure gradient51 jpdtddat = 9, & !: dynamicdamping term52 jpdtdswf = 10, & !: dynamicsurface wind forcing53 jpdtdbfr = 11 !: dynamicbottom friction52 INTEGER, PARAMETER :: & !: => dynamic trends indexes <= 53 jpicpd_hpg = 1, & !: hydrostatic pressure gradient 54 jpicpd_keg = 2, & !: kinetic energy gradient 55 jpicpd_rvo = 3, & !: relative vorticity 56 jpicpd_pvo = 4, & !: planetary vorticity 57 jpicpd_ldf = 5, & !: lateral diffusion 58 jpicpd_zad = 6, & !: vertical advection 59 jpicpd_zdf = 7, & !: vertical diffusion 60 jpicpd_spg = 8, & !: surface pressure gradient 61 jpicpd_dat = 9, & !: damping term 62 jpicpd_swf = 10, & !: surface wind forcing 63 jpicpd_bfr = 11 !: bottom friction 54 64 55 REAL, DIMENSION(jpi,jpj) :: & !: 56 tldfbbl, sldfbbl, & ! Temperature/salinity lateral diffusion trends 57 ! ! in the BBL 58 tladbbl, sladbbl ! Temperature/salinity lateral advection trends 59 ! ! in the BBL 60 61 REAL, DIMENSION(jpi,jpj,jpk) :: & !: 62 tladi, sladi, & ! Temp./sal. MUSCL OR TVD advection fluxes 63 ! ! terms along i- 64 tladj, sladj ! Temp./sal. MUSCL OR TVD advection fluxes 65 ! ! terms along j- 66 #if defined key_ldfslp 67 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & !: 68 uldftrd, vldftrd !: lateral diffusion trend in isopycnal case 69 #endif 65 INTEGER, PARAMETER :: & !: => Total dynamic trends indexes <= 66 jptot_dyn = 11 !: change it when adding/removing one indice above 67 70 68 #if defined key_trdtra || defined key_trddyn || defined key_esopa 71 69 72 70 !! Variables used for diagnostics 73 71 !!--------------------------------------------------------------------- 74 REAL(wp) :: & !: 75 tvolt, & !: volume of the whole ocean computed at t-points 76 tvolu, & !: volume of the whole ocean computed at u-points 77 tvolv !: volume of the whole ocean computed at v-points 72 REAL(wp) :: tvolt !: volume of the whole ocean computed at t-points 73 REAL(wp) :: tvolu !: volume of the whole ocean computed at u-points 74 REAL(wp) :: tvolv !: volume of the whole ocean computed at v-points 78 75 79 76 !! Tracers trends diagnostics variables 80 77 !!--------------------------------------------------------------------- 81 REAL(wp), DIMENSION(10) :: & !: 82 tmo, smo !: tracers trends average 83 ! ! tmo(1) : horizontal advection 84 ! ! tmo(2) : vertical advection 85 ! ! tmo(3) : horizontal diffusion 86 ! ! tmo(4) : vertical diffusion 87 ! ! tmo(5) : static instability 88 ! ! tmo(6) : damping OR vertical EIV 89 ! ! tmo(7) : penetrative solar radiation (T only) 90 REAL(wp), DIMENSION(10) :: & !: 91 t2, s2 !: tracers square trends average 92 ! ! t2(1) : horizontal advection 93 ! ! t2(2) : vertical advection 94 ! ! t2(3) : horizontal diffusion 95 ! ! t2(4) : vertical diffusion 96 ! ! t2(5) : static instability 97 ! ! t2(6) : damping OR vertical EIV 98 ! ! t2(7) : penetrative solar radiation (T only) 78 REAL(wp), DIMENSION(jptot_tra) :: tmo, smo !: tracers trends average 79 REAL(wp), DIMENSION(jptot_tra) :: t2, s2 !: tracers square trends average 99 80 100 81 !! Momentum trends diagnostics variables 101 82 !!--------------------------------------------------------------------- 102 REAL(wp), DIMENSION(11) :: & !: 103 umo, vmo !: momentum trends average 104 ! ! umo(1) : hydrostatic pressure gradient 105 ! ! umo(2) : kinetic energy 106 ! ! umo(3) : lateral diffusion geo-pot 107 ! ! umo(4) : 108 ! ! umo(5) : lateral diffusion 109 ! ! umo(6) : vertical advection 110 ! ! umo(7) : vertical diffusion 111 ! ! umo(8) : surface pressure gradient 112 ! ! umo(9) : 113 114 REAL(wp), DIMENSION(10) :: & !: 115 hke !: momentum square trends average 116 ! ! hke(1) : horizontal advection 117 ! ! hke(2) : vertical advection 118 119 REAL(wp) :: & !: 120 rpktrd, & !: potential to kinetic energy conversion 121 peke !: conversion potential energy - kinetic energy trend 83 REAL(wp), DIMENSION(jptot_dyn) :: umo, vmo !: momentum trends average 84 REAL(wp), DIMENSION(jptot_dyn) :: hke !: momentum square trends average 85 REAL(wp) :: rpktrd !: potential to kinetic energy conversion 86 REAL(wp) :: peke !: conversion potential energy - kinetic energy trend 122 87 123 88 #endif 124 125 !!====================================================================== 89 !!---------------------------------------------------------------------- 90 !! OPA 9.0 , LOCEAN-IPSL (2005) 91 !! $Header$ 92 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 93 !!====================================================================== 126 94 END MODULE trdicp_oce -
trunk/NEMO/OPA_SRC/TRD/trdmld.F90
r352 r503 4 4 !! Ocean diagnostics: mixed layer T-S trends 5 5 !!===================================================================== 6 !! History : ! 95-04 (J. Vialard) Original code 7 !! ! 97-02 (E. Guilyardi) Adaptation global + base cmo 8 !! ! 99-09 (E. Guilyardi) Re-writing + netCDF output 9 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 10 !! 9.0 ! 04-08 (C. Talandier) New trends organization 11 !! ! 05-05 (C. Deltel) Diagnose trends of time averaged ML T & S 12 !!---------------------------------------------------------------------- 6 13 #if defined key_trdmld || defined key_esopa 7 14 !!---------------------------------------------------------------------- 8 15 !! 'key_trdmld' mixed layer trend diagnostics 16 !!---------------------------------------------------------------------- 9 17 !!---------------------------------------------------------------------- 10 18 !! trd_mld : T and S cumulated trends averaged over the mixed layer … … 12 20 !! trd_mld_init : initialization step 13 21 !!---------------------------------------------------------------------- 14 !! * Modules used15 22 USE oce ! ocean dynamics and tracers variables 16 23 USE dom_oce ! ocean space and time domain variables … … 28 35 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 36 USE diadimg ! dimg direct access file format output 37 USE trdmld_rst , ONLY : trd_mld_rst_read ! restart for diagnosing the ML trends 38 USE prtctl ! Print control 30 39 31 40 IMPLICIT NONE 32 41 PRIVATE 33 42 34 !! * Accessibility 35 PUBLIC trd_mld ! routine called by step.F90 36 PUBLIC trd_mld_init ! routine called by opa.F90 37 PUBLIC trd_mld_zint ! routine called by tracers routines 38 39 !! * Shared module variables 40 LOGICAL, PUBLIC, PARAMETER :: lk_trdmld = .TRUE. !: momentum trend flag 41 42 !! * Module variables 43 INTEGER :: & 44 nh_t, nmoymltrd, & ! ??? 45 nidtrd, & 46 ndextrd1(jpi*jpj), & 47 ndimtrd1 48 INTEGER, SAVE :: & 49 ionce, icount, & 50 idebug ! (0/1) set it to 1 in case of problem to have more print 51 52 INTEGER, DIMENSION(jpi,jpj) :: & 53 nmld, & ! mixed layer depth 54 nbol 55 56 REAL(wp), DIMENSION(jpi,jpj) :: & 57 rmld , & ! mld depth (m) corresponding to nmld 58 tml , sml , & ! average T and S over mixed layer 59 tmlb , smlb , & ! before tml and sml (kt-1) 60 tmlbb , smlbb, & ! tml and sml at begining of the nwrite-1 61 ! ! timestep averaging period 62 tmlbn , smlbn, & ! after tml and sml at time step after the 63 ! ! begining of the NWRITE-1 timesteps 64 tmltrdm, smltrdm ! 65 66 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 67 tmltrd , & ! total cumulative trends of temperature and 68 smltrd , & ! salinity over nwrite-1 time steps 69 wkx 70 71 CHARACTER(LEN=80) :: clname 43 PUBLIC trd_mld ! routine called by step.F90 44 PUBLIC trd_mld_init ! routine called by opa.F90 45 PUBLIC trd_mld_zint ! routine called by tracers routines 46 47 CHARACTER (LEN=40) :: clhstnam ! name of the trends NetCDF file 48 INTEGER :: nh_t, nmoymltrd 49 INTEGER :: nidtrd, ndextrd1(jpi*jpj) 50 INTEGER :: ndimtrd1 51 INTEGER, SAVE :: ionce, icount 72 52 73 53 !! * Substitutions … … 83 63 CONTAINS 84 64 85 SUBROUTINE trd_mld_zint( pttrdmld, pstrdmld, ktrd, ctype )65 SUBROUTINE trd_mld_zint( pttrdmld, pstrdmld, ktrd, ctype ) 86 66 !!---------------------------------------------------------------------- 87 67 !! *** ROUTINE trd_mld_zint *** 88 68 !! 89 !! ** Purpose : computation of vertically integrated T and S budgets 90 !! from ocean surface down to control surface 69 !! ** Purpose : Compute the vertical average of the 3D fields given as arguments 70 !! to the subroutine. This vertical average is performed from ocean 71 !! surface down to a chosen control surface. 91 72 !! 92 73 !! ** Method/usage : 93 !! integration done over nwrite-1 time steps 94 !! Control surface can be either a mixed layer depth (time varying) 74 !! The control surface can be either a mixed layer depth (time varying) 95 75 !! or a fixed surface (jk level or bowl). 96 !! Choose control surface with nctls in namelist NAM DIA.97 !! nctls = 0 : use mixed layer with density criterion98 !! nctls = 1 : read index from file 'ctlsurf_idx'99 !! nctls > 1 : use fixed level surface jk = nctls76 !! Choose control surface with nctls in namelist NAMTRD : 77 !! nctls = 0 : use mixed layer with density criterion 78 !! nctls = 1 : read index from file 'ctlsurf_idx' 79 !! nctls > 1 : use fixed level surface jk = nctls 100 80 !! Note: in the remainder of the routine, the volume between the 101 81 !! surface and the control surface is called "mixed-layer" 102 !! Method check : if the control surface is fixed, the residual dh/dt103 !! entrainment should be zero104 !!105 !! ** Action :106 !! /commld/ : rmld mld depth corresponding to nmld107 !! tml average T over mixed layer108 !! tmlb tml at kt-1109 !! tmlbb tml at begining of the NWRITE-1110 !! time steps averaging period111 !! tmlbn tml at time step after the112 !! begining of the NWRITE-1 time113 !! steps averaging period114 !!115 !! mixed layer trends :116 !!117 !! tmltrd (,,1) = zonal advection118 !! tmltrd (,,2) = meridional advection119 !! tmltrd (,,3) = vertical advection120 !! tmltrd (,,4) = lateral diffusion (horiz. component+Beckman)121 !! tmltrd (,,5) = forcing122 !! tmltrd (,,6) = entrainment due to vertical diffusion (TKE)123 !! if iso tmltrd (,,7) = lateral diffusion (vertical component)124 !! tmltrd (,,8) = eddy induced zonal advection125 !! tmltrd (,,9) = eddy induced meridional advection126 !! tmltrd (,,10) = eddy induced vertical advection127 !!128 !! tmltrdm(,) : total cumulative trends over nwrite-1 time steps129 !! ztmltot(,) : dT/dt over the NWRITE-1 time steps130 !! averaging period (including Asselin131 !! terms)132 !! ztmlres(,) : residual = dh/dt entrainment133 !!134 !! trends output in netCDF format using ioipsl135 !!136 !! History :137 !! ! 95-04 (J. Vialard) Original code138 !! ! 97-02 (E. Guilyardi) Adaptation global + base cmo139 !! ! 99-09 (E. Guilyardi) Re-writing + netCDF output140 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module141 !! 9.0 ! 04-08 (C. Talandier) New trends organization142 82 !!---------------------------------------------------------------------- 143 !! * Arguments 144 INTEGER, INTENT( in ) :: ktrd ! ocean trend index 145 146 CHARACTER(len=2), INTENT( in ) :: & 147 ctype ! surface/bottom (2D arrays) or 148 ! interior (3D arrays) physics 149 150 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) :: & 151 pttrdmld, & ! Temperature trend 152 pstrdmld ! Salinity trend 153 154 !! * Local declarations 83 INTEGER, INTENT( in ) :: ktrd ! ocean trend index 84 CHARACTER(len=2), INTENT( in ) :: ctype ! surface/bottom (2D arrays) or 85 ! ! interior (3D arrays) physics 86 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) :: pttrdmld ! temperature trend 87 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) :: pstrdmld ! salinity trend 155 88 INTEGER :: ji, jj, jk, isum 156 # if defined key_trabbl_dif 157 INTEGER :: ikb 158 # endif 159 160 REAL(wp), DIMENSION(jpi,jpj) :: & 161 zvlmsk 89 REAL(wp), DIMENSION(jpi,jpj) :: zvlmsk 162 90 !!---------------------------------------------------------------------- 163 91 92 ! I. Definition of control surface and associated fields 93 ! ------------------------------------------------------ 94 ! ==> only once per time step <== 95 164 96 IF( icount == 1 ) THEN 165 166 zvlmsk(:,:) = 0.e0 167 tmltrd(:,:,:) = 0.e0 168 smltrd(:,:,:) = 0.e0 169 170 ! This computation should be done only once per time step 171 172 ! ======================================================== 173 ! I. definition of control surface and associated fields 174 ! ======================================================== 175 176 ! I.1 set nmld(ji,jj) = index of first T point below control surface 177 ! ------------------- or outside mixed-layer 178 179 IF( nctls == 0 ) THEN 180 ! control surface = mixed-layer with density criterion 181 ! (array nmln computed in zdfmxl.F90) 182 nmld(:,:) = nmln(:,:) 183 ELSE IF( nctls == 1 ) THEN 184 ! control surface = read index from file 97 ! 98 tmltrd(:,:,:) = 0.e0 ; smltrd(:,:,:) = 0.e0 ! <<< reset trend arrays to zero 99 100 ! ... Set nmld(ji,jj) = index of first T point below control surf. or outside mixed-layer 101 IF( nctls == 0 ) THEN ! * control surface = mixed-layer with density criterion 102 nmld(:,:) = nmln(:,:) ! array nmln computed in zdfmxl.F90 103 ELSE IF( nctls == 1 ) THEN ! * control surface = read index from file 185 104 nmld(:,:) = nbol(:,:) 186 ELSE IF( nctls >= 2 ) THEN 187 ! control surface = model level 105 ELSE IF( nctls >= 2 ) THEN ! * control surface = model level 188 106 nctls = MIN( nctls, jpktrd - 1 ) 189 107 nmld(:,:) = nctls + 1 190 108 ENDIF 191 109 192 IF( ionce == 1 ) THEN ! compute ndextrd1 and ndimtrd1 only once 193 ! Check of validity : nmld(ji,jj) =< jpktrd 194 isum = 0 110 ! ... Compute ndextrd1 and ndimtrd1 only once 111 IF( ionce == 1 ) THEN 112 ! 113 ! Check of validity : nmld(ji,jj) <= jpktrd 114 isum = 0 115 zvlmsk(:,:) = 0.e0 195 116 196 117 IF( jpktrd < jpk ) THEN … … 215 136 ENDIF 216 137 217 ! no more pass here 218 ionce = 0 219 220 ENDIF 221 222 IF( idebug /= 0 ) THEN 223 ! CALL prihre (zvlmsk,jpi,jpj,1,jpi,2,1,jpj,2,3,numout) 224 WRITE(numout,*) ' debuging trd_mld_zint: I.1 done ' 225 CALL FLUSH(numout) 226 ENDIF 227 228 229 ! I.2 probability density function of presence in mixed-layer 230 ! -------------------------------- 231 ! (i.e. weight of each grid point in vertical integration : wkx(ji,jj,jk) 232 233 234 ! initialize wkx with vertical scale factor in mixed-layer 235 138 ionce = 0 ! no more pass here 139 ! 140 END IF 141 142 ! ... Weights for vertical averaging 236 143 wkx(:,:,:) = 0.e0 237 DO jk = 1, jpktrd 144 DO jk = 1, jpktrd ! initialize wkx with vertical scale factor in mixed-layer 238 145 DO jj = 1,jpj 239 146 DO ji = 1,jpi 240 IF( jk - nmld(ji,jj) < 0. ) wkx(ji,jj,jk) = fse3t(ji,jj,jk) * tmask(ji,jj,jk)147 IF( jk - nmld(ji,jj) < 0.e0 ) wkx(ji,jj,jk) = fse3t(ji,jj,jk) * tmask(ji,jj,jk) 241 148 END DO 242 149 END DO 243 150 END DO 244 151 245 ! compute mixed-layer depth : rmld 246 247 rmld(:,:) = 0. 152 rmld(:,:) = 0.e0 ! compute mixed-layer depth : rmld 248 153 DO jk = 1, jpktrd 249 154 rmld(:,:) = rmld(:,:) + wkx(:,:,jk) 250 155 END DO 251 156 252 ! compute PDF 253 157 DO jk = 1, jpktrd ! compute integration weights 158 wkx(:,:,jk) = wkx(:,:,jk) / MAX( 1., rmld(:,:) ) 159 END DO 160 161 icount = 0 ! <<< flag = off : control surface & integr. weights 162 ! ! computed only once per time step 163 END IF 164 165 ! II. Vertical integration of trends in the mixed-layer 166 ! ----------------------------------------------------- 167 168 SELECT CASE (ctype) 169 CASE ( '3D' ) ! mean T/S trends in the mixed-layer 254 170 DO jk = 1, jpktrd 255 wkx(:,:,jk) = wkx(:,:,jk) / MAX( 1., rmld(:,:) ) 256 END DO 257 258 IF( idebug /= 0 ) THEN 259 WRITE(numout,*) ' debuging trd_mld_zint: I.2 done ' 260 CALL FLUSH(numout) 261 ENDIF 262 263 ! Set counter icount to 0 to avoid this part at each time step 264 icount = 0 265 266 ENDIF 267 268 269 ! ==================================================== 270 ! II. vertical integration of trends in mixed-layer 271 ! ==================================================== 272 273 ! II.1 vertical integration of 3D and 2D trends 274 ! --------------------------------------------- 275 276 SELECT CASE (ctype) 277 278 CASE ('3D') ! 3D treatment 279 280 ! trends terms in the mixed-layer 281 DO jk = 1, jpktrd 282 ! Temperature 283 tmltrd(:,:,ktrd) = tmltrd(:,:,ktrd) + pttrdmld(:,:,jk) * wkx(:,:,jk) 284 285 ! Salinity 286 smltrd(:,:,ktrd) = smltrd(:,:,ktrd) + pstrdmld(:,:,jk) * wkx(:,:,jk) 287 ENDDO 288 289 CASE ('2D') ! 2D treatment 290 291 SELECT CASE (ktrd) 292 293 CASE (jpmldldf) 294 295 # if defined key_trabbl_dif 296 ! trends terms from Beckman over-flow parameterization 297 DO jj = 1,jpj 298 DO ji = 1,jpi 299 ikb = MAX( mbathy(ji,jj)-1, 1 ) 300 ! beckmann component -> horiz. part of lateral diffusion 301 tmltrd(ji,jj,ktrd) = tmltrd(ji,jj,ktrd) + pttrdmld(ji,jj,1) * wkx(ji,jj,ikb) 302 smltrd(ji,jj,ktrd) = smltrd(ji,jj,ktrd) + pstrdmld(ji,jj,1) * wkx(ji,jj,ikb) 303 END DO 304 END DO 305 # endif 306 307 CASE DEFAULT 308 309 ! trends terms at upper boundary of mixed-layer 310 311 ! forcing term (non penetrative) 312 ! Temperature 313 tmltrd(:,:,ktrd) = tmltrd(:,:,ktrd) + pttrdmld(:,:,1) * wkx(:,:,1) 314 315 ! forcing term 316 ! Salinity 317 smltrd(:,:,ktrd) = smltrd(:,:,ktrd) + pstrdmld(:,:,1) * wkx(:,:,1) 318 319 END SELECT 320 171 tmltrd(:,:,ktrd) = tmltrd(:,:,ktrd) + pttrdmld(:,:,jk) * wkx(:,:,jk) ! temperature 172 smltrd(:,:,ktrd) = smltrd(:,:,ktrd) + pstrdmld(:,:,jk) * wkx(:,:,jk) ! salinity 173 END DO 174 CASE ( '2D' ) ! forcing at upper boundary of the mixed-layer 175 tmltrd(:,:,ktrd) = tmltrd(:,:,ktrd) + pttrdmld(:,:,1) * wkx(:,:,1) ! non penetrative 176 smltrd(:,:,ktrd) = smltrd(:,:,ktrd) + pstrdmld(:,:,1) * wkx(:,:,1) 321 177 END SELECT 322 323 IF( idebug /= 0 ) THEN 324 IF(lwp) WRITE(numout,*) ' debuging trd_mld_zint: II.1 done' 325 CALL FLUSH(numout) 326 ENDIF 327 178 ! 328 179 END SUBROUTINE trd_mld_zint 329 330 180 331 181 332 182 SUBROUTINE trd_mld( kt ) … … 334 184 !! *** ROUTINE trd_mld *** 335 185 !! 336 !! ** Purpose : computation of cumulated trends over analysis period337 !! and make outputs (NetCDF or DIMG format)186 !! ** Purpose : Compute and cumulate the mixed layer trends over an analysis 187 !! period, and write NetCDF (or dimg) outputs. 338 188 !! 339 189 !! ** Method/usage : 190 !! The stored trends can be chosen twofold (according to the ln_trdmld_instant 191 !! logical namelist variable) : 192 !! 1) to explain the difference between initial and final 193 !! mixed-layer T & S (where initial and final relate to the 194 !! current analysis window, defined by ntrd in the namelist) 195 !! 2) to explain the difference between the current and previous 196 !! TIME-AVERAGED mixed-layer T & S (where time-averaging is 197 !! performed over each analysis window). 340 198 !! 341 !! History : 342 !! 9.0 ! 04-08 (C. Talandier) New trends organization 199 !! ** Consistency check : 200 !! If the control surface is fixed ( nctls > 1 ), the residual term (dh/dt 201 !! entrainment) should be zero, at machine accuracy. Note that in the case 202 !! of time-averaged mixed-layer fields, this residual WILL NOT BE ZERO 203 !! over the first two analysis windows (except if restart). 204 !! N.B. For ORCA2_LIM, use e.g. ntrd=5, ucf=1., nctls=8 205 !! for checking residuals. 206 !! On a NEC-SX5 computer, this typically leads to: 207 !! O(1.e-20) temp. residuals (tml_res) when ln_trdmld_instant=.false. 208 !! O(1.e-21) temp. residuals (tml_res) when ln_trdmld_instant=.true. 209 !! 210 !! ** Action : 211 !! At each time step, mixed-layer averaged trends are stored in the 212 !! tmltrd(:,:,jpmld_xxx) array (see trdmld_oce.F90 for definitions of jpmld_xxx). 213 !! This array is known when trd_mld is called, at the end of the stp subroutine, 214 !! except for the purely vertical K_z diffusion term, which is embedded in the 215 !! lateral diffusion trend. 216 !! 217 !! In I), this K_z term is diagnosed and stored, thus its contribution is removed 218 !! from the lateral diffusion trend. 219 !! In II), the instantaneous mixed-layer T & S are computed, and misc. cumulative 220 !! arrays are updated. 221 !! In III), called only once per analysis window, we compute the total trends, 222 !! along with the residuals and the Asselin correction terms. 223 !! In IV), the appropriate trends are written in the trends NetCDF file. 224 !! 225 !! References : 226 !! - Vialard & al. 227 !! - See NEMO documentation (in preparation) 343 228 !!---------------------------------------------------------------------- 344 !! * Arguments345 229 INTEGER, INTENT( in ) :: kt ! ocean time-step index 346 347 !! * Local declarations 230 !! 348 231 INTEGER :: ji, jj, jk, jl, ik, it 349 350 REAL(wp) :: zmean, zavt 351 352 REAL(wp) ,DIMENSION(jpi,jpj) :: & 353 ztmltot, ztmlres, & 354 zsmltot, zsmlres, & 355 z2d 356 232 LOGICAL :: lldebug = .TRUE. 233 REAL(wp) :: zavt, zfn, zfn2 234 REAL(wp) ,DIMENSION(jpi,jpj) :: & 235 ztmltot, zsmltot, & ! dT/dt over the anlysis window (including Asselin) 236 ztmlres, zsmlres, & ! residual = dh/dt entrainment term 237 ztmlatf, zsmlatf, & ! needed for storage only 238 ztmltot2, ztmlres2, ztmltrdm2, & ! \ working arrays to diagnose the trends 239 zsmltot2, zsmlres2, zsmltrdm2, & ! > associated with the time meaned ML T & S 240 ztmlatf2, zsmlatf2 ! / 241 REAL(wp), DIMENSION(jpi,jpj,jpltrd) :: & 242 ztmltrd2, zsmltrd2 ! only needed for mean diagnostics 357 243 #if defined key_dimgout 358 244 INTEGER :: iyear,imon,iday … … 361 247 !!---------------------------------------------------------------------- 362 248 363 ! I. trends terms at lower boundary of mixed-layer 364 ! ------------------------------------------------ 365 249 ! ====================================================================== 250 ! I. Diagnose the purely vertical (K_z) diffusion trend 251 ! ====================================================================== 252 253 ! ... These terms can be estimated by flux computation at the lower boundary of the ML 254 ! (we compute (-1/h) * K_z * d_z( T ) and (-1/h) * K_z * d_z( S )) 366 255 DO jj = 1,jpj 367 256 DO ji = 1,jpi 368 369 257 ik = nmld(ji,jj) 370 371 ! Temperature372 ! entrainment due to vertical diffusion373 ! - due to vertical mixing scheme (TKE)374 258 zavt = avt(ji,jj,ik) 375 tmltrd(ji,jj,jpmldevd) = - 1. * zavt / fse3w(ji,jj,ik) * tmask(ji,jj,ik) & 376 & * ( tn(ji,jj,ik-1) - tn(ji,jj,ik) ) & 377 & / MAX( 1., rmld(ji,jj) ) * tmask(ji,jj,1) 378 ! Salinity 379 ! entrainment due to vertical diffusion 380 ! - due to vertical mixing scheme (TKE) 259 tmltrd(ji,jj,jpmld_zdf) = - zavt / fse3w(ji,jj,ik) * tmask(ji,jj,ik) & 260 & * ( tn(ji,jj,ik-1) - tn(ji,jj,ik) ) & 261 & / MAX( 1., rmld(ji,jj) ) * tmask(ji,jj,1) 381 262 zavt = fsavs(ji,jj,ik) 382 smltrd(ji,jj,jpmld evd) = -1. * zavt / fse3w(ji,jj,ik) * tmask(ji,jj,ik)&383 & * ( sn(ji,jj,ik-1) - sn(ji,jj,ik) )&384 & / MAX( 1., rmld(ji,jj) ) * tmask(ji,jj,1)263 smltrd(ji,jj,jpmld_zdf) = - zavt / fse3w(ji,jj,ik) * tmask(ji,jj,ik) & 264 & * ( sn(ji,jj,ik-1) - sn(ji,jj,ik) ) & 265 & / MAX( 1., rmld(ji,jj) ) * tmask(ji,jj,1) 385 266 END DO 386 267 END DO 387 268 269 ! ... Remove this K_z trend from the iso-neutral diffusion term (if any) 388 270 IF( ln_traldf_iso ) THEN 389 ! We substract to the TOTAL vertical diffusion tmltrd(:,:,jpmldzdf) 390 ! computed in subroutines trazdf_iso.F90 or trazdf_imp.F90 391 ! the vertical part du to the Kz in order to keep only the vertical 392 ! isopycnal diffusion (i.e the isopycnal diffusion componant on the vertical): 393 tmltrd(:,:,jpmldzdf) = tmltrd(:,:,jpmldzdf) - tmltrd(:,:,jpmldevd) ! - due to isopycnal mixing scheme (implicit part) 394 smltrd(:,:,jpmldzdf) = smltrd(:,:,jpmldzdf) - smltrd(:,:,jpmldevd) ! - due to isopycnal mixing scheme (implicit part) 395 ENDIF 396 397 ! Boundary conditions 398 CALL lbc_lnk( tmltrd, 'T', 1. ) 399 CALL lbc_lnk( smltrd, 'T', 1. ) 400 401 IF( idebug /= 0 ) THEN 402 WRITE(numout,*) ' debuging trd_mld: I. done' 403 CALL FLUSH(numout) 404 ENDIF 405 406 ! ================================= 407 ! II. Cumulated trends 408 ! ================================= 409 410 ! II.1 set before values of vertically average T and S 411 ! --------------------------------------------------- 412 271 tmltrd(:,:,jpmld_ldf) = tmltrd(:,:,jpmld_ldf) - tmltrd(:,:,jpmld_zdf) 272 smltrd(:,:,jpmld_ldf) = smltrd(:,:,jpmld_ldf) - smltrd(:,:,jpmld_zdf) 273 END IF 274 275 ! ... Lateral boundary conditions 276 DO jl = 1, jpltrd 277 CALL lbc_lnk( tmltrd(:,:,jl), 'T', 1. ) 278 CALL lbc_lnk( smltrd(:,:,jl), 'T', 1. ) 279 END DO 280 281 ! ====================================================================== 282 ! II. Cumulate the trends over the analysis window 283 ! ====================================================================== 284 285 ztmltrd2(:,:,:) = 0.e0 ; zsmltrd2(:,:,:) = 0.e0 ! <<< reset arrays to zero 286 ztmltot2(:,:) = 0.e0 ; zsmltot2(:,:) = 0.e0 287 ztmlres2(:,:) = 0.e0 ; zsmlres2(:,:) = 0.e0 288 ztmlatf2(:,:) = 0.e0 ; zsmlatf2(:,:) = 0.e0 289 290 ! II.1 Set before values of vertically average T and S 291 ! ---------------------------------------------------- 413 292 IF( kt > nit000 ) THEN 414 tmlb(:,:) = tml(:,:) 415 smlb(:,:) = sml(:,:) 416 ENDIF 417 418 ! II.2 vertically integrated T and S 419 ! --------------------------------- 420 421 tml(:,:) = 0. 422 sml(:,:) = 0. 423 293 ! ... temperature ... ... salinity ... 294 tmlb (:,:) = tml (:,:) ; smlb (:,:) = sml (:,:) 295 tmlatfn(:,:) = tmltrd(:,:,jpmld_atf) ; smlatfn(:,:) = smltrd(:,:,jpmld_atf) 296 END IF 297 298 ! II.2 Vertically averaged T and S 299 ! -------------------------------- 300 tml(:,:) = 0.e0 ; sml(:,:) = 0.e0 424 301 DO jk = 1, jpktrd - 1 425 302 tml(:,:) = tml(:,:) + wkx(:,:,jk) * tn(:,:,jk) … … 427 304 END DO 428 305 429 IF(idebug /= 0) THEN 430 WRITE(numout,*) ' debuging trd_mld: II.2 done' 431 CALL FLUSH(numout) 432 ENDIF 433 434 ! II.3 set `before' mixed layer values for kt = nit000+1 435 ! -------------------------------------------------------- 436 437 IF( kt == nit000+1 ) THEN 438 tmlbb(:,:) = tmlb(:,:) 439 tmlbn(:,:) = tml (:,:) 440 smlbb(:,:) = smlb(:,:) 441 smlbn(:,:) = sml (:,:) 442 ENDIF 443 444 IF( idebug /= 0 ) THEN 445 WRITE(numout,*) ' debuging trd_mld: II.3 done' 446 CALL FLUSH(numout) 447 ENDIF 448 449 ! II.4 cumulated trends over analysis period (kt=2 to nwrite) 450 ! ----------------------------------------------------------- 451 452 ! trends cumulated over nwrite-2 time steps 453 454 IF( kt >= nit000+2 ) THEN 306 ! II.3 Initialize mixed-layer "before" arrays for the 1rst analysis window 307 ! ------------------------------------------------------------------------ 308 IF( kt == 2 ) THEN ! i.e. ( .NOT. ln_rstart ).AND.( kt == nit000 + 1) 309 ! 310 ! ... temperature ... ... salinity ... 311 tmlbb (:,:) = tmlb (:,:) ; smlbb (:,:) = smlb (:,:) 312 tmlbn (:,:) = tml (:,:) ; smlbn (:,:) = sml (:,:) 313 tmlatfb(:,:) = tmlatfn(:,:) ; smlatfb(:,:) = smlatfn(:,:) 314 315 tmltrd_csum_ub (:,:,:) = 0.e0 ; smltrd_csum_ub (:,:,:) = 0.e0 316 tmltrd_atf_sumb(:,:) = 0.e0 ; smltrd_atf_sumb(:,:) = 0.e0 317 318 rmldbn(:,:) = rmld(:,:) 319 320 IF( ln_ctl ) THEN 321 WRITE(numout,*) ' we reach kt == nit000 + 1 = ', nit000+1 322 CALL prt_ctl(tab2d_1=tmlbb , clinfo1=' tmlbb - : ', mask1=tmask, ovlap=1) 323 CALL prt_ctl(tab2d_1=tmlbn , clinfo1=' tmlbn - : ', mask1=tmask, ovlap=1) 324 CALL prt_ctl(tab2d_1=tmlatfb , clinfo1=' tmlatfb - : ', mask1=tmask, ovlap=1) 325 END IF 326 ! 327 END IF 328 329 IF( ( ln_rstart ) .AND. ( kt == nit000 ) .AND. ( ln_ctl ) ) THEN 330 IF( ln_trdmld_instant ) THEN 331 WRITE(numout,*) ' restart from kt == nit000 = ', nit000 332 CALL prt_ctl(tab2d_1=tmlbb , clinfo1=' tmlbb - : ', mask1=tmask, ovlap=1) 333 CALL prt_ctl(tab2d_1=tmlbn , clinfo1=' tmlbn - : ', mask1=tmask, ovlap=1) 334 CALL prt_ctl(tab2d_1=tmlatfb , clinfo1=' tmlatfb - : ', mask1=tmask, ovlap=1) 335 ELSE 336 WRITE(numout,*) ' restart from kt == nit000 = ', nit000 337 CALL prt_ctl(tab2d_1=tmlbn , clinfo1=' tmlbn - : ', mask1=tmask, ovlap=1) 338 CALL prt_ctl(tab2d_1=rmldbn , clinfo1=' rmldbn - : ', mask1=tmask, ovlap=1) 339 CALL prt_ctl(tab2d_1=tml_sumb , clinfo1=' tml_sumb - : ', mask1=tmask, ovlap=1) 340 CALL prt_ctl(tab2d_1=tmltrd_atf_sumb, clinfo1=' tmltrd_atf_sumb - : ', mask1=tmask, ovlap=1) 341 CALL prt_ctl(tab3d_1=tmltrd_csum_ub , clinfo1=' tmltrd_csum_ub - : ', mask1=tmask, ovlap=1, kdim=1) 342 END IF 343 END IF 344 345 ! II.4 Cumulated trends over the analysis period 346 ! ---------------------------------------------- 347 ! 348 ! [ 1rst analysis window ] [ 2nd analysis window ] 349 ! 350 ! o---[--o-----o-----o-----o--]-[--o-----o-----o-----o-----o--]---o-----o--> time steps 351 ! ntrd 2*ntrd etc. 352 ! 1 2 3 4 =5 e.g. =10 353 ! 354 IF( ( kt >= 2 ).OR.( ln_rstart ) ) THEN 355 ! 455 356 nmoymltrd = nmoymltrd + 1 357 358 ! ... Cumulate over BOTH physical contributions AND over time steps 456 359 DO jl = 1, jpltrd 457 360 tmltrdm(:,:) = tmltrdm(:,:) + tmltrd(:,:,jl) 458 361 smltrdm(:,:) = smltrdm(:,:) + smltrd(:,:,jl) 459 362 END DO 460 ENDIF 461 462 IF( idebug /= 0 ) THEN 463 WRITE(numout,*) ' debuging trd_mld: II.4 done' 464 CALL FLUSH(numout) 465 ENDIF 466 467 ! ============================================= 468 ! III. Output in netCDF + residual computation 469 ! ============================================= 470 471 ztmltot(:,:) = 0. 472 zsmltot(:,:) = 0. 473 ztmlres(:,:) = 0. 474 zsmlres(:,:) = 0. 475 476 IF( MOD( kt - nit000+1, nwrite ) == 0 ) THEN 477 478 ! III.1 compute total trend 479 ! ------------------------ 480 481 zmean = float(nmoymltrd) 482 483 ztmltot(:,:) = ( tml(:,:) - tmlbn(:,:) + tmlb(:,:) - tmlbb(:,:) ) / (zmean * 2. * rdt) 484 zsmltot(:,:) = ( sml(:,:) - smlbn(:,:) + smlb(:,:) - smlbb(:,:) ) / (zmean * 2. * rdt) 485 486 IF(idebug /= 0) THEN 487 WRITE(numout,*) ' zmean = ',zmean 488 WRITE(numout,*) ' debuging trd_mld: III.1 done' 489 CALL FLUSH(numout) 490 ENDIF 491 492 493 ! III.2 compute residual 494 ! --------------------- 495 496 ztmlres(:,:) = ztmltot(:,:) - tmltrdm(:,:) / zmean 497 zsmlres(:,:) = zsmltot(:,:) - smltrdm(:,:) / zmean 498 499 500 ! Boundary conditions 501 502 CALL lbc_lnk( ztmltot, 'T', 1. ) 503 CALL lbc_lnk( ztmlres, 'T', 1. ) 504 CALL lbc_lnk( zsmltot, 'T', 1. ) 505 CALL lbc_lnk( zsmlres, 'T', 1. ) 506 507 IF( idebug /= 0 ) THEN 508 WRITE(numout,*) ' debuging trd_mld: III.2 done' 509 CALL FLUSH(numout) 510 ENDIF 511 512 513 ! III.3 time evolution array swap 514 ! ------------------------------ 515 516 tmlbb(:,:) = tmlb(:,:) 517 tmlbn(:,:) = tml (:,:) 518 smlbb(:,:) = smlb(:,:) 519 smlbn(:,:) = sml (:,:) 520 521 IF( idebug /= 0 ) THEN 522 WRITE(numout,*) ' debuging trd_mld: III.3 done' 523 CALL FLUSH(numout) 524 ENDIF 525 526 527 ! III.4 zero cumulative array 528 ! --------------------------- 529 530 nmoymltrd = 0 531 532 tmltrdm(:,:) = 0. 533 smltrdm(:,:) = 0. 534 535 IF(idebug /= 0) THEN 536 WRITE(numout,*) ' debuging trd_mld: III.4 done' 537 CALL FLUSH(numout) 538 ENDIF 539 540 ENDIF 541 542 ! III.5 write trends to output 543 ! --------------------------- 363 364 ! ... Special handling of the Asselin trend 365 tmlatfm(:,:) = tmlatfm(:,:) + tmlatfn(:,:) 366 smlatfm(:,:) = smlatfm(:,:) + smlatfn(:,:) 367 368 ! ... Trends associated with the time mean of the ML T/S 369 tmltrd_sum (:,:,:) = tmltrd_sum (:,:,:) + tmltrd (:,:,:) ! tem 370 tmltrd_csum_ln(:,:,:) = tmltrd_csum_ln(:,:,:) + tmltrd_sum(:,:,:) 371 tml_sum (:,:) = tml_sum (:,:) + tml (:,:) 372 smltrd_sum (:,:,:) = smltrd_sum (:,:,:) + smltrd (:,:,:) ! sal 373 smltrd_csum_ln(:,:,:) = smltrd_csum_ln(:,:,:) + smltrd_sum(:,:,:) 374 sml_sum (:,:) = sml_sum (:,:) + sml (:,:) 375 rmld_sum (:,:) = rmld_sum (:,:) + rmld (:,:) ! rmld 376 ! 377 END IF 378 379 ! ====================================================================== 380 ! III. Prepare fields for output (get here ONCE PER ANALYSIS PERIOD) 381 ! ====================================================================== 382 383 ! Convert to appropriate physical units 384 ! N.B. It may be useful to check IOIPSL time averaging with : 385 ! tmltrd (:,:,:) = 1. ; smltrd (:,:,:) = 1. 386 tmltrd(:,:,:) = tmltrd(:,:,:) * ucf ! (actually needed for 1:jpltrd-1, but trdmld(:,:,jpltrd) 387 smltrd(:,:,:) = smltrd(:,:,:) * ucf ! is no longer used, and is reset to 0. at next time step) 388 389 MODULO_NTRD : IF( MOD( kt, ntrd ) == 0 ) THEN ! nitend MUST be multiple of ntrd 390 ! 391 ztmltot (:,:) = 0.e0 ; zsmltot (:,:) = 0.e0 ! reset arrays to zero 392 ztmlres (:,:) = 0.e0 ; zsmlres (:,:) = 0.e0 393 ztmltot2(:,:) = 0.e0 ; zsmltot2(:,:) = 0.e0 394 ztmlres2(:,:) = 0.e0 ; zsmlres2(:,:) = 0.e0 395 396 zfn = float(nmoymltrd) ; zfn2 = zfn * zfn 397 398 ! III.1 Prepare fields for output ("instantaneous" diagnostics) 399 ! ------------------------------------------------------------- 400 401 !-- Compute total trends 402 ztmltot(:,:) = ( tml(:,:) - tmlbn(:,:) + tmlb(:,:) - tmlbb(:,:) ) / ( 2.*rdt ) 403 zsmltot(:,:) = ( sml(:,:) - smlbn(:,:) + smlb(:,:) - smlbb(:,:) ) / ( 2.*rdt ) 404 405 !-- Compute residuals 406 ztmlres(:,:) = ztmltot(:,:) - ( tmltrdm(:,:) - tmlatfn(:,:) + tmlatfb(:,:) ) 407 zsmlres(:,:) = zsmltot(:,:) - ( smltrdm(:,:) - smlatfn(:,:) + smlatfb(:,:) ) 408 409 !-- Diagnose Asselin trend over the analysis window 410 ztmlatf(:,:) = tmlatfm(:,:) - tmlatfn(:,:) + tmlatfb(:,:) 411 zsmlatf(:,:) = smlatfm(:,:) - smlatfn(:,:) + smlatfb(:,:) 412 413 !-- Lateral boundary conditions 414 ! ... temperature ... ... salinity ... 415 CALL lbc_lnk( ztmltot , 'T', 1. ) ; CALL lbc_lnk( zsmltot , 'T', 1. ) 416 CALL lbc_lnk( ztmlres , 'T', 1. ) ; CALL lbc_lnk( zsmlres , 'T', 1. ) 417 CALL lbc_lnk( ztmlatf , 'T', 1. ) ; CALL lbc_lnk( zsmlatf , 'T', 1. ) 418 419 #if defined key_diainstant 420 CALL ctl_stop( 'tml_trd : key_diainstant was never checked within trdmld. Comment this to proceed.') 421 #endif 422 ! III.2 Prepare fields for output ("mean" diagnostics) 423 ! ---------------------------------------------------- 424 425 !-- Update the ML depth time sum (to build the Leap-Frog time mean) 426 rmld_sum(:,:) = rmldbn(:,:) + 2 * ( rmld_sum(:,:) - rmld(:,:) ) + rmld(:,:) 427 428 !-- Compute temperature total trends 429 tml_sum (:,:) = tmlbn(:,:) + 2 * ( tml_sum(:,:) - tml(:,:) ) + tml(:,:) 430 ztmltot2(:,:) = ( tml_sum(:,:) - tml_sumb(:,:) ) / ( 2.*rdt ) ! now in degC/s 431 432 !-- Compute salinity total trends 433 sml_sum (:,:) = smlbn(:,:) + 2 * ( sml_sum(:,:) - sml(:,:) ) + sml(:,:) 434 zsmltot2(:,:) = ( sml_sum(:,:) - sml_sumb(:,:) ) / ( 2.*rdt ) ! now in psu/s 435 436 !-- Compute temperature residuals 437 DO jl = 1, jpltrd 438 ztmltrd2(:,:,jl) = tmltrd_csum_ub(:,:,jl) + tmltrd_csum_ln(:,:,jl) 439 END DO 440 441 ztmltrdm2(:,:) = 0.e0 442 DO jl = 1, jpltrd 443 ztmltrdm2(:,:) = ztmltrdm2(:,:) + ztmltrd2(:,:,jl) 444 END DO 445 446 ztmlres2(:,:) = ztmltot2(:,:) - & 447 ( ztmltrdm2(:,:) - tmltrd_sum(:,:,jpmld_atf) + tmltrd_atf_sumb(:,:) ) 448 449 !-- Compute salinity residuals 450 DO jl = 1, jpltrd 451 zsmltrd2(:,:,jl) = smltrd_csum_ub(:,:,jl) + smltrd_csum_ln(:,:,jl) 452 END DO 453 454 zsmltrdm2(:,:) = 0. 455 DO jl = 1, jpltrd 456 zsmltrdm2(:,:) = zsmltrdm2(:,:) + zsmltrd2(:,:,jl) 457 END DO 458 459 zsmlres2(:,:) = zsmltot2(:,:) - & 460 ( zsmltrdm2(:,:) - smltrd_sum(:,:,jpmld_atf) + smltrd_atf_sumb(:,:) ) 461 462 !-- Diagnose Asselin trend over the analysis window 463 ztmlatf2(:,:) = ztmltrd2(:,:,jpmld_atf) - tmltrd_sum(:,:,jpmld_atf) + tmltrd_atf_sumb(:,:) 464 zsmlatf2(:,:) = zsmltrd2(:,:,jpmld_atf) - smltrd_sum(:,:,jpmld_atf) + smltrd_atf_sumb(:,:) 465 466 !-- Lateral boundary conditions 467 ! ... temperature ... ... salinity ... 468 CALL lbc_lnk( ztmltot2, 'T', 1. ) ; CALL lbc_lnk( zsmltot2, 'T', 1. ) 469 CALL lbc_lnk( ztmlres2, 'T', 1. ) ; CALL lbc_lnk( zsmlres2, 'T', 1. ) 470 DO jl = 1, jpltrd 471 CALL lbc_lnk( ztmltrd2(:,:,jl), 'T', 1. ) ! \ these will be output 472 CALL lbc_lnk( zsmltrd2(:,:,jl), 'T', 1. ) ! / in the NetCDF trends file 473 END DO 474 475 ! III.3 Time evolution array swap 476 ! ------------------------------- 477 478 ! For T/S instantaneous diagnostics 479 ! ... temperature ... ... salinity ... 480 tmlbb (:,:) = tmlb (:,:) ; smlbb (:,:) = smlb (:,:) 481 tmlbn (:,:) = tml (:,:) ; smlbn (:,:) = sml (:,:) 482 tmlatfb(:,:) = tmlatfn(:,:) ; smlatfb(:,:) = smlatfn(:,:) 483 484 ! For T mean diagnostics 485 tmltrd_csum_ub (:,:,:) = zfn * tmltrd_sum(:,:,:) - tmltrd_csum_ln(:,:,:) 486 tml_sumb (:,:) = tml_sum(:,:) 487 tmltrd_atf_sumb(:,:) = tmltrd_sum(:,:,jpmld_atf) 488 489 ! For S mean diagnostics 490 smltrd_csum_ub (:,:,:) = zfn * smltrd_sum(:,:,:) - smltrd_csum_ln(:,:,:) 491 sml_sumb (:,:) = sml_sum(:,:) 492 smltrd_atf_sumb(:,:) = smltrd_sum(:,:,jpmld_atf) 493 494 ! ML depth 495 rmldbn (:,:) = rmld (:,:) 496 497 IF( ln_ctl ) THEN 498 IF( ln_trdmld_instant ) THEN 499 CALL prt_ctl(tab2d_1=tmlbb , clinfo1=' tmlbb - : ', mask1=tmask, ovlap=1) 500 CALL prt_ctl(tab2d_1=tmlbn , clinfo1=' tmlbn - : ', mask1=tmask, ovlap=1) 501 CALL prt_ctl(tab2d_1=tmlatfb , clinfo1=' tmlatfb - : ', mask1=tmask, ovlap=1) 502 ELSE 503 CALL prt_ctl(tab2d_1=tmlbn , clinfo1=' tmlbn - : ', mask1=tmask, ovlap=1) 504 CALL prt_ctl(tab2d_1=rmldbn , clinfo1=' rmldbn - : ', mask1=tmask, ovlap=1) 505 CALL prt_ctl(tab2d_1=tml_sumb , clinfo1=' tml_sumb - : ', mask1=tmask, ovlap=1) 506 CALL prt_ctl(tab2d_1=tmltrd_atf_sumb, clinfo1=' tmltrd_atf_sumb - : ', mask1=tmask, ovlap=1) 507 CALL prt_ctl(tab3d_1=tmltrd_csum_ub , clinfo1=' tmltrd_csum_ub - : ', mask1=tmask, ovlap=1, kdim=1) 508 END IF 509 END IF 510 511 ! III.4 Convert to appropriate physical units 512 ! ------------------------------------------- 513 514 ! ... temperature ... ... salinity ... 515 ztmltot (:,:) = ztmltot(:,:) * ucf/zfn ; zsmltot (:,:) = zsmltot(:,:) * ucf/zfn 516 ztmlres (:,:) = ztmlres(:,:) * ucf/zfn ; zsmlres (:,:) = zsmlres(:,:) * ucf/zfn 517 ztmlatf (:,:) = ztmlatf(:,:) * ucf/zfn ; zsmlatf (:,:) = zsmlatf(:,:) * ucf/zfn 518 519 tml_sum (:,:) = tml_sum (:,:) / (2*zfn) ; sml_sum (:,:) = sml_sum (:,:) / (2*zfn) 520 ztmltot2(:,:) = ztmltot2(:,:) * ucf/zfn2 ; zsmltot2(:,:) = zsmltot2(:,:) * ucf/zfn2 521 ztmltrd2(:,:,:) = ztmltrd2(:,:,:)* ucf/zfn2 ; zsmltrd2(:,:,:) = zsmltrd2(:,:,:)* ucf/zfn2 522 ztmlatf2(:,:) = ztmlatf2(:,:) * ucf/zfn2 ; zsmlatf2(:,:) = zsmlatf2(:,:) * ucf/zfn2 523 ztmlres2(:,:) = ztmlres2(:,:) * ucf/zfn2 ; zsmlres2(:,:) = zsmlres2(:,:) * ucf/zfn2 524 525 rmld_sum(:,:) = rmld_sum(:,:) / (2*zfn) ! similar to tml_sum and sml_sum 526 527 ! * Debugging information * 528 IF( lldebug ) THEN 529 ! 530 WRITE(numout,*) 531 WRITE(numout,*) 'trd_mld : write trends in the Mixed Layer for debugging process:' 532 WRITE(numout,*) '~~~~~~~ ' 533 WRITE(numout,*) ' TRA kt = ', kt, 'nmoymltrd = ', nmoymltrd 534 WRITE(numout,*) 535 WRITE(numout,*) ' >>>>>>>>>>>>>>>>>> TRA TEMPERATURE <<<<<<<<<<<<<<<<<<' 536 WRITE(numout,*) ' TRA ztmlres : ', SUM(ztmlres(:,:)) 537 WRITE(numout,*) ' TRA ztmltot : ', SUM(ztmltot(:,:)) 538 WRITE(numout,*) ' TRA tmltrdm : ', SUM(tmltrdm(:,:)) 539 WRITE(numout,*) ' TRA tmlatfb : ', SUM(tmlatfb(:,:)) 540 WRITE(numout,*) ' TRA tmlatfn : ', SUM(tmlatfn(:,:)) 541 DO jl = 1, jpltrd 542 WRITE(numout,*) ' * TRA TREND INDEX jpmld_xxx = jl = ', jl, & 543 & ' tmltrd : ', SUM(tmltrd(:,:,jl)) 544 END DO 545 WRITE(numout,*) ' TRA ztmlres (jpi/2,jpj/2) : ', ztmlres (jpi/2,jpj/2) 546 WRITE(numout,*) ' TRA ztmlres2(jpi/2,jpj/2) : ', ztmlres2(jpi/2,jpj/2) 547 WRITE(numout,*) 548 WRITE(numout,*) ' >>>>>>>>>>>>>>>>>> TRA SALINITY <<<<<<<<<<<<<<<<<<' 549 WRITE(numout,*) ' TRA zsmlres : ', SUM(zsmlres(:,:)) 550 WRITE(numout,*) ' TRA zsmltot : ', SUM(zsmltot(:,:)) 551 WRITE(numout,*) ' TRA smltrdm : ', SUM(smltrdm(:,:)) 552 WRITE(numout,*) ' TRA smlatfb : ', SUM(smlatfb(:,:)) 553 WRITE(numout,*) ' TRA smlatfn : ', SUM(smlatfn(:,:)) 554 DO jl = 1, jpltrd 555 WRITE(numout,*) ' * TRA TREND INDEX jpmld_xxx = jl = ', jl, & 556 & ' smltrd : ', SUM(smltrd(:,:,jl)) 557 END DO 558 WRITE(numout,*) ' TRA zsmlres (jpi/2,jpj/2) : ', zsmlres (jpi/2,jpj/2) 559 WRITE(numout,*) ' TRA zsmlres2(jpi/2,jpj/2) : ', zsmlres2(jpi/2,jpj/2) 560 ! 561 END IF 562 ! 563 END IF MODULO_NTRD 564 565 ! ====================================================================== 566 ! IV. Write trends in the NetCDF file 567 ! ====================================================================== 568 569 ! IV.1 Code for dimg mpp output 570 ! ----------------------------- 544 571 545 572 #if defined key_dimgout 546 ! code for dimg mpp output 547 IF ( MOD(kt,nwrite) == 0 ) THEN 548 WRITE(clmode,'(f5.1,a)' ) nwrite*rdt/86400.,' days average' 549 iyear = ndastp/10000 550 imon = (ndastp-iyear*10000)/100 551 iday = ndastp - imon*100 - iyear*10000 573 574 IF( MOD( kt, ntrd ) == 0 ) THEN 575 iyear = ndastp/10000 576 imon = (ndastp-iyear*10000)/100 577 iday = ndastp - imon*100 - iyear*10000 552 578 WRITE(clname,9000) TRIM(cexper),'MLDiags',iyear,imon,iday 553 cltext=TRIM(cexper)//' mld diags'//TRIM(clmode) 579 WRITE(clmode,'(f5.1,a)') ntrd*rdt/86400.,' days average' 580 cltext = TRIM(cexper)//' mld diags'//TRIM(clmode) 554 581 CALL dia_wri_dimg (clname, cltext, smltrd, jpltrd, '2') 555 9000 FORMAT(a,"_",a,"_y",i4.4,"m",i2.2,"d",i2.2,".dimgproc") 556 END IF 582 END IF 583 584 9000 FORMAT(a,"_",a,"_y",i4.4,"m",i2.2,"d",i2.2,".dimgproc") 557 585 558 586 #else 559 IF( kt >= nit000+1 ) THEN 560 561 ! define time axis 562 it= kt-nit000+1 563 IF( lwp .AND. MOD( kt, nwrite ) == 0 ) THEN 564 WRITE(numout,*) ' trd_mld : write NetCDF fields' 565 ENDIF 566 567 CALL histwrite( nidtrd,"somlttml",it,rmld ,ndimtrd1,ndextrd1) ! Mixed-layer depth 568 569 ! Temperature trends 570 ! ------------------ 571 CALL histwrite( nidtrd,"somltemp",it,tml ,ndimtrd1,ndextrd1) ! Mixed-layer temperature 572 CALL histwrite( nidtrd,"somlttto",it,ztmltot ,ndimtrd1,ndextrd1) ! total 573 CALL histwrite( nidtrd,"somlttax",it,tmltrd(:,:, 1),ndimtrd1,ndextrd1) ! i- adv. 574 CALL histwrite( nidtrd,"somlttay",it,tmltrd(:,:, 2),ndimtrd1,ndextrd1) ! j- adv. 575 CALL histwrite( nidtrd,"somlttaz",it,tmltrd(:,:, 3),ndimtrd1,ndextrd1) ! vertical adv. 576 CALL histwrite( nidtrd,"somlttdh",it,tmltrd(:,:, 4),ndimtrd1,ndextrd1) ! hor. lateral diff. 577 CALL histwrite( nidtrd,"somlttfo",it,tmltrd(:,:, 5),ndimtrd1,ndextrd1) ! forcing 578 579 CALL histwrite( nidtrd,"somlbtdz",it,tmltrd(:,:, 6),ndimtrd1,ndextrd1) ! vert. diffusion 580 CALL histwrite( nidtrd,"somlbtdt",it,ztmlres ,ndimtrd1,ndextrd1) ! dh/dt entrainment (residual) 581 IF( ln_traldf_iso ) THEN 582 CALL histwrite( nidtrd,"somlbtdv",it,tmltrd(:,:, 7),ndimtrd1,ndextrd1) ! vert. lateral diff. 583 ENDIF 584 #if defined key_traldf_eiv 585 CALL histwrite( nidtrd,"somlgtax",it,tmltrd(:,:, 8),ndimtrd1,ndextrd1) ! i- adv. (eiv) 586 CALL histwrite( nidtrd,"somlgtay",it,tmltrd(:,:, 9),ndimtrd1,ndextrd1) ! j- adv. (eiv) 587 CALL histwrite( nidtrd,"somlgtaz",it,tmltrd(:,:,10),ndimtrd1,ndextrd1) ! vert. adv. (eiv) 588 z2d(:,:) = tmltrd(:,:,8) + tmltrd(:,:,9) + tmltrd(:,:,10) 589 CALL histwrite( nidtrd,"somlgtat",it,z2d ,ndimtrd1,ndextrd1) ! total adv. (eiv) 590 #endif 591 592 ! Salinity trends 593 ! --------------- 594 CALL histwrite( nidtrd,"somlsalt",it,sml ,ndimtrd1,ndextrd1) ! Mixed-layer salinity 595 CALL histwrite( nidtrd,"somltsto",it,zsmltot ,ndimtrd1,ndextrd1) ! total 596 CALL histwrite( nidtrd,"somltsax",it,smltrd(:,:, 1),ndimtrd1,ndextrd1) ! i- adv. 597 CALL histwrite( nidtrd,"somltsay",it,smltrd(:,:, 2),ndimtrd1,ndextrd1) ! j- adv. 598 CALL histwrite( nidtrd,"somltsaz",it,smltrd(:,:, 3),ndimtrd1,ndextrd1) ! vert. adv. 599 CALL histwrite( nidtrd,"somltsdh",it,smltrd(:,:, 4),ndimtrd1,ndextrd1) ! hor. lateral diff. 600 CALL histwrite( nidtrd,"somltsfo",it,smltrd(:,:, 5),ndimtrd1,ndextrd1) ! forcing 601 CALL histwrite( nidtrd,"somlbsdz",it,smltrd(:,:, 6),ndimtrd1,ndextrd1) ! vert. diff. 602 CALL histwrite( nidtrd,"somlbsdt",it,zsmlres ,ndimtrd1,ndextrd1) ! dh/dt entrainment (residual) 603 IF( ln_traldf_iso ) THEN 604 CALL histwrite( nidtrd,"somlbsdv",it,smltrd(:,:, 7),ndimtrd1,ndextrd1) ! vert. lateral diff; 605 ENDIF 606 #if defined key_traldf_eiv 607 CALL histwrite( nidtrd,"somlgsax",it,smltrd(:,:, 8),ndimtrd1,ndextrd1) ! i-adv. (eiv) 608 CALL histwrite( nidtrd,"somlgsay",it,smltrd(:,:, 9),ndimtrd1,ndextrd1) ! j-adv. (eiv) 609 CALL histwrite( nidtrd,"somlgsaz",it,smltrd(:,:,10),ndimtrd1,ndextrd1) ! vert. adv. (eiv) 610 z2d(:,:) = smltrd(:,:,8) + smltrd(:,:,9) + smltrd(:,:,10) 611 CALL histwrite( nidtrd,"somlgsat",it,z2d ,ndimtrd1,ndextrd1) ! total adv. (eiv) 587 588 ! IV.2 Code for IOIPSL/NetCDF output 589 ! ---------------------------------- 590 591 IF( lwp .AND. MOD( kt , ntrd ) == 0 ) THEN 592 WRITE(numout,*) ' ' 593 WRITE(numout,*) 'trd_mld : write trends in the NetCDF file :' 594 WRITE(numout,*) '~~~~~~~ ' 595 WRITE(numout,*) ' ', TRIM(clhstnam), ' at kt = ', kt 596 WRITE(numout,*) ' N.B. nmoymltrd = ', nmoymltrd 597 WRITE(numout,*) ' ' 598 END IF 599 600 it = kt - nit000 + 1 601 602 !-- Write the trends for T/S instantaneous diagnostics 603 IF( ln_trdmld_instant ) THEN 604 605 CALL histwrite( nidtrd, "mxl_depth", it, rmld(:,:), ndimtrd1, ndextrd1 ) 606 607 !................................. ( ML temperature ) ................................... 608 609 !-- Output the fields 610 CALL histwrite( nidtrd, "tml" , it, tml (:,:), ndimtrd1, ndextrd1 ) 611 CALL histwrite( nidtrd, "tml_tot" , it, ztmltot(:,:), ndimtrd1, ndextrd1 ) 612 CALL histwrite( nidtrd, "tml_res" , it, ztmlres(:,:), ndimtrd1, ndextrd1 ) 613 614 DO jl = 1, jpltrd - 1 615 CALL histwrite( nidtrd, trim("tml"//ctrd(jl,2)), & 616 & it, tmltrd (:,:,jl), ndimtrd1, ndextrd1 ) 617 END DO 618 619 CALL histwrite( nidtrd, trim("tml"//ctrd(jpmld_atf,2)), & 620 & it, ztmlatf(:,:), ndimtrd1, ndextrd1 ) 621 622 !.................................. ( ML salinity ) ..................................... 623 624 !-- Output the fields 625 CALL histwrite( nidtrd, "sml" , it, sml (:,:), ndimtrd1, ndextrd1 ) 626 CALL histwrite( nidtrd, "sml_tot" , it, zsmltot(:,:), ndimtrd1, ndextrd1 ) 627 CALL histwrite( nidtrd, "sml_res" , it, zsmlres(:,:), ndimtrd1, ndextrd1 ) 628 629 DO jl = 1, jpltrd - 1 630 CALL histwrite( nidtrd, trim("sml"//ctrd(jl,2)), & 631 & it, smltrd(:,:,jl), ndimtrd1, ndextrd1 ) 632 END DO 633 634 CALL histwrite( nidtrd, trim("sml"//ctrd(jpmld_atf,2)), & 635 & it, zsmlatf(:,:), ndimtrd1, ndextrd1 ) 636 637 IF( kt == nitend ) CALL histclo( nidtrd ) 638 639 !-- Write the trends for T/S mean diagnostics 640 ELSE 641 642 CALL histwrite( nidtrd, "mxl_depth", it, rmld_sum(:,:), ndimtrd1, ndextrd1 ) 643 644 !................................. ( ML temperature ) ................................... 645 646 !-- Output the fields 647 CALL histwrite( nidtrd, "tml" , it, tml_sum (:,:), ndimtrd1, ndextrd1 ) 648 CALL histwrite( nidtrd, "tml_tot" , it, ztmltot2(:,:), ndimtrd1, ndextrd1 ) 649 CALL histwrite( nidtrd, "tml_res" , it, ztmlres2(:,:), ndimtrd1, ndextrd1 ) 650 651 DO jl = 1, jpltrd - 1 652 CALL histwrite( nidtrd, trim("tml"//ctrd(jl,2)), & 653 & it, ztmltrd2(:,:,jl), ndimtrd1, ndextrd1 ) 654 END DO 655 656 CALL histwrite( nidtrd, trim("tml"//ctrd(jpmld_atf,2)), & 657 & it, ztmlatf2(:,:), ndimtrd1, ndextrd1 ) 658 659 !.................................. ( ML salinity ) ..................................... 660 661 !-- Output the fields 662 CALL histwrite( nidtrd, "sml" , it, sml_sum (:,:), ndimtrd1, ndextrd1 ) 663 CALL histwrite( nidtrd, "sml_tot" , it, zsmltot2(:,:), ndimtrd1, ndextrd1 ) 664 CALL histwrite( nidtrd, "sml_res" , it, zsmlres2(:,:), ndimtrd1, ndextrd1 ) 665 666 DO jl = 1, jpltrd - 1 667 CALL histwrite( nidtrd, trim("sml"//ctrd(jl,2)), & 668 & it, zsmltrd2(:,:,jl), ndimtrd1, ndextrd1 ) 669 END DO 670 671 CALL histwrite( nidtrd, trim("sml"//ctrd(jpmld_atf,2)), & 672 & it, zsmlatf2(:,:), ndimtrd1, ndextrd1 ) 673 674 IF( kt == nitend ) CALL histclo( nidtrd ) 675 676 END IF 677 678 ! Compute the control surface (for next time step) : flag = on 679 icount = 1 680 ! 612 681 #endif 613 682 614 IF( idebug /= 0 ) THEN 615 WRITE(numout,*) ' debuging trd_mld: III.5 done' 616 CALL FLUSH(numout) 617 ENDIF 618 619 ! set counter icount to one to allow the calculation 620 ! of the surface control in the next time step in the trd_mld_zint subroutine 621 icount = 1 622 623 ENDIF 624 625 ! At the end of the 1st time step, set icount to 1 to be 626 ! able to compute the surface control at the beginning of 627 ! the second time step 628 IF( kt == nit000 ) icount = 1 629 630 IF( kt == nitend ) CALL histclo( nidtrd ) 631 #endif 683 IF( MOD( kt , ntrd ) == 0 ) THEN 684 ! 685 ! III.5 Reset cumulative arrays to zero 686 ! ------------------------------------- 687 nmoymltrd = 0 688 689 ! ... temperature ... ... salinity ... 690 tmltrdm (:,:) = 0.e0 ; smltrdm (:,:) = 0.e0 691 tmlatfm (:,:) = 0.e0 ; smlatfm (:,:) = 0.e0 692 tml_sum (:,:) = 0.e0 ; sml_sum (:,:) = 0.e0 693 tmltrd_csum_ln (:,:,:) = 0.e0 ; smltrd_csum_ln (:,:,:) = 0.e0 694 tmltrd_sum (:,:,:) = 0.e0 ; smltrd_sum (:,:,:) = 0.e0 695 696 rmld_sum (:,:) = 0.e0 697 ! 698 END IF 632 699 633 700 END SUBROUTINE trd_mld … … 642 709 !! from ocean surface down to control surface (NetCDF output) 643 710 !! 644 !! ** Method/usage :645 !!646 !! History :647 !! ! 95-04 (J. Vialard) Original code648 !! ! 97-02 (E. Guilyardi) Adaptation global + base cmo649 !! ! 99-09 (E. Guilyardi) Re-writing + netCDF output650 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module651 !! 9.0 ! 04-08 (C. Talandier) New trends organization652 711 !!---------------------------------------------------------------------- 653 712 !! * Local declarations 654 INTEGER :: ilseq 713 INTEGER :: ilseq, jl 655 714 656 715 REAL(wp) :: zjulian, zsto, zout 657 716 658 CHARACTER (LEN=21) :: &717 CHARACTER (LEN=21) :: & 659 718 clold ='OLD' , & ! open specifier (direct access files) 660 719 clunf ='UNFORMATTED', & ! open specifier (direct access files) 661 720 clseq ='SEQUENTIAL' ! open specifier (direct access files) 662 CHARACTER (LEN=40) :: clhstnam663 721 CHARACTER (LEN=40) :: clop 664 CHARACTER (LEN=12) :: clmxl 665 666 NAMELIST/namtrd/ ntrd, nctls 722 CHARACTER (LEN=12) :: clmxl, cltu, clsu 723 667 724 !!---------------------------------------------------------------------- 668 725 669 ! =================== 670 ! I. initialization 671 ! =================== 672 673 ! Open specifier 674 ilseq = 1 675 idebug = 0 ! set it to 1 in case of problem to have more print 676 icount = 1 677 ionce = 1 678 679 ! namelist namtrd : trend diagnostic 680 REWIND( numnam ) 681 READ ( numnam, namtrd ) 726 ! ====================================================================== 727 ! I. initialization 728 ! ====================================================================== 682 729 683 730 IF(lwp) THEN 684 WRITE(numout,*) ' ' 685 WRITE(numout,*) 'trd_mld_init: mixed layer heat & freshwater budget trends' 686 WRITE(numout,*) '~~~~~~~~~~~~~' 687 WRITE(numout,*) ' ' 688 WRITE(numout,*) ' Namelist namtrd : ' 689 WRITE(numout,*) ' control surface for trends nctls = ',nctls 690 WRITE(numout,*) ' ' 691 ENDIF 692 693 ! cumulated trends array init 731 WRITE(numout,*) 732 WRITE(numout,*) ' trd_mld_init : Mixed-layer trends' 733 WRITE(numout,*) ' ~~~~~~~~~~~~~' 734 WRITE(numout,*) ' namelist namtrd read in trd_mod_init ' 735 WRITE(numout,*) 736 END IF 737 738 ! I.1 Check consistency of user defined preferences 739 ! ------------------------------------------------- 740 741 IF( ( lk_trdmld ) .AND. ( MOD( nitend, ntrd ) /= 0 ) ) THEN 742 WRITE(numout,cform_err) 743 WRITE(numout,*) ' Your nitend parameter, nitend = ', nitend 744 WRITE(numout,*) ' is no multiple of the trends diagnostics frequency ' 745 WRITE(numout,*) ' you defined, ntrd = ', ntrd 746 WRITE(numout,*) ' This will not allow you to restart from this simulation. ' 747 WRITE(numout,*) ' You should reconsider this choice. ' 748 WRITE(numout,*) 749 WRITE(numout,*) ' N.B. the nitend parameter is also constrained to be a ' 750 WRITE(numout,*) ' multiple of the sea-ice frequency parameter (typically 5) ' 751 nstop = nstop + 1 752 END IF 753 754 IF( ( lk_trdmld ) .AND. ( n_cla == 1 ) ) THEN 755 WRITE(numout,cform_war) 756 WRITE(numout,*) ' You set n_cla = 1. Note that the Mixed-Layer diagnostics ' 757 WRITE(numout,*) ' are not exact along the corresponding straits. ' 758 nwarn = nwarn + 1 759 END IF 760 761 ! I.2 Initialize arrays to zero or read a restart file 762 ! ---------------------------------------------------- 763 694 764 nmoymltrd = 0 695 tmltrdm(:,:) = 0.e0 696 smltrdm(:,:) = 0.e0 697 698 ! read control surface from file ctlsurf_idx 699 765 766 ! ... temperature ... ... salinity ... 767 tml (:,:) = 0.e0 ; sml (:,:) = 0.e0 ! inst. 768 tmltrdm (:,:) = 0.e0 ; smltrdm (:,:) = 0.e0 769 tmlatfm (:,:) = 0.e0 ; smlatfm (:,:) = 0.e0 770 tml_sum (:,:) = 0.e0 ; sml_sum (:,:) = 0.e0 ! mean 771 tmltrd_sum (:,:,:) = 0.e0 ; smltrd_sum (:,:,:) = 0.e0 772 tmltrd_csum_ln (:,:,:) = 0.e0 ; smltrd_csum_ln (:,:,:) = 0.e0 773 774 rmld (:,:) = 0.e0 775 rmld_sum (:,:) = 0.e0 776 777 IF( ln_rstart .AND. ln_trdmld_restart ) THEN 778 CALL trd_mld_rst_read 779 ELSE 780 ! ... temperature ... ... salinity ... 781 tmlb (:,:) = 0.e0 ; smlb (:,:) = 0.e0 ! inst. 782 tmlbb (:,:) = 0.e0 ; smlbb (:,:) = 0.e0 783 tmlbn (:,:) = 0.e0 ; smlbn (:,:) = 0.e0 784 tml_sumb (:,:) = 0.e0 ; sml_sumb (:,:) = 0.e0 ! mean 785 tmltrd_csum_ub (:,:,:) = 0.e0 ; smltrd_csum_ub (:,:,:) = 0.e0 786 tmltrd_atf_sumb(:,:) = 0.e0 ; smltrd_atf_sumb(:,:) = 0.e0 787 END IF 788 789 ilseq = 1 ; icount = 1 ; ionce = 1 ! open specifier 790 791 ! I.3 Read control surface from file ctlsurf_idx 792 ! ---------------------------------------------- 793 700 794 IF( nctls == 1 ) THEN 701 clname ='ctlsurf_idx' 702 CALL ctlopn(numbol,clname,clold,clunf,clseq, & 703 ilseq,numout,lwp,1) 704 REWIND (numbol) 705 READ(numbol) nbol 706 ENDIF 707 708 709 IF( idebug /= 0 ) THEN 710 WRITE(numout,*) ' debuging trd_mld_init: 0. done ' 711 CALL FLUSH(numout) 712 ENDIF 713 714 ! =================================== 715 ! II. netCDF output initialization 716 ! =================================== 795 clname = 'ctlsurf_idx' 796 CALL ctlopn( numbol, clname, clold, clunf, clseq, ilseq, numout, lwp, 1 ) 797 REWIND( numbol ) 798 READ ( numbol ) nbol 799 END IF 800 801 ! ====================================================================== 802 ! II. netCDF output initialization 803 ! ====================================================================== 717 804 718 805 #if defined key_dimgout 719 806 ??? 720 807 #else 721 ! clmxl = legend root for netCDF output 722 IF( nctls == 0 ) THEN 723 ! control surface = mixed-layer with density criterion 724 ! (array nmln computed in zdfmxl.F90) 725 clmxl = 'Mixed Layer ' 726 ELSE IF( nctls == 1 ) THEN 727 ! control surface = read index from file 808 ! clmxl = legend root for netCDF output 809 IF( nctls == 0 ) THEN ! control surface = mixed-layer with density criterion 810 clmxl = 'Mixed Layer ' ! (array nmln computed in zdfmxl.F90) 811 ELSE IF( nctls == 1 ) THEN ! control surface = read index from file 728 812 clmxl = ' Bowl ' 729 ELSE IF( nctls >= 2 ) THEN 730 ! control surface = model level 731 WRITE(clmxl,'(A9,I2,1X)') 'Levels 1-', nctls 732 ENDIF 733 734 !----------------------------------------- 813 ELSE IF( nctls >= 2 ) THEN ! control surface = model level 814 WRITE(clmxl,'(A10,I2,1X)') 'Levels 1 -', nctls 815 END IF 816 735 817 ! II.1 Define frequency of output and means 736 818 ! ----------------------------------------- 737 738 #if defined key_diainstant 739 zsto = nwrite*rdt 740 clop ="inst(x)" 741 #else 742 zsto = rdt 743 clop ="ave(x)" 744 #endif 745 zout = nwrite*rdt 746 747 IF(lwp) WRITE (numout,*) ' trdmld_ncinit: netCDF initialization' 819 # if defined key_diainstant 820 IF( .NOT. ln_trdmld_instant ) THEN 821 CALL ctl_stop( 'trd_mld : this was never checked. Comment this line to proceed...' ) 822 END IF 823 zsto = ntrd * rdt 824 clop ="inst(only(x))" 825 # else 826 IF( ln_trdmld_instant ) THEN 827 zsto = rdt ! inst. diags : we use IOIPSL time averaging 828 ELSE 829 zsto = ntrd * rdt ! mean diags : we DO NOT use any IOIPSL time averaging 830 END IF 831 clop ="ave(only(x))" 832 # endif 833 zout = ntrd * rdt 834 835 IF(lwp) WRITE (numout,*) ' netCDF initialization' 748 836 749 837 ! II.2 Compute julian date from starting date of the run 750 ! ------------------------ 751 838 ! ------------------------------------------------------ 752 839 CALL ymds2ju( nyear, nmonth, nday, 0.e0, zjulian ) 753 IF 754 IF (lwp) WRITE(numout,*)' Date 0 used :',nit000&755 ,' YEAR ', nyear,' MONTH ', nmonth,' DAY ', nday&756 ,'Julian day : ', zjulian840 IF(lwp) WRITE(numout,*)' ' 841 IF(lwp) WRITE(numout,*)' Date 0 used :',nit000, & 842 & ' YEAR ', nyear,' MONTH ' , nmonth, & 843 & ' DAY ' , nday, 'Julian day : ', zjulian 757 844 758 845 759 846 ! II.3 Define the T grid trend file (nidtrd) 760 ! --------------------------------- 761 762 CALL dia_nam( clhstnam, nwrite, 'trends' ) ! filename 847 ! ------------------------------------------ 848 !-- Define long and short names for the NetCDF output variables 849 ! ==> choose them according to trdmld_oce.F90 <== 850 851 ctrd(jpmld_xad,1) = " Zonal advection" ; ctrd(jpmld_xad,2) = "_xad" 852 ctrd(jpmld_yad,1) = " Meridional advection" ; ctrd(jpmld_yad,2) = "_yad" 853 ctrd(jpmld_zad,1) = " Vertical advection" ; ctrd(jpmld_zad,2) = "_zad" 854 ctrd(jpmld_ldf,1) = " Lateral diffusion" ; ctrd(jpmld_ldf,2) = "_ldf" 855 ctrd(jpmld_for,1) = " Forcing" ; ctrd(jpmld_for,2) = "_for" 856 ctrd(jpmld_zdf,1) = " Vertical diff. (Kz)" ; ctrd(jpmld_zdf,2) = "_zdf" 857 ctrd(jpmld_bbc,1) = " Geothermal flux" ; ctrd(jpmld_bbc,2) = "_bbc" 858 ctrd(jpmld_bbl,1) = " Adv/diff. Bottom boundary layer" ; ctrd(jpmld_bbl,2) = "_bbl" 859 ctrd(jpmld_dmp,1) = " Tracer damping" ; ctrd(jpmld_dmp,2) = "_dmp" 860 ctrd(jpmld_npc,1) = " Non penetrative convec. adjust." ; ctrd(jpmld_npc,2) = "_npc" 861 ctrd(jpmld_atf,1) = " Asselin time filter" ; ctrd(jpmld_atf,2) = "_atf" 862 863 !-- Create a NetCDF file and enter the define mode 864 CALL dia_nam( clhstnam, ntrd, 'trends' ) 763 865 IF(lwp) WRITE(numout,*) ' Name of NETCDF file ', clhstnam 764 CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,1, jpi, & ! Horizontal grid : glamt and gphit 765 & 1, jpj, 0, zjulian, rdt, nh_t, nidtrd, domain_id=nidom ) 766 767 ! Declare output fields as netCDF variables 768 769 ! Mixed layer Depth 770 CALL histdef( nidtrd, "somlttml", clmxl//"Depth" , "m" , & ! hmlp 771 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 772 773 ! Temperature 774 CALL histdef( nidtrd, "somltemp", clmxl//"Temperature" , "C" , & ! ??? 775 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 776 ! Temperature trends 777 CALL histdef( nidtrd, "somlttto", clmxl//"T Total" , "C/s", & ! total 778 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) 779 CALL histdef( nidtrd, "somlttax", clmxl//"T Zonal Advection", "C/s", & ! i-adv. 780 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 781 CALL histdef( nidtrd, "somlttay", clmxl//"T Meridional Advection", "C/s", & ! j-adv. 782 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 783 CALL histdef( nidtrd, "somlttaz", clmxl//"T Vertical Advection", "C/s", & ! vert. adv. 784 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 785 CALL histdef( nidtrd, "somlttdh", clmxl//"T Horizontal Diffusion ", "C/s", & ! hor. lateral diff. 786 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 787 CALL histdef( nidtrd, "somlttfo", clmxl//"T Forcing", "C/s", & ! forcing 788 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 789 CALL histdef( nidtrd, "somlbtdz", clmxl//"T Vertical Diffusion", "C/s", & ! vert. diff. 790 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 791 CALL histdef( nidtrd, "somlbtdt", clmxl//"T dh/dt Entrainment (Residual)", "C/s", & ! T * dh/dt 792 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) 793 IF( ln_traldf_iso ) THEN 794 CALL histdef( nidtrd, "somlbtdv", clmxl//"T Vert. lateral Diffusion","C/s", & ! vertical diffusion entrainment (ISO) 795 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 796 ENDIF 797 #if defined key_traldf_eiv 798 CALL histdef( nidtrd, "somlgtax", clmxl//"T Zonal EIV Advection", "C/s", & ! i-adv. (eiv) 799 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 800 CALL histdef( nidtrd, "somlgtay", clmxl//"T Meridional EIV Advection", "C/s", & ! j-adv. (eiv) 801 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 802 CALL histdef( nidtrd, "somlgtaz", clmxl//"T Vertical EIV Advection", "C/s", & ! vert. adv. (eiv) 803 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 804 CALL histdef( nidtrd, "somlgtat", clmxl//"T Total EIV Advection", "C/s", & ! total advection (eiv) 805 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 806 #endif 807 ! Salinity 808 CALL histdef( nidtrd, "somlsalt", clmxl//"Salinity", "PSU", & ! Mixed-layer salinity 809 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 810 ! Salinity trends 811 CALL histdef( nidtrd, "somltsto", clmxl//"S Total", "PSU/s", & ! total 812 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 813 CALL histdef( nidtrd, "somltsax", clmxl//"S Zonal Advection", "PSU/s", & ! i-advection 814 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 815 CALL histdef( nidtrd, "somltsay", clmxl//"S Meridional Advection", "PSU/s", & ! j-advection 816 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 817 CALL histdef( nidtrd, "somltsaz", clmxl//"S Vertical Advection", "PSU/s", & ! vertical advection 818 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 819 CALL histdef( nidtrd, "somltsdh", clmxl//"S Horizontal Diffusion ", "PSU/s", & ! hor. lat. diff. 820 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 821 CALL histdef( nidtrd, "somltsfo", clmxl//"S Forcing", "PSU/s", & ! forcing 822 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 823 824 CALL histdef( nidtrd, "somlbsdz", clmxl//"S Vertical Diffusion", "PSU/s", & ! vert. diff. 825 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 826 CALL histdef( nidtrd, "somlbsdt", clmxl//"S dh/dt Entrainment (Residual)", "PSU/s", & ! S * dh/dt 827 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 828 IF( ln_traldf_iso ) THEN 829 ! vertical diffusion entrainment (ISO) 830 CALL histdef( nidtrd, "somlbsdv", clmxl//"S Vertical lateral Diffusion", "PSU/s", & ! vert. lat. diff. 831 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 832 ENDIF 833 #if defined key_traldf_eiv 834 CALL histdef( nidtrd, "somlgsax", clmxl//"S Zonal EIV Advection", "PSU/s", & ! i-advection (eiv) 835 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 836 CALL histdef( nidtrd, "somlgsay", clmxl//"S Meridional EIV Advection", "PSU/s", & ! j-advection (eiv) 837 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 838 CALL histdef( nidtrd, "somlgsaz", clmxl//"S Vertical EIV Advection", "PSU/s", & ! vert. adv. (eiv) 839 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 840 CALL histdef( nidtrd, "somlgsat", clmxl//"S Total EIV Advection", "PSU/s", & ! total adv. (eiv) 841 & jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 842 #endif 866 CALL histbeg( clhstnam, jpi, glamt, jpj, gphit, & 867 & 1, jpi, 1, jpj, 0, zjulian, rdt, nh_t, nidtrd, domain_id=nidom ) 868 869 !-- Define the ML depth variable 870 CALL histdef(nidtrd, "mxl_depth", clmxl//" Mixed Layer Depth" , "m", & 871 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 872 873 !-- Define physical units 874 IF( ucf == 1. ) THEN 875 cltu = "degC/s" ; clsu = "p.s.u./s" 876 ELSEIF ( ucf == 3600.*24.) THEN 877 cltu = "degC/day" ; clsu = "p.s.u./day" 878 ELSE 879 cltu = "unknown?" ; clsu = "unknown?" 880 END IF 881 882 !-- Define miscellaneous T and S mixed-layer variables 883 884 IF( jpltrd /= jpmld_atf ) CALL ctl_stop( 'Error : jpltrd /= jpmld_atf' ) ! see below 885 886 !................................. ( ML temperature ) ................................... 887 888 CALL histdef(nidtrd, "tml" , clmxl//" T Mixed Layer Temperature" , "C", & 889 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 890 CALL histdef(nidtrd, "tml_tot", clmxl//" T Total trend" , cltu, & 891 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) 892 CALL histdef(nidtrd, "tml_res", clmxl//" T dh/dt Entrainment (Resid.)" , cltu, & 893 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) 894 895 DO jl = 1, jpltrd - 1 ! <== only true if jpltrd == jpmld_atf 896 CALL histdef(nidtrd, trim("tml"//ctrd(jl,2)), clmxl//" T"//ctrd(jl,1), cltu, & 897 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) ! IOIPSL: time mean 898 END DO ! if zsto=rdt above 899 900 CALL histdef(nidtrd, trim("tml"//ctrd(jpmld_atf,2)), clmxl//" T"//ctrd(jpmld_atf,1), cltu, & 901 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) ! IOIPSL: NO time mean 902 903 !.................................. ( ML salinity ) ..................................... 904 905 CALL histdef(nidtrd, "sml" , clmxl//" S Mixed Layer Salinity" , "p.s.u.", & 906 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) 907 CALL histdef(nidtrd, "sml_tot", clmxl//" S Total trend" , clsu, & 908 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) 909 CALL histdef(nidtrd, "sml_res", clmxl//" S dh/dt Entrainment (Resid.)" , clsu, & 910 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) 911 912 DO jl = 1, jpltrd - 1 ! <== only true if jpltrd == jpmld_atf 913 CALL histdef(nidtrd, trim("sml"//ctrd(jl,2)), clmxl//" S"//ctrd(jl,1), clsu, & 914 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) ! IOIPSL: time mean 915 END DO ! if zsto=rdt above 916 917 CALL histdef(nidtrd, trim("sml"//ctrd(jpmld_atf,2)), clmxl//" S"//ctrd(jpmld_atf,1), clsu, & 918 jpi, jpj, nh_t, 1 , 1, 1 , -99 , 32, clop, zout, zout ) ! IOIPSL: NO time mean 919 920 !-- Leave IOIPSL/NetCDF define mode 843 921 CALL histend( nidtrd ) 844 #endif 845 846 IF( idebug /= 0 ) THEN 847 WRITE(numout,*) ' debuging trd_mld_init: II. done' 848 CALL FLUSH(numout) 849 ENDIF 850 851 852 END SUBROUTINE trd_mld_init 922 923 #endif /* key_dimgout */ 924 END SUBROUTINE trd_mld_init 853 925 854 926 #else … … 856 928 !! Default option : Empty module 857 929 !!---------------------------------------------------------------------- 858 LOGICAL, PUBLIC, PARAMETER :: lk_trdmld = .FALSE. !: momentum trend flag859 930 CONTAINS 860 931 SUBROUTINE trd_mld( kt ) ! Empty routine -
trunk/NEMO/OPA_SRC/TRD/trdmld_oce.F90
r247 r503 4 4 !! Ocean trends : set tracer and momentum trend variables 5 5 !!====================================================================== 6 !! History : 9.0 ! 04-08 (C. Talandier) New trends organization 6 7 !!---------------------------------------------------------------------- 7 !! OPA 9.0 , LOCEAN-IPSL (2005)8 !! $Header$9 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt10 !!----------------------------------------------------------------------11 !!----------------------------------------------------------------------12 !! * Modules used13 8 USE par_oce ! ocean parameters 14 9 15 10 IMPLICIT NONE 16 P UBLIC11 PRIVATE 17 12 18 INTEGER, PARAMETER :: & !: mixed layer trends index 19 jpmldxad = 1, & !: zonal advection 20 jpmldyad = 2, & !: meridionnal advection 21 jpmldzad = 3, & !: vertical advection 22 jpmldldf = 4, & !: lateral diffusion (horiz. component+Beckman) 23 jpmldfor = 5, & !: forcing 24 jpmldevd = 6, & !: entrainment due to vertical diffusion (TKE) 25 jpmldzdf = 7, & !: explicit vertical part if isopycnal diffusion 26 jpmldxei = 8, & !: eddy induced zonal advection 27 jpmldyei = 9, & !: eddy induced meridional advection 28 jpmldzei =10 !: eddy induced vertical advection 13 #if defined key_trdmld 14 LOGICAL, PUBLIC, PARAMETER :: lk_trdmld = .TRUE. !: ML trend flag 15 #else 16 LOGICAL, PUBLIC, PARAMETER :: lk_trdmld = .FALSE. !: ML trend flag 17 #endif 18 !!* mixed layer trends indices 19 INTEGER, PARAMETER, PUBLIC :: jpltrd = 11 !: number of mixed-layer trends arrays 20 INTEGER, PARAMETER, PUBLIC :: jpktrd = jpk !: max level for mixed-layer trends diag. 21 ! 22 INTEGER, PUBLIC, PARAMETER :: jpmld_xad = 1 !: zonal \ 23 INTEGER, PUBLIC, PARAMETER :: jpmld_yad = 2 !: meridonal > advection 24 INTEGER, PUBLIC, PARAMETER :: jpmld_zad = 3 !: vertical / 25 INTEGER, PUBLIC, PARAMETER :: jpmld_ldf = 4 !: lateral diffusion (geopot. or iso-neutral) 26 INTEGER, PUBLIC, PARAMETER :: jpmld_for = 5 !: forcing 27 INTEGER, PUBLIC, PARAMETER :: jpmld_zdf = 6 !: vertical diffusion (TKE) 28 INTEGER, PUBLIC, PARAMETER :: jpmld_bbc = 7 !: geothermal flux 29 INTEGER, PUBLIC, PARAMETER :: jpmld_bbl = 8 !: bottom boundary layer (advective/diffusive) 30 INTEGER, PUBLIC, PARAMETER :: jpmld_dmp = 9 !: internal restoring trend 31 INTEGER, PUBLIC, PARAMETER :: jpmld_npc = 10 !: non penetrative convective adjustment 32 INTEGER, PUBLIC, PARAMETER :: jpmld_atf = 11 !: asselin trend 33 !! INTEGER, PUBLIC, PARAMETER :: jpmld_xxx = xx !: add here any additional trend (add change jpltrd) 29 34 30 35 #if defined key_trdmld || defined key_esopa … … 33 38 !!---------------------------------------------------------------------- 34 39 35 !! Trends diagnostics parameters40 !! Arrays used for diagnosing mixed-layer trends 36 41 !!--------------------------------------------------------------------- 37 INTEGER, PARAMETER :: & !: 38 # if defined key_traldf_eiv 39 jpltrd = 10, & !: number of mixed-layer trends arrays 40 jpktrd = jpk !: max level for mixed-layer trends diag. 41 # else 42 jpltrd = 7, & !: number of mixed-layer trends arrays 43 jpktrd = jpk !: max level for mixed-layer trends diag. 44 # endif 42 CHARACTER(LEN=80) , PUBLIC :: clname, ctrd(jpltrd+1,2) 45 43 44 INTEGER , PUBLIC, DIMENSION(jpi,jpj) :: nmld !: mixed layer depth indexes 45 INTEGER , PUBLIC, DIMENSION(jpi,jpj) :: nbol !: mixed-layer depth indexes when read from file 46 47 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: wkx !: 48 49 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & 50 rmld , & !: mld depth (m) corresponding to nmld 51 tml , sml , & !: \ "now" mixed layer temperature/salinity 52 tmlb , smlb , & !: / and associated "before" fields 53 tmlbb , smlbb, & !: \ idem, but valid at the 1rst time step of the 54 tmlbn , smlbn, & !: / current analysis window 55 tmltrdm, smltrdm, & !: total cumulative trends over the analysis window 56 tml_sum, & !: mixed layer T, summed over the current analysis period 57 tml_sumb, & !: idem, but from the previous analysis period 58 tmltrd_atf_sumb, & !: Asselin trends, summed over the previous analysis period 59 sml_sum, & !: 60 sml_sumb, & !: ( idem for salinity ) 61 smltrd_atf_sumb, & !: 62 rmld_sum, rmldbn !: needed to compute the leap-frog time mean of the ML depth 63 64 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & 65 tmlatfb, tmlatfn , & !: "before" Asselin contribution at begining of the averaging 66 smlatfb, smlatfn, & !: period (i.e. last contrib. from previous such period) and 67 !: "now" Asselin contribution to the ML temp. & salinity trends 68 tmlatfm, smlatfm !: accumulator for Asselin trends (needed for storage only) 69 70 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpltrd) :: & 71 tmltrd, & !: \ physical contributions to the total trend (for T/S), 72 smltrd, & !: / cumulated over the current analysis window 73 tmltrd_sum, & !: sum of these trends over the analysis period 74 tmltrd_csum_ln, & !: now cumulated sum of the trends over the "lower triangle" 75 tmltrd_csum_ub, & !: before (prev. analysis period) cumulated sum over the upper triangle 76 smltrd_sum, & !: 77 smltrd_csum_ln, & !: ( idem for salinity ) 78 smltrd_csum_ub !: 46 79 #endif 47 !!====================================================================== 80 !!---------------------------------------------------------------------- 81 !! OPA 9.0 , LOCEAN-IPSL (2005) 82 !! $Header$ 83 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 84 !!====================================================================== 48 85 END MODULE trdmld_oce -
trunk/NEMO/OPA_SRC/TRD/trdmod.F90
r462 r503 4 4 !! Ocean diagnostics: ocean tracers and dynamic trends 5 5 !!===================================================================== 6 !! History : 9.0 ! 04-08 (C. Talandier) Original code 7 !! ! 05-04 (C. Deltel) Add Asselin trend in the ML budget 8 !!---------------------------------------------------------------------- 6 9 #if defined key_trdtra || defined key_trddyn || defined key_trdmld || defined key_trdvor || defined key_esopa 7 10 !!---------------------------------------------------------------------- 8 11 !! trd_mod : Call the trend to be computed 9 !!---------------------------------------------------------------------- 10 !! * Modules used 12 !! trd_mod_init : Initialization step 13 !!---------------------------------------------------------------------- 14 USE phycst ! physical constants 11 15 USE oce ! ocean dynamics and tracers variables 12 16 USE dom_oce ! ocean space and time domain variables 17 USE zdf_oce ! ocean vertical physics variables 13 18 USE trdmod_oce ! ocean variables trends 19 USE ldftra_oce ! ocean active tracers lateral physics 14 20 USE trdvor ! ocean vorticity trends 15 21 USE trdicp ! ocean bassin integral constraints properties 16 22 USE trdmld ! ocean active mixed layer tracers trends 17 USE trabbl ! bottom boundary layer variables18 23 USE in_out_manager ! I/O manager 24 USE taumod ! surface ocean stress 19 25 20 26 IMPLICIT NONE 21 27 PRIVATE 22 28 23 !! * Routine accessibility 24 PUBLIC trd_mod ! called by all dynXX or traXX modules 29 REAL(wp) :: r2dt ! time-step, = 2 rdttra except at nit000 (=rdttra) if neuler=0 30 31 PUBLIC trd_mod ! called by all dynXX or traXX modules 32 PUBLIC trd_mod_init ! called by opa.F90 module 25 33 26 34 !! * Substitutions … … 30 38 !! OPA 9.0 , LOCEAN-IPSL (2005) 31 39 !! $Header$ 32 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt40 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 33 41 !!---------------------------------------------------------------------- 34 42 35 43 CONTAINS 36 44 37 SUBROUTINE trd_mod( ptrdx, ptrdy, ktrd, ctype, kt)45 SUBROUTINE trd_mod( ptrdx, ptrdy, ktrd, ctype, kt, cnbpas ) 38 46 !!--------------------------------------------------------------------- 39 47 !! *** ROUTINE trd_mod *** 40 48 !! 41 49 !! ** Purpose : Dispatch all trends computation, e.g. vorticity, mld or 42 !! integral constrains 50 !! integral constraints 51 !!---------------------------------------------------------------------- 52 INTEGER, INTENT( in ) :: kt ! time step 53 INTEGER, INTENT( in ) :: ktrd ! tracer trend index 54 CHARACTER(len=3), INTENT( in ) :: ctype ! momentum or tracers trends type 'DYN'/'TRA' 55 CHARACTER(len=3), INTENT( in ), OPTIONAL :: cnbpas ! number of passage 56 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: ptrdx ! Temperature or U trend 57 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: ptrdy ! Salinity or V trend 43 58 !! 44 !! ** Method : 45 !! 46 !! History : 47 !! 9.0 ! 04-08 (C. Talandier) New trends organization 48 !!---------------------------------------------------------------------- 49 !! * Modules used 50 #if defined key_trabbl_adv 51 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & ! temporary arrays 52 & zun, zvn 53 #else 54 USE oce , zun => un, & ! When no bbl, zun == un 55 & zvn => vn ! When no bbl, zvn == vn 56 #endif 57 58 !! * Arguments 59 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: & 60 ptrdx, & ! Temperature or U trend 61 ptrdy ! Salinity or V trend 62 63 INTEGER, INTENT( in ) :: & 64 kt , & ! time step 65 ktrd ! tracer trend index 66 67 CHARACTER(len=3), INTENT( in ) :: & 68 ctype ! momentum or tracers trends type 69 ! ! 'DYN' or 'TRA' 70 71 !! * Local save 72 REAL(wp), DIMENSION(jpi,jpj), SAVE :: & 73 zbtr2 74 75 !! * Local declarations 76 INTEGER :: ji, jj, jk ! loop indices 77 REAL(wp) :: & 78 zbtr, & ! temporary scalars 79 zfui, zfvj, & ! " " 80 zfui1, zfvj1 ! " " 81 REAL(wp), DIMENSION(jpi,jpj) :: & 82 z2dx, z2dy ! workspace arrays 83 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 84 z3dx, z3dy ! workspace arrays 85 !!---------------------------------------------------------------------- 86 87 ! Initialization of workspace arrays 88 z3dx(:,:,:) = 0.e0 89 z3dy(:,:,:) = 0.e0 90 z2dx(:,:) = 0.e0 91 z2dy(:,:) = 0.e0 59 INTEGER :: ji, ikbu, ikbum1 60 INTEGER :: jj, ikbv, ikbvm1 61 CHARACTER(len=3) :: clpas ! number of passage 62 REAL(wp) :: zua, zva ! scalars 63 REAL(wp), DIMENSION(jpi,jpj) :: ztswu, ztswv ! 2D workspace 64 REAL(wp), DIMENSION(jpi,jpj) :: ztbfu, ztbfv ! 2D workspace 65 REAL(wp), DIMENSION(jpi,jpj) :: z2dx, z2dy ! workspace arrays 66 !!---------------------------------------------------------------------- 67 68 z2dx(:,:) = 0.e0 ; z2dy(:,:) = 0.e0 ! initialization of workspace arrays 69 70 ! Control of optional arguments 71 clpas = 'fst' 72 IF( PRESENT(cnbpas) ) clpas = cnbpas 73 74 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdtra (restarting with Euler time stepping) 75 ELSEIF( kt <= nit000 + 1) THEN ; r2dt = 2. * rdt ! = 2 rdttra (leapfrog) 76 ENDIF 92 77 93 78 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 94 ! I. Bassin averaged properties for momentum and/or tracers trends79 ! I. Integral Constraints Properties for momentum and/or tracers trends 95 80 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 96 81 97 82 IF( ( mod(kt,ntrd) == 0 .OR. kt == nit000 .OR. kt == nitend) ) THEN 98 99 ! Active tracers trends 100 IF( lk_trdtra .AND. ctype == 'TRA' ) THEN 101 102 IF( ktrd == jpttdnsr ) THEN 103 ! 2D array tracers surface forcing 104 z2dx(:,:) = ptrdx(:,:,1) 105 z2dy(:,:) = ptrdy(:,:,1) 106 107 CALL trd(z2dx, z2dy, ktrd, ctype) 108 ELSE 109 ! 3D array 110 CALL trd(ptrdx, ptrdy, ktrd, ctype) 111 ENDIF 112 113 ENDIF 114 115 ! Momentum trends 116 IF( lk_trddyn .AND. ctype == 'DYN' ) THEN 117 118 IF( ktrd == jpdtdswf .OR. ktrd == jpdtdbfr ) THEN 119 ! momentum surface forcing/bottom friction 2D array 120 z2dx(:,:) = ptrdx(:,:,1) 121 z2dy(:,:) = ptrdy(:,:,1) 122 123 CALL trd(z2dx, z2dy, ktrd, ctype) 124 ELSE 125 ! 3D array 126 CALL trd(ptrdx, ptrdy, ktrd, ctype) 127 ENDIF 128 129 ENDIF 130 131 ENDIF 83 ! 84 IF( lk_trdtra .AND. ctype == 'TRA' ) THEN ! active tracer trends 85 SELECT CASE ( ktrd ) 86 CASE ( jptra_trd_ldf ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_ldf, ctype ) ! lateral diff 87 CASE ( jptra_trd_zdf ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_zdf, ctype ) ! vertical diff (Kz) 88 CASE ( jptra_trd_bbc ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_bbc, ctype ) ! bottom boundary cond 89 CASE ( jptra_trd_bbl ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_bbl, ctype ) ! bottom boundary layer 90 CASE ( jptra_trd_npc ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_npc, ctype ) ! static instability mixing 91 CASE ( jptra_trd_dmp ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_dmp, ctype ) ! damping 92 CASE ( jptra_trd_qsr ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_qsr, ctype ) ! penetrative solar radiat. 93 CASE ( jptra_trd_nsr ) 94 z2dx(:,:) = ptrdx(:,:,1) ; z2dy(:,:) = ptrdy(:,:,1) 95 CALL trd_icp( z2dx, z2dy, jpicpt_nsr, ctype ) ! non solar radiation 96 CASE ( jptra_trd_xad ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_xad, ctype ) ! x- horiz adv 97 CASE ( jptra_trd_yad ) ; CALL trd_icp( ptrdx, ptrdy, jpicpt_yad, ctype ) ! y- horiz adv 98 CASE ( jptra_trd_zad ) ! z- vertical adv 99 CALL trd_icp( ptrdx, ptrdy, jpicpt_zad, ctype, clpas ) 100 ! compute the surface flux condition wn(:,:,1)*tn(:,:,1) 101 z2dx(:,:) = wn(:,:,1)*tn(:,:,1)/fse3t(:,:,1) 102 z2dy(:,:) = wn(:,:,1)*sn(:,:,1)/fse3t(:,:,1) 103 CALL trd_icp( z2dx , z2dy , jpicpt_zl1, ctype ) ! 1st z- vertical adv 104 END SELECT 105 END IF 106 107 IF( lk_trddyn .AND. ctype == 'DYN' ) THEN ! momentum trends 108 ! 109 SELECT CASE ( ktrd ) 110 CASE ( jpdyn_trd_hpg ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_hpg, ctype ) ! hydrost. pressure grad 111 CASE ( jpdyn_trd_keg ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_keg, ctype ) ! KE gradient 112 CASE ( jpdyn_trd_rvo ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_rvo, ctype ) ! relative vorticity 113 CASE ( jpdyn_trd_pvo ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_pvo, ctype ) ! planetary vorticity 114 CASE ( jpdyn_trd_ldf ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_ldf, ctype ) ! lateral diffusion 115 CASE ( jpdyn_trd_zad ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_zad, ctype ) ! vertical advection 116 CASE ( jpdyn_trd_spg ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_spg, ctype ) ! surface pressure grad. 117 CASE ( jpdyn_trd_dat ) ; CALL trd_icp( ptrdx, ptrdy, jpicpd_dat, ctype ) ! damping term 118 CASE ( jpdyn_trd_zdf ) ! vertical diffusion 119 ! subtract surface forcing/bottom friction trends 120 ! from vertical diffusive momentum trends 121 ztswu(:,:) = 0.e0 ; ztswv(:,:) = 0.e0 122 ztbfu(:,:) = 0.e0 ; ztbfv(:,:) = 0.e0 123 DO jj = 2, jpjm1 124 DO ji = fs_2, fs_jpim1 ! vector opt. 125 ! save the surface forcing momentum fluxes 126 ztswu(ji,jj) = taux(ji,jj) / ( fse3u(ji,jj,1)*rau0 ) 127 ztswv(ji,jj) = tauy(ji,jj) / ( fse3v(ji,jj,1)*rau0 ) 128 ! save bottom friction momentum fluxes 129 ikbu = MIN( mbathy(ji+1,jj ), mbathy(ji,jj) ) 130 ikbv = MIN( mbathy(ji ,jj+1), mbathy(ji,jj) ) 131 ikbum1 = MAX( ikbu-1, 1 ) 132 ikbvm1 = MAX( ikbv-1, 1 ) 133 zua = ua(ji,jj,ikbum1) * r2dt + ub(ji,jj,ikbum1) 134 zva = va(ji,jj,ikbvm1) * r2dt + vb(ji,jj,ikbvm1) 135 ztbfu(ji,jj) = - avmu(ji,jj,ikbu) * zua / ( fse3u(ji,jj,ikbum1)*fse3uw(ji,jj,ikbu) ) 136 ztbfv(ji,jj) = - avmv(ji,jj,ikbv) * zva / ( fse3v(ji,jj,ikbvm1)*fse3vw(ji,jj,ikbv) ) 137 ! 138 ptrdx(ji,jj,1 ) = ptrdx(ji,jj,1 ) - ztswu(ji,jj) 139 ptrdy(ji,jj,1 ) = ptrdy(ji,jj,1 ) - ztswv(ji,jj) 140 ptrdx(ji,jj,ikbum1) = ptrdx(ji,jj,ikbum1) - ztbfu(ji,jj) 141 ptrdy(ji,jj,ikbvm1) = ptrdy(ji,jj,ikbvm1) - ztbfv(ji,jj) 142 END DO 143 END DO 144 ! 145 CALL trd_icp( ptrdx, ptrdy, jpicpd_zdf, ctype ) 146 CALL trd_icp( ztswu, ztswv, jpicpd_swf, ctype ) ! wind stress forcing term 147 CALL trd_icp( ztbfu, ztbfv, jpicpd_bfr, ctype ) ! bottom friction term 148 END SELECT 149 ! 150 END IF 151 ! 152 END IF 132 153 133 154 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 136 157 137 158 IF( lk_trdvor .AND. ctype == 'DYN' ) THEN 138 139 SELECT CASE ( ktrd ) 140 141 ! Pressure Gradient trend 142 CASE ( jpdtdhpg ) 143 CALL trd_vor_zint(ptrdx, ptrdy, jpvorprg) 144 145 ! KE Gradient trend 146 CASE ( jpdtdkeg ) 147 CALL trd_vor_zint(ptrdx, ptrdy, jpvorkeg) 148 149 ! Relative Vorticity trend 150 CASE ( jpdtdrvo ) 151 CALL trd_vor_zint(ptrdx, ptrdy, jpvorrvo) 152 153 ! Planetary Vorticity Term trend 154 CASE ( jpdtdpvo ) 155 CALL trd_vor_zint(ptrdx, ptrdy, jpvorpvo) 156 157 ! Horizontal Diffusion trend 158 CASE ( jpdtdldf ) 159 CALL trd_vor_zint(ptrdx, ptrdy, jpvorldf) 160 161 ! Vertical Advection trend 162 CASE ( jpdtdzad ) 163 CALL trd_vor_zint(ptrdx, ptrdy, jpvorzad) 164 165 ! Vertical Diffusion trend 166 CASE ( jpdtdzdf ) 167 CALL trd_vor_zint(ptrdx, ptrdy, jpvorzdf) 168 169 ! Surface Pressure Grad. trend 170 CASE ( jpdtdspg ) 171 CALL trd_vor_zint(ptrdx, ptrdy, jpvorspg) 172 173 ! Beta V trend 174 CASE ( jpdtddat ) 175 CALL trd_vor_zint(ptrdx, ptrdy, jpvorbev) 176 177 ! Wind stress forcing term 178 CASE ( jpdtdswf ) 179 z2dx(:,:) = ptrdx(:,:,1) 180 z2dy(:,:) = ptrdy(:,:,1) 181 182 CALL trd_vor_zint(z2dx, z2dy, jpvorswf) 183 184 ! Bottom friction term 185 CASE ( jpdtdbfr ) 186 z2dx(:,:) = ptrdx(:,:,1) 187 z2dy(:,:) = ptrdy(:,:,1) 188 189 CALL trd_vor_zint(z2dx, z2dy, jpvorbfr) 190 159 ! 160 SELECT CASE ( ktrd ) 161 CASE ( jpdyn_trd_hpg ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_prg ) ! Hydrostatique Pressure Gradient 162 CASE ( jpdyn_trd_keg ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_keg ) ! KE Gradient 163 CASE ( jpdyn_trd_rvo ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_rvo ) ! Relative Vorticity 164 CASE ( jpdyn_trd_pvo ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_pvo ) ! Planetary Vorticity Term 165 CASE ( jpdyn_trd_ldf ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_ldf ) ! Horizontal Diffusion 166 CASE ( jpdyn_trd_zad ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_zad ) ! Vertical Advection 167 CASE ( jpdyn_trd_spg ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_spg ) ! Surface Pressure Grad. 168 CASE ( jpdyn_trd_dat ) ; CALL trd_vor_zint( ptrdx, ptrdy, jpvor_bev ) ! Beta V 169 CASE ( jpdyn_trd_zdf ) ! Vertical Diffusion 170 ! subtract surface forcing/bottom friction trends 171 ! from vertical diffusive momentum trends 172 ztswu(:,:) = 0.e0 ; ztswv(:,:) = 0.e0 173 ztbfu(:,:) = 0.e0 ; ztbfv(:,:) = 0.e0 174 DO jj = 2, jpjm1 175 DO ji = fs_2, fs_jpim1 ! vector opt. 176 ! save the surface forcing momentum fluxes 177 ztswu(ji,jj) = taux(ji,jj) / ( fse3u(ji,jj,1)*rau0 ) 178 ztswv(ji,jj) = tauy(ji,jj) / ( fse3v(ji,jj,1)*rau0 ) 179 ! save bottom friction momentum fluxes 180 ikbu = MIN( mbathy(ji+1,jj ), mbathy(ji,jj) ) 181 ikbv = MIN( mbathy(ji ,jj+1), mbathy(ji,jj) ) 182 ikbum1 = MAX( ikbu-1, 1 ) 183 ikbvm1 = MAX( ikbv-1, 1 ) 184 zua = ua(ji,jj,ikbum1) * r2dt + ub(ji,jj,ikbum1) 185 zva = va(ji,jj,ikbvm1) * r2dt + vb(ji,jj,ikbvm1) 186 ztbfu(ji,jj) = - avmu(ji,jj,ikbu) * zua / ( fse3u(ji,jj,ikbum1)*fse3uw(ji,jj,ikbu) ) 187 ztbfv(ji,jj) = - avmv(ji,jj,ikbv) * zva / ( fse3v(ji,jj,ikbvm1)*fse3vw(ji,jj,ikbv) ) 188 ! 189 ptrdx(ji,jj,1 ) = ptrdx(ji,jj,1 ) - ztswu(ji,jj) 190 ptrdx(ji,jj,ikbum1) = ptrdx(ji,jj,ikbum1) - ztbfu(ji,jj) 191 ptrdy(ji,jj,1 ) = ptrdy(ji,jj,1 ) - ztswv(ji,jj) 192 ptrdy(ji,jj,ikbvm1) = ptrdy(ji,jj,ikbvm1) - ztbfv(ji,jj) 193 END DO 194 END DO 195 ! 196 CALL trd_vor_zint( ptrdx, ptrdy, jpvor_zdf ) 197 CALL trd_vor_zint( ztswu, ztswv, jpvor_swf ) ! Wind stress forcing term 198 CALL trd_vor_zint( ztbfu, ztbfv, jpvor_bfr ) ! Bottom friction term 191 199 END SELECT 192 200 ! 193 201 ENDIF 194 202 195 203 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 196 ! III. Mixed layer trends 204 ! III. Mixed layer trends for active tracers 197 205 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 198 206 199 207 IF( lk_trdmld .AND. ctype == 'TRA' ) THEN 200 208 209 !----------------------------------------------------------------------------------------------- 210 ! W.A.R.N.I.N.G : 211 ! jptra_trd_ldf : called by traldf.F90 212 ! at this stage we store: 213 ! - the lateral geopotential diffusion (here, lateral = horizontal) 214 ! - and the iso-neutral diffusion if activated 215 ! jptra_trd_zdf : called by trazdf.F90 216 ! * in case of purely vertical diffusion (and not iso-neutral), 217 ! we do not need to store the corresponding trend here, since it 218 ! is recomputed later (at the basis of the ML, see trd_mld) 219 ! * else (iso-neutral case) we store the vertical diffusion component in the 220 ! lateral trend including the K_z contrib, which will be removed later (see trd_mld) 221 !----------------------------------------------------------------------------------------------- 222 201 223 SELECT CASE ( ktrd ) 202 203 ! horizontal advection trends 204 CASE ( jpttdlad ) 205 206 #if defined key_trabbl_adv 207 ! Advective bottom boundary layer 208 ! ------------------------------- 209 zun(:,:,:) = un(:,:,:) - u_bbl(:,:,:) 210 zvn(:,:,:) = vn(:,:,:) - v_bbl(:,:,:) 211 #endif 212 IF( kt == nit000 ) zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 213 214 SELECT CASE ( l_adv ) 215 216 CASE ( 'ce2' ) 217 218 ! Split horizontal trends into i- and j- compnents for trdmld case 219 ! ---------------------------------------------------------------- 220 221 ! i- advective trend computed as Uh gradh(T) 222 DO jk = 1, jpkm1 223 DO jj = 2, jpjm1 224 DO ji = fs_2, fs_jpim1 ! vector opt. 225 # if defined key_zco 226 zbtr = zbtr2(ji,jj) 227 zfui = 0.5 * e2u(ji ,jj) * zun(ji, jj,jk) 228 zfui1= 0.5 * e2u(ji-1,jj) * zun(ji-1,jj,jk) 229 # else 230 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 231 zfui = 0.5 * e2u(ji ,jj) * fse3u(ji, jj,jk) * zun(ji, jj,jk) 232 zfui1= 0.5 * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk) 233 # endif 234 ! save i- advective trend 235 z3dx(ji,jj,jk) = - zbtr * ( zfui * ( tn(ji+1,jj,jk) - tn(ji ,jj,jk) ) & 236 & + zfui1 * ( tn(ji ,jj,jk) - tn(ji-1,jj,jk) ) ) 237 z3dy(ji,jj,jk) = - zbtr * ( zfui * ( sn(ji+1,jj,jk) - sn(ji ,jj,jk) ) & 238 & + zfui1 * ( sn(ji ,jj,jk) - sn(ji-1,jj,jk) ) ) 239 END DO 240 END DO 241 END DO 242 243 ! save the i- horizontal trends for diagnostic 244 CALL trd_mld_zint(z3dx, z3dy, jpmldxad, '3D') 245 246 ! j- advective trend computed as Uh gradh(T) 247 DO jk = 1, jpkm1 248 DO jj = 2, jpjm1 249 DO ji = fs_2, fs_jpim1 ! vector opt. 250 # if defined key_zco 251 zbtr = zbtr2(ji,jj) 252 zfvj = 0.5 * e1v(ji,jj ) * zvn(ji,jj ,jk) 253 zfvj1= 0.5 * e1v(ji,jj-1) * zvn(ji,jj-1,jk) 254 # else 255 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 256 zfvj = 0.5 * e1v(ji,jj ) * fse3v(ji,jj ,jk) * zvn(ji,jj ,jk) 257 zfvj1= 0.5 * e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk) 258 # endif 259 ! save j- advective trend 260 z3dx(ji,jj,jk) = - zbtr * ( zfvj * ( tn(ji,jj+1,jk) - tn(ji,jj ,jk) ) & 261 & + zfvj1 * ( tn(ji,jj ,jk) - tn(ji,jj-1,jk) ) ) 262 z3dy(ji,jj,jk) = - zbtr * ( zfvj * ( sn(ji,jj+1,jk) - sn(ji,jj ,jk) ) & 263 & + zfvj1 * ( sn(ji,jj ,jk) - sn(ji,jj-1,jk) ) ) 264 END DO 265 END DO 266 END DO 267 268 ! save the j- horizontal trend for diagnostic 269 CALL trd_mld_zint(z3dx, z3dy, jpmldyad, '3D') 270 271 CASE ( 'tvd' ) 272 273 ! Recompute the horizontal advection term Div(Uh.T) term 274 z3dx(:,:,:) = ptrdx(:,:,:) - tn(:,:,:) * hdivn(:,:,:) 275 z3dy(:,:,:) = ptrdy(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 276 277 ! Deduce the i- horizontal advection in substracting the j- one. 278 ! tladj()/sladj() are computed in traadv_tvd.F90 module 279 z3dx(:,:,:) = z3dx(:,:,:) - tladj(:,:,:) 280 z3dy(:,:,:) = z3dy(:,:,:) - sladj(:,:,:) 281 282 DO jk = 1, jpkm1 283 DO jj = 2, jpjm1 284 DO ji = fs_2, fs_jpim1 285 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 286 287 ! Compute the zonal et meridional divergence 288 zfui = e2u(ji ,jj) * fse3u(ji ,jj,jk) * zun(ji ,jj,jk) & 289 - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk) 290 zfvj = e1v(ji,jj ) * fse3v(ji,jj ,jk) * zvn(ji,jj ,jk) & 291 - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk) 292 293 ! i- advective trend computed as U gradx(T/S) 294 z3dx(ji,jj,jk) = z3dx(ji,jj,jk) + tn(ji,jj,jk) * zfui * zbtr 295 z3dy(ji,jj,jk) = z3dy(ji,jj,jk) + sn(ji,jj,jk) * zfui * zbtr 296 297 ! j- advective trend computed as V grady(T/S) 298 tladj(ji,jj,jk) = tladj(ji,jj,jk) + tn(ji,jj,jk) * zfvj * zbtr 299 sladj(ji,jj,jk) = sladj(ji,jj,jk) + sn(ji,jj,jk) * zfvj * zbtr 300 301 END DO 302 END DO 303 END DO 304 305 ! save the i- horizontal trend for diagnostic 306 CALL trd_mld_zint(z3dx, z3dy, jpmldxad, '3D') 307 308 ! save the j- horizontal trend for diagnostic 309 CALL trd_mld_zint(tladj, sladi, jpmldyad, '3D') 310 311 CASE ( 'mus', 'mu2' ) 312 313 ! Split horizontal trends in i- and j- direction for trdmld case 314 ! ---------------------------------------------------------------- 315 316 ! i- advective trend computed as U gradx(T/S) 317 DO jk = 1, jpkm1 318 DO jj = 2, jpjm1 319 DO ji = fs_2, fs_jpim1 ! vector opt. 320 # if defined key_zco 321 zbtr = zbtr2(ji,jj) 322 zfui = e2u(ji ,jj) * zun(ji, jj,jk) & 323 & - e2u(ji-1,jj) * zun(ji-1,jj,jk) 324 # else 325 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 326 zfui = e2u(ji ,jj) * fse3u(ji, jj,jk) * zun(ji, jj,jk) & 327 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk) 328 # endif 329 ! save i- advective trend 330 z3dx(ji,jj,jk) = - zbtr * ( tladi(ji,jj,jk) - tladi(ji-1,jj,jk) ) & 331 & + tn(ji,jj,jk) * zfui * zbtr 332 z3dy(ji,jj,jk) = - zbtr * ( sladi(ji,jj,jk) - sladi(ji-1,jj,jk) ) & 333 & + sn(ji,jj,jk) * zfui * zbtr 334 END DO 335 END DO 336 END DO 337 338 ! save the i- horizontal trends for diagnostic 339 CALL trd_mld_zint(z3dx, z3dy, jpmldxad, '3D') 340 341 ! j- advective trend computed as V grady(T/S) 342 DO jk = 1, jpkm1 343 DO jj = 2, jpjm1 344 DO ji = fs_2, fs_jpim1 ! vector opt. 345 # if defined key_zco 346 zbtr = zbtr2(ji,jj) 347 zfvj = e1v(ji,jj ) * zvn(ji,jj ,jk) & 348 & - e1v(ji,jj-1) * zvn(ji,jj-1,jk) 349 # else 350 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 351 zfvj = e1v(ji,jj ) * fse3v(ji,jj ,jk) * zvn(ji,jj ,jk) & 352 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk) 353 # endif 354 ! save j- advective trend 355 z3dx(ji,jj,jk) = - zbtr * ( tladj(ji,jj,jk) - tladj(ji,jj-1,jk) ) & 356 & + tn(ji,jj,jk) * zfvj * zbtr 357 z3dy(ji,jj,jk) = - zbtr * ( sladj(ji,jj,jk) - sladj(ji,jj-1,jk) ) & 358 & + sn(ji,jj,jk) * zfvj * zbtr 359 END DO 360 END DO 361 END DO 362 363 ! save the j- horizontal trends for diagnostic 364 CALL trd_mld_zint(z3dx, z3dy, jpmldyad, '3D') 365 366 END SELECT 367 368 ! vertical advection trends 369 CASE ( jpttdzad ) 370 CALL trd_mld_zint(ptrdx, ptrdy, jpmldzad, '3D') 371 372 ! lateral diffusion trends 373 CASE ( jpttdldf ) 374 CALL trd_mld_zint(ptrdx, ptrdy, jpmldldf, '3D') 375 # if defined key_traldf_eiv 376 ! Save the i- and j- eddy induce velocity trends 377 CALL trd_mld_zint(tladi, sladi, jpmldxei, '3D') 378 CALL trd_mld_zint(tladj, sladj, jpmldyei, '3D') 379 # endif 380 IF( lk_trabbl_dif ) THEN 381 z3dx(:,:,:) = 0.e0 382 z3dy(:,:,:) = 0.e0 383 z3dx(:,:,1) = tldfbbl(:,:) 384 z3dy(:,:,1) = sldfbbl(:,:) 385 CALL trd_mld_zint(z3dx, z3dy, jpmldldf, '2D') 386 ENDIF 387 388 ! vertical diffusion trends 389 CASE ( jpttdzdf ) 390 CALL trd_mld_zint(ptrdx, ptrdy, jpmldzdf, '3D') 391 392 ! vertical diffusion trends 393 CASE ( jpttddoe ) 394 CALL trd_mld_zint(ptrdx, ptrdy, jpmldzei, '3D') 395 396 ! penetrative solar radiation trends 397 CASE ( jpttdqsr ) 398 CALL trd_mld_zint(ptrdx, ptrdy, jpmldfor, '3D') 399 400 ! non penetrative solar radiation trends 401 CASE ( jpttdnsr ) 402 ptrdx(:,:,2:jpk) = 0.e0 403 ptrdy(:,:,2:jpk) = 0.e0 404 CALL trd_mld_zint(ptrdx, ptrdy, jpmldfor, '2D') 405 406 END SELECT 224 CASE ( jptra_trd_xad ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_xad, '3D' ) ! merid. advection 225 CASE ( jptra_trd_yad ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_yad, '3D' ) ! zonal advection 226 CASE ( jptra_trd_zad ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_zad, '3D' ) ! vertical advection 227 CASE ( jptra_trd_ldf ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_ldf, '3D' ) ! lateral diffusive 228 CASE ( jptra_trd_bbl ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_bbl, '3D' ) ! bottom boundary layer 229 CASE ( jptra_trd_zdf ) 230 IF( ln_traldf_iso ) CALL trd_mld_zint( ptrdx, ptrdy, jpmld_ldf, '3D' ) ! vertical diffusion (K_z) 231 CASE ( jptra_trd_dmp ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_dmp, '3D' ) ! internal 3D restoring (tradmp) 232 CASE ( jptra_trd_qsr ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_for, '3D' ) ! air-sea : penetrative sol radiat 233 CASE ( jptra_trd_nsr ) 234 ptrdx(:,:,2:jpk) = 0.e0 ; ptrdy(:,:,2:jpk) = 0.e0 235 CALL trd_mld_zint( ptrdx, ptrdy, jpmld_for, '2D' ) ! air-sea : non penetr sol radiat 236 CASE ( jptra_trd_bbc ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_bbc, '3D' ) ! bottom bound cond (geoth flux) 237 CASE ( jptra_trd_atf ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_atf, '3D' ) ! asselin numerical 238 CASE ( jptra_trd_npc ) ; CALL trd_mld_zint( ptrdx, ptrdy, jpmld_npc, '3D' ) ! non penetr convect adjustment 239 END SELECT 407 240 408 241 ENDIF 409 410 242 411 243 END SUBROUTINE trd_mod … … 434 266 # endif 435 267 268 SUBROUTINE trd_mod_init 269 !!---------------------------------------------------------------------- 270 !! *** ROUTINE trd_mod_init *** 271 !! 272 !! ** Purpose : Initialization of activated trends 273 !!---------------------------------------------------------------------- 274 USE in_out_manager ! I/O manager 275 276 NAMELIST/namtrd/ ntrd, nctls, ln_trdmld_restart, ucf, ln_trdmld_instant 277 !!---------------------------------------------------------------------- 278 279 IF( l_trdtra .OR. l_trddyn ) THEN 280 REWIND( numnam ) 281 READ ( numnam, namtrd ) ! namelist namtrd : trends diagnostic 282 283 IF(lwp) THEN 284 WRITE(numout,*) 285 WRITE(numout,*) ' trd_mod_init : Momentum/Tracers trends' 286 WRITE(numout,*) ' ~~~~~~~~~~~~~' 287 WRITE(numout,*) ' Namelist namtrd : set trends parameters' 288 WRITE(numout,*) ' * frequency of trends diagnostics ntrd = ', ntrd 289 WRITE(numout,*) ' * control surface type nctls = ', nctls 290 WRITE(numout,*) ' * restart for ML diagnostics ln_trdmld_restart = ', ln_trdmld_restart 291 WRITE(numout,*) ' * instantaneous or mean ML T/S ln_trdmld_instant = ', ln_trdmld_instant 292 WRITE(numout,*) ' * unit conversion factor ucf = ', ucf 293 ENDIF 294 ENDIF 295 ! 296 IF( lk_trddyn .OR. lk_trdtra ) CALL trd_icp_init ! integral constraints trends 297 IF( lk_trdmld ) CALL trd_mld_init ! mixed-layer trends (active tracers) 298 IF( lk_trdvor ) CALL trd_vor_init ! vorticity trends 299 ! 300 END SUBROUTINE trd_mod_init 301 436 302 !!====================================================================== 437 303 END MODULE trdmod -
trunk/NEMO/OPA_SRC/TRD/trdmod_oce.F90
r247 r503 4 4 !! Ocean trends : set tracer and momentum trend variables 5 5 !!====================================================================== 6 !! History : 9.0 ! 04-08 (C. Talandier) Original code 6 7 !!---------------------------------------------------------------------- 7 !! OPA 9.0 , LOCEAN-IPSL (2005)8 !! $Header$9 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt10 !!----------------------------------------------------------------------11 !! * Modules used12 8 USE trdicp_oce ! ocean momentum/tracers bassin properties trends variables 13 9 USE trdmld_oce ! ocean active mixed layer tracers trends variables 14 10 USE trdvor_oce ! ocean vorticity trends variables 15 11 16 !! Control parameters 12 IMPLICIT NONE 13 PUBLIC 14 15 !!* Namelist namtrd: diagnostics on dynamics/tracer trends 16 INTEGER , PUBLIC :: ntrd = 10 !: time step frequency dynamics and tracers trends 17 INTEGER , PUBLIC :: nctls = 0 !: control surface type for trends vertical integration 18 REAL(wp), PUBLIC :: ucf = 1. !: unit conversion factor (for netCDF trends outputs) 19 !: =1. (=86400.) for degC/s (degC/day) and psu/s (psu/day) 20 LOGICAL , PUBLIC :: ln_trdmld_instant = .FALSE. !: flag to diagnose inst./mean ML T/S trends 21 LOGICAL , PUBLIC :: ln_trdmld_restart = .FALSE. !: flag to restart mixed-layer diagnostics 22 23 !!* Control parameters 24 # if defined key_trdtra || defined key_trdmld 25 LOGICAL , PUBLIC :: l_trdtra = .TRUE. !: tracers trend flag 26 # else 27 LOGICAL , PUBLIC :: l_trdtra = .FALSE. !: tracers trend flag 28 # endif 29 # if defined key_trddyn || defined key_trdvor 30 LOGICAL , PUBLIC :: l_trddyn = .TRUE. !: momentum trend flag 31 # else 32 LOGICAL , PUBLIC :: l_trddyn = .FALSE. !: momentum trend flag 33 # endif 34 35 !!* Active tracers trends indexes 36 INTEGER, PUBLIC, PARAMETER :: jptra_trd_xad = 1 !: x- horizontal advection 37 INTEGER, PUBLIC, PARAMETER :: jptra_trd_yad = 2 !: y- horizontal advection 38 INTEGER, PUBLIC, PARAMETER :: jptra_trd_zad = 3 !: z- vertical advection 39 INTEGER, PUBLIC, PARAMETER :: jptra_trd_ldf = 4 !: lateral diffusion 40 INTEGER, PUBLIC, PARAMETER :: jptra_trd_zdf = 5 !: vertical diffusion (Kz) 41 INTEGER, PUBLIC, PARAMETER :: jptra_trd_bbc = 6 !: Bottom Boundary Condition (geoth. flux) 42 INTEGER, PUBLIC, PARAMETER :: jptra_trd_bbl = 7 !: Bottom Boundary Layer (diffusive/convective) 43 INTEGER, PUBLIC, PARAMETER :: jptra_trd_npc = 8 !: static instability mixing 44 INTEGER, PUBLIC, PARAMETER :: jptra_trd_dmp = 9 !: damping 45 INTEGER, PUBLIC, PARAMETER :: jptra_trd_qsr = 10 !: penetrative solar radiation 46 INTEGER, PUBLIC, PARAMETER :: jptra_trd_nsr = 11 !: non solar radiation 47 INTEGER, PUBLIC, PARAMETER :: jptra_trd_atf = 12 !: Asselin correction 48 49 !!* Momentum trends indexes 50 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_hpg = 1 !: hydrostatic pressure gradient 51 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_keg = 2 !: kinetic energy gradient 52 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_rvo = 3 !: relative vorticity 53 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_pvo = 4 !: planetary vorticity 54 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_ldf = 5 !: lateral diffusion 55 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_zad = 6 !: vertical advection 56 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_zdf = 7 !: vertical diffusion 57 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_spg = 8 !: surface pressure gradient 58 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_dat = 9 !: damping term 59 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_swf = 10 !: surface wind forcing 60 INTEGER, PUBLIC, PARAMETER :: jpdyn_trd_bfr = 11 !: bottom friction 61 17 62 !!---------------------------------------------------------------------- 18 LOGICAL, PUBLIC :: l_trdtra = .FALSE. !: tracers trend flag19 LOGICAL, PUBLIC :: l_trddyn = .FALSE. !: momentum trend flag20 21 !!======================================================================63 !! OPA 9.0 , LOCEAN-IPSL (2006) 64 !! $Header$ 65 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 66 !!====================================================================== 22 67 END MODULE trdmod_oce -
trunk/NEMO/OPA_SRC/TRD/trdvor.F90
r462 r503 4 4 !! Ocean diagnostics: momentum trends 5 5 !!===================================================================== 6 6 !! History : 9.0 ! 04-06 (L. Brunier, A-M. Treguier) Original code 7 !! ! 04-08 (C. Talandier) New trends organization 8 !!---------------------------------------------------------------------- 7 9 #if defined key_trdvor || defined key_esopa 8 10 !!---------------------------------------------------------------------- 9 11 !! 'key_trdvor' : momentum trend diagnostics 12 !!---------------------------------------------------------------------- 10 13 !!---------------------------------------------------------------------- 11 14 !! trd_vor : momentum trends averaged over the depth … … 13 16 !! trd_vor_init : initialization step 14 17 !!---------------------------------------------------------------------- 15 !! * Modules used16 18 USE oce ! ocean dynamics and tracers variables 17 19 USE dom_oce ! ocean space and time domain variables … … 27 29 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 28 30 29 30 31 IMPLICIT NONE 31 32 PRIVATE 32 33 33 !! * Interfaces34 34 INTERFACE trd_vor_zint 35 35 MODULE PROCEDURE trd_vor_zint_2d, trd_vor_zint_3d 36 36 END INTERFACE 37 37 38 !! * Accessibility 39 PUBLIC trd_vor ! routine called by step.F90 40 PUBLIC trd_vor_zint ! routine called by dynamics routines 41 PUBLIC trd_vor_init ! routine called by opa.F90 42 43 !! * Shared module variables 44 LOGICAL, PUBLIC :: lk_trdvor = .TRUE. ! momentum trend flag 45 46 !! * Module variables 38 PUBLIC trd_vor ! routine called by step.F90 39 PUBLIC trd_vor_zint ! routine called by dynamics routines 40 PUBLIC trd_vor_init ! routine called by opa.F90 41 47 42 INTEGER :: & 48 43 nh_t, nmoydpvor , & … … 61 56 vor_avrres 62 57 63 REAL(wp), DIMENSION(jpi,jpj,jplvor):: & !: curl of trends 64 vortrd 65 58 REAL(wp), DIMENSION(jpi,jpj,jpltot_vor):: vortrd !: curl of trends 59 66 60 CHARACTER(len=12) :: cvort 67 61 … … 70 64 # include "ldfdyn_substitute.h90" 71 65 # include "vectopt_loop_substitute.h90" 72 73 66 !!---------------------------------------------------------------------- 74 67 !! OPA 9.0 , LOCEAN-IPSL (2005) 75 68 !! $Header$ 76 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt69 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 77 70 !!---------------------------------------------------------------------- 78 71 … … 80 73 81 74 SUBROUTINE trd_vor_zint_2d( putrdvor, pvtrdvor, ktrd ) 75 !!---------------------------------------------------------------------------- 76 !! *** ROUTINE trd_vor_zint *** 77 !! 78 !! ** Purpose : computation of vertically integrated vorticity budgets 79 !! from ocean surface down to control surface (NetCDF output) 80 !! 81 !! ** Method/usage : 82 !! integration done over nwrite-1 time steps 83 !! 84 !! 85 !! ** Action : 86 !! /comvor/ : 87 !! vor_avr average 88 !! vor_avrb vorticity at kt-1 89 !! vor_avrbb vorticity at begining of the NWRITE-1 90 !! time steps averaging period 91 !! vor_avrbn vorticity at time step after the 92 !! begining of the NWRITE-1 time 93 !! steps averaging period 94 !! 95 !! trends : 96 !! 97 !! vortrd (,, 1) = Pressure Gradient Trend 98 !! vortrd (,, 2) = KE Gradient Trend 99 !! vortrd (,, 3) = Relative Vorticity Trend 100 !! vortrd (,, 4) = Coriolis Term Trend 101 !! vortrd (,, 5) = Horizontal Diffusion Trend 102 !! vortrd (,, 6) = Vertical Advection Trend 103 !! vortrd (,, 7) = Vertical Diffusion Trend 104 !! vortrd (,, 8) = Surface Pressure Grad. Trend 105 !! vortrd (,, 9) = Beta V 106 !! vortrd (,,10) = forcing term 107 !! vortrd (,,11) = bottom friction term 108 !! rotot(,) : total cumulative trends over nwrite-1 time steps 109 !! vor_avrtot(,) : first membre of vrticity equation 110 !! vor_avrres(,) : residual = dh/dt entrainment 111 !! 112 !! trends output in netCDF format using ioipsl 113 !! 114 !!---------------------------------------------------------------------- 115 INTEGER, INTENT( in ) :: ktrd ! ocean trend index 116 REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) :: & 117 putrdvor, & ! u vorticity trend 118 pvtrdvor ! v vorticity trend 119 !! 120 INTEGER :: ji, jj 121 INTEGER :: ikbu, ikbum1, ikbv, ikbvm1 122 REAL(wp), DIMENSION(jpi,jpj) :: zudpvor, zvdpvor ! total cmulative trends 123 !!---------------------------------------------------------------------- 124 125 ! Initialization 126 zudpvor(:,:) = 0.e0 127 zvdpvor(:,:) = 0.e0 128 129 CALL lbc_lnk( putrdvor, 'U' , -1. ) 130 CALL lbc_lnk( pvtrdvor, 'V' , -1. ) 131 132 ! ===================================== 133 ! I vertical integration of 2D trends 134 ! ===================================== 135 136 SELECT CASE (ktrd) 137 138 CASE (jpvor_bfr) ! bottom friction 139 140 DO jj = 2, jpjm1 141 DO ji = fs_2, fs_jpim1 142 ikbu = min( mbathy(ji+1,jj), mbathy(ji,jj) ) 143 ikbum1 = max( ikbu-1, 1 ) 144 ikbv = min( mbathy(ji,jj+1), mbathy(ji,jj) ) 145 ikbvm1 = max( ikbv-1, 1 ) 146 147 zudpvor(ji,jj) = putrdvor(ji,jj) * fse3u(ji,jj,ikbum1) * e1u(ji,jj) * umask(ji,jj,ikbum1) 148 zvdpvor(ji,jj) = pvtrdvor(ji,jj) * fse3v(ji,jj,ikbvm1) * e2v(ji,jj) * vmask(ji,jj,ikbvm1) 149 END DO 150 END DO 151 152 CASE (jpvor_swf) ! wind stress 153 154 zudpvor(:,:) = putrdvor(:,:) * fse3u(:,:,1) * e1u(:,:) * umask(:,:,1) 155 zvdpvor(:,:) = pvtrdvor(:,:) * fse3v(:,:,1) * e2v(:,:) * vmask(:,:,1) 156 157 END SELECT 158 159 ! Average except for Beta.V 160 zudpvor(:,:) = zudpvor(:,:) * hur(:,:) 161 zvdpvor(:,:) = zvdpvor(:,:) * hvr(:,:) 162 163 ! Curl 164 DO ji=1,jpim1 165 DO jj=1,jpjm1 166 vortrd(ji,jj,ktrd) = ( zvdpvor(ji+1,jj) - zvdpvor(ji,jj) & 167 & - ( zudpvor(ji,jj+1) - zudpvor(ji,jj) ) ) & 168 & / ( e1f(ji,jj) * e2f(ji,jj) ) 169 END DO 170 END DO 171 172 ! Surface mask 173 vortrd(:,:,ktrd) = vortrd(:,:,ktrd) * fmask(:,:,1) 174 175 IF( idebug /= 0 ) THEN 176 IF(lwp) WRITE(numout,*) ' debuging trd_vor_zint: I done' 177 CALL FLUSH(numout) 178 ENDIF 179 ! 180 END SUBROUTINE trd_vor_zint_2d 181 182 183 SUBROUTINE trd_vor_zint_3d( putrdvor, pvtrdvor, ktrd ) 82 184 !!---------------------------------------------------------------------------- 83 185 !! *** ROUTINE trd_vor_zint *** … … 119 221 !! trends output in netCDF format using ioipsl 120 222 !! 121 !! History : 122 !! 9.0 ! 04-06 (L. Brunier, A-M. Treguier) Original code 123 !! ! 04-08 (C. Talandier) New trends organization 124 !!---------------------------------------------------------------------- 125 !! * Arguments 223 !!---------------------------------------------------------------------- 126 224 INTEGER, INTENT( in ) :: ktrd ! ocean trend index 127 128 REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) :: &129 putrdvor, & ! u vorticity trend130 pvtrdvor ! v vorticity trend131 132 !! * Local declarations133 INTEGER :: ji, jj134 INTEGER :: ikbu, ikbum1, ikbv, ikbvm1135 REAL(wp), DIMENSION(jpi,jpj) :: &136 zudpvor, & ! total cmulative trends137 zvdpvor ! " " "138 !!----------------------------------------------------------------------139 140 ! Initialization141 zudpvor(:,:) = 0.e0142 zvdpvor(:,:) = 0.e0143 144 CALL lbc_lnk( putrdvor, 'U' , -1. )145 CALL lbc_lnk( pvtrdvor, 'V' , -1. )146 147 ! =====================================148 ! I vertical integration of 2D trends149 ! =====================================150 151 SELECT CASE (ktrd)152 153 CASE (jpvorbfr) ! bottom friction154 155 DO jj = 2, jpjm1156 DO ji = fs_2, fs_jpim1157 ikbu = min( mbathy(ji+1,jj), mbathy(ji,jj) )158 ikbum1 = max( ikbu-1, 1 )159 ikbv = min( mbathy(ji,jj+1), mbathy(ji,jj) )160 ikbvm1 = max( ikbv-1, 1 )161 162 zudpvor(ji,jj) = putrdvor(ji,jj) * fse3u(ji,jj,ikbum1) * e1u(ji,jj) * umask(ji,jj,ikbum1)163 zvdpvor(ji,jj) = pvtrdvor(ji,jj) * fse3v(ji,jj,ikbvm1) * e2v(ji,jj) * vmask(ji,jj,ikbvm1)164 END DO165 END DO166 167 CASE (jpvorswf) ! wind stress168 169 zudpvor(:,:) = putrdvor(:,:) * fse3u(:,:,1) * e1u(:,:) * umask(:,:,1)170 zvdpvor(:,:) = pvtrdvor(:,:) * fse3v(:,:,1) * e2v(:,:) * vmask(:,:,1)171 172 END SELECT173 174 ! Average except for Beta.V175 zudpvor(:,:) = zudpvor(:,:) * hur(:,:)176 zvdpvor(:,:) = zvdpvor(:,:) * hvr(:,:)177 178 ! Curl179 DO ji=1,jpim1180 DO jj=1,jpjm1181 vortrd(ji,jj,ktrd) = ( zvdpvor(ji+1,jj) - zvdpvor(ji,jj) &182 & - ( zudpvor(ji,jj+1) - zudpvor(ji,jj) ) ) &183 & / ( e1f(ji,jj) * e2f(ji,jj) )184 END DO185 END DO186 187 ! Surface mask188 vortrd(:,:,ktrd) = vortrd(:,:,ktrd) * fmask(:,:,1)189 190 IF( idebug /= 0 ) THEN191 IF(lwp) WRITE(numout,*) ' debuging trd_vor_zint: I done'192 CALL FLUSH(numout)193 ENDIF194 195 END SUBROUTINE trd_vor_zint_2d196 197 198 199 SUBROUTINE trd_vor_zint_3d( putrdvor, pvtrdvor, ktrd )200 !!----------------------------------------------------------------------------201 !! *** ROUTINE trd_vor_zint ***202 !!203 !! ** Purpose : computation of vertically integrated vorticity budgets204 !! from ocean surface down to control surface (NetCDF output)205 !!206 !! ** Method/usage :207 !! integration done over nwrite-1 time steps208 !!209 !!210 !! ** Action :211 !! /comvor/ :212 !! vor_avr average213 !! vor_avrb vorticity at kt-1214 !! vor_avrbb vorticity at begining of the NWRITE-1215 !! time steps averaging period216 !! vor_avrbn vorticity at time step after the217 !! begining of the NWRITE-1 time218 !! steps averaging period219 !!220 !! trends :221 !!222 !! vortrd (,,1) = Pressure Gradient Trend223 !! vortrd (,,2) = KE Gradient Trend224 !! vortrd (,,3) = Relative Vorticity Trend225 !! vortrd (,,4) = Coriolis Term Trend226 !! vortrd (,,5) = Horizontal Diffusion Trend227 !! vortrd (,,6) = Vertical Advection Trend228 !! vortrd (,,7) = Vertical Diffusion Trend229 !! vortrd (,,8) = Surface Pressure Grad. Trend230 !! vortrd (,,9) = Beta V231 !! vortrd (,,10) = forcing term232 !! vortrd (,,11) = bottom friction term233 !! rotot(,) : total cumulative trends over nwrite-1 time steps234 !! vor_avrtot(,) : first membre of vrticity equation235 !! vor_avrres(,) : residual = dh/dt entrainment236 !!237 !! trends output in netCDF format using ioipsl238 !!239 !! History :240 !! 9.0 ! 04-06 (L. Brunier, A-M. Treguier) Original code241 !! ! 04-08 (C. Talandier) New trends organization242 !!----------------------------------------------------------------------243 !! * Arguments244 INTEGER, INTENT( in ) :: ktrd ! ocean trend index245 246 225 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: & 247 226 putrdvor, & ! u vorticity trend 248 227 pvtrdvor ! v vorticity trend 249 250 !! * Local declarations 228 !! 251 229 INTEGER :: ji, jj, jk 252 253 230 REAL(wp), DIMENSION(jpi,jpj) :: & 254 231 zubet, & ! u Beta.V case … … 279 256 ! Save Beta.V term to avoid average before Curl 280 257 ! Beta.V : intergration, no average 281 IF( ktrd == jpvor bev ) THEN258 IF( ktrd == jpvor_bev ) THEN 282 259 zubet(:,:) = zudpvor(:,:) 283 260 zvbet(:,:) = zvdpvor(:,:) … … 302 279 ! Special treatement for the Beta.V term 303 280 ! Compute the Curl of the Beta.V term which is not averaged 304 IF( ktrd == jpvor bev ) THEN281 IF( ktrd == jpvor_bev ) THEN 305 282 DO ji=1,jpim1 306 283 DO jj=1,jpjm1 307 vortrd(ji,jj,jpvor bev) = ( zvbet(ji+1,jj) - zvbet(ji,jj) - &284 vortrd(ji,jj,jpvor_bev) = ( zvbet(ji+1,jj) - zvbet(ji,jj) - & 308 285 & ( zubet(ji,jj+1) - zubet(ji,jj) ) ) & 309 286 & / ( e1f(ji,jj) * e2f(ji,jj) ) … … 312 289 313 290 ! Average on the Curl 314 vortrd(:,:,jpvor bev) = vortrd(:,:,jpvorbev) * hur(:,:)291 vortrd(:,:,jpvor_bev) = vortrd(:,:,jpvor_bev) * hur(:,:) 315 292 316 293 ! Surface mask 317 vortrd(:,:,jpvor bev) = vortrd(:,:,jpvorbev) * fmask(:,:,1)294 vortrd(:,:,jpvor_bev) = vortrd(:,:,jpvor_bev) * fmask(:,:,1) 318 295 ENDIF 319 296 … … 322 299 CALL FLUSH(numout) 323 300 ENDIF 324 301 ! 325 302 END SUBROUTINE trd_vor_zint_3d 326 327 303 328 304 … … 333 309 !! ** Purpose : computation of cumulated trends over analysis period 334 310 !! and make outputs (NetCDF or DIMG format) 335 !! 336 !! ** Method/usage : 337 !! 338 !! History : 339 !! 9.0 ! 04-06 (L. Brunier, A-M. Treguier) Original code 340 !! ! 04-08 (C. Talandier) New trends organization 341 !!---------------------------------------------------------------------- 342 !! * Arguments 311 !!---------------------------------------------------------------------- 343 312 INTEGER, INTENT( in ) :: kt ! ocean time-step index 344 345 !! * Local declarations 346 INTEGER :: ji, jj, jk, jl, it 347 348 REAL(wp) :: zmean 349 350 REAL(wp) ,DIMENSION(jpi,jpj) :: & 351 zun, zvn 313 !! 314 INTEGER :: ji, jj, jk, jl, it 315 REAL(wp) :: zmean 316 REAL(wp), DIMENSION(jpi,jpj) :: zun, zvn 352 317 !!---------------------------------------------------------------------- 353 318 … … 424 389 IF( kt >= nit000+2 ) THEN 425 390 nmoydpvor = nmoydpvor + 1 426 DO jl = 1, jpl vor391 DO jl = 1, jpltot_vor 427 392 IF( jl /= 9 ) THEN 428 393 rotot(:,:) = rotot(:,:) + vortrd(:,:,jl) … … 490 455 it= kt-nit000+1 491 456 IF( lwp .AND. MOD( kt, ntrd ) == 0 ) THEN 492 WRITE(numout,*) ' trdvor_ncwrite : write NetCDF fields' 457 WRITE(numout,*) '' 458 WRITE(numout,*) 'trd_vor : write trends in the NetCDF file at kt = ', kt 459 WRITE(numout,*) '~~~~~~~ ' 493 460 ENDIF 494 461 495 CALL histwrite( nidvor,"sovortPh",it,vortrd(:,:, 1),ndimvor1,ndexvor1) ! grad Ph496 CALL histwrite( nidvor,"sovortEk",it,vortrd(:,:, 2),ndimvor1,ndexvor1) ! Energy497 CALL histwrite( nidvor,"sovozeta",it,vortrd(:,:, 3),ndimvor1,ndexvor1) ! rel vorticity498 CALL histwrite( nidvor,"sovortif",it,vortrd(:,:, 4),ndimvor1,ndexvor1) ! coriolis499 CALL histwrite( nidvor,"sovodifl",it,vortrd(:,:, 5),ndimvor1,ndexvor1) ! lat diff500 CALL histwrite( nidvor,"sovoadvv",it,vortrd(:,:, 6),ndimvor1,ndexvor1) ! vert adv501 CALL histwrite( nidvor,"sovodifv",it,vortrd(:,:, 7),ndimvor1,ndexvor1) ! vert diff502 CALL histwrite( nidvor,"sovortPs",it,vortrd(:,:, 8),ndimvor1,ndexvor1) ! grad Ps503 CALL histwrite( nidvor,"sovortbv",it,vortrd(:,:, 9),ndimvor1,ndexvor1) ! beta.V504 CALL histwrite( nidvor,"sovowind",it,vortrd(:,:, 10),ndimvor1,ndexvor1) ! wind stress505 CALL histwrite( nidvor,"sovobfri",it,vortrd(:,:, 11),ndimvor1,ndexvor1) ! bottom friction462 CALL histwrite( nidvor,"sovortPh",it,vortrd(:,:,jpvor_prg),ndimvor1,ndexvor1) ! grad Ph 463 CALL histwrite( nidvor,"sovortEk",it,vortrd(:,:,jpvor_keg),ndimvor1,ndexvor1) ! Energy 464 CALL histwrite( nidvor,"sovozeta",it,vortrd(:,:,jpvor_rvo),ndimvor1,ndexvor1) ! rel vorticity 465 CALL histwrite( nidvor,"sovortif",it,vortrd(:,:,jpvor_pvo),ndimvor1,ndexvor1) ! coriolis 466 CALL histwrite( nidvor,"sovodifl",it,vortrd(:,:,jpvor_ldf),ndimvor1,ndexvor1) ! lat diff 467 CALL histwrite( nidvor,"sovoadvv",it,vortrd(:,:,jpvor_zad),ndimvor1,ndexvor1) ! vert adv 468 CALL histwrite( nidvor,"sovodifv",it,vortrd(:,:,jpvor_zdf),ndimvor1,ndexvor1) ! vert diff 469 CALL histwrite( nidvor,"sovortPs",it,vortrd(:,:,jpvor_spg),ndimvor1,ndexvor1) ! grad Ps 470 CALL histwrite( nidvor,"sovortbv",it,vortrd(:,:,jpvor_bev),ndimvor1,ndexvor1) ! beta.V 471 CALL histwrite( nidvor,"sovowind",it,vortrd(:,:,jpvor_swf),ndimvor1,ndexvor1) ! wind stress 472 CALL histwrite( nidvor,"sovobfri",it,vortrd(:,:,jpvor_bfr),ndimvor1,ndexvor1) ! bottom friction 506 473 CALL histwrite( nidvor,"1st_mbre",it,vor_avrtot ,ndimvor1,ndexvor1) ! First membre 507 474 CALL histwrite( nidvor,"sovorgap",it,vor_avrres ,ndimvor1,ndexvor1) ! gap between 1st and 2 nd mbre 508 475 ! 509 476 IF( idebug /= 0 ) THEN 510 477 WRITE(numout,*) ' debuging trd_vor: III.4 done' 511 478 CALL FLUSH(numout) 512 479 ENDIF 513 514 ENDIF 515 480 ! 481 ENDIF 482 ! 516 483 IF( MOD( kt - nit000+1, ntrd ) == 0 ) rotot(:,:)=0 517 484 ! 518 485 IF( kt == nitend ) CALL histclo( nidvor ) 519 486 ! 520 487 END SUBROUTINE trd_vor 521 522 488 523 489 … … 528 494 !! ** Purpose : computation of vertically integrated T and S budgets 529 495 !! from ocean surface down to control surface (NetCDF output) 530 !! 531 !! ** Method/usage : 532 !! 533 !! History : 534 !! 9.0 ! 04-06 (L. Brunier, A-M. Treguier) Original code 535 !! ! 04-08 (C. Talandier) New trends organization 536 !!---------------------------------------------------------------------- 537 !! * Local declarations 538 REAL(wp) :: zjulian, zsto, zout 539 496 !!---------------------------------------------------------------------- 497 REAL(wp) :: zjulian, zsto, zout 540 498 CHARACTER (len=40) :: clhstnam 541 499 CHARACTER (len=40) :: clop 542 543 NAMELIST/namtrd/ ntrd,nctls544 500 !!---------------------------------------------------------------------- 545 501 … … 553 509 idebug = 0 ! set it to 1 in case of problem to have more Print 554 510 555 ! namelist namtrd : trend diagnostic556 REWIND( numnam )557 READ ( numnam, namtrd )558 559 511 IF(lwp) THEN 560 512 WRITE(numout,*) ' ' 561 WRITE(numout,*) ' trd_vor_init: vorticity trends'562 WRITE(numout,*) ' ~~~~~~~~~~~~~'513 WRITE(numout,*) ' trd_vor_init: vorticity trends' 514 WRITE(numout,*) ' ~~~~~~~~~~~~' 563 515 WRITE(numout,*) ' ' 564 WRITE(numout,*) ' Namelist namtrd : ' 565 WRITE(numout,*) ' time step frequency trend ntrd = ',ntrd 566 WRITE(numout,*) ' ' 567 WRITE(numout,*) '##########################################################################' 568 WRITE(numout,*) ' CAUTION: The interpretation of the vorticity trends is' 569 WRITE(numout,*) ' not obvious, please contact Anne-Marie TREGUIER at: treguier@ifremer.fr ' 570 WRITE(numout,*) '##########################################################################' 516 WRITE(numout,*) ' ##########################################################################' 517 WRITE(numout,*) ' CAUTION: The interpretation of the vorticity trends is' 518 WRITE(numout,*) ' not obvious, please contact Anne-Marie TREGUIER at: treguier@ifremer.fr ' 519 WRITE(numout,*) ' ##########################################################################' 571 520 WRITE(numout,*) ' ' 572 521 ENDIF … … 599 548 zout = ntrd*rdt 600 549 601 IF(lwp) WRITE (numout,*) ' trdvor_ncinit:netCDF initialization'550 IF(lwp) WRITE(numout,*) ' netCDF initialization' 602 551 603 552 ! II.2 Compute julian date from starting date of the run 604 553 ! ------------------------ 605 554 CALL ymds2ju( nyear, nmonth, nday, 0.e0, zjulian ) 606 IF 607 IF (lwp) WRITE(numout,*)' Date 0 used :',nit000&608 ,' YEAR ', nyear,' MONTH ', nmonth,' DAY ', nday&609 ,'Julian day : ', zjulian555 IF(lwp) WRITE(numout,*)' ' 556 IF(lwp) WRITE(numout,*)' Date 0 used :',nit000, & 557 & ' YEAR ', nyear,' MONTH ' , nmonth, & 558 & ' DAY ' , nday, 'Julian day : ', zjulian 610 559 611 560 ! II.3 Define the T grid trend file (nidvor) … … 650 599 CALL FLUSH(numout) 651 600 ENDIF 652 601 ! 653 602 END SUBROUTINE trd_vor_init 654 603 … … 657 606 !! Default option : Empty module 658 607 !!---------------------------------------------------------------------- 659 LOGICAL, PUBLIC :: lk_trdvor = .FALSE. ! momentum trend flag660 661 !! * Interfaces662 608 INTERFACE trd_vor_zint 663 609 MODULE PROCEDURE trd_vor_zint_2d, trd_vor_zint_3d 664 610 END INTERFACE 665 666 611 CONTAINS 667 612 SUBROUTINE trd_vor( kt ) ! Empty routine … … 669 614 END SUBROUTINE trd_vor 670 615 SUBROUTINE trd_vor_zint_2d( putrdvor, pvtrdvor, ktrd ) 671 REAL, DIMENSION(:,:), INTENT( inout ) :: & 672 putrdvor, pvtrdvor ! U and V momentum trends 616 REAL, DIMENSION(:,:), INTENT( inout ) :: putrdvor, pvtrdvor 673 617 INTEGER, INTENT( in ) :: ktrd ! ocean trend index 674 618 WRITE(*,*) 'trd_vor_zint_2d: You should not have seen this print! error?', putrdvor(1,1) … … 677 621 END SUBROUTINE trd_vor_zint_2d 678 622 SUBROUTINE trd_vor_zint_3d( putrdvor, pvtrdvor, ktrd ) 679 REAL, DIMENSION(:,:,:), INTENT( inout ) :: & 680 putrdvor, pvtrdvor ! U and V momentum trends 623 REAL, DIMENSION(:,:,:), INTENT( inout ) :: putrdvor, pvtrdvor 681 624 INTEGER, INTENT( in ) :: ktrd ! ocean trend index 682 625 WRITE(*,*) 'trd_vor_zint_3d: You should not have seen this print! error?', putrdvor(1,1,1) -
trunk/NEMO/OPA_SRC/TRD/trdvor_oce.F90
r247 r503 4 4 !! Ocean trends : set vorticity trend variables 5 5 !!====================================================================== 6 !! History : 9.0 ! ??? 7 !!---------------------------------------------------------------------- 8 9 !!---------------------------------------------------------------------- 10 USE par_oce ! ocean parameters 11 12 IMPLICIT NONE 13 PRIVATE 14 15 #if defined key_trdvor 16 LOGICAL, PUBLIC, PARAMETER :: lk_trdvor = .TRUE. !: momentum trend flag 17 #else 18 LOGICAL, PUBLIC, PARAMETER :: lk_trdvor = .FALSE. !: momentum trend flag 19 #endif 20 !!* vorticity trends index 21 INTEGER, PUBLIC, PARAMETER :: jpltot_vor = 11 !: Number of vorticity trend terms 22 ! 23 INTEGER, PUBLIC, PARAMETER :: jpvor_prg = 1 !: Pressure Gradient Trend 24 INTEGER, PUBLIC, PARAMETER :: jpvor_keg = 2 !: KE Gradient Trend 25 INTEGER, PUBLIC, PARAMETER :: jpvor_rvo = 3 !: Relative Vorticity Trend 26 INTEGER, PUBLIC, PARAMETER :: jpvor_pvo = 4 !: Planetary Vorticity Term Trend 27 INTEGER, PUBLIC, PARAMETER :: jpvor_ldf = 5 !: Horizontal Diffusion Trend 28 INTEGER, PUBLIC, PARAMETER :: jpvor_zad = 6 !: Vertical Advection Trend 29 INTEGER, PUBLIC, PARAMETER :: jpvor_zdf = 7 !: Vertical Diffusion Trend 30 INTEGER, PUBLIC, PARAMETER :: jpvor_spg = 8 !: Surface Pressure Grad. Trend 31 INTEGER, PUBLIC, PARAMETER :: jpvor_bev = 9 !: Beta V 32 INTEGER, PUBLIC, PARAMETER :: jpvor_swf = 10 !: wind stress forcing term 33 INTEGER, PUBLIC, PARAMETER :: jpvor_bfr = 11 !: bottom friction term 34 6 35 !!---------------------------------------------------------------------- 7 36 !! OPA 9.0 , LOCEAN-IPSL (2005) 8 37 !! $Header$ 9 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 10 !!---------------------------------------------------------------------- 11 !!---------------------------------------------------------------------- 12 !! * Modules used 13 USE par_oce ! ocean parameters 14 15 IMPLICIT NONE 16 PUBLIC 17 18 INTEGER,PARAMETER :: jplvor = 11 ! Number of vorticity trend terms 19 20 INTEGER, PARAMETER :: & !: vorticity trends index 21 jpvorprg = 1, & !: Pressure Gradient Trend 22 jpvorkeg = 2, & !: KE Gradient Trend 23 jpvorrvo = 3, & !: Relative Vorticity Trend 24 jpvorpvo = 4, & !: Planetary Vorticity Term Trend 25 jpvorldf = 5, & !: Horizontal Diffusion Trend 26 jpvorzad = 6, & !: Vertical Advection Trend 27 jpvorzdf = 7, & !: Vertical Diffusion Trend 28 jpvorspg = 8, & !: Surface Pressure Grad. Trend 29 jpvorbev = 9, & !: Beta V 30 jpvorswf =10, & !: wind stress forcing term 31 jpvorbfr =11 !: bottom friction term 32 33 !!====================================================================== 38 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 39 !!====================================================================== 34 40 END MODULE trdvor_oce -
trunk/NEMO/OPA_SRC/ZDF/zdfkpp.F90
r474 r503 5 5 !! turbulent closure parameterization 6 6 !!===================================================================== 7 !! History : 8.1 ! 00-03 (W.G. Large, J. Chanut) Original code 8 !! 8.1 ! 02-06 (J.M. Molines) for real case CLIPPER 9 !! 8.2 ! 03-10 (Chanut J.) re-writting 10 !! 9.0 ! 05-01 (C. Ethe) Free form, F90 11 !!---------------------------------------------------------------------- 7 12 #if defined key_zdfkpp || defined key_esopa 8 13 !!---------------------------------------------------------------------- 9 14 !! 'key_zdfkpp' KPP scheme 10 15 !!---------------------------------------------------------------------- 16 !!---------------------------------------------------------------------- 11 17 !! zdf_kpp : update momentum and tracer Kz from a kpp scheme 12 18 !! zdf_kpp_init : initialization, namelist read, and parameters control 13 19 !!---------------------------------------------------------------------- 14 !! * Modules used15 20 USE oce ! ocean dynamics and active tracers 16 21 USE dom_oce ! ocean space and time domain … … 28 33 PRIVATE 29 34 30 !! * Routine accessibility 31 PUBLIC zdf_kpp ! routine called by step.F90 32 PUBLIC tra_kpp ! routine called by step.F90 33 34 !! * Share Module variables 35 LOGICAL, PUBLIC, PARAMETER :: & 36 lk_zdfkpp = .TRUE. !: KPP vertical mixing flag 37 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: & 38 ghats ! non-local scalar mixing term (gamma/<ws>o) 35 PUBLIC zdf_kpp ! routine called by step.F90 36 PUBLIC tra_kpp ! routine called by step.F90 37 38 LOGICAL, PUBLIC, PARAMETER :: lk_zdfkpp = .TRUE. !: KPP vertical mixing flag 39 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: ghats !: non-local scalar mixing term (gamma/<ws>o) 39 40 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & 40 wt0 , & ! surface temperature flux for non local flux41 ws0 , & ! surface salinity flux for non local flux42 hkpp ! boundary layer depht43 !! * Module variables 41 wt0 , & !: surface temperature flux for non local flux 42 ws0 , & !: surface salinity flux for non local flux 43 hkpp !: boundary layer depht 44 44 45 INTEGER :: & !!! ** kpp namelist (namkpp) ** 45 46 nave = 1 , & ! = 0/1 flag for horizontal average on avt, avmu, avmv … … 148 149 !! OPA 9.0 , LOCEAN-IPSL (2005) 149 150 !! $Header$ 150 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt151 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 151 152 !!---------------------------------------------------------------------- 152 153 153 154 CONTAINS 154 155 155 156 156 SUBROUTINE zdf_kpp ( kt ) … … 184 184 !! update avt, avmu, avmv (before vertical eddy coef.) 185 185 !! 186 !! References : 187 !! Large W.G., Mc Williams J.C. and Doney S.C. 186 !! References : Large W.G., Mc Williams J.C. and Doney S.C. 188 187 !! Reviews of Geophysics, 32, 4, November 1994 189 188 !! Comments in the code refer to this paper, particularly 190 189 !! the equation number. (LMD94, here after) 191 !!192 !! Modifications :193 !! --------------194 !! original : 00-03 (LARGE W.G.)195 !! additions : 00-04 (CHANUT J.)196 !! : 02-06 (MOLINES J.M. for real case CLIPPER)197 !! : 03-10 (CHANUT J.)198 !!199 !! History :200 !! 8.1 ! 00-03 (J. Chanut) Original code201 !! 8.1 ! 00-04 (J.M. Molines) for real case CLIPPER202 !! 9.0 ! 05-01 (C. Ethe) Free form, F90203 190 !!---------------------------------------------------------------------- 204 !! * Modules used205 191 #if defined key_zdfddm 206 192 USE oce , zviscos => ua, & ! temp. array for viscosities use ua as workspace … … 211 197 & zdiffut => ta ! temp. array for diffusivities use sa as workspace 212 198 #endif 213 214 215 !! * arguments 216 INTEGER, INTENT( in ) :: & 217 kt ! ocean time step 218 219 !! * local declarations 220 INTEGER :: & 221 ji, jj, jk ! dummy loop indices 222 INTEGER :: & ! 223 ikbot, jkmax, jkm1, jkp2 ! 199 !! 200 INTEGER, INTENT( in ) :: kt ! ocean time step 201 !! 202 INTEGER :: ji, jj, jk ! dummy loop indices 203 INTEGER :: ikbot, jkmax, jkm1, jkp2 ! 224 204 225 205 REAL(wp), DIMENSION(jpi,jpj) :: & !!! Surface buoyancy forcing, friction velocity … … 1251 1231 IF(ln_ctl) THEN 1252 1232 #if defined key_zdfddm 1253 CALL prt_ctl(tab3d_1=avt , clinfo1=' kpp - t: ', tab3d_2=avs , clinfo2=' s: ', & 1254 & ovlap=1, kdim=jpk) 1233 CALL prt_ctl(tab3d_1=avt , clinfo1=' kpp - t: ', tab3d_2=avs , clinfo2=' s: ', ovlap=1, kdim=jpk) 1255 1234 #else 1256 CALL prt_ctl(tab3d_1=avt , clinfo1=' kpp - t: ', ovlap=1, kdim=jpk) 1257 #endif 1258 CALL prt_ctl(tab3d_1=avmu , clinfo1=' u: ', tab3d_2=avmv , clinfo2=' v: ', & 1259 & ovlap=1, kdim=jpk) 1235 CALL prt_ctl(tab3d_1=avt , clinfo1=' kpp - t: ', ovlap=1, kdim=jpk) 1236 #endif 1237 CALL prt_ctl(tab3d_1=avmu, clinfo1=' u: ', tab3d_2=avmv , clinfo2=' v: ', ovlap=1, kdim=jpk) 1260 1238 ENDIF 1261 1239 … … 1312 1290 ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 1313 1291 !!bug gm jpttdzdf ==> jpttkpp 1314 CALL trd_mod(ztrdt, ztrds, jpt tdzdf, 'TRA', kt)1292 CALL trd_mod(ztrdt, ztrds, jptra_trd_zdf, 'TRA', kt) 1315 1293 ENDIF 1316 1294 1317 IF(ln_ctl) THEN ! print mean trends (used for debugging) 1318 CALL prt_ctl(tab3d_1=ta, clinfo1=' kpp - Ta: ', mask1=tmask, & 1319 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra') 1295 IF(ln_ctl) CALL prt_ctl( tab3d_1=ta, clinfo1=' kpp - Ta: ', mask1=tmask, & 1296 & tab3d_2=sa, clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 1320 1297 ENDIF 1321 1298 … … 1594 1571 END DO 1595 1572 #endif 1596 1597 1573 END SUBROUTINE zdf_kpp_init 1598 1574 -
trunk/NEMO/OPA_SRC/opa.F90
r473 r503 62 62 USE cpl ! coupled ocean/atmos. (cpl_init routine) 63 63 USE ocfzpt ! ocean freezing point (oc_fz_pt routine) 64 USE trdicp ! momentum/tracers trends (trd_icp_init routine) 65 USE trdvor ! vorticity trends (trd_vor_init routine) 66 USE trdmld ! tracer mixed layer trends (trd_mld_init routine) 64 USE trdmod ! momentum/tracers trends (trd_mod_init routine) 67 65 USE flxfwb ! freshwater budget correction (flx_fwb_init routine) 68 66 USE flxmod ! thermohaline forcing of the ocean (flx_init routine) … … 280 278 CALL zdf_init ! Vertical ocean physics 281 279 282 ! ! Ocean trends 283 ! Control parameters 284 IF( lk_trdtra .OR. lk_trdmld ) l_trdtra = .TRUE. 285 IF( lk_trddyn .OR. lk_trdvor ) l_trddyn = .TRUE. 286 287 IF( lk_trddyn .OR. lk_trdtra ) & 288 & CALL trd_icp_init ! active tracers and/or momentum 289 290 IF( lk_trdmld ) CALL trd_mld_init ! mixed layer 291 292 IF( lk_trdvor ) CALL trd_vor_init ! vorticity 280 CALL trd_mod_init ! Mixed-layer/Vorticity/Integral constraints trends 281 293 282 294 283 #if defined key_passivetrc -
trunk/NEMO/OPA_SRC/step.F90
r474 r503 102 102 USE trdicp ! Ocean momentum/tracers trends (trd_wri routine) 103 103 USE trdmld ! mixed-layer trends (trd_mld routine) 104 USE trdmld_rst ! restart for mixed-layer trends 105 USE trdmod_oce ! ocean momentum/tracers trends 104 106 USE trdvor ! vorticity budget (trd_vor routine) 105 107 USE diagap ! hor. mean model-data gap (dia_gap routine) … … 424 426 CALL rst_write ( kstp ) ! ocean model: restart file output 425 427 IF( lk_obc ) CALL obc_rst_wri( kstp ) ! ocean model: open boundary restart file output 428 IF( lk_trdmld ) CALL trd_mld_rst_write( kstp ) ! ocean model: restart file output for trends diagnostics 426 429 CALL dia_wri ( kstp, indic ) ! ocean model: outputs 427 430
Note: See TracChangeset
for help on using the changeset viewer.