Changeset 503 for trunk/NEMO/OPA_SRC/DYN
- Timestamp:
- 2006-09-27T10:52:29+02:00 (18 years ago)
- Location:
- trunk/NEMO/OPA_SRC/DYN
- Files:
-
- 12 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
Note: See TracChangeset
for help on using the changeset viewer.