- Timestamp:
- 2021-04-23T13:12:15+02:00 (3 years ago)
- Location:
- NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/cfgs/SHARED/field_def_nemo-oce.xml
r14701 r14742 1061 1061 <field id="utrd_pvo" long_name="i-trend: planetary vorticity: 3D component" unit="m/s^2" /> 1062 1062 <field id="utrd_pvo2d" long_name="i-trend: planetary vorticity: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 1063 <field id="utrd_pvo_corr" long_name="i-trend: planetary vorticity: correction" 1063 <field id="utrd_pvo_corr" long_name="i-trend: planetary vorticity: correction" unit="m/s^2" grid_ref="grid_U_2D" /> 1064 1064 <field id="utrd_zad" long_name="i-trend: vertical advection" unit="m/s^2" /> 1065 1065 <field id="utrd_udx" long_name="i-trend: U.dx[U]" unit="m/s^2" /> … … 1067 1067 <field id="utrd_zdf" long_name="i-trend: vertical diffusion" unit="m/s^2" /> 1068 1068 <field id="utrd_tau" long_name="i-trend: wind stress " unit="m/s^2" grid_ref="grid_U_2D" /> 1069 <field id="utrd_bfr" long_name="i-trend: bottom friction (explicit)" unit="m/s^2" /> 1070 <field id="utrd_bfri" long_name="i-trend: bottom friction (implicit)" unit="m/s^2" /> 1071 <field id="utrd_bfr2d" long_name="i-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 1069 <field id="utrd_tfr" long_name="i-trend: total top friction excluding wind stress" unit="m/s^2" /> 1070 <field id="utrd_bfr" long_name="i-trend: total bottom friction (explicit and implicit)" unit="m/s^2" /> 1071 <field id="utrd_tfr2d" long_name="i-trend: top friction: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 1072 <field id="utrd_bfr2d" long_name="i-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_U_2D" /> 1072 1073 <field id="utrd_tot" long_name="i-trend: total momentum trend before atf" unit="m/s^2" /> 1073 1074 <field id="utrd_atf" long_name="i-trend: asselin time filter trend" unit="m/s^2" /> … … 1085 1086 <field id="utrd_atf_e3u" unit="m2/s^2" > utrd_atf * e3u </field> 1086 1087 <field id="utrd_bta_e3u" unit="m2/s^2" > utrd_bta * e3u </field> 1088 <field id="utrd_tfr_e3u" unit="m2/s^2" > utrd_tfr * e3u </field> 1087 1089 <field id="utrd_bfr_e3u" unit="m2/s^2" > utrd_bfr * e3u </field> 1088 <field id="utrd_bfri_e3u" unit="m2/s^2" > utrd_bfri * e3u </field>1089 1090 </field_group> 1090 1091 … … 1104 1105 <field id="vtrd_zdf" long_name="j-trend: vertical diffusion" unit="m/s^2" /> 1105 1106 <field id="vtrd_tau" long_name="j-trend: wind stress " unit="m/s^2" grid_ref="grid_V_2D" /> 1106 <field id="vtrd_bfr" long_name="j-trend: bottom friction (explicit)" unit="m/s^2" /> 1107 <field id="vtrd_bfri" long_name="j-trend: bottom friction (implicit)" unit="m/s^2" /> 1108 <field id="vtrd_bfr2d" long_name="j-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_V_2D" /> 1107 <field id="vtrd_tfr" long_name="j-trend: total top friction excluding wind stress" unit="m/s^2" /> 1108 <field id="vtrd_bfr" long_name="j-trend: total bottom friction (explicit and implicit)" unit="m/s^2" /> 1109 <field id="vtrd_tfr2d" long_name="j-trend: top friction: 2D component" unit="m/s^2" grid_ref="grid_V_2D" /> 1110 <field id="vtrd_bfr2d" long_name="j-trend: bottom friction: 2D component" unit="m/s^2" grid_ref="grid_V_2D" /> 1109 1111 <field id="vtrd_tot" long_name="j-trend: total momentum trend before atf" unit="m/s^2" /> 1110 1112 <field id="vtrd_atf" long_name="j-trend: asselin time filter trend" unit="m/s^2" /> … … 1122 1124 <field id="vtrd_atf_e3v" unit="m2/s^2" > vtrd_atf * e3v </field> 1123 1125 <field id="vtrd_bta_e3v" unit="m2/s^2" > vtrd_bta * e3v </field> 1126 <field id="vtrd_tfr_e3v" unit="m2/s^2" > vtrd_tfr * e3v </field> 1124 1127 <field id="vtrd_bfr_e3v" unit="m2/s^2" > vtrd_bfr * e3v </field> 1125 <field id="vtrd_bfri_e3v" unit="m2/s^2" > vtrd_bfri * e3v </field>1126 1128 </field_group> 1127 1129 -
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/DYN/dynspg_ts.F90
r14716 r14742 178 178 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zuwdav2, zvwdav2 ! averages over the sub-steps of zuwdmask and zvwdmask 179 179 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zspgtrdu, zspgtrdv, zpvotrdu, zpvotrdv ! SPG and PVO trends (if l_trddyn) 180 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztautrdu, ztautrdv, zbfrtrdu, zbfrtrdv ! TAU and BFR trends (if l_trddyn) 180 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztautrdu, ztautrdv, ztfrtrdu, ztfrtrdv ! TAU and TFR trends (if l_trddyn) 181 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zbfrtrdu, zbfrtrdv ! BFR trends (if l_trddyn) 181 182 REAL(wp) :: zt0substep ! Time of day at the beginning of the time substep 182 183 !!---------------------------------------------------------------------- … … 188 189 IF( l_trddyn ) THEN 189 190 ALLOCATE( zspgtrdu(jpi,jpj), zspgtrdv(jpi,jpj), zpvotrdu(jpi,jpj), zpvotrdv(jpi,jpj), & 190 & ztautrdu(jpi,jpj), ztautrdv(jpi,jpj), zbfrtrdu(jpi,jpj), zbfrtrdv(jpi,jpj) ) 191 & ztautrdu(jpi,jpj), ztautrdv(jpi,jpj), ztfrtrdu(jpi,jpj), ztfrtrdv(jpi,jpj), & 192 & zbfrtrdu(jpi,jpj), zbfrtrdv(jpi,jpj) ) 191 193 zspgtrdu(:,:) = 0._wp 192 194 zspgtrdv(:,:) = 0._wp … … 195 197 ztautrdu(:,:) = 0._wp 196 198 ztautrdv(:,:) = 0._wp 199 ztfrtrdu(:,:) = 0._wp 200 ztfrtrdv(:,:) = 0._wp 197 201 zbfrtrdu(:,:) = 0._wp 198 202 zbfrtrdv(:,:) = 0._wp … … 303 307 zCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 304 308 END_2D 305 ELSE !* removebaroclinic drag AND provide the barotropic drag coefficients309 ELSE !* add baroclinic drag AND provide the barotropic drag coefficients 306 310 IF( l_trddyn ) THEN 307 zbfrtrdu(:,:) = zu_frc(:,:) 308 zbfrtrdv(:,:) = zv_frc(:,:) 309 ENDIF 310 ! 311 CALL dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b, pvv_b, zu_frc, zv_frc, zCdU_u, zCdU_v ) 312 ! 313 IF( l_trddyn ) THEN 314 ! bottom friction trend diagnostic: bottom friction due to baroclinic currents 315 zbfrtrdu(:,:) = zu_frc(:,:) - zbfrtrdu(:,:) 316 zbfrtrdv(:,:) = zv_frc(:,:) - zbfrtrdv(:,:) 311 ! 312 CALL dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b, pvv_b, zu_frc, zv_frc, zCdU_u, zCdU_v, & 313 & ztfrtrdu, ztfrtrdv, zbfrtrdu, zbfrtrdv ) 314 ! 315 ELSE 316 ! 317 CALL dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b, pvv_b, zu_frc, zv_frc, zCdU_u, zCdU_v ) 318 ! 317 319 ENDIF 318 320 ENDIF … … 667 669 IF( l_trddyn ) THEN 668 670 za2 = wgtbtp2(jn) 669 zbfrtrdu(:,:) = zbfrtrdu(:,:) + za2 * zCdU_u(:,:) * un_e(:,:) * hur_e(:,:) 670 zbfrtrdv(:,:) = zbfrtrdv(:,:) + za2 * zCdU_v(:,:) * vn_e(:,:) * hvr_e(:,:) 671 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! top+bottom friction (ocean cavities) 672 DO_2D( 0, 0, 0, 0 ) 673 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) 674 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) 675 END_2D 676 ENDIF 677 DO_2D( 0, 0, 0, 0 ) 678 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) 679 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) 680 END_2D 671 681 ENDIF 672 682 ENDIF … … 899 909 CALL trd_dyn( zpvotrdu, zpvotrdv, jpdyn_pvo, kt, Kmm ) 900 910 CALL trd_dyn( ztautrdu, ztautrdv, jpdyn_tau, kt, Kmm ) 911 IF( ln_isfcav.OR.ln_drgice_imp ) CALL trd_dyn( ztfrtrdu, ztfrtrdv, jpdyn_tfr, kt, Kmm ) 901 912 CALL trd_dyn( zbfrtrdu, zbfrtrdv, jpdyn_bfr, kt, Kmm ) 902 DEALLOCATE( zspgtrdu, zspgtrdv, zpvotrdu, zpvotrdv, ztautrdu, ztautrdv, zbfrtrdu, zbfrtrdv ) 913 DEALLOCATE( zspgtrdu, zspgtrdv, zpvotrdu, zpvotrdv, ztautrdu, ztautrdv, & 914 & ztfrtrdu, ztfrtrdv, zbfrtrdu, zbfrtrdv ) 903 915 ENDIF 904 916 ! … … 1408 1420 1409 1421 1410 SUBROUTINE dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, pu_RHSi, pv_RHSi, pCdU_u, pCdU_v ) 1422 SUBROUTINE dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, pu_RHSi, pv_RHSi, pCdU_u, pCdU_v, & 1423 & ptfrtrdu, ptfrtrdv, pbfrtrdu, pbfrtrdv ) 1411 1424 !!---------------------------------------------------------------------- 1412 1425 !! *** ROUTINE dyn_drg_init *** … … 1418 1431 !! ** Method : computation done over the INNER domain only 1419 1432 !!---------------------------------------------------------------------- 1420 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 1421 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in ) :: puu, pvv ! ocean velocities and RHS of momentum equation 1422 REAL(wp), DIMENSION(jpi,jpj,jpt) , INTENT(in ) :: puu_b, pvv_b ! barotropic velocities at main time levels 1423 REAL(wp), DIMENSION(jpi,jpj) , INTENT(inout) :: pu_RHSi, pv_RHSi ! baroclinic part of the barotropic RHS 1424 REAL(wp), DIMENSION(jpi,jpj) , INTENT( out) :: pCdU_u , pCdU_v ! barotropic drag coefficients 1433 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 1434 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in ) :: puu, pvv ! ocean velocities and RHS of momentum equation 1435 REAL(wp), DIMENSION(jpi,jpj,jpt) , INTENT(in ) :: puu_b, pvv_b ! barotropic velocities at main time levels 1436 REAL(wp), DIMENSION(jpi,jpj) , INTENT(inout) :: pu_RHSi, pv_RHSi ! baroclinic part of the barotropic RHS 1437 REAL(wp), DIMENSION(jpi,jpj) , INTENT( out) :: pCdU_u , pCdU_v ! barotropic drag coefficients 1438 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout), OPTIONAL :: ptfrtrdu, ptfrtrdv ! top friction trends 1439 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout), OPTIONAL :: pbfrtrdu, pbfrtrdv ! bottom friction trends 1425 1440 ! 1426 1441 INTEGER :: ji, jj ! dummy loop indices … … 1443 1458 pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 1444 1459 END_2D 1460 ENDIF 1461 ! 1462 IF( l_trddyn ) THEN 1463 pbfrtrdu(:,:) = pu_RHSi(:,:) 1464 pbfrtrdv(:,:) = pv_RHSi(:,:) 1445 1465 ENDIF 1446 1466 ! … … 1481 1501 END IF 1482 1502 ! 1503 IF( l_trddyn ) THEN 1504 pbfrtrdu(:,:) = pu_RHSi(:,:) - pbfrtrdu(:,:) 1505 pbfrtrdv(:,:) = pv_RHSi(:,:) - pbfrtrdv(:,:) 1506 ENDIF 1507 ! 1483 1508 ! !== TOP stress contribution from baroclinic velocities ==! (no W/D case) 1484 1509 ! 1485 1510 IF( ln_isfcav.OR.ln_drgice_imp ) THEN 1511 ! 1512 IF( l_trddyn ) THEN 1513 ptfrtrdu(:,:) = pu_RHSi(:,:) 1514 ptfrtrdv(:,:) = pv_RHSi(:,:) 1515 ENDIF 1486 1516 ! 1487 1517 IF( ln_bt_fw ) THEN ! FORWARD integration: use NOW top baroclinic velocity … … 1509 1539 pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zv_i(ji,jj) 1510 1540 END_2D 1541 ! 1542 IF( l_trddyn ) THEN 1543 ptfrtrdu(:,:) = pu_RHSi(:,:) - ptfrtrdu(:,:) 1544 ptfrtrdv(:,:) = pv_RHSi(:,:) - ptfrtrdv(:,:) 1545 ENDIF 1511 1546 ! 1512 1547 ENDIF -
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/DYN/dynzdf.F90
r14725 r14742 80 80 REAL(wp) :: zWus, zWvs ! - - 81 81 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwd, zws ! 3D workspace 82 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! - -82 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv, ztrdu_fr, ztrdv_fr ! - - 83 83 !!--------------------------------------------------------------------- 84 84 ! … … 115 115 END_3D 116 116 ENDIF 117 ! 118 IF( l_trddyn ) THEN !* temporary save of provisional "after" velocities 119 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 120 ztrdu(:,:,:) = puu(:,:,:,Kaa) 121 ztrdv(:,:,:) = pvv(:,:,:,Kaa) 122 ENDIF 123 ! 117 124 ! ! add top/bottom friction 118 125 ! With split-explicit free surface, barotropic stress is treated explicitly Update velocities at the bottom. … … 126 133 END_3D 127 134 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 128 ALLOCATE( ztrdu (jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) )129 ztrdu (:,:,:) = puu(:,:,:,Kaa)130 ztrdv (:,:,:) = pvv(:,:,:,Kaa)135 ALLOCATE( ztrdu_fr(jpi,jpj,jpk), ztrdv_fr(jpi,jpj,jpk) ) 136 ztrdu_fr(:,:,:) = puu(:,:,:,Kaa) 137 ztrdv_fr(:,:,:) = pvv(:,:,:,Kaa) 131 138 ENDIF 132 139 DO_2D( 0, 0, 0, 0 ) ! Add bottom/top stress due to barotropic component only … … 140 147 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 141 148 END_2D 142 IF( l_trddyn ) THEN ! save explicit part of bottom friction trends143 ztrdu (:,:,:) = ( puu(:,:,:,Kaa) - ztrdu(:,:,:) ) / rDt144 ztrdv (:,:,:) = ( pvv(:,:,:,Kaa) - ztrdv(:,:,:) ) / rDt145 CALL trd_dyn( ztrdu , ztrdv, jpdyn_bfr, kt, Kmm, Kaa )149 IF( l_trddyn ) THEN ! save baroclinic bottom friction trends due to barotropic currents 150 ztrdu_fr(:,:,:) = ( puu(:,:,:,Kaa) - ztrdu_fr(:,:,:) ) / rDt 151 ztrdv_fr(:,:,:) = ( pvv(:,:,:,Kaa) - ztrdv_fr(:,:,:) ) / rDt 152 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_bfre_bt, kt, Kmm, Kaa ) 146 153 ENDIF 147 154 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! Ocean cavities (ISF) 155 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 156 ztrdu_fr(:,:,:) = puu(:,:,:,Kaa) 157 ztrdv_fr(:,:,:) = pvv(:,:,:,Kaa) 158 ENDIF 148 159 DO_2D( 0, 0, 0, 0 ) 149 160 iku = miku(ji,jj) ! top ocean level at u- and v-points … … 156 167 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 157 168 END_2D 169 IF( l_trddyn ) THEN ! save baroclinic top friction trends due to barotropic currents 170 ztrdu_fr(:,:,:) = ( puu(:,:,:,Kaa) - ztrdu_fr(:,:,:) ) / rDt 171 ztrdv_fr(:,:,:) = ( pvv(:,:,:,Kaa) - ztrdv_fr(:,:,:) ) / rDt 172 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_tfre_bt, kt, Kmm, Kaa ) 173 ENDIF 158 174 END IF 159 ENDIF160 !161 IF( l_trddyn ) THEN !* temporary save of ta and sa trends162 IF( .NOT. ALLOCATED(ztrdu) ) ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) )163 ztrdu(:,:,:) = puu(:,:,:,Kaa)164 ztrdv(:,:,:) = pvv(:,:,:,Kaa)165 175 ENDIF 166 176 ! … … 442 452 ! 443 453 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 454 ! 455 IF( ln_drgimp ) THEN 456 ztrdu_fr(:,:,:) = 0._wp ; ztrdv_fr(:,:,:) = 0._wp 457 DO_2D( 0, 0, 0, 0 ) 458 iku = mbku(ji,jj) ! deepest ocean u- & v-levels 459 ikv = mbkv(ji,jj) 460 ztrdu_fr(ji,jj,iku) = 0.5 * ( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) ) & 461 & * puu(ji,jj,iku,Kmm) / e3u(ji,jj,iku,Kmm) 462 ztrdv_fr(ji,jj,ikv) = 0.5 * ( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) ) & 463 & * pvv(ji,jj,ikv,Kmm) / e3v(ji,jj,ikv,Kmm) 464 END_2D 465 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_bfri, kt, Kmm ) 466 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! Ocean cavities (ISF) or implicit ice-ocean drag 467 ztrdu_fr(:,:,:) = 0._wp ; ztrdv_fr(:,:,:) = 0._wp 468 DO_2D( 0, 0, 0, 0 ) 469 iku = miku(ji,jj) ! ocean top level at u-points 470 ikv = mikv(ji,jj) ! ocean top level at v-points 471 ztrdu_fr(ji,jj,iku) = 0.5 * ( rCdU_top(ji+1,jj) + rCdU_top(ji,jj) ) & 472 & * puu(ji,jj,iku,Kmm) / e3u(ji,jj,iku,Kmm) 473 ztrdv_fr(ji,jj,ikv) = 0.5 * ( rCdU_top(ji,jj+1) + rCdU_top(ji,jj) ) & 474 & * pvv(ji,jj,ikv,Kmm) / e3v(ji,jj,ikv,Kmm) 475 END_2D 476 CALL trd_dyn( ztrdu_fr, ztrdv_fr, jpdyn_tfri, kt, Kmm ) 477 ENDIF 478 ENDIF 479 ! 444 480 ztrdu(:,:,:) = ( puu(:,:,:,Kaa) - ztrdu(:,:,:) ) / rDt 445 481 ztrdv(:,:,:) = ( pvv(:,:,:,Kaa) - ztrdv(:,:,:) ) / rDt 446 482 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt, Kmm, Kaa ) 447 483 ! 448 IF( ln_drgimp ) THEN 449 ztrdu(:,:,:) = 0._wp ; ztrdv(:,:,:) = 0._wp 450 DO_2D( 0, 0, 0, 0 ) 451 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels 452 ikbv = mbkv(ji,jj) 453 ztrdu(ji,jj,ikbu) = 0.5 * ( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) ) & 454 & * puu(ji,jj,ikbu,Kmm) / e3u(ji,jj,ikbu,Kmm) 455 ztrdv(ji,jj,ikbv) = 0.5 * ( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) ) & 456 & * pvv(ji,jj,ikbv,Kmm) / e3v(ji,jj,ikbv,Kmm) 457 END_2D 458 CALL trd_dyn( ztrdu, ztrdv, jpdyn_bfri, kt, Kmm ) 459 ENDIF 460 ! 461 DEALLOCATE( ztrdu, ztrdv ) 484 DEALLOCATE( ztrdu, ztrdv, ztrdu_fr, ztrdv_fr ) 462 485 ENDIF 463 486 ! ! print mean trends (used for debugging) -
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/TRD/trd_oce.F90
r14701 r14742 60 60 ! 61 61 ! !!!* Momentum trends indices 62 INTEGER, PUBLIC, PARAMETER :: jptot_dyn = 17!: Total trend nb: change it when adding/removing one indice below62 INTEGER, PUBLIC, PARAMETER :: jptot_dyn = 21 !: Total trend nb: change it when adding/removing one indice below 63 63 ! =============== ! 64 64 INTEGER, PUBLIC, PARAMETER :: jpdyn_hpg = 1 !: hydrostatic pressure gradient 65 65 INTEGER, PUBLIC, PARAMETER :: jpdyn_hpg_save = 2 !: hydrostatic pressure gradient (saved value) 66 INTEGER, PUBLIC, PARAMETER :: jpdyn_ hpg_corr = 3 !: hydrostatic pressure gradient (initial correction)67 INTEGER, PUBLIC, PARAMETER :: jpdyn_ spg = 4 !: surface pressure gradient68 INTEGER, PUBLIC, PARAMETER :: jpdyn_ keg = 5 !: kinetic energy gradient or horizontal advection69 INTEGER, PUBLIC, PARAMETER :: jpdyn_ rvo = 6 !: relative vorticity or metric term70 INTEGER, PUBLIC, PARAMETER :: jpdyn_pvo = 7 !: planetary vorticity71 INTEGER, PUBLIC, PARAMETER :: jpdyn_pvo_ save = 8 !: planetary vorticity (saved value)72 INTEGER, PUBLIC, PARAMETER :: jpdyn_ pvo_corr = 9 !: planetary vorticity (initial correction)73 INTEGER, PUBLIC, PARAMETER :: jpdyn_ zad = 10 !: vertical advection74 INTEGER, PUBLIC, PARAMETER :: jpdyn_ ldf = 11 !: horizontal diffusion75 INTEGER, PUBLIC, PARAMETER :: jpdyn_ zdf = 12 !: vertical diffusion76 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfr = 13 !: bottom stress66 INTEGER, PUBLIC, PARAMETER :: jpdyn_spg = 3 !: surface pressure gradient 67 INTEGER, PUBLIC, PARAMETER :: jpdyn_keg = 4 !: kinetic energy gradient or horizontal advection 68 INTEGER, PUBLIC, PARAMETER :: jpdyn_rvo = 5 !: relative vorticity or metric term 69 INTEGER, PUBLIC, PARAMETER :: jpdyn_pvo = 6 !: planetary vorticity 70 INTEGER, PUBLIC, PARAMETER :: jpdyn_pvo_save = 7 !: planetary vorticity (saved value) 71 INTEGER, PUBLIC, PARAMETER :: jpdyn_pvo_corr = 8 !: planetary vorticity (initial correction) 72 INTEGER, PUBLIC, PARAMETER :: jpdyn_zad = 9 !: vertical advection 73 INTEGER, PUBLIC, PARAMETER :: jpdyn_ldf = 10 !: horizontal diffusion 74 INTEGER, PUBLIC, PARAMETER :: jpdyn_zdf = 11 !: vertical diffusion 75 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfr = 12 !: total top friction (cavities and ice-ocean drag if ln_drgice_imp=T) 76 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfr = 13 !: total bottom friction 77 77 INTEGER, PUBLIC, PARAMETER :: jpdyn_atf = 14 !: Asselin time filter 78 INTEGER, PUBLIC, PARAMETER :: jpdyn_tau = 15 !: surface stress 79 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfri = 16 !: implicit bottom friction (ln_drgimp=.TRUE.) 80 INTEGER, PUBLIC, PARAMETER :: jpdyn_ken = 17 !: use for calculation of KE 78 INTEGER, PUBLIC, PARAMETER :: jpdyn_tau = 15 !: wind stress (= ice-ocean drag under ice if ln_drgice_imp=F) 79 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfre_bt = 16 !: top friction due to barotropic currents for baroclinic trend (ln_dynspg_ts=.TRUE.) 80 INTEGER, PUBLIC, PARAMETER :: jpdyn_tfri = 17 !: implicit top friction for baroclinic trend 81 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfre = 18 !: explicit bottom friction for baroclinic trend (ln_drgimp=.FALSE.) 82 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfre_bt = 19 !: bottom friction due to barotropic currents for baroclinic trend (ln_dynspg_ts=.TRUE.) 83 INTEGER, PUBLIC, PARAMETER :: jpdyn_bfri = 20 !: implicit bottom friction for baroclinic trend (ln_drgimp=.TRUE.) 84 INTEGER, PUBLIC, PARAMETER :: jpdyn_ken = 21 !: use for calculation of KE 81 85 ! 82 86 !!---------------------------------------------------------------------- -
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/TRD/trddyn.F90
r14716 r14742 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 44 REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_tau, zvtrd_tau 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 … … 99 102 DEALLOCATE( zutrd_hpg, zvtrd_hpg ) 100 103 101 CASE( jpdyn_bfr ) 102 ! 103 ! Add 3D part of BFR trend minus its depth-mean part to depth-mean trend already saved. 104 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 105 zue(:,:) = e3u(:,:,1,Kaa) * putrd(:,:,1) * umask(:,:,1) 106 zve(:,:) = e3v(:,:,1,Kaa) * pvtrd(:,:,1) * vmask(:,:,1) 107 DO jk = 2, jpkm1 108 zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * putrd(:,:,jk) * umask(:,:,jk) 109 zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvtrd(:,:,jk) * vmask(:,:,jk) 110 END DO 111 DO jk = 1, jpkm1 112 putrd(:,:,jk) = zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) 113 pvtrd(:,:,jk) = zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) 114 END DO 115 ! Update locally saved BFR trends to add to ZDF trend. 116 zutrd_bfr(:,:,:) = putrd(:,:,:) 117 zvtrd_bfr(:,:,:) = pvtrd(:,:,:) 104 CASE( jpdyn_tfre_bt, jpdyn_tfri ) 105 ! 106 ! Add various top friction terms for baroclinic trend to saved quantity. 107 ! Any barotropic component removed later when TFR diagnostic finalised (on ZDF call). 108 IF( .NOT. ALLOCATED(zutrd_tfr) ) THEN 109 ALLOCATE( zutrd_tfr(jpi,jpj,jpk), zvtrd_tfr(jpi,jpj,jpk) ) 110 zutrd_tfr(:,:,:) = 0.0 111 zvtrd_tfr(:,:,:) = 0.0 112 ENDIF 113 zutrd_tfr(:,:,:) = zutrd_tfr(:,:,:) + putrd(:,:,:) 114 zvtrd_tfr(:,:,:) = zvtrd_tfr(:,:,:) + pvtrd(:,:,:) 115 116 CASE( jpdyn_bfre, jpdyn_bfre_bt, jpdyn_bfri ) 117 ! 118 ! Add various bottom friction terms for baroclinic trend to saved quantity. 119 ! Any barotropic component removed later when BFR diagnostic finalised (on ZDF call). 120 IF( .NOT. ALLOCATED(zutrd_bfr) ) THEN 121 ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) ) 122 zutrd_bfr(:,:,:) = 0.0 123 zvtrd_bfr(:,:,:) = 0.0 124 ENDIF 125 zutrd_bfr(:,:,:) = zutrd_bfr(:,:,:) + putrd(:,:,:) 126 zvtrd_bfr(:,:,:) = zvtrd_bfr(:,:,:) + pvtrd(:,:,:) 118 127 119 128 CASE( jpdyn_zdf ) 120 ! ZDF trend: Remove barotropic component and add wind stress and bottom friction 121 ! trends from dynspg_ts. Also adding on the bottom stress for the 122 ! baroclinic solution in the case of explicit bottom friction. 123 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 124 zue(:,:) = e3u(:,:,1,Kaa) * putrd(:,:,1) * umask(:,:,1) 125 zve(:,:) = e3v(:,:,1,Kaa) * pvtrd(:,:,1) * vmask(:,:,1) 126 DO jk = 2, jpkm1 127 zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * putrd(:,:,jk) * umask(:,:,jk) 128 zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvtrd(:,:,jk) * vmask(:,:,jk) 129 END DO 130 DO jk = 1, jpkm1 131 putrd(:,:,jk) = zutrd_tau(:,:) + zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) 132 pvtrd(:,:,jk) = zvtrd_tau(:,:) + zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) 133 END DO 134 DEALLOCATE( zue, zve, zutrd_tau, zvtrd_tau, zutrd_bfr, zvtrd_bfr ) 135 129 ! ZDF trend: If ln_dynspg_ts, remove barotropic component and add wind stress, and top and bottom friction 130 ! trends from dynspg_ts. Otherwise just output trend in call to trd_dyn_iom_3d below. 131 ! Also finalise TFR and BFR trends. 132 ! 133 IF( ln_dynspg_ts ) THEN 134 ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 135 zue(:,:) = e3u(:,:,1,Kaa) * putrd(:,:,1) * umask(:,:,1) 136 zve(:,:) = e3v(:,:,1,Kaa) * pvtrd(:,:,1) * vmask(:,:,1) 137 DO jk = 2, jpkm1 138 zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * putrd(:,:,jk) * umask(:,:,jk) 139 zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvtrd(:,:,jk) * vmask(:,:,jk) 140 END DO 141 IF( ALLOCATED( zutrd_tfr2d ) ) THEN 142 DO jk = 1, jpkm1 143 putrd(:,:,jk) = ( zutrd_tau(:,:) + zutrd_tfr2d(:,:) + zutrd_bfr2d(:,:) + putrd(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) ) * umask(:,:,jk) 144 pvtrd(:,:,jk) = ( zvtrd_tau(:,:) + zvtrd_tfr2d(:,:) + zvtrd_bfr2d(:,:) + pvtrd(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) ) * vmask(:,:,jk) 145 END DO 146 ELSE 147 DO jk = 1, jpkm1 148 putrd(:,:,jk) = ( zutrd_tau(:,:) + zutrd_bfr2d(:,:) + putrd(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) ) * umask(:,:,jk) 149 pvtrd(:,:,jk) = ( zvtrd_tau(:,:) + zvtrd_bfr2d(:,:) + pvtrd(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) ) * vmask(:,:,jk) 150 END DO 151 ENDIF 152 ! 153 IF( ALLOCATED( zutrd_tfr ) ) THEN 154 ! Finalise total top friction trend : remove any barotropic component from baroclinic trends 155 ! and add bfr2d trend 156 zue(:,:) = e3u(:,:,1,Kaa) * zutrd_tfr(:,:,1) * umask(:,:,1) 157 zve(:,:) = e3v(:,:,1,Kaa) * zvtrd_tfr(:,:,1) * vmask(:,:,1) 158 DO jk = 2, jpkm1 159 zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * zutrd_tfr(:,:,jk) * umask(:,:,jk) 160 zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * zvtrd_tfr(:,:,jk) * vmask(:,:,jk) 161 END DO 162 DO jk = 1, jpkm1 163 zutrd_tfr(:,:,jk) = ( zutrd_tfr2d(:,:) + zutrd_tfr(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) ) * umask(:,:,jk) 164 zvtrd_tfr(:,:,jk) = ( zvtrd_tfr2d(:,:) + zvtrd_tfr(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) ) * vmask(:,:,jk) 165 END DO 166 DEALLOCATE( zutrd_tfr2d, zvtrd_tfr2d ) 167 ENDIF 168 ! 169 ! Finalise total bottom friction trend : remove any barotropic component from baroclinic trends 170 ! and add bfr2d trend 171 zue(:,:) = e3u(:,:,1,Kaa) * zutrd_bfr(:,:,1) * umask(:,:,1) 172 zve(:,:) = e3v(:,:,1,Kaa) * zvtrd_bfr(:,:,1) * vmask(:,:,1) 173 DO jk = 2, jpkm1 174 zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * zutrd_bfr(:,:,jk) * umask(:,:,jk) 175 zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * zvtrd_bfr(:,:,jk) * vmask(:,:,jk) 176 END DO 177 DO jk = 1, jpkm1 178 zutrd_bfr(:,:,jk) = ( zutrd_bfr2d(:,:) + zutrd_bfr(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) ) * umask(:,:,jk) 179 zvtrd_bfr(:,:,jk) = ( zvtrd_bfr2d(:,:) + zvtrd_bfr(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) ) * vmask(:,:,jk) 180 END DO 181 ! 182 DEALLOCATE( zue, zve, zutrd_tau, zvtrd_tau, zutrd_bfr2d, zvtrd_bfr2d ) 183 ENDIF 184 ! Write out total top and bottom friction trends. 185 IF( ALLOCATED( zutrd_tfr ) ) THEN 186 187 CALL trd_dyn_iom_3d( zutrd_tfr, zvtrd_tfr, jpdyn_tfr, kt, Kmm ) 188 DEALLOCATE( zutrd_tfr, zvtrd_tfr ) 189 ENDIF 190 CALL trd_dyn_iom_3d( zutrd_bfr, zvtrd_bfr, jpdyn_bfr, kt, Kmm ) 191 DEALLOCATE( zutrd_bfr, zvtrd_bfr ) 192 136 193 END SELECT 137 194 138 IF ( ktrd /= jpdyn_pvo_save ) THEN195 IF ( ktrd /= jpdyn_pvo_save .and. ktrd /= jpdyn_bfre .and. ktrd /= jpdyn_bfre_bt .and. ktrd /= jpdyn_bfri ) THEN 139 196 ! 140 197 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 229 286 zvtrd_tau(:,:) = pvtrd(:,:) 230 287 288 CASE( jpdyn_tfr ) 289 ! 290 ! Save 2D field to add to ZDF trend (and also output 2D field as diagnostic in own right below). 291 ALLOCATE( zutrd_tfr2d(jpi,jpj), zvtrd_tfr2d(jpi,jpj) ) 292 zutrd_tfr2d(:,:) = putrd(:,:) 293 zvtrd_tfr2d(:,:) = pvtrd(:,:) 294 231 295 CASE( jpdyn_bfr ) 232 296 ! 233 ! Create 3D BFR trend from 2D field and also output 2D field as diagnostic in own right. 234 ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) ) 235 zutrd_bfr(:,:,:) = 0.0 236 zvtrd_bfr(:,:,:) = 0.0 237 DO jk = 1, jpkm1 238 zutrd_bfr(:,:,jk) = putrd(:,:) * umask(:,:,jk) 239 zvtrd_bfr(:,:,jk) = pvtrd(:,:) * vmask(:,:,jk) 240 ENDDO 297 ! Save 2D field to add to ZDF trend (and also output 2D field as diagnostic in own right below). 298 ALLOCATE( zutrd_bfr2d(jpi,jpj), zvtrd_bfr2d(jpi,jpj) ) 299 zutrd_bfr2d(:,:) = putrd(:,:) 300 zvtrd_bfr2d(:,:) = pvtrd(:,:) 241 301 242 302 END SELECT … … 323 383 CALL iom_put( "vtrd_tau", z2dy ) 324 384 DEALLOCATE( z2dx , z2dy ) 325 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr", putrd ) ! bottom friction (explicit case)385 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr", putrd ) ! total bottom friction 326 386 CALL iom_put( "vtrd_bfr", pvtrd ) 327 CASE( jpdyn_bfri) ; CALL iom_put( "utrd_bfri", putrd ) ! bottom friction (implicit case)328 CALL iom_put( "vtrd_bfri", pvtrd )329 387 CASE( jpdyn_atf ) ; CALL iom_put( "utrd_atf", putrd ) ! asselin filter trends 330 388 CALL iom_put( "vtrd_atf", pvtrd ) … … 355 413 CASE( jpdyn_pvo ) ; CALL iom_put( "utrd_pvo2d", putrd ) ! planetary vorticity (barotropic part) 356 414 CALL iom_put( "vtrd_pvo2d", pvtrd ) 357 CASE( jpdyn_hpg_corr ) ; CALL iom_put( "utrd_hpg_corr", putrd ) ! horizontal pressure gradient correction358 CALL iom_put( "vtrd_hpg_corr", pvtrd )359 415 CASE( jpdyn_pvo_corr ) ; CALL iom_put( "utrd_pvo_corr", putrd ) ! planetary vorticity correction 360 416 CALL iom_put( "vtrd_pvo_corr", pvtrd ) 361 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr2d", putrd ) ! bottom friction due to barotropic currents 417 CASE( jpdyn_tfr ) ; CALL iom_put( "utrd_tfr2d", putrd ) ! top friction trend for barotropic currents 418 CALL iom_put( "vtrd_tfr2d", pvtrd ) 419 CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr2d", putrd ) ! bottom friction trend for barotropic currents 362 420 CALL iom_put( "vtrd_bfr2d", pvtrd ) 363 421 END SELECT -
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/ZDF/zdfdrg.F90
r14716 r14742 205 205 ztrdu(:,:,:) = pua(:,:,:) - ztrdu(:,:,:) 206 206 ztrdv(:,:,:) = pva(:,:,:) - ztrdv(:,:,:) 207 CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr , kt, Kmm, Kaa )207 CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfre, kt, Kmm, Kaa ) 208 208 DEALLOCATE( ztrdu, ztrdv ) 209 209 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.