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 2068 for branches/DEV_r1837_MLF/NEMO/OPA_SRC/DYN/dynnxt.F90 – NEMO

Ignore:
Timestamp:
2010-09-06T17:56:51+02:00 (14 years ago)
Author:
mlelod
Message:

ticket: #663 ensuring restartability and conservation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r1837_MLF/NEMO/OPA_SRC/DYN/dynnxt.F90

    r2005 r2068  
    2222   USE oce             ! ocean dynamics and tracers 
    2323   USE dom_oce         ! ocean space and time domain 
     24   USE sbc_oce         ! Surface boundary condition: ocean fields 
     25   USE phycst          ! physical constants 
    2426   USE dynspg_oce      ! type of surface pressure gradient 
    2527   USE dynadv          ! dynamics: vector invariant versus flux form 
     
    218220         END DO 
    219221      ELSE                                             !* Leap-Frog : Asselin filter and swap 
    220          IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN          ! applied on velocity 
     222         !                                ! =============! 
     223         IF( .NOT. lk_vvl ) THEN          ! Fixed volume ! 
     224            !                             ! =============! 
    221225            DO jk = 1, jpkm1                               
    222226               DO jj = 1, jpj 
     
    232236               END DO 
    233237            END DO 
    234          ELSE                                                ! applied on thickness weighted velocity 
    235             ! Before scale factors at (t/u/v)-points (actually "now filtered" and futur "before") 
    236             ! ====================================== 
    237             ! Scale factor at t-points 
    238             ! ------------------------ 
    239             fse3t_b(:,:,:) = fse3t_n(:,:,:) + atfp * fse3t_m(:,:,:) 
     238            !                             ! ================! 
     239         ELSE                             ! Variable volume ! 
     240            !                             ! ================! 
     241            ! Before scale factor at t-points 
     242            ! ------------------------------- 
     243            DO jk = 1, jpkm1 
     244               fse3t_b(:,:,jk) = fse3t_n(:,:,jk) + atfp * fse3t_d(:,:,jk) 
     245            ENDDO 
    240246            ! Add volume filter correction only at the first level of t-point scale factors 
    241247            zec = atfp * rdt / rau0 
    242248            fse3t_b(:,:,1) = fse3t_b(:,:,1) - zec * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 
    243             ! Scale factor at (u/v)-points 
    244             ! ------------------------ 
    245249            ! surface at t-points and inverse surface at (u/v)-points used in surface averaging computations 
    246250            zs_t  (:,:) =       e1t(:,:) * e2t(:,:) 
    247251            zs_u_1(:,:) = 0.5 / e1u(:,:) * e2u(:,:) 
    248252            zs_v_1(:,:) = 0.5 / e1v(:,:) * e2v(:,:) 
    249             ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
    250             DO jk = 1, jpkm1 
    251                DO jj = 1, jpjm1 
    252                   DO ji = 1, jpim1 
    253                      zv_t_ij          = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
    254                      zv_t_ip1j        = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
    255                      zv_t_ijp1        = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
    256                      ze3u_f(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
    257                      ze3v_f(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
    258                   END DO 
    259                END DO 
    260             END DO 
    261             CALL lbc_lnk( ze3u_f, 'U', 1. )               ! lateral boundary conditions 
    262             CALL lbc_lnk( ze3v_f, 'U', 1. ) 
    263             ! Add initial scale factor to scale factor anomaly 
    264             ze3u_f(:,:,:) = ze3u_f(:,:,:) + fse3u_0(:,:,:) 
    265             ze3v_f(:,:,:) = ze3v_f(:,:,:) + fse3v_0(:,:,:) 
    266              
    267             DO jk = 1, jpkm1 
    268                DO jj = 1, jpj 
    269                   DO ji = 1, jpim 
    270                      zue3a = ua(ji,jj,jk) * fse3u_a(ji,jj,jk) 
    271                      zve3a = va(ji,jj,jk) * fse3v_a(ji,jj,jk) 
    272                      zue3n = un(ji,jj,jk) * fse3u_n(ji,jj,jk) 
    273                      zve3n = vn(ji,jj,jk) * fse3v_n(ji,jj,jk) 
    274                      zue3b = ub(ji,jj,jk) * fse3u_b(ji,jj,jk) 
    275                      zve3b = vb(ji,jj,jk) * fse3v_b(ji,jj,jk) 
    276                      ! 
    277                      zuf  = ( zue3n + atfp * ( zue3b  - 2.e0 * zue3n  + zue3a  ) ) / ze3u_f(ji,jj,jk) 
    278                      zvf  = ( zve3n + atfp * ( zve3b  - 2.e0 * zve3n  + zve3a  ) ) / ze3v_f(ji,jj,jk) 
    279                      ! 
    280                      ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
    281                      vb(ji,jj,jk) = zvf 
    282                      fse3u_b(ji,jj,jk) = ze3u_f(ji,jj,jk)    ! e3u_b <-- filtered scale factor 
    283                      fse3v_b(ji,jj,jk) = ze3v_f(ji,jj,jk) 
    284                      un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
    285                      vn(ji,jj,jk) = va(ji,jj,jk) 
    286                   END DO 
    287                END DO 
    288             END DO 
    289             CALL lbc_lnk( ub, 'U', -1. )         ! local domain boundaries 
    290             CALL lbc_lnk( vb, 'V', -1. )  
     253            ! 
     254            IF( ln_dynadv_vec ) THEN 
     255               ! Before scale factor at (u/v)-points 
     256               ! ----------------------------------- 
     257               ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
     258               DO jk = 1, jpkm1 
     259                  DO jj = 1, jpjm1 
     260                     DO ji = 1, jpim1 
     261                        zv_t_ij           = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
     262                        zv_t_ip1j         = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
     263                        zv_t_ijp1         = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
     264                        fse3u_b(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
     265                        fse3v_b(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
     266                     END DO 
     267                  END DO 
     268               END DO 
     269               ! lateral boundary conditions 
     270               CALL lbc_lnk( fse3u_b(:,:,:), 'U', 1. ) 
     271               CALL lbc_lnk( fse3v_b(:,:,:), 'V', 1. ) 
     272               ! Add initial scale factor to scale factor anomaly 
     273               fse3u_b(:,:,:) = fse3u_b(:,:,:) + fse3u_0(:,:,:) 
     274               fse3v_b(:,:,:) = fse3v_b(:,:,:) + fse3v_0(:,:,:) 
     275               ! Leap-Frog - Asselin filter and swap: applied on velocity 
     276               ! ----------------------------------- 
     277               DO jk = 1, jpkm1 
     278                  DO jj = 1, jpj 
     279                     DO ji = 1, jpi 
     280                        zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2.e0 * un(ji,jj,jk) + ua(ji,jj,jk) ) 
     281                        zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2.e0 * vn(ji,jj,jk) + va(ji,jj,jk) ) 
     282                        ! 
     283                        ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
     284                        vb(ji,jj,jk) = zvf 
     285                        un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
     286                        vn(ji,jj,jk) = va(ji,jj,jk) 
     287                     END DO 
     288                  END DO 
     289               END DO 
     290               ! 
     291            ELSE 
     292               ! Temporary filered scale factor at (u/v)-points (will become before scale factor) 
     293               !----------------------------------------------- 
     294               ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
     295               DO jk = 1, jpkm1 
     296                  DO jj = 1, jpjm1 
     297                     DO ji = 1, jpim1 
     298                        zv_t_ij          = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
     299                        zv_t_ip1j        = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
     300                        zv_t_ijp1        = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
     301                        ze3u_f(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
     302                        ze3v_f(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
     303                     END DO 
     304                  END DO 
     305               END DO 
     306               ! lateral boundary conditions 
     307               CALL lbc_lnk( ze3u_f, 'U', 1. ) 
     308               CALL lbc_lnk( ze3v_f, 'V', 1. ) 
     309               ! Add initial scale factor to scale factor anomaly 
     310               ze3u_f(:,:,:) = ze3u_f(:,:,:) + fse3u_0(:,:,:) 
     311               ze3v_f(:,:,:) = ze3v_f(:,:,:) + fse3v_0(:,:,:) 
     312               ! Leap-Frog - Asselin filter and swap: applied on thickness weighted velocity 
     313               ! -----------------------------------             =========================== 
     314               DO jk = 1, jpkm1 
     315                  DO jj = 1, jpj 
     316                     DO ji = 1, jpim1 
     317                        zue3a = ua(ji,jj,jk) * fse3u_a(ji,jj,jk) 
     318                        zve3a = va(ji,jj,jk) * fse3v_a(ji,jj,jk) 
     319                        zue3n = un(ji,jj,jk) * fse3u_n(ji,jj,jk) 
     320                        zve3n = vn(ji,jj,jk) * fse3v_n(ji,jj,jk) 
     321                        zue3b = ub(ji,jj,jk) * fse3u_b(ji,jj,jk) 
     322                        zve3b = vb(ji,jj,jk) * fse3v_b(ji,jj,jk) 
     323                        ! 
     324                        zuf  = ( zue3n + atfp * ( zue3b - 2.e0 * zue3n  + zue3a ) ) / ze3u_f(ji,jj,jk) 
     325                        zvf  = ( zve3n + atfp * ( zve3b - 2.e0 * zve3n  + zve3a ) ) / ze3v_f(ji,jj,jk) 
     326                        ! 
     327                        ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
     328                        vb(ji,jj,jk) = zvf 
     329                        un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
     330                        vn(ji,jj,jk) = va(ji,jj,jk) 
     331                     END DO 
     332                  END DO 
     333               END DO 
     334               fse3u_b(:,:,:) = ze3u_f(:,:,:)                   ! e3u_b <-- filtered scale factor 
     335               fse3v_b(:,:,:) = ze3v_f(:,:,:) 
     336               CALL lbc_lnk( ub, 'U', -1. )                     ! lateral boundary conditions 
     337               CALL lbc_lnk( vb, 'V', -1. ) 
     338            ENDIF 
     339            ! 
    291340         ENDIF 
     341         ! 
    292342      ENDIF 
    293343 
Note: See TracChangeset for help on using the changeset viewer.