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 2996 – NEMO

Changeset 2996


Ignore:
Timestamp:
2011-10-25T19:18:54+02:00 (13 years ago)
Author:
mlelod
Message:

fix isopycnal diffusion issue and dynspg_ts bug. see ticket/863?

Location:
branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM/CONFIG/ORCA2_LIM/cpp_ORCA2_LIM.fcm

    r2905 r2996  
    1  bld::tool::fppkeys key_trabbl key_vectopt_loop key_orca_r2 key_lim2 key_dynspg_flt key_diaeiv key_ldfslp key_traldf_c2d key_traldf_eiv key_dynldf_c3d key_dtatem key_dtasal key_tradmp key_zdftke key_zdfddm key_zdftmx key_iomput key_vvl 
     1 bld::tool::fppkeys key_trabbl key_vectopt_loop key_orca_r2 key_lim2  key_diaeiv key_ldfslp key_traldf_c2d key_traldf_eiv key_dynldf_c3d key_dtatem key_dtasal key_tradmp key_zdftke key_zdfddm key_zdftmx key_iomput key_vvl key_dynspg_ts 
  • branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r2974 r2996  
    384384         ! - ML - baroclinicity error should be better treated in the future 
    385385         !        i.e. locally and not spread over the water column. 
     386         !        (keep in mind that the idea is to reduce Eulerian velocity as much as possible) 
    386387         zht(:,:) = 0. 
    387388         DO jk = 1, jpkm1 
     
    397398      IF( ln_debug ) THEN   ! - ML - test: control prints for debuging 
    398399         IF ( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
    399             WRITE(numout, *) 'kt  =', kt 
     400            WRITE(numout, *) 'kt =', kt 
    400401            WRITE(numout, *) 'MAXVAL(abs(ht_0-SUM(e3t_t_a))) =',   & 
    401402               &              MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) - zht(:,:) ) ) 
     
    521522      z_e3t_def(:,:,:) = ( ( fse3t_n(:,:,:) - fse3t_0(:,:,:) ) / fse3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 
    522523      CALL iom_put( "e3t_n"  , fse3t_n  (:,:,:) ) 
    523       CALL iom_put( "dept_n" , fsdept_n (:,:,:) ) 
     524      CALL iom_put( "dept_n" , fsde3w_n (:,:,:) ) 
    524525      CALL iom_put( "e3tdef" , z_e3t_def(:,:,:) ) 
    525526 
  • branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r2905 r2996  
    572572      ! 
    573573      IF( wrk_not_released(2,  1, 2, 3, 4, 5, 6, 7, 8, 9,10,         & 
    574          &                    11,12,13,14,15,16,17,18,19,20,21) )    & 
     574         &                    11,12,13,14,15,16,17,18,19,20,         & 
     575         &                    21,22,23                        ) )    & 
    575576         CALL ctl_stop('dyn_spg_ts: failed to release workspace arrays') 
    576577      ! 
     
    584585      !! ** Purpose : Read or write time-splitting arrays in restart file 
    585586      !!---------------------------------------------------------------------- 
     587      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
     588      USE wrk_nemo, ONLY:   zhu_b => wrk_2d_24 , zhv_b => wrk_2d_25 
     589      ! 
    586590      INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    587591      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
     
    601605               DO jk = 1, jpkm1 
    602606                  DO ji = 1, jpij 
    603                      un_b(ji,1) = un_b(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
    604                      vn_b(ji,1) = vn_b(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
     607                     un_b(ji,1) = un_b(ji,1) + fse3u_n(ji,1,jk) * un(ji,1,jk) 
     608                     vn_b(ji,1) = vn_b(ji,1) + fse3v_n(ji,1,jk) * vn(ji,1,jk) 
    605609                  END DO 
    606610               END DO 
    607611            ELSE                             ! No  vector opt. 
    608612               DO jk = 1, jpkm1 
    609                   un_b(:,:) = un_b(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
    610                   vn_b(:,:) = vn_b(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
     613                  un_b(:,:) = un_b(:,:) + fse3u_n(:,:,jk) * un(:,:,jk) 
     614                  vn_b(:,:) = vn_b(:,:) + fse3v_n(:,:,jk) * vn(:,:,jk) 
    611615               END DO 
    612616            ENDIF 
     
    617621         ! Vertically integrated velocity (before) 
    618622         IF (neuler/=0) THEN 
    619             ub_b (:,:) = 0.e0 
    620             vb_b (:,:) = 0.e0 
    621  
    622             ! vertical sum 
    623             IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
    624                DO jk = 1, jpkm1 
    625                   DO ji = 1, jpij 
    626                      ub_b(ji,1) = ub_b(ji,1) + fse3u_b(ji,1,jk) * ub(ji,1,jk) 
    627                      vb_b(ji,1) = vb_b(ji,1) + fse3v_b(ji,1,jk) * vb(ji,1,jk) 
     623            ! 
     624            IF( lk_vvl ) THEN 
     625               IF( wrk_in_use(2, 24, 25 ) ) THEN 
     626                  CALL ctl_stop( 'ts_rst: requested workspace arrays unavailable' )   ;   RETURN 
     627               ENDIF 
     628               ub_b (:,:) = 0. 
     629               vb_b (:,:) = 0. 
     630               zhu_b(:,:) = 0. 
     631               zhv_b(:,:) = 0. 
     632               ! vertical sum 
     633               IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
     634                  DO jk = 1, jpkm1 
     635                     DO ji = 1, jpij 
     636                        ub_b(ji,1) = ub_b (ji,1) + fse3u_b(ji,1,jk) * ub   (ji,1,jk) 
     637                        vb_b(ji,1) = vb_b (ji,1) + fse3v_b(ji,1,jk) * vb   (ji,1,jk) 
     638                        zhu_b(:,:) = zhu_b(ji,1) + fse3u_b(ji,1,jk) * umask(ji,1,jk) 
     639                        zhv_b(:,:) = zhv_b(ji,1) + fse3v_b(ji,1,jk) * vmask(ji,1,jk) 
     640                     END DO 
    628641                  END DO 
    629                END DO 
    630             ELSE                             ! No  vector opt. 
    631                DO jk = 1, jpkm1 
    632                   ub_b(:,:) = ub_b(:,:) + fse3u_b(:,:,jk) * ub(:,:,jk) 
    633                   vb_b(:,:) = vb_b(:,:) + fse3v_b(:,:,jk) * vb(:,:,jk) 
    634                END DO 
     642               ELSE                             ! No  vector opt. 
     643                  DO jk = 1, jpkm1 
     644                     ub_b (:,:) = ub_b (:,:) + fse3u_b(:,:,jk) * ub   (:,:,jk) 
     645                     vb_b (:,:) = vb_b (:,:) + fse3v_b(:,:,jk) * vb   (:,:,jk) 
     646                     zhu_b(:,:) = zhu_b(:,:) + fse3u_b(:,:,jk) * umask(:,:,jk) 
     647                     zhv_b(:,:) = zhv_b(:,:) + fse3v_b(:,:,jk) * vmask(:,:,jk) 
     648                  END DO 
     649               ENDIF 
     650               ub_b(:,:) = ub_b(:,:) / ( zhu_b(:,:) + 1. - umask(:,:,1) ) 
     651               vb_b(:,:) = vb_b(:,:) / ( zhv_b(:,:) + 1. - vmask(:,:,1) ) 
     652            ELSE              
     653               ub_b (:,:) = 0.e0 
     654               vb_b (:,:) = 0.e0 
     655               ! vertical sum 
     656               IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
     657                  DO jk = 1, jpkm1 
     658                     DO ji = 1, jpij 
     659                        ub_b(ji,1) = ub_b(ji,1) + fse3u_b(ji,1,jk) * ub(ji,1,jk) 
     660                        vb_b(ji,1) = vb_b(ji,1) + fse3v_b(ji,1,jk) * vb(ji,1,jk) 
     661                     END DO 
     662                  END DO 
     663               ELSE                             ! No  vector opt. 
     664                  DO jk = 1, jpkm1 
     665                     ub_b(:,:) = ub_b(:,:) + fse3u_b(:,:,jk) * ub(:,:,jk) 
     666                     vb_b(:,:) = vb_b(:,:) + fse3v_b(:,:,jk) * vb(:,:,jk) 
     667                  END DO 
     668               ENDIF 
     669               ub_b(:,:) = ub_b(:,:) * hur(:,:) 
     670               vb_b(:,:) = vb_b(:,:) * hvr(:,:) 
    635671            ENDIF 
    636  
    637             ub_b(:,:) = ub_b(:,:) * zhu_b(:,:) 
    638             vb_b(:,:) = vb_b(:,:) * zhv_b(:,:) 
     672            ! 
     673         ELSE                                 ! neuler==0 
     674            ub_b (:,:) = un_b (:,:) 
     675            vb_b (:,:) = vn_b (:,:) 
     676         ENDIF 
    639677 
    640678         IF( iom_varid( numror, 'sshn_b', ldstop = .FALSE. ) > 0 ) THEN 
     
    647685         CALL iom_rstput( kt, nitrst, numrow, 'vn_b'   , vn_b  (:,:) )   ! issued from barotropic loop 
    648686         CALL iom_rstput( kt, nitrst, numrow, 'sshn_b' , sshn_b(:,:) )   !  
     687      ENDIF 
     688      ! 
     689      IF( lk_vvl ) THEN 
     690         IF( wrk_not_released(2, 24, 25) )    & 
     691            CALL ctl_stop('dyn_spg_ts: failed to release workspace arrays') 
    649692      ENDIF 
    650693      ! 
  • branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90

    r2715 r2996  
    7272CONTAINS 
    7373 
    74    SUBROUTINE eos_insitu( pts, prd ) 
     74   SUBROUTINE eos_insitu( pts, prd, pdep ) 
    7575      !!---------------------------------------------------------------------- 
    7676      !!                   ***  ROUTINE eos_insitu  *** 
     
    114114      !                                                      ! 2 : salinity               [psu] 
    115115      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd   ! in situ density            [-] 
     116      REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep  ! depth                      [m] 
    116117      !! 
    117118      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
     
    138139            DO jj = 1, jpj 
    139140               DO ji = 1, jpi 
    140                   zt = pts   (ji,jj,jk,jp_tem) 
    141                   zs = pts   (ji,jj,jk,jp_sal) 
    142                   zh = fsdept(ji,jj,jk)        ! depth 
    143                   zsr= zws   (ji,jj,jk)        ! square root salinity 
     141                  zt = pts (ji,jj,jk,jp_tem) 
     142                  zs = pts (ji,jj,jk,jp_sal) 
     143                  zh = pdep(ji,jj,jk)        ! depth 
     144                  zsr= zws (ji,jj,jk)        ! square root salinity 
    144145                  ! 
    145146                  ! compute volumic mass pure water at atm pressure 
     
    196197 
    197198 
    198    SUBROUTINE eos_insitu_pot( pts, prd, prhop ) 
     199   SUBROUTINE eos_insitu_pot( pts, prd, prhop, pdep ) 
    199200      !!---------------------------------------------------------------------- 
    200201      !!                  ***  ROUTINE eos_insitu_pot  *** 
     
    249250      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(  out) ::   prd    ! in situ density            [-] 
    250251      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(  out) ::   prhop  ! potential density (surface referenced) 
     252      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pdep   ! depth                      [m] 
    251253      ! 
    252254      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    269271            DO jj = 1, jpj 
    270272               DO ji = 1, jpi 
    271                   zt = pts   (ji,jj,jk,jp_tem) 
    272                   zs = pts   (ji,jj,jk,jp_sal) 
    273                   zh = fsdept(ji,jj,jk)        ! depth 
    274                   zsr= zws   (ji,jj,jk)        ! square root salinity 
     273                  zt = pts (ji,jj,jk,jp_tem) 
     274                  zs = pts (ji,jj,jk,jp_sal) 
     275                  zh = pdep(ji,jj,jk)        ! depth 
     276                  zsr= zws (ji,jj,jk)        ! square root salinity 
    275277                  ! 
    276278                  ! compute volumic mass pure water at atm pressure 
  • branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM/NEMO/OPA_SRC/step.F90

    r2917 r2996  
    146146      ! 
    147147      IF( lk_ldfslp ) THEN                            ! slope of lateral mixing 
    148                          CALL eos( tsb, rhd )                ! before in situ density 
     148                         CALL eos( tsb, rhd, fsdept_0(:,:,:) )            ! before in situ density 
    149149         IF( ln_zps )    CALL zps_hde( kstp, jpts, tsb, gtsu, gtsv,  &    ! Partial steps: before horizontal gradient 
    150150            &                                      rhd, gru , grv  )      ! of t, s, rd at the last ocean level 
     
    201201         IF( ln_zdfnpc   )   CALL tra_npc( kstp )                ! update after fields by non-penetrative convection 
    202202                             CALL tra_nxt( kstp )                ! tracer fields at next time step 
    203                              CALL eos    ( tsa, rhd, rhop )      ! Time-filtered in situ density for hpg computation 
     203                             CALL eos    ( tsa, rhd, rhop, fsdept_n(:,:,:) )  ! Time-filtered in situ density for hpg computation 
    204204         IF( ln_zps      )   CALL zps_hde( kstp, jpts, tsa, gtsu, gtsv,  &    ! zps: time filtered hor. derivative 
    205205            &                                          rhd, gru , grv  )      ! of t, s, rd at the last ocean level 
    206206          
    207207      ELSE                                                  ! centered hpg  (eos then time stepping) 
    208                              CALL eos    ( tsn, rhd, rhop )      ! now in situ density for hpg computation 
     208                             CALL eos    ( tsn, rhd, rhop, fsdept_n(:,:,:) )  ! now in situ density for hpg computation 
    209209         IF( ln_zps      )   CALL zps_hde( kstp, jpts, tsn, gtsu, gtsv,  &    ! zps: now hor. derivative 
    210210            &                                          rhd, gru , grv  )      ! of t, s, rd at the last ocean level 
  • branches/2011/dev_r2739_LOCEAN8_ZTC/NEMOGCM/NEMO/TOP_SRC/trcwri.F90

    r2567 r2996  
    6767      DO jn = 1, jptra 
    6868         cltra = TRIM( ctrcnm(jn) )                  ! short title for tracer 
    69          CALL iom_put( cltra, trn(:,:,:,jn) ) 
     69         IF( lk_vvl ) THEN 
     70            CALL iom_put( cltra, trn(:,:,:,jn) * fse3t_n(:,:,:) ) 
     71         ELSE 
     72            CALL iom_put( cltra, trn(:,:,:,jn) ) 
     73         END IF 
    7074      END DO 
    7175      ! 
Note: See TracChangeset for help on using the changeset viewer.