- Timestamp:
- 2021-08-03T16:15:46+02:00 (3 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/cfgs/SHARED/field_def_nemo-oce.xml
r15154 r15168 851 851 <field id="utrd_ldf" long_name="i-trend: lateral diffusion" unit="m/s^2" /> 852 852 <field id="utrd_zdf" long_name="i-trend: vertical diffusion" unit="m/s^2" /> 853 <field id="utrd_tau" long_name="i-trend: wind stress " unit="m/s^2" grid_ref="grid_U_2D" /> 854 <field id="utrd_bfr" long_name="i-trend: bottom friction (explicit)" unit="m/s^2" /> 855 <field id="utrd_bfri" long_name="i-trend: bottom friction (implicit)" unit="m/s^2" /> 856 <field id="utrd_bfr2d" long_name="i-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 853 <field id="utrd_tau" long_name="i-trend: wind stress in top layer " unit="m/s^2" grid_ref="grid_U_2D" /> 854 <field id="utrd_tau2d" long_name="i-trend: wind stress: 2D component " unit="m/s^2" grid_ref="grid_U_2D" /> 855 <field id="utrd_bfr" long_name="i-trend: bottom friction (3D) in bottom layer" unit="m/s^2" /> 856 <field id="utrd_bfr2d" long_name="i-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 857 <field id="utrd_tfr" long_name="i-trend: top friction (3D) in top layer" unit="m/s^2" /> 858 <field id="utrd_tfr2d" long_name="i-trend: top friction: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 857 859 <field id="utrd_tot" long_name="i-trend: total momentum trend before atf" unit="m/s^2" /> 858 860 <field id="utrd_atf" long_name="i-trend: asselin time filter trend" unit="m/s^2" /> … … 871 873 <field id="utrd_bta_e3u" unit="m2/s^2" > utrd_bta * e3u </field> 872 874 <field id="utrd_bfr_e3u" unit="m2/s^2" > utrd_bfr * e3u </field> 873 <field id="utrd_ bfri_e3u" unit="m2/s^2" > utrd_bfri* e3u </field>875 <field id="utrd_tfr_e3u" unit="m2/s^2" > utrd_tfr * e3u </field> 874 876 </field_group> 875 877 … … 891 893 <field id="vtrd_ldf" long_name="j-trend: lateral diffusion" unit="m/s^2" /> 892 894 <field id="vtrd_zdf" long_name="j-trend: vertical diffusion" unit="m/s^2" /> 893 <field id="vtrd_tau" long_name="j-trend: wind stress " unit="m/s^2" grid_ref="grid_V_2D" /> 894 <field id="vtrd_bfr" long_name="j-trend: bottom friction (explicit)" unit="m/s^2" /> 895 <field id="vtrd_bfri" long_name="j-trend: bottom friction (implicit)" unit="m/s^2" /> 896 <field id="vtrd_bfr2d" long_name="j-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_V_2D" /> 895 <field id="vtrd_tau" long_name="j-trend: wind stress in top layer " unit="m/s^2" grid_ref="grid_V_2D" /> 896 <field id="vtrd_tau2d" long_name="j-trend: wind stress: 2D component " unit="m/s^2" grid_ref="grid_V_2D" /> 897 <field id="vtrd_bfr" long_name="j-trend: bottom friction (3D) in bottom layer" unit="m/s^2" /> 898 <field id="vtrd_bfr2d" long_name="j-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_V_2D" /> 899 <field id="vtrd_tfr" long_name="j-trend: top friction (3D) in top layer" unit="m/s^2" /> 900 <field id="vtrd_tfr2d" long_name="j-trend: top friction: 2D component" unit="m/s^2" grid_ref="grid_V_2D" /> 897 901 <field id="vtrd_tot" long_name="j-trend: total momentum trend before atf" unit="m/s^2" /> 898 902 <field id="vtrd_atf" long_name="j-trend: asselin time filter trend" unit="m/s^2" /> … … 911 915 <field id="vtrd_bta_e3v" unit="m2/s^2" > vtrd_bta * e3v </field> 912 916 <field id="vtrd_bfr_e3v" unit="m2/s^2" > vtrd_bfr * e3v </field> 913 <field id="vtrd_ bfri_e3v" unit="m2/s^2" > vtrd_bfri* e3v </field>917 <field id="vtrd_tfr_e3v" unit="m2/s^2" > vtrd_tfr * e3v </field> 914 918 </field_group> 915 919 -
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/src/OCE/DYN/dynnxt.F90
r14075 r15168 164 164 zua(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) * z1_2dt 165 165 zva(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) * z1_2dt 166 CALL iom_put( "utrd_tot", zua ) ! total momentum trends, except the asselin time filter 167 CALL iom_put( "vtrd_tot", zva ) 166 CALL trd_dyn( zua, zva, jpdyn_tot, kt ) ! total momentum trends, except the asselin time filter 167 !!$ CALL iom_put( "utrd_tot", zua ) ! total momentum trends, except the asselin time filter 168 !!$ CALL iom_put( "vtrd_tot", zva ) 168 169 ENDIF 169 170 ! -
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/src/OCE/DYN/dynspg_ts.F90
r15154 r15168 172 172 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zspgtrdu, zspgtrdv, zpvotrdu, zpvotrdv ! SPG and PVO trends (if l_trddyn) 173 173 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztautrdu, ztautrdv, zbfrtrdu, zbfrtrdv ! TAU and BFR trends (if l_trddyn) 174 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztfrtrdu, ztfrtrdv ! TFR trends (if l_trddyn) 174 175 !!---------------------------------------------------------------------- 175 176 ! … … 189 190 zbfrtrdu(:,:) = 0._wp 190 191 zbfrtrdv(:,:) = 0._wp 192 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! top+bottom friction (ocean cavities) 193 ALLOCATE( ztfrtrdu(jpi,jpj), ztfrtrdv(jpi,jpj) ) 194 ztfrtrdu(:,:) = 0._wp 195 ztfrtrdv(:,:) = 0._wp 196 ENDIF 191 197 ENDIF 192 198 ! … … 323 329 END DO 324 330 ! 325 IF( l_trddyn ) THEN326 zbfrtrdu(:,:) = zu_frc(:,:)327 zbfrtrdv(:,:) = zv_frc(:,:)328 ENDIF329 331 ! != Add bottom stress contribution from baroclinic velocities =! 330 332 ! ! ----------------------------------------------------------- ! 331 CALL dyn_drg_init( zu_frc, zv_frc, zCdU_u, zCdU_v ) ! also provide the barotropic drag coefficients332 !333 333 IF( l_trddyn ) THEN 334 ! bottom friction trend diagnostic: bottom friction due to baroclinic currents 335 zbfrtrdu(:,:) = zu_frc(:,:) - zbfrtrdu(:,:) 336 zbfrtrdv(:,:) = zv_frc(:,:) - zbfrtrdv(:,:) 334 ! 335 CALL dyn_drg_init( zu_frc, zv_frc, zCdU_u, zCdU_v, & ! also provide the barotropic drag coefficients 336 & ztfrtrdu, ztfrtrdv, zbfrtrdu, zbfrtrdv ) 337 ! 338 ELSE 339 ! 340 CALL dyn_drg_init( zu_frc, zv_frc, zCdU_u, zCdU_v ) ! also provide the barotropic drag coefficients 341 ! 337 342 ENDIF 338 343 ! … … 690 695 IF( l_trddyn ) THEN 691 696 za2 = wgtbtp2(jn) 692 zbfrtrdu(:,:) = zbfrtrdu(:,:) + za2 * zCdU_u(:,:) * un_e(:,:) * hur_e(:,:) 693 zbfrtrdv(:,:) = zbfrtrdv(:,:) + za2 * zCdU_v(:,:) * vn_e(:,:) * hvr_e(:,:) 697 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! top+bottom friction (ocean cavities) 698 DO jj = 2, jpjm1 699 DO ji = fs_2, fs_jpim1 ! vector opt. 700 ztfrtrdu(ji,jj) = ztfrtrdu(ji,jj) + za2 * 0.5_wp*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj)) * un_e(ji,jj) * hur_e(ji,jj) 701 ztfrtrdv(ji,jj) = ztfrtrdv(ji,jj) + za2 * 0.5_wp*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj)) * vn_e(ji,jj) * hvr_e(ji,jj) 702 END DO 703 END DO 704 ENDIF 705 DO jj = 2, jpjm1 706 DO ji = fs_2, fs_jpim1 ! vector opt. 707 zbfrtrdu(ji,jj) = zbfrtrdu(ji,jj) + za2 * 0.5_wp*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj)) * un_e(ji,jj) * hur_e(ji,jj) 708 zbfrtrdv(ji,jj) = zbfrtrdv(ji,jj) + za2 * 0.5_wp*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj)) * vn_e(ji,jj) * hvr_e(ji,jj) 709 END DO 710 END DO 694 711 ENDIF 695 712 ENDIF … … 921 938 CALL trd_dyn( zbfrtrdu, zbfrtrdv, jpdyn_bfr, kt ) 922 939 DEALLOCATE( zspgtrdu, zspgtrdv, zpvotrdu, zpvotrdv, ztautrdu, ztautrdv, zbfrtrdu, zbfrtrdv ) 940 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! top+bottom friction (ocean cavities) 941 CALL trd_dyn( ztfrtrdu, ztfrtrdv, jpdyn_tfr, kt ) 942 DEALLOCATE( ztfrtrdu, ztfrtrdv ) 943 ENDIF 923 944 ENDIF 924 945 ! … … 1533 1554 1534 1555 1535 SUBROUTINE dyn_drg_init( pu_RHSi, pv_RHSi, pCdU_u, pCdU_v ) 1556 SUBROUTINE dyn_drg_init( pu_RHSi, pv_RHSi, pCdU_u, pCdU_v, & 1557 & ptfrtrdu, ptfrtrdv, pbfrtrdu, pbfrtrdv ) 1536 1558 !!---------------------------------------------------------------------- 1537 1559 !! *** ROUTINE dyn_drg_init *** … … 1545 1567 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pu_RHSi, pv_RHSi ! baroclinic part of the barotropic RHS 1546 1568 REAL(wp), DIMENSION(jpi,jpj), INTENT( out) :: pCdU_u , pCdU_v ! barotropic drag coefficients 1569 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout), OPTIONAL :: ptfrtrdu, ptfrtrdv ! top friction trends 1570 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout), OPTIONAL :: pbfrtrdu, pbfrtrdv ! bottom friction trends 1547 1571 ! 1548 1572 INTEGER :: ji, jj ! dummy loop indices … … 1572 1596 ! 1573 1597 ! !== BOTTOM stress contribution from baroclinic velocities ==! 1598 ! 1599 IF( l_trddyn ) THEN 1600 pbfrtrdu(:,:) = pu_RHSi(:,:) 1601 pbfrtrdv(:,:) = pv_RHSi(:,:) 1602 ENDIF 1574 1603 ! 1575 1604 IF( ln_bt_fw ) THEN ! FORWARD integration: use NOW bottom baroclinic velocities … … 1615 1644 END IF 1616 1645 ! 1646 IF( l_trddyn ) THEN 1647 pbfrtrdu(:,:) = pu_RHSi(:,:) - pbfrtrdu(:,:) 1648 pbfrtrdv(:,:) = pv_RHSi(:,:) - pbfrtrdv(:,:) 1649 ENDIF 1650 ! 1617 1651 ! !== TOP stress contribution from baroclinic velocities ==! (no W/D case) 1618 1652 ! 1619 1653 IF( ln_isfcav.OR.ln_drgice_imp ) THEN 1654 ! 1655 IF( l_trddyn ) THEN 1656 ptfrtrdu(:,:) = pu_RHSi(:,:) 1657 ptfrtrdv(:,:) = pv_RHSi(:,:) 1658 ENDIF 1620 1659 ! 1621 1660 IF( ln_bt_fw ) THEN ! FORWARD integration: use NOW top baroclinic velocity … … 1649 1688 END DO 1650 1689 END DO 1690 ! 1691 IF( l_trddyn ) THEN 1692 ptfrtrdu(:,:) = pu_RHSi(:,:) - ptfrtrdu(:,:) 1693 ptfrtrdv(:,:) = pv_RHSi(:,:) - ptfrtrdv(:,:) 1694 ENDIF 1651 1695 ! 1652 1696 ENDIF -
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/src/OCE/DYN/dynzdf.F90
r15154 r15168 70 70 INTEGER :: ji, jj, jk ! dummy loop indices 71 71 INTEGER :: iku, ikv ! local integers 72 INTEGER :: ikbu, ikbv ! local integers73 72 REAL(wp) :: zzwi, ze3ua, zdt ! local scalars 74 73 REAL(wp) :: zzws, ze3va ! - - … … 78 77 REAL(wp) :: zWus, zWvs ! - - 79 78 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwd, zws ! 3D workspace 80 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! - - 79 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! - - 80 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu_fr, ztrdv_fr ! - - 81 81 !!--------------------------------------------------------------------- 82 82 ! … … 117 117 END DO 118 118 ENDIF 119 ! 120 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 121 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 122 ztrdu(:,:,:) = ua(:,:,:) 123 ztrdv(:,:,:) = va(:,:,:) 124 ENDIF 125 ! 119 126 ! ! add top/bottom friction 120 127 ! With split-explicit free surface, barotropic stress is treated explicitly Update velocities at the bottom. … … 128 135 END DO 129 136 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 130 ALLOCATE( ztrdu (jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) )131 ztrdu (:,:,:) = ua(:,:,:)132 ztrdv (:,:,:) = va(:,:,:)137 ALLOCATE( ztrdu_fr(jpi,jpj,jpk), ztrdv_fr(jpi,jpj,jpk) ) 138 ztrdu_fr(:,:,:) = ua(:,:,:) 139 ztrdv_fr(:,:,:) = va(:,:,:) 133 140 ENDIF 134 141 DO jj = 2, jpjm1 ! Add bottom/top stress due to barotropic component only … … 142 149 END DO 143 150 END DO 151 IF( l_trddyn ) THEN ! save baroclinic bottom friction trends due to barotropic currents 152 ztrdu_fr(:,:,:) = ( ua(:,:,:) - ztrdu_fr(:,:,:) ) / r2dt 153 ztrdv_fr(:,:,:) = ( va(:,:,:) - ztrdv_fr(:,:,:) ) / r2dt 154 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_bfre_bt, kt ) 155 ENDIF 144 156 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! Ocean cavities (ISF) 157 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 158 ztrdu_fr(:,:,:) = ua(:,:,:) 159 ztrdv_fr(:,:,:) = va(:,:,:) 160 ENDIF 145 161 DO jj = 2, jpjm1 146 162 DO ji = fs_2, fs_jpim1 ! vector opt. … … 153 169 END DO 154 170 END DO 171 IF( l_trddyn ) THEN ! save baroclinic top friction trends due to barotropic currents 172 ztrdu_fr(:,:,:) = ( ua(:,:,:) - ztrdu_fr(:,:,:) ) / r2dt 173 ztrdv_fr(:,:,:) = ( va(:,:,:) - ztrdv_fr(:,:,:) ) / r2dt 174 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_tfre_bt, kt ) 175 ENDIF 155 176 END IF 156 IF( l_trddyn ) THEN ! save explicit part of bottom friction trends 157 ztrdu(:,:,:) = ( ua(:,:,:) - ztrdu(:,:,:) ) / r2dt 158 ztrdv(:,:,:) = ( va(:,:,:) - ztrdv(:,:,:) ) / r2dt 159 CALL trd_dyn( ztrdu, ztrdv, jpdyn_bfr, kt ) 160 ENDIF 161 ENDIF 162 ! 163 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 164 IF( .NOT. ALLOCATED(ztrdu) ) ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 165 ztrdu(:,:,:) = ua(:,:,:) 166 ztrdv(:,:,:) = va(:,:,:) 167 ENDIF 177 ENDIF 168 178 ! 169 179 ! !== Vertical diffusion on u ==! … … 497 507 END DO 498 508 ! 499 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 500 509 IF( l_trddyn ) THEN 510 ! Save the vertical diffusive trends for further diagnostics 511 ! and calculate implicit drag trends 512 ! (The order of operation is important here). 513 ! 501 514 ztrdu(:,:,:) = ( ua(:,:,:) - ztrdu(:,:,:) ) / r2dt 502 515 ztrdv(:,:,:) = ( va(:,:,:) - ztrdv(:,:,:) ) / r2dt … … 504 517 ! 505 518 IF( ln_drgimp ) THEN 506 ztrdu(:,:,:) = 0._wp ; ztrdv(:,:,:) = 0._wp 507 DO jk = 1, jpkm1 519 ztrdu_fr(:,:,:) = 0._wp ; ztrdv_fr(:,:,:) = 0._wp 520 DO jj = 2, jpjm1 521 DO ji = 2, jpim1 522 iku = mbku(ji,jj) ! deepest ocean u- & v-levels 523 ikv = mbkv(ji,jj) 524 ztrdu_fr(ji,jj,iku) = 0.5 * ( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) ) & 525 & * un(ji,jj,iku) / e3u_n(ji,jj,iku) 526 ztrdv_fr(ji,jj,ikv) = 0.5 * ( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) ) & 527 & * vn(ji,jj,ikv) / e3v_n(ji,jj,ikv) 528 END DO 529 END DO 530 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_bfri, kt ) 531 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! Ocean cavities (ISF) or implicit ice-ocean drag 532 ztrdu_fr(:,:,:) = 0._wp ; ztrdv_fr(:,:,:) = 0._wp 508 533 DO jj = 2, jpjm1 509 534 DO ji = 2, jpim1 510 ik bu = mbku(ji,jj) ! deepest ocean u- & v-levels511 ik bv = mbkv(ji,jj)512 ztrdu (ji,jj,jk) = 0.5 * ( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) ) &513 & * un(ji,jj,ikbu) / e3u_n(ji,jj,ikbu)514 ztrdv (ji,jj,jk) = 0.5 * ( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) ) &515 & * vn(ji,jj,ikbv) / e3v_n(ji,jj,ikbv)516 END DO 517 END DO 518 END DO519 CALL trd_dyn( ztrdu, ztrdv, jpdyn_bfri, kt )535 iku = miku(ji,jj) ! ocean top level at u-points 536 ikv = mikv(ji,jj) ! ocean top level at v-points 537 ztrdu_fr(ji,jj,iku) = 0.5 * ( rCdU_top(ji+1,jj) + rCdU_top(ji,jj) ) & 538 & * un(ji,jj,iku) / e3u_n(ji,jj,iku) 539 ztrdv_fr(ji,jj,ikv) = 0.5 * ( rCdU_top(ji,jj+1) + rCdU_top(ji,jj) ) & 540 & * vn(ji,jj,ikv) / e3v_n(ji,jj,ikv) 541 END DO 542 END DO 543 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_tfri, kt ) 544 ENDIF 520 545 ENDIF 521 546 ! 547 IF( ALLOCATED(ztrdu_fr) ) DEALLOCATE( ztrdu_fr, ztrdv_fr ) 522 548 DEALLOCATE( ztrdu, ztrdv ) 523 549 ENDIF -
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/src/OCE/TRD/trd_oce.F90
r15154 r15168 59 59 ! 60 60 ! !!!* Momentum trends indices 61 INTEGER, PUBLIC, PARAMETER :: jptot_dyn = 17!: Total trend nb: change it when adding/removing one indice below61 INTEGER, PUBLIC, PARAMETER :: jptot_dyn = 24 !: Total trend nb: change it when adding/removing one indice below 62 62 ! =============== ! 63 63 INTEGER, PUBLIC, PARAMETER :: jpdyn_hpg = 1 !: hydrostatic pressure gradient … … 73 73 INTEGER, PUBLIC, PARAMETER :: jpdyn_ldf = 11 !: horizontal diffusion 74 74 INTEGER, PUBLIC, PARAMETER :: jpdyn_zdf = 12 !: vertical diffusion 75 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfr = 13 !: bottom stress 76 INTEGER, PUBLIC, PARAMETER :: jpdyn_atf = 14 !: Asselin time filter 77 INTEGER, PUBLIC, PARAMETER :: jpdyn_tau = 15 !: surface stress 78 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfri = 16 !: implicit bottom friction (ln_drgimp=.TRUE.) 79 INTEGER, PUBLIC, PARAMETER :: jpdyn_ken = 17 !: use for calculation of KE 75 INTEGER, PUBLIC, PARAMETER :: jpdyn_tau = 13 !: wind stress (= ice-ocean drag under ice if ln_drgice_imp=F) 76 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfr = 14 !: top friction (cavities and ice-ocean drag if ln_drgice_imp=T) 77 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfr = 15 !: bottom friction 78 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfre = 16 !: explicit top friction for baroclinic trend (ln_drgimp=.FALSE.) 79 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfre_bt = 17 !: top friction due to barotropic currents for baroclinic trend (ln_dynspg_ts=.TRUE.) 80 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfri = 18 !: implicit top friction for baroclinic trend 81 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfre = 19 !: explicit bottom friction for baroclinic trend (ln_drgimp=.FALSE.) 82 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfre_bt = 20 !: bottom friction due to barotropic currents for baroclinic trend (ln_dynspg_ts=.TRUE.) 83 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfri = 21 !: implicit bottom friction for baroclinic trend (ln_drgimp=.TRUE.) 84 INTEGER, PUBLIC, PARAMETER :: jpdyn_tot = 22 !: Total trend excluding Asselin time filter 85 INTEGER, PUBLIC, PARAMETER :: jpdyn_atf = 23 !: Asselin time filter 86 INTEGER, PUBLIC, PARAMETER :: jpdyn_ken = 24 !: use for calculation of KE 80 87 ! 81 88 !!---------------------------------------------------------------------- -
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/src/OCE/TRD/trddyn.F90
r15154 r15168 40 40 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_hpg, zvtrd_hpg 41 41 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_pvo, zvtrd_pvo 42 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_tfr, zvtrd_tfr 42 43 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_bfr, zvtrd_bfr 43 REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_tau, zvtrd_tau 44 REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_tau2d, zvtrd_tau2d 45 REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_tfr2d, zvtrd_tfr2d 46 REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_bfr2d, zvtrd_bfr2d 44 47 45 48 !! * Substitutions … … 65 68 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zue, zve ! temporary 2D arrays 66 69 INTEGER :: jk 70 LOGICAL, SAVE :: l_drgexp ! local logical to flag explicit friction 67 71 !!---------------------------------------------------------------------- 68 72 ! … … 96 100 DEALLOCATE( zutrd_hpg, zvtrd_hpg ) 97 101 98 CASE( jpdyn_bfr ) 99 ! 100 ! Add 3D part of BFR trend minus its depth-mean part to depth-mean trend already saved. 101 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 102 zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1) 103 zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1) 104 DO jk = 2, jpkm1 105 zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk) 106 zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk) 107 END DO 108 DO jk = 1, jpkm1 109 putrd(:,:,jk) = zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:) 110 pvtrd(:,:,jk) = zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:) 111 END DO 112 ! Update locally saved BFR trends to add to ZDF trend. 113 zutrd_bfr(:,:,:) = putrd(:,:,:) 114 zvtrd_bfr(:,:,:) = pvtrd(:,:,:) 102 CASE( jpdyn_tfre, jpdyn_tfre_bt, jpdyn_tfri ) 103 ! 104 ! Add various top friction terms for baroclinic trend to saved quantity. 105 ! Any depth-mean component removed later when TFR trend written out. 106 IF( .NOT. ALLOCATED(zutrd_tfr) ) THEN 107 ALLOCATE( zutrd_tfr(jpi,jpj,jpk), zvtrd_tfr(jpi,jpj,jpk) ) 108 zutrd_tfr(:,:,:) = 0.0 109 zvtrd_tfr(:,:,:) = 0.0 110 ENDIF 111 zutrd_tfr(:,:,:) = zutrd_tfr(:,:,:) + putrd(:,:,:) 112 zvtrd_tfr(:,:,:) = zvtrd_tfr(:,:,:) + pvtrd(:,:,:) 113 114 CASE( jpdyn_bfre, jpdyn_bfre_bt, jpdyn_bfri ) 115 ! 116 ! Add various bottom friction terms for baroclinic trend to saved quantity. 117 ! Any depth-mean component removed later when TFR trend written out. 118 l_drgexp = .false. 119 IF( .NOT. ALLOCATED(zutrd_bfr) ) THEN 120 ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) ) 121 zutrd_bfr(:,:,:) = 0.0 122 zvtrd_bfr(:,:,:) = 0.0 123 ENDIF 124 zutrd_bfr(:,:,:) = zutrd_bfr(:,:,:) + putrd(:,:,:) 125 zvtrd_bfr(:,:,:) = zvtrd_bfr(:,:,:) + pvtrd(:,:,:) 115 126 116 127 CASE( jpdyn_zdf ) 117 ! ZDF trend: Remove barotropic component and add wind stress and bottom friction 118 ! trends from dynspg_ts. Also adding on the bottom stress for the 119 ! baroclinic solution in the case of explicit bottom friction. 120 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 121 zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1) 122 zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1) 123 DO jk = 2, jpkm1 124 zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk) 125 zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk) 126 END DO 127 DO jk = 1, jpkm1 128 putrd(:,:,jk) = zutrd_tau(:,:) + zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:) 129 pvtrd(:,:,jk) = zvtrd_tau(:,:) + zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:) 130 END DO 131 DEALLOCATE( zue, zve, zutrd_tau, zvtrd_tau, zutrd_bfr, zvtrd_bfr ) 128 ! ZDF trend: Add explicit bottom friction if necessary. If ln_dynspg_ts, remove barotropic component 129 ! and add wind stress, and top and bottom friction trends from dynspg_ts. 130 ! 131 ! If TFR or BFR arrays allocated at this stage then they will contain trends due 132 ! to explicit top or bottom drag components which need to be added to the ZDF trend. 133 IF( ALLOCATED( zutrd_tfr ) )THEN 134 DO jk = 1, jpkm1 135 putrd(:,:,jk) = ( putrd(:,:,jk) + zutrd_tfr(:,:,jk) ) * umask(:,:,jk) 136 pvtrd(:,:,jk) = ( pvtrd(:,:,jk) + zvtrd_tfr(:,:,jk) ) * vmask(:,:,jk) 137 END DO 138 ENDIF 139 IF( ALLOCATED( zutrd_bfr ) )THEN 140 DO jk = 1, jpkm1 141 putrd(:,:,jk) = ( putrd(:,:,jk) + zutrd_bfr(:,:,jk) ) * umask(:,:,jk) 142 pvtrd(:,:,jk) = ( pvtrd(:,:,jk) + zvtrd_bfr(:,:,jk) ) * vmask(:,:,jk) 143 END DO 144 ENDIF 145 IF( ln_dynspg_ts ) THEN 146 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 147 zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1) 148 zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1) 149 DO jk = 2, jpkm1 150 zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk) 151 zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk) 152 END DO 153 DO jk = 1, jpkm1 154 putrd(:,:,jk) = ( zutrd_tau2d(:,:) + zutrd_bfr2d(:,:) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:) ) * umask(:,:,jk) 155 pvtrd(:,:,jk) = ( zvtrd_tau2d(:,:) + zvtrd_bfr2d(:,:) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:) ) * vmask(:,:,jk) 156 END DO 157 DEALLOCATE( zue, zve, zutrd_tau2d, zvtrd_tau2d, zutrd_bfr2d, zvtrd_bfr2d) 158 IF( ALLOCATED( zutrd_tfr2d ) ) THEN 159 DO jk = 1, jpkm1 160 putrd(:,:,jk) = ( putrd(:,:,jk) + zutrd_tfr2d(:,:) ) * umask(:,:,jk) 161 pvtrd(:,:,jk) = ( pvtrd(:,:,jk) + zvtrd_tfr2d(:,:) ) * vmask(:,:,jk) 162 END DO 163 DEALLOCATE( zutrd_tfr2d, zvtrd_tfr2d ) 164 ENDIF 165 ! 166 ENDIF 167 ! 168 CASE( jpdyn_tot ) 169 ! Don't need to do anything special for TOT trends, but we are at the end of the timestep, so 170 ! write out total top and bottom friction "trends" for the surface / bottom layers after 171 ! removing any depth-mean component. 172 IF( ALLOCATED( zutrd_tfr ) ) THEN 173 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 174 zue(:,:) = e3u_a(:,:,1) * zutrd_tfr(:,:,1) * umask(:,:,1) 175 zve(:,:) = e3v_a(:,:,1) * zvtrd_tfr(:,:,1) * vmask(:,:,1) 176 DO jk = 2, jpkm1 177 zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * zutrd_tfr(:,:,jk) * umask(:,:,jk) 178 zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * zvtrd_tfr(:,:,jk) * vmask(:,:,jk) 179 END DO 180 DO jk = 1, jpkm1 181 zutrd_tfr(:,:,jk) = ( zutrd_tfr(:,:,jk) - zue(:,:) * r1_hu_a(:,:) ) * umask(:,:,jk) 182 zvtrd_tfr(:,:,jk) = ( zvtrd_tfr(:,:,jk) - zve(:,:) * r1_hv_a(:,:) ) * vmask(:,:,jk) 183 END DO 184 CALL trd_dyn_iom_3d( zutrd_tfr, zvtrd_tfr, jpdyn_tfr, kt ) 185 DEALLOCATE( zue, zve, zutrd_tfr, zvtrd_tfr ) 186 ENDIF 187 IF( ALLOCATED( zutrd_bfr ) ) THEN 188 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 189 zue(:,:) = e3u_a(:,:,1) * zutrd_bfr(:,:,1) * umask(:,:,1) 190 zve(:,:) = e3v_a(:,:,1) * zvtrd_bfr(:,:,1) * vmask(:,:,1) 191 DO jk = 2, jpkm1 192 zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * zutrd_bfr(:,:,jk) * umask(:,:,jk) 193 zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * zvtrd_bfr(:,:,jk) * vmask(:,:,jk) 194 END DO 195 DO jk = 1, jpkm1 196 zutrd_bfr(:,:,jk) = ( zutrd_bfr(:,:,jk) - zue(:,:) * r1_hu_a(:,:) ) * umask(:,:,jk) 197 zvtrd_bfr(:,:,jk) = ( zvtrd_bfr(:,:,jk) - zve(:,:) * r1_hv_a(:,:) ) * vmask(:,:,jk) 198 END DO 199 CALL trd_dyn_iom_3d( zutrd_bfr, zvtrd_bfr, jpdyn_bfr, kt ) 200 DEALLOCATE( zue, zve, zutrd_bfr, zvtrd_bfr ) 201 ENDIF 132 202 133 203 END SELECT 134 204 135 IF ( ktrd /= jpdyn_hpg_save .AND. ktrd /= jpdyn_pvo_save ) THEN 205 IF ( ktrd /= jpdyn_hpg_save .AND. ktrd /= jpdyn_pvo_save .AND. & 206 & ktrd /= jpdyn_tfre .AND. ktrd /= jpdyn_tfre_bt .AND. & 207 & ktrd /= jpdyn_tfri .AND. ktrd /= jpdyn_bfre .AND. & 208 & ktrd /= jpdyn_bfre_bt .AND. ktrd /= jpdyn_bfri ) THEN 136 209 ! 137 210 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 228 301 ! Save 2D wind forcing trend locally (to be added to ZDF trend) 229 302 ! and output as a trend in its own right. 230 ALLOCATE( zutrd_tau(jpi,jpj), zvtrd_tau(jpi,jpj) ) 231 zutrd_tau(:,:) = putrd(:,:) 232 zvtrd_tau(:,:) = pvtrd(:,:) 303 ALLOCATE( zutrd_tau2d(jpi,jpj), zvtrd_tau2d(jpi,jpj) ) 304 zutrd_tau2d(:,:) = putrd(:,:) 305 zvtrd_tau2d(:,:) = pvtrd(:,:) 306 307 CASE( jpdyn_tfr ) 308 ! 309 ! Save 2D field to add to ZDF trend (and also output 2D field as diagnostic in own right below). 310 ALLOCATE( zutrd_tfr2d(jpi,jpj), zvtrd_tfr2d(jpi,jpj) ) 311 zutrd_tfr2d(:,:) = putrd(:,:) 312 zvtrd_tfr2d(:,:) = pvtrd(:,:) 233 313 234 314 CASE( jpdyn_bfr ) 235 315 ! 236 316 ! Create 3D BFR trend from 2D field and also output 2D field as diagnostic in own right. 237 ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) ) 238 zutrd_bfr(:,:,:) = 0.0 239 zvtrd_bfr(:,:,:) = 0.0 240 DO jk = 1, jpkm1 241 zutrd_bfr(:,:,jk) = putrd(:,:) * umask(:,:,jk) 242 zvtrd_bfr(:,:,jk) = pvtrd(:,:) * vmask(:,:,jk) 243 ENDDO 317 ALLOCATE( zutrd_bfr2d(jpi,jpj), zvtrd_bfr2d(jpi,jpj) ) 318 zutrd_bfr2d(:,:) = putrd(:,:) 319 zvtrd_bfr2d(:,:) = pvtrd(:,:) 244 320 245 321 END SELECT … … 322 398 CALL iom_put( "vtrd_zdf", pvtrd ) 323 399 ! 324 ! ! wind stress trends 400 ! ! wind stress trends in surface layer 325 401 ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) ) 326 402 z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u_n(:,:,1) * rau0 ) … … 329 405 CALL iom_put( "vtrd_tau", z2dy ) 330 406 DEALLOCATE( z2dx , z2dy ) 331 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr", putrd ) ! bottom friction (explicit case)407 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr", putrd ) ! bottom friction for bottom layer 332 408 CALL iom_put( "vtrd_bfr", pvtrd ) 333 CASE( jpdyn_bfri) ; CALL iom_put( "utrd_bfri", putrd ) ! bottom friction (implicit case) 334 CALL iom_put( "vtrd_bfri", pvtrd ) 335 CASE( jpdyn_atf ) ; CALL iom_put( "utrd_atf", putrd ) ! asselin filter trends 409 CASE( jpdyn_tfr ) ; CALL iom_put( "utrd_tfr", putrd ) ! total top friction for top layer 410 CALL iom_put( "vtrd_tfr", pvtrd ) 411 CASE( jpdyn_tot ) ; CALL iom_put( "utrd_tot", putrd ) ! total trends excluding asselin filter 412 CALL iom_put( "vtrd_tot", pvtrd ) 413 CASE( jpdyn_atf ) ; CALL iom_put( "utrd_atf", putrd ) ! asselin filter trends 336 414 CALL iom_put( "vtrd_atf", pvtrd ) 337 415 END SELECT … … 365 443 CASE( jpdyn_pvo_corr ) ; CALL iom_put( "utrd_pvo_corr", putrd ) ! planetary vorticity correction 366 444 CALL iom_put( "vtrd_pvo_corr", pvtrd ) 367 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr2d", putrd ) ! bottom friction due to barotropic currents 445 CASE( jpdyn_tau ) ; CALL iom_put( "utrd_tau2d", putrd ) ! wind stress depth-mean trend 446 CALL iom_put( "vtrd_tau2d", pvtrd ) 447 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr2d", putrd ) ! bottom friction depth-mean trend 368 448 CALL iom_put( "vtrd_bfr2d", pvtrd ) 449 CASE( jpdyn_tfr ) ; CALL iom_put( "utrd_tfr2d", putrd ) ! top friction depth-mean trend 450 CALL iom_put( "vtrd_tfr2d", pvtrd ) 369 451 END SELECT 370 452 ! -
NEMO/branches/UKMO/NEMO_4.0.4_momentum_trends/src/OCE/ZDF/zdfdrg.F90
r14075 r15168 191 191 END DO 192 192 ! 193 IF( l_trddyn ) THEN ! trends: send trends to trddyn for further diagnostics 194 ztrdu(:,:,:) = pua(:,:,:) - ztrdu(:,:,:) 195 ztrdv(:,:,:) = pva(:,:,:) - ztrdv(:,:,:) 196 CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfre, kt ) 197 DEALLOCATE( ztrdu, ztrdv ) 198 ENDIF 199 ! 193 200 IF( ln_isfcav ) THEN ! ocean cavities 201 IF( l_trddyn ) THEN ! trends: store the input trends 202 ztrdu(:,:,:) = pua(:,:,:) 203 ztrdv(:,:,:) = pva(:,:,:) 204 ENDIF 194 205 DO jj = 2, jpjm1 195 206 DO ji = 2, jpim1 … … 205 216 END DO 206 217 END DO 207 ENDIF 208 ! 209 IF( l_trddyn ) THEN ! trends: send trends to trddyn for further diagnostics 210 ztrdu(:,:,:) = pua(:,:,:) - ztrdu(:,:,:) 211 ztrdv(:,:,:) = pva(:,:,:) - ztrdv(:,:,:) 212 CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr, kt ) 213 DEALLOCATE( ztrdu, ztrdv ) 214 ENDIF 218 IF( l_trddyn ) THEN ! trends: send trends to trddyn for further diagnostics 219 ztrdu(:,:,:) = pua(:,:,:) - ztrdu(:,:,:) 220 ztrdv(:,:,:) = pva(:,:,:) - ztrdv(:,:,:) 221 CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_tfre, kt ) 222 ENDIF 223 ENDIF 224 ! 215 225 ! ! print mean trends (used for debugging) 216 226 IF(ln_ctl) CALL prt_ctl( tab3d_1=pua, clinfo1=' bfr - Ua: ', mask1=umask, &
Note: See TracChangeset
for help on using the changeset viewer.