New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 14716 – NEMO

Changeset 14716


Ignore:
Timestamp:
2021-04-16T09:01:35+02:00 (3 years ago)
Author:
davestorkey
Message:

2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends : bug fixes.

Location:
NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/DYN/dynhpg.F90

    r14433 r14716  
    126126         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
    127127         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
    128          CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt, Kmm ) 
     128         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg_save, kt, Kmm ) 
    129129         DEALLOCATE( ztrdu , ztrdv ) 
    130130      ENDIF 
  • NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/DYN/dynspg_ts.F90

    r14701 r14716  
    204204      zv_spg(:,:) = 0._wp 
    205205      ! 
    206       zmdi=1.e+20                               !  missing data indicator for masking 
    207       ! 
    208206      zwdramp = r_rn_wdmin1               ! simplest ramp  
    209207!     zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 
     
    898896      ! 
    899897      IF( l_trddyn ) THEN 
    900          CALL trd_dyn( zspgtrdu, zspgtrdv, jpdyn_spg, kt ) 
    901          CALL trd_dyn( zpvotrdu, zpvotrdv, jpdyn_pvo, kt ) 
    902          CALL trd_dyn( ztautrdu, ztautrdv, jpdyn_tau, kt ) 
    903          CALL trd_dyn( zbfrtrdu, zbfrtrdv, jpdyn_bfr, kt ) 
     898         CALL trd_dyn( zspgtrdu, zspgtrdv, jpdyn_spg, kt, Kmm ) 
     899         CALL trd_dyn( zpvotrdu, zpvotrdv, jpdyn_pvo, kt, Kmm ) 
     900         CALL trd_dyn( ztautrdu, ztautrdv, jpdyn_tau, kt, Kmm ) 
     901         CALL trd_dyn( zbfrtrdu, zbfrtrdv, jpdyn_bfr, kt, Kmm ) 
    904902         DEALLOCATE( zspgtrdu, zspgtrdv, zpvotrdu, zpvotrdv, ztautrdu, ztautrdv, zbfrtrdu, zbfrtrdv ) 
    905903      ENDIF 
  • NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/DYN/dynzdf.F90

    r14701 r14716  
    9595      ENDIF 
    9696      !                             !* explicit top/bottom drag case 
    97       IF( .NOT.ln_drgimp )   CALL zdf_drg_exp( kt, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! add top/bottom friction trend to (puu(Kaa),pvv(Kaa)) 
     97      IF( .NOT.ln_drgimp )   CALL zdf_drg_exp( kt, Kmm, Kaa, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! add top/bottom friction trend to (puu(Kaa),pvv(Kaa)) 
    9898      ! 
    9999      !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in puu(:,:,:,Kaa),pvv(:,:,:,Kaa)) 
     
    448448         IF( ln_drgimp ) THEN 
    449449            ztrdu(:,:,:) = 0._wp    ;   ztrdv(:,:,:) = 0._wp 
    450             DO_2D( 2, jpim1, 2, jpjm1 ) 
     450            DO_2D( 0, 0, 0, 0 ) 
    451451               ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
    452452               ikbv = mbkv(ji,jj) 
  • NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/TRD/trddyn.F90

    r14701 r14716  
    5353CONTAINS 
    5454 
    55    SUBROUTINE trd_dyn_3d( putrd, pvtrd, ktrd, kt, Kmm ) 
     55   SUBROUTINE trd_dyn_3d( putrd, pvtrd, ktrd, kt, Kmm, Kaa ) 
    5656      !!--------------------------------------------------------------------- 
    5757      !!                  ***  ROUTINE trd_dyn_3d  *** 
     
    6565      INTEGER                   , INTENT(in   ) ::   kt             ! time step 
    6666      INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index 
     67      INTEGER                   , INTENT(in   ), OPTIONAL :: Kaa    !  "     "     " 
    6768      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zue, zve       ! temporary 2D arrays 
    6869      INTEGER                                   ::   jk 
     
    7677 
    7778      SELECT CASE( ktrd ) 
     79      CASE( jpdyn_hpg_save )  
     80         ! 
     81         ! save 3D HPG trends to have SPG added later. 
     82         ALLOCATE( zutrd_hpg(jpi,jpj,jpk), zvtrd_hpg(jpi,jpj,jpk) ) 
     83         zutrd_hpg(:,:,:) = putrd(:,:,:) 
     84         zvtrd_hpg(:,:,:) = pvtrd(:,:,:) 
     85 
    7886      CASE( jpdyn_pvo_save )  
    7987         ! 
     
    8694         ! For explicit scheme SPG trends come here as 3D fields 
    8795         ! Add SPG trend to 3D HPG trend and also output as 2D diagnostic in own right. 
    88          CALL trd_dyn_iom_2d( putrd(:,:,1), pvtrd(:,:,1), jpdyn_spg, kt, Kmm )  
     96         CALL trd_dyn_iom_2d( putrd(:,:,1), pvtrd(:,:,1), jpdyn_spg, kt )  
    8997         putrd(:,:,:) = putrd(:,:,:) + zutrd_hpg(:,:,:)  
    9098         pvtrd(:,:,:) = pvtrd(:,:,:) + zvtrd_hpg(:,:,:)  
     
    95103         ! Add 3D part of BFR trend minus its depth-mean part to depth-mean trend already saved. 
    96104         ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 
    97          zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1) 
    98          zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1) 
     105         zue(:,:) = e3u(:,:,1,Kaa) * putrd(:,:,1) * umask(:,:,1) 
     106         zve(:,:) = e3v(:,:,1,Kaa) * pvtrd(:,:,1) * vmask(:,:,1) 
    99107         DO jk = 2, jpkm1 
    100             zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk) 
    101             zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk) 
     108            zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * putrd(:,:,jk) * umask(:,:,jk) 
     109            zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvtrd(:,:,jk) * vmask(:,:,jk) 
    102110         END DO 
    103111         DO jk = 1, jpkm1 
    104             putrd(:,:,jk) = zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:) 
    105             pvtrd(:,:,jk) = zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:) 
     112            putrd(:,:,jk) = zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu(:,:,Kaa) 
     113            pvtrd(:,:,jk) = zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv(:,:,Kaa) 
    106114         END DO 
    107115         ! Update locally saved BFR trends to add to ZDF trend. 
     
    114122         !            baroclinic solution in the case of explicit bottom friction.  
    115123         ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) 
    116          zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1) 
    117          zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1) 
     124         zue(:,:) = e3u(:,:,1,Kaa) * putrd(:,:,1) * umask(:,:,1) 
     125         zve(:,:) = e3v(:,:,1,Kaa) * pvtrd(:,:,1) * vmask(:,:,1) 
    118126         DO jk = 2, jpkm1 
    119             zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk) 
    120             zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk) 
     127            zue(:,:) = zue(:,:) + e3u(:,:,jk,Kaa) * putrd(:,:,jk) * umask(:,:,jk) 
     128            zve(:,:) = zve(:,:) + e3v(:,:,jk,Kaa) * pvtrd(:,:,jk) * vmask(:,:,jk) 
    121129         END DO 
    122130         DO jk = 1, jpkm1 
    123             putrd(:,:,jk) = zutrd_tau(:,:) + zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:) 
    124             pvtrd(:,:,jk) = zvtrd_tau(:,:) + zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:) 
     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) 
    125133         END DO 
    126134         DEALLOCATE( zue, zve, zutrd_tau, zvtrd_tau, zutrd_bfr, zvtrd_bfr ) 
     
    160168 
    161169 
    162    SUBROUTINE trd_dyn_2d( putrd, pvtrd, ktrd, kt, Kmm ) 
     170   SUBROUTINE trd_dyn_2d( putrd, pvtrd, ktrd, kt, Kmm, Kaa ) 
    163171      !!--------------------------------------------------------------------- 
    164172      !!                  ***  ROUTINE trd_mod  *** 
     
    172180      INTEGER                 , INTENT(in   ) ::   kt             ! time step 
    173181      INTEGER                 , INTENT(in   ) ::   Kmm            ! time level index 
     182      INTEGER                 , INTENT(in   ), OPTIONAL :: Kaa    !  "     "     " 
    174183      INTEGER                                 ::   jk 
    175184      !!---------------------------------------------------------------------- 
     
    199208             zvtrd_hpg(:,:,jk) = zvtrd_hpg(:,:,jk) + pvtrd(:,:) 
    200209          ENDDO 
    201           CALL trd_dyn_3d( zutrd_hpg, zvtrd_hpg, jpdyn_hpg, kt ) 
     210          CALL trd_dyn_3d( zutrd_hpg, zvtrd_hpg, jpdyn_hpg, kt, Kmm ) 
    202211          DEALLOCATE( zutrd_hpg, zvtrd_hpg ) 
    203212 
     
    209218             zvtrd_pvo(:,:,jk) = zvtrd_pvo(:,:,jk) + pvtrd(:,:) 
    210219          ENDDO 
    211           CALL trd_dyn_3d( zutrd_pvo, zvtrd_pvo, jpdyn_pvo, kt ) 
     220          CALL trd_dyn_3d( zutrd_pvo, zvtrd_pvo, jpdyn_pvo, kt, Kmm ) 
    212221          DEALLOCATE( zutrd_pvo, zvtrd_pvo ) 
    213222 
     
    236245      !   2D output of momentum and/or tracers trends using IOM interface 
    237246      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    238       IF( ln_dyn_trd )   CALL trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt, Kmm ) 
     247      IF( ln_dyn_trd )   CALL trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt ) 
    239248          
    240249 
     
    296305                                 z3dy(ji,jj,jk) = vv(ji,jj,jk,Kmm) * ( vv(ji,jj+1,jk,Kmm) - vv(ji,jj-1,jk,Kmm) ) / ( 2._wp * e2v(ji,jj) ) 
    297306                              END_3D 
    298                               CALL lbc_lnk_multi( 'trddyn', z3dx, 'U', -1., z3dy, 'V', -1. ) 
     307                              CALL lbc_lnk( 'trddyn', z3dx, 'U', -1., z3dy, 'V', -1. ) 
    299308                              CALL iom_put( "utrd_udx", z3dx  ) 
    300309                              CALL iom_put( "vtrd_vdy", z3dy  ) 
     
    309318                              !                                    ! wind stress trends 
    310319                              ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) ) 
    311                               z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u_n(:,:,1) * rau0 ) 
    312                               z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v_n(:,:,1) * rau0 ) 
     320                              z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u(:,:,1,Kmm) * rho0 ) 
     321                              z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v(:,:,1,Kmm) * rho0 ) 
    313322                              CALL iom_put( "utrd_tau", z2dx ) 
    314323                              CALL iom_put( "vtrd_tau", z2dy ) 
     
    325334 
    326335 
    327    SUBROUTINE trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt, Kmm ) 
     336   SUBROUTINE trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt ) 
    328337      !!--------------------------------------------------------------------- 
    329338      !!                  ***  ROUTINE trd_dyn_iom  *** 
     
    334343      INTEGER                 , INTENT(in   ) ::   ktrd           ! trend index 
    335344      INTEGER                 , INTENT(in   ) ::   kt             ! time step 
    336       INTEGER                 , INTENT(in   ) ::   Kmm            ! time level index 
    337345      ! 
    338346      INTEGER ::   ji, jj, jk   ! dummy loop indices 
  • NEMO/branches/2021/ENHANCE-01_davestorkey_fix_3D_momentum_trends/src/OCE/ZDF/zdfdrg.F90

    r13558 r14716  
    143143 
    144144 
    145    SUBROUTINE zdf_drg_exp( kt, Kmm, pub, pvb, pua, pva ) 
     145   SUBROUTINE zdf_drg_exp( kt, Kmm, Kaa, pub, pvb, pua, pva ) 
    146146      !!---------------------------------------------------------------------- 
    147147      !!                  ***  ROUTINE zdf_drg_exp  *** 
     
    156156      !!--------------------------------------------------------------------- 
    157157      INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index 
    158       INTEGER                         , INTENT(in   ) ::   Kmm        ! time level indices 
     158      INTEGER                         , INTENT(in   ) ::   Kmm, Kaa   ! time level indices 
    159159      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pub, pvb   ! the two components of the before velocity 
    160160      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva   ! the two components of the velocity tendency 
     
    205205         ztrdu(:,:,:) = pua(:,:,:) - ztrdu(:,:,:) 
    206206         ztrdv(:,:,:) = pva(:,:,:) - ztrdv(:,:,:) 
    207          CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr, kt, Kmm ) 
     207         CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr, kt, Kmm, Kaa ) 
    208208         DEALLOCATE( ztrdu, ztrdv ) 
    209209      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.