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 1381 for branches/dev_004_VVL/NEMO/OPA_SRC/TRA – NEMO

Ignore:
Timestamp:
2009-04-06T15:12:22+02:00 (15 years ago)
Author:
rblod
Message:

Time stepping for VVL case and correct a bug in sshnxt, see #398

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_004_VVL/NEMO/OPA_SRC/TRA/tranxt.F90

    r1361 r1381  
    277277      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    278278      !!      
    279        
    280       ! Not yet ready 
    281       WRITE(*,*) 'tra_next_vvl : you should not be there' 
    282       STOP 
     279      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
     280      REAL(wp) ::   ztm , ztc_f , ztf , ztca, ztcn, ztcb   ! temporary scalar 
     281      REAL(wp) ::   zsm , zsc_f , zsf , zsca, zscn, zscb   !    -         - 
     282      REAL(wp) ::   ze3mr, ze3fr                           !    -         - 
     283      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f         !    -         - 
     284      !!---------------------------------------------------------------------- 
     285 
     286      IF( kt == nit000 ) THEN 
     287         IF(lwp) WRITE(numout,*) 
     288         IF(lwp) WRITE(numout,*) 'tra_nxt_vvl : time stepping' 
     289         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     290      ENDIF 
     291 
     292      !                                              ! ----------------------- ! 
     293      IF( ln_dynhpg_imp ) THEN                       ! semi-implicite hpg case ! 
     294         !                                           ! ----------------------- ! 
     295         ! 
     296         IF( neuler == 0 .AND. kt == nit000 ) THEN 
     297            DO jk = 1, jpkm1 
     298               DO jj = 1, jpj 
     299                  DO ji = 1, jpi 
     300                     ze3t_b = fse3t_b(ji,jj,jk) 
     301                     ze3t_n = fse3t_n(ji,jj,jk) 
     302                     ze3t_a = fse3t_a(ji,jj,jk) 
     303                     !                                         ! tracer content at Before, now and after 
     304                     ztcb = tb(ji,jj,jk) *  ze3t_b   ;   zscb = sb(ji,jj,jk) * ze3t_b 
     305                     ztcn = tn(ji,jj,jk) *  ze3t_n   ;   zscn = sn(ji,jj,jk) * ze3t_n 
     306                     ztca = ta(ji,jj,jk) *  ze3t_a   ;   zsca = sa(ji,jj,jk) * ze3t_a 
     307                     ! 
     308                     !                                         ! mean thickness and tracer 
     309                     ze3mr= 1.e0  / ( ze3t_a + 2.* ze3t_n + ze3t_b ) 
     310                     ztm  = ze3mr * ( ztca   + 2.* ztcn   + ztcb   ) 
     311                     zsm  = ze3mr * ( zsca   + 2.* zscn   + zscb   ) 
     312!!gm mean e3t have to be saved and used in dynhpg  or it can be recomputed in dynhpg !! 
     313!!gm                 e3t_m(ji,jj,jk) = 0.25 / ze3mr 
     314                     !                                         ! swap of arrays 
     315                     tb(ji,jj,jk) = tn(ji,jj,jk)                    ! tb <-- tn 
     316                     sb(ji,jj,jk) = sn(ji,jj,jk) 
     317                     tn(ji,jj,jk) = ta(ji,jj,jk)                    ! tn <-- ta 
     318                     sn(ji,jj,jk) = sa(ji,jj,jk) 
     319                     ta(ji,jj,jk) = ztm                             ! ta <-- mean t 
     320                     sa(ji,jj,jk) = zsm 
     321                  END DO 
     322               END DO 
     323            END DO 
     324         ELSE 
     325            DO jk = 1, jpkm1 
     326               DO jj = 1, jpj 
     327                  DO ji = 1, jpi 
     328                     ze3t_b = fse3t_b(ji,jj,jk) 
     329                     ze3t_n = fse3t_n(ji,jj,jk) 
     330                     ze3t_a = fse3t_a(ji,jj,jk) 
     331                     !                                         ! tracer content at Before, now and after 
     332                     ztcb = tb(ji,jj,jk) *  ze3t_b   ;   zscb = sb(ji,jj,jk) * ze3t_b 
     333                     ztcn = tn(ji,jj,jk) *  ze3t_n   ;   zscn = sn(ji,jj,jk) * ze3t_n 
     334                     ztca = ta(ji,jj,jk) *  ze3t_a   ;   zsca = sa(ji,jj,jk) * ze3t_a 
     335                     ! 
     336                     !                                         ! Asselin filter on thickness and tracer content 
     337                     ze3t_f = atfp * ( ze3t_a - 2.* ze3t_n + ze3t_b ) 
     338                     ztc_f  = atfp * ( ztca   - 2.* ztcn   + ztcb   )  
     339                     zsc_f  = atfp * ( zsca   - 2.* zscn   + zscb   )  
     340                     ! 
     341                     !                                         ! filtered tracer including the correction  
     342                     ze3fr = 1.e0  / ( ze3t_n + ze3t_f ) 
     343                     ztf   = ze3fr * ( ztcn   + ztc_f  ) 
     344                     zsf   = ze3fr * ( zscn   + zsc_f  ) 
     345                     !                                         ! mean thickness and tracer 
     346                     ze3mr = 1.e0  / ( ze3t_a + 2.* ze3t_n + ze3t_b ) 
     347                     ztm   = ze3mr * ( ztca   + 2.* ztcn   + ztcb   ) 
     348                     zsm   = ze3mr * ( zsca   + 2.* zscn   + zscb   ) 
     349!!gm mean e3t have to be saved and used in dynhpg  or it can be recomputed in dynhpg !! 
     350!!gm                 e3t_m(ji,jj,jk) = 0.25 / ze3mr 
     351                     !                                         ! swap of arrays 
     352                     tb(ji,jj,jk) = ztf                             ! tb <-- tn + filter 
     353                     sb(ji,jj,jk) = zsf 
     354                     tn(ji,jj,jk) = ta(ji,jj,jk)                    ! tn <-- ta 
     355                     sn(ji,jj,jk) = sa(ji,jj,jk) 
     356                     ta(ji,jj,jk) = ztm                             ! ta <-- mean t 
     357                     sa(ji,jj,jk) = zsm 
     358                  END DO 
     359               END DO 
     360            END DO 
     361         ENDIF 
     362         !                                           ! ----------------------- ! 
     363      ELSE                                           !    explicit hpg case    ! 
     364         !                                           ! ----------------------- ! 
     365         ! 
     366         IF( neuler == 0 .AND. kt == nit000 ) THEN        ! case of Euler time-stepping at first time-step 
     367            DO jk = 1, jpkm1                              ! No filter nor thickness weighting computation required 
     368               DO jj = 1, jpj                             ! ONLY swap 
     369                  DO ji = 1, jpi 
     370                     tb(ji,jj,jk) = tn(ji,jj,jk)                                 ! tb <-- tn 
     371                     sb(ji,jj,jk) = sn(ji,jj,jk) 
     372                     tn(ji,jj,jk) = ta(ji,jj,jk)                                 ! tn <-- ta 
     373                     sn(ji,jj,jk) = sa(ji,jj,jk) 
     374                  END DO 
     375               END DO 
     376            END DO 
     377            !                                             ! general case (Leapfrog + Asselin filter) 
     378         ELSE                                             ! apply filter on thickness weighted tracer and swap 
     379            DO jk = 1, jpkm1 
     380               DO jj = 1, jpj 
     381                  DO ji = 1, jpi 
     382                     ze3t_b = fse3t_b(ji,jj,jk) 
     383                     ze3t_n = fse3t_n(ji,jj,jk) 
     384                     ze3t_a = fse3t_a(ji,jj,jk) 
     385                     !                                         ! tracer content at Before, now and after 
     386                     ztcb = tb(ji,jj,jk) *  ze3t_b   ;   zscb = sb(ji,jj,jk) * ze3t_b 
     387                     ztcn = tn(ji,jj,jk) *  ze3t_n   ;   zscn = sn(ji,jj,jk) * ze3t_n 
     388                     ztca = ta(ji,jj,jk) *  ze3t_a   ;   zsca = sa(ji,jj,jk) * ze3t_a 
     389                     ! 
     390                     !                                         ! Asselin filter on thickness and tracer content 
     391                     ze3t_f = atfp * ( ze3t_a - 2.* ze3t_n + ze3t_b ) 
     392                     ztc_f  = atfp * ( ztca   - 2.* ztcn   + ztcb   )  
     393                     zsc_f  = atfp * ( zsca   - 2.* zscn   + zscb   )  
     394                     ! 
     395!!gm tmask useless below 
     396                     !                                         ! filtered tracer including the correction  
     397                     ze3fr = tmask(ji,jj,jk) / ( ze3t_n + ze3t_f ) 
     398                     ztf   =  ( ztcn  + ztc_f ) * ze3fr 
     399                     zsf   =  ( zscn  + zsc_f ) * ze3fr 
     400                     !                                         ! swap of arrays 
     401                     tb(ji,jj,jk) = ztf                             ! tb <-- tn filtered 
     402                     sb(ji,jj,jk) = zsf 
     403                     tn(ji,jj,jk) = ta(ji,jj,jk)                    ! tn <-- ta 
     404                     sn(ji,jj,jk) = sa(ji,jj,jk) 
     405                  END DO 
     406               END DO 
     407            END DO 
     408         ENDIF 
     409      ENDIF 
    283410      ! 
    284411   END SUBROUTINE tra_nxt_vvl 
Note: See TracChangeset for help on using the changeset viewer.