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

Changeset 4105


Ignore:
Timestamp:
2013-10-22T16:47:27+02:00 (11 years ago)
Author:
acc
Message:

Branch 2013/dev_r3858_NOC_ZTC, #863. Port across time-stepping changes from dev_r3867_MERCATOR1_DYN branch. Part 1: modules totally independent of ztilde changes (chiefly BDY stuff).

Location:
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90

    r3851 r4105  
    2929   USE iom             ! IOM library 
    3030   USE in_out_manager  ! I/O logical units 
     31   USE dynspg_oce, ONLY: lk_dynspg_ts ! Split-explicit free surface flag 
    3132#if defined key_lim2 
    3233   USE ice_2 
     
    9394         CALL wrk_alloc(jpi,jpj,pu2d,pv2d)  
    9495 
    95          pu2d(:,:) = 0.e0 
    96          pv2d(:,:) = 0.e0 
     96         pu2d(:,:) = 0._wp 
     97         pv2d(:,:) = 0._wp 
    9798 
    9899         DO ik = 1, jpkm1   !! Vertically integrated momentum trends 
     
    195196               IF( nn_dyn2d(ib_bdy) .gt. 0 ) THEN 
    196197                  IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    197                      dta_bdy(ib_bdy)%ssh(:) = 0.0 
    198                      dta_bdy(ib_bdy)%u2d(:) = 0.0 
    199                      dta_bdy(ib_bdy)%v2d(:) = 0.0 
     198                     dta_bdy(ib_bdy)%ssh(:) = 0._wp 
     199                     dta_bdy(ib_bdy)%u2d(:) = 0._wp 
     200                     dta_bdy(ib_bdy)%v2d(:) = 0._wp 
    200201                  ENDIF 
    201202                  IF (nn_tra(ib_bdy).ne.4) THEN 
     
    216217 
    217218                           igrd = 2                      ! zonal velocity 
    218                            dta_bdy(ib_bdy)%u2d(:) = 0.0 
     219                           dta_bdy(ib_bdy)%u2d(:) = 0._wp 
    219220                           DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    220221                              ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    230231                           END DO 
    231232                           igrd = 3                      ! meridional velocity 
    232                            dta_bdy(ib_bdy)%v2d(:) = 0.0 
     233                           dta_bdy(ib_bdy)%v2d(:) = 0._wp 
    233234                           DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    234235                              ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    272273               ELSE 
    273274                  IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    274                      dta_bdy(ib_bdy)%ssh(:) = 0.0 
    275                      dta_bdy(ib_bdy)%u2d(:) = 0.0 
    276                      dta_bdy(ib_bdy)%v2d(:) = 0.0 
     275                     dta_bdy(ib_bdy)%ssh(:) = 0._wp 
     276                     dta_bdy(ib_bdy)%u2d(:) = 0._wp 
     277                     dta_bdy(ib_bdy)%v2d(:) = 0._wp 
    277278                  ENDIF 
    278279                  IF( nb_bdy_fld(ib_bdy) .gt. 0 ) THEN ! update external data 
     
    286287                    &   nn_dyn3d_dta(ib_bdy) .EQ. 1 ) ) THEN 
    287288                     igrd = 2                      ! zonal velocity 
    288                      dta_bdy(ib_bdy)%u2d(:) = 0.0 
     289                     dta_bdy(ib_bdy)%u2d(:) = 0._wp 
    289290                     DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    290291                        ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    300301                     END DO 
    301302                     igrd = 3                      ! meridional velocity 
    302                      dta_bdy(ib_bdy)%v2d(:) = 0.0 
     303                     dta_bdy(ib_bdy)%v2d(:) = 0._wp 
    303304                     DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    304305                        ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    314315                     END DO 
    315316                  ENDIF 
    316                   IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
    317                      CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy),  & 
    318                                         & td=tides(ib_bdy), time_offset=time_offset ) 
    319                   ENDIF 
    320317               ENDIF 
    321318            ENDIF 
     
    324321      END DO  ! ib_bdy 
    325322 
     323#if defined key_tide 
     324      ! Add tides if not split-explicit free surface else this is done in ts loop 
     325      IF (.NOT.lk_dynspg_ts) CALL bdy_dta_tides( kt=kt, time_offset=time_offset ) 
     326#endif 
    326327      IF ( ln_apr_obc ) THEN 
    327328         DO ib_bdy = 1, nb_bdy 
     
    476477            IF( nn_dyn2d(ib_bdy) .gt. 0 .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN  
    477478 
    478                IF( nn_tra(ib_bdy) .ne. 4 ) THEN ! runoff condition : no ssh reading 
     479               IF( nn_dyn2d(ib_bdy) .ne. jp_frs .and. nn_tra(ib_bdy) .ne. 4 ) THEN ! runoff condition : no ssh reading 
    479480                  jfld = jfld + 1 
    480481                  blf_i(jfld) = bn_ssh 
     
    572573            ! Recalculate field counts 
    573574            !------------------------- 
    574             nb_bdy_fld_sum = 0 
    575575            IF( ib_bdy .eq. 1 ) THEN  
     576               nb_bdy_fld_sum = 0 
    576577               nb_bdy_fld(ib_bdy) = jfld 
    577578               nb_bdy_fld_sum     = jfld               
     
    616617               ALLOCATE( dta_bdy(ib_bdy)%u2d(ilen0(2)) ) 
    617618               ALLOCATE( dta_bdy(ib_bdy)%v2d(ilen0(3)) ) 
    618                IF (nn_dyn2d_dta(ib_bdy).eq.1.or.nn_dyn2d_dta(ib_bdy).eq.3) THEN 
     619               IF ( nn_dyn2d(ib_bdy) .ne. jp_frs .and. (nn_dyn2d_dta(ib_bdy).eq.1.or.nn_dyn2d_dta(ib_bdy).eq.3) ) THEN 
    619620                  jfld = jfld + 1 
    620621                  dta_bdy(ib_bdy)%ssh => bf(jfld)%fnow(:,1,1) 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn.F90

    r3294 r4105  
    3030   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3131   USE in_out_manager  ! 
     32   USE domvvl          ! variable volume 
    3233 
    3334   IMPLICIT NONE 
     
    8283      !------------------------------------------------------- 
    8384 
    84       pu2d(:,:) = 0.e0 
    85       pv2d(:,:) = 0.e0 
    86       DO jk = 1, jpkm1   !! Vertically integrated momentum trends 
    87           pu2d(:,:) = pu2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 
    88           pv2d(:,:) = pv2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 
    89       END DO 
    90       pu2d(:,:) = pu2d(:,:) * phur(:,:) 
    91       pv2d(:,:) = pv2d(:,:) * phvr(:,:) 
     85      pu2d(:,:) = 0._wp 
     86      pv2d(:,:) = 0._wp 
     87      ! bg jchanut tschanges (not specifically related to ts; this is a bug) 
     88      IF (lk_vvl) THEN 
     89         DO jk = 1, jpkm1   !! Vertically integrated momentum trends 
     90            pu2d(:,:) = pu2d(:,:) + fse3u_a(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 
     91            pv2d(:,:) = pv2d(:,:) + fse3v_a(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 
     92         END DO 
     93         pu2d(:,:) = pu2d(:,:) / ( hu_0(:,:) + sshu_a(:,:) + 1._wp - umask(:,:,1) ) 
     94         pv2d(:,:) = pv2d(:,:) / ( hv_0(:,:) + sshv_a(:,:) + 1._wp - vmask(:,:,1) ) 
     95      ! end jchanut tschanges 
     96      ELSE 
     97         DO jk = 1, jpkm1   !! Vertically integrated momentum trends 
     98            pu2d(:,:) = pu2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 
     99            pv2d(:,:) = pv2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 
     100         END DO 
     101         pu2d(:,:) = pu2d(:,:) * phur(:,:) 
     102         pv2d(:,:) = pv2d(:,:) * phvr(:,:) 
     103      ENDIF 
     104 
    92105      DO jk = 1 , jpkm1 
    93          ua(:,:,jk) = ua(:,:,jk) - pu2d(:,:) 
    94          va(:,:,jk) = va(:,:,jk) - pv2d(:,:) 
     106         ua(:,:,jk) = ua(:,:,jk) - pu2d(:,:) * umask(:,:,jk) 
     107         va(:,:,jk) = va(:,:,jk) - pv2d(:,:) * vmask(:,:,jk) 
    95108      END DO 
    96109 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90

    r3680 r4105  
    66   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite 
    77   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
     8   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes 
    89   !!---------------------------------------------------------------------- 
    910#if defined key_bdy  
     
    2728 
    2829   PUBLIC   bdy_dyn2d     ! routine called in dynspg_ts and bdy_dyn 
     30   PUBLIC   bdy_ssh       ! routine called in dynspg_ts or sshwzv 
    2931 
    3032   !!---------------------------------------------------------------------- 
     
    135137      REAL(wp) ::   zcorr                            ! Flather correction 
    136138      REAL(wp) ::   zforc                            ! temporary scalar 
     139      REAL(wp) ::   zflag, z1_2                      !    "        " 
    137140      !!---------------------------------------------------------------------- 
    138141 
    139142      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn2d_fla') 
     143 
     144      z1_2 = 0.5_wp 
    140145 
    141146      ! ---------------------------------! 
     
    147152      ! Fill temporary array with ssh data (here spgu): 
    148153      igrd = 1 
    149       spgu(:,:) = 0.0 
     154      spgu(:,:) = 0._wp 
    150155      DO jb = 1, idx%nblenrim(igrd) 
    151156         ii = idx%nbi(jb,igrd) 
     
    164169         ! 
    165170         zcorr = - idx%flagu(jb) * SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) ) 
    166          zforc = dta%u2d(jb) 
    167          pu2d(ii,ij) = zforc + zcorr * umask(ii,ij,1)  
     171         ! bg jchanut tschanges: Set zflag to 0 below to revert to Flather scheme 
     172!!         zforc = dta%u2d(jb) 
     173         zflag = ABS(idx%flagu(jb)) 
     174         iim1 = ii + idx%flagu(jb) 
     175         zforc = dta%u2d(jb) * (1._wp - z1_2*zflag) + z1_2 * zflag * pu2d(iim1,ij) 
     176         pu2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * umask(ii,ij,1)  
     177         ! end jchanut tschanges 
    168178      END DO 
    169179      ! 
     
    177187         ! 
    178188         zcorr = - idx%flagv(jb) * SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) ) 
    179          zforc = dta%v2d(jb) 
    180          pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 
     189         ! bg jchanut tschanges: Set zflag to 0 below to revert to std Flather scheme 
     190!!         zforc = dta%v2d(jb) 
     191         zflag = ABS(idx%flagv(jb)) 
     192         ijm1 = ij + idx%flagv(jb) 
     193         zforc = dta%v2d(jb) * (1._wp - z1_2*zflag) + z1_2 * zflag * pv2d(ii,ijm1) 
     194         pv2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * vmask(ii,ij,1) 
     195         ! end jchanut tschanges 
    181196      END DO 
    182197      CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
     
    186201      ! 
    187202   END SUBROUTINE bdy_dyn2d_fla 
     203 
     204   SUBROUTINE bdy_ssh( zssh ) 
     205      !!---------------------------------------------------------------------- 
     206      !!                  ***  SUBROUTINE bdy_ssh  *** 
     207      !! 
     208      !! ** Purpose : Duplicate sea level across open boundaries 
     209      !! 
     210      !!---------------------------------------------------------------------- 
     211      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   zssh ! Sea level 
     212      !! 
     213      INTEGER  ::   ib_bdy, ib, igrd                        ! local integers 
     214      INTEGER  ::   ii, ij, zcoef, zcoef1, zcoef2, ip, jp   !   "       " 
     215 
     216      igrd = 1                       ! Everything is at T-points here 
     217 
     218      DO ib_bdy = 1, nb_bdy 
     219         DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
     220            ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     221            ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     222            ! Set gradient direction: 
     223            zcoef1 = bdytmask(ii-1,ij  ) +  bdytmask(ii+1,ij  ) 
     224            zcoef2 = bdytmask(ii  ,ij-1) +  bdytmask(ii  ,ij+1) 
     225            IF ( zcoef1+zcoef2 == 0 ) THEN 
     226               ! corner 
     227!               zcoef = tmask(ii-1,ij,1) + tmask(ii+1,ij,1) +  tmask(ii,ij-1,1) +  tmask(ii,ij+1,1) 
     228!               zssh(ii,ij) = zssh(ii-1,ij  ) * tmask(ii-1,ij  ,1) + & 
     229!                 &           zssh(ii+1,ij  ) * tmask(ii+1,ij  ,1) + & 
     230!                 &           zssh(ii  ,ij-1) * tmask(ii  ,ij-1,1) + & 
     231!                 &           zssh(ii  ,ij+1) * tmask(ii  ,ij+1,1) 
     232               zcoef = bdytmask(ii-1,ij) + bdytmask(ii+1,ij) +  bdytmask(ii,ij-1) +  bdytmask(ii,ij+1) 
     233               zssh(ii,ij) = zssh(ii-1,ij  ) * bdytmask(ii-1,ij  ) + & 
     234                 &           zssh(ii+1,ij  ) * bdytmask(ii+1,ij  ) + & 
     235                 &           zssh(ii  ,ij-1) * bdytmask(ii  ,ij-1) + & 
     236                 &           zssh(ii  ,ij+1) * bdytmask(ii  ,ij+1) 
     237               zssh(ii,ij) = ( zssh(ii,ij) / MAX( 1, zcoef) ) * tmask(ii,ij,1) 
     238            ELSE 
     239               ip = bdytmask(ii+1,ij  ) - bdytmask(ii-1,ij  ) 
     240               jp = bdytmask(ii  ,ij+1) - bdytmask(ii  ,ij-1) 
     241               zssh(ii,ij) = zssh(ii+ip,ij+jp) * tmask(ii+ip,ij+jp,1) 
     242            ENDIF 
     243         END DO 
     244 
     245         ! Boundary points should be updated 
     246         CALL lbc_bdy_lnk( zssh(:,:), 'T', 1., ib_bdy ) 
     247      END DO 
     248 
     249   END SUBROUTINE bdy_ssh 
    188250#else 
    189251   !!---------------------------------------------------------------------- 
     
    192254CONTAINS 
    193255   SUBROUTINE bdy_dyn2d( kt )      ! Empty routine 
    194       WRITE(*,*) 'bdy_dyn_frs: You should not have seen this print! error?', kt 
     256      INTEGER, intent(in) :: kt 
     257      WRITE(*,*) 'bdy_dyn2d: You should not have seen this print! error?', kt 
    195258   END SUBROUTINE bdy_dyn2d 
    196259#endif 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r3703 r4105  
    161161 
    162162      DO ib_bdy = 1,nb_bdy 
     163        icount = 0 ! flag to set max rimwidth to 1 if no relaxation 
    163164        IF(lwp) WRITE(numout,*) ' '  
    164165        IF(lwp) WRITE(numout,*) '------ Open boundary data set ',ib_bdy,'------'  
     
    175176          CASE(jp_none)         ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    176177          CASE(jp_frs)          ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
     178          icount = icount + 1 
    177179          CASE(jp_flather)      ;   IF(lwp) WRITE(numout,*) '      Flather radiation condition' 
    178180          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_dyn2d' ) 
     
    196198          CASE(jp_none)  ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    197199          CASE(jp_frs)   ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
     200          icount = icount + 1 
    198201          CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '      Specified value' 
    199202          CASE( 3 )      ;   IF(lwp) WRITE(numout,*) '      Zero baroclinic velocities (runoff case)' 
     
    215218              CALL ctl_stop( 'Use FRS OR relaxation' ) 
    216219           ELSE 
     220              icount = icount + 1 
    217221              IF(lwp) WRITE(numout,*) '      + baroclinic velocities relaxation zone' 
    218222              IF(lwp) WRITE(numout,*) '      Damping time scale: ',rn_time_dmp(ib_bdy),' days' 
     
    228232          CASE(jp_none)  ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    229233          CASE(jp_frs)   ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
     234          icount = icount + 1 
    230235          CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '      Specified value' 
    231236          CASE( 3 )      ;   IF(lwp) WRITE(numout,*) '      Neumann conditions' 
     
    248253              CALL ctl_stop( 'Use FRS OR relaxation' ) 
    249254           ELSE 
     255              icount = icount + 1 
    250256              IF(lwp) WRITE(numout,*) '      + T/S relaxation zone' 
    251257              IF(lwp) WRITE(numout,*) '      Damping time scale: ',rn_time_dmp(ib_bdy),' days' 
     
    262268          CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '      no open boundary condition'         
    263269          CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '      Flow Relaxation Scheme' 
     270          icount = icount + 1 
    264271          CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_tra' ) 
    265272        END SELECT 
     
    273280        IF(lwp) WRITE(numout,*) 
    274281#endif 
    275  
    276         IF(lwp) WRITE(numout,*) '      Width of relaxation zone = ', nn_rimwidth(ib_bdy) 
    277         IF(lwp) WRITE(numout,*) 
     282        IF ( icount>0 ) THEN 
     283           IF(lwp) WRITE(numout,*) '      Width of relaxation zone = ', nn_rimwidth(ib_bdy) 
     284           IF(lwp) WRITE(numout,*) 
     285        ELSE 
     286           nn_rimwidth(ib_bdy) = 1 ! no relaxation 
     287        ENDIF 
    278288 
    279289      ENDDO 
     
    446456         ENDIF  
    447457 
    448       ENDDO       
     458      ENDDO      
    449459     
    450460      ! 2. Now fill indices corresponding to straight open boundary arrays: 
     
    752762               ! check if point is in local domain 
    753763               IF(  nbidta(ib,igrd,ib_bdy) >= iw .AND. nbidta(ib,igrd,ib_bdy) <= ie .AND.   & 
    754                   & nbjdta(ib,igrd,ib_bdy) >= is .AND. nbjdta(ib,igrd,ib_bdy) <= in       ) THEN 
     764                  & nbjdta(ib,igrd,ib_bdy) >= is .AND. nbjdta(ib,igrd,ib_bdy) <= in .AND.   & 
     765                  & nbrdta(ib,igrd,ib_bdy) <= nn_rimwidth(ib_bdy)     ) THEN       
    755766                  ! 
    756767                  icount = icount  + 1 
     
    765776         ! Allocate index arrays for this boundary set 
    766777         !-------------------------------------------- 
    767          ilen1 = MAXVAL(idx_bdy(ib_bdy)%nblen(:)) 
     778 
     779         ilen1 = MAXVAL(idx_bdy(ib_bdy)%nblen(1:jpbgrd)) 
     780         ilen1 = MAX(1,ilen1) 
    768781         ALLOCATE( idx_bdy(ib_bdy)%nbi(ilen1,jpbgrd) ) 
    769782         ALLOCATE( idx_bdy(ib_bdy)%nbj(ilen1,jpbgrd) ) 
     
    10081021      ! bdytmask = 1  on the computational domain AND on open boundaries 
    10091022      !          = 0  elsewhere    
    1010   
     1023      bdytmask(:,:) = 1.e0 
     1024      bdyumask(:,:) = 1.e0 
     1025      bdyvmask(:,:) = 1.e0 
     1026 
    10111027      IF( ln_mask_file ) THEN 
    10121028         CALL iom_open( cn_mask_file, inum ) 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdytides.F90

    r3651 r4105  
    99   !!            3.3  !  2010-09  (D.Storkey and E.O'Dea)  bug fixes 
    1010   !!            3.4  !  2012-09  (G. Reffray and J. Chanut) New inputs + mods 
     11   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes 
    1112   !!---------------------------------------------------------------------- 
    1213#if defined key_bdy 
     
    3233!   USE tide_mod       ! Useless ?? 
    3334   USE fldread, ONLY: fld_map 
     35   USE dynspg_oce, ONLY: lk_dynspg_ts 
    3436 
    3537   IMPLICIT NONE 
     
    3840   PUBLIC   bdytide_init     ! routine called in bdy_init 
    3941   PUBLIC   bdytide_update   ! routine called in bdy_dta 
     42   PUBLIC   bdy_dta_tides    ! routine called in dyn_spg_ts 
    4043 
    4144   TYPE, PUBLIC ::   TIDES_DATA     !: Storage for external tidal harmonics data 
     
    4952 
    5053   TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET :: tides  !: External tidal harmonics data 
     54   TYPE(OBC_DATA)  , PRIVATE, DIMENSION(jp_bdy) :: dta_bdy_s  !: bdy external data (slow component) 
    5155 
    5256   !!---------------------------------------------------------------------- 
     
    143147            ALLOCATE( td%v ( ilen0(3), nb_harmo, 2 ) ) 
    144148 
    145             td%ssh0(:,:,:) = 0.e0 
    146             td%ssh(:,:,:) = 0.e0 
    147             td%u0(:,:,:) = 0.e0 
    148             td%u(:,:,:) = 0.e0 
    149             td%v0(:,:,:) = 0.e0 
    150             td%v(:,:,:) = 0.e0 
     149            td%ssh0(:,:,:) = 0._wp 
     150            td%ssh (:,:,:) = 0._wp 
     151            td%u0  (:,:,:) = 0._wp 
     152            td%u   (:,:,:) = 0._wp 
     153            td%v0  (:,:,:) = 0._wp 
     154            td%v   (:,:,:) = 0._wp 
    151155 
    152156            IF (ln_bdytide_2ddta) THEN 
     
    252256            ENDIF 
    253257            ! 
     258            IF ( lk_dynspg_ts ) THEN ! Allocate arrays to save slowly varying boundary data during 
     259                                     ! time splitting integration 
     260               ALLOCATE( dta_bdy_s(ib_bdy)%ssh ( ilen0(1) ) ) 
     261               ALLOCATE( dta_bdy_s(ib_bdy)%u2d ( ilen0(2) ) ) 
     262               ALLOCATE( dta_bdy_s(ib_bdy)%v2d ( ilen0(3) ) ) 
     263               dta_bdy_s(ib_bdy)%ssh(:) = 0.e0 
     264               dta_bdy_s(ib_bdy)%u2d(:) = 0.e0 
     265               dta_bdy_s(ib_bdy)%v2d(:) = 0.e0 
     266            ENDIF 
     267            ! 
    254268         ENDIF ! nn_dyn2d_dta(ib_bdy) .ge. 2 
    255269         ! 
     
    297311      ENDIF 
    298312 
    299       IF ( nsec_day == NINT(0.5 * rdttra(1)) .AND. zflag==1 ) THEN 
     313      IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. zflag==1 ) THEN 
    300314        ! 
    301315        kt_tide = kt 
     
    318332          
    319333      IF( PRESENT(jit) ) THEN   
    320          z_arg = ( ((kt-kt_tide)-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) ) 
     334         z_arg = ((kt-kt_tide) * rdt + (jit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 
    321335      ELSE                               
    322336         z_arg = ((kt-kt_tide)+time_add) * rdt 
     
    324338 
    325339      ! Linear ramp on tidal component at open boundaries  
    326       zramp = 1. 
    327       IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0.),1.) 
     340      zramp = 1._wp 
     341      IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0._wp),1._wp) 
    328342 
    329343      DO itide = 1, nb_harmo 
     
    351365      ! 
    352366   END SUBROUTINE bdytide_update 
     367 
     368   SUBROUTINE bdy_dta_tides( kt, kit, time_offset ) 
     369      !!---------------------------------------------------------------------- 
     370      !!                 ***  SUBROUTINE bdy_dta_tides  *** 
     371      !!                 
     372      !! ** Purpose : - Add tidal forcing to ssh, u2d and v2d OBC data arrays.  
     373      !!                 
     374      !!---------------------------------------------------------------------- 
     375      INTEGER, INTENT( in )            ::   kt          ! Main timestep counter 
     376      INTEGER, INTENT( in ),OPTIONAL   ::   kit         ! Barotropic timestep counter (for timesplitting option) 
     377      INTEGER, INTENT( in ),OPTIONAL   ::   time_offset ! time offset in units of timesteps. NB. if kit 
     378                                                        ! is present then units = subcycle timesteps. 
     379                                                        ! time_offset = 0  => get data at "now"    time level 
     380                                                        ! time_offset = -1 => get data at "before" time level 
     381                                                        ! time_offset = +1 => get data at "after"  time level 
     382                                                        ! etc. 
     383      !! 
     384      LOGICAL  :: lk_first_btstp  ! =.TRUE. if time splitting and first barotropic step 
     385      INTEGER,          DIMENSION(jpbgrd) :: ilen0  
     386      INTEGER, DIMENSION(1:jpbgrd) :: nblen, nblenrim  ! short cuts 
     387      INTEGER  :: itide, ib_bdy, ib, igrd                     ! loop indices 
     388      INTEGER  :: time_add                                    ! time offset in units of timesteps 
     389      REAL(wp) :: z_arg, z_sarg, zramp, zoff, z_cost, z_sist       
     390      !!---------------------------------------------------------------------- 
     391 
     392      IF( nn_timing == 1 ) CALL timing_start('bdy_dta_tides') 
     393 
     394      lk_first_btstp=.TRUE. 
     395      IF ( PRESENT(kit).AND.( kit /= 1 ) ) THEN ; lk_first_btstp=.FALSE. ; ENDIF 
     396 
     397      time_add = 0 
     398      IF( PRESENT(time_offset) ) THEN 
     399         time_add = time_offset 
     400      ENDIF 
     401       
     402      ! Absolute time from model initialization:    
     403      IF( PRESENT(kit) ) THEN   
     404         z_arg = ( kt + (kit+0.5_wp*(time_add-1)) / REAL(nn_baro,wp) ) * rdt 
     405      ELSE                               
     406         z_arg = ( kt + time_add ) * rdt 
     407      ENDIF 
     408 
     409      ! Linear ramp on tidal component at open boundaries  
     410      zramp = 1. 
     411      IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - nit000*rdt)/(rdttideramp*rday),0.),1.) 
     412 
     413      DO ib_bdy = 1,nb_bdy 
     414 
     415         ! line below should be simplified (runoff case) 
     416         IF (( nn_dyn2d_dta(ib_bdy) .ge. 2 ).AND.(nn_tra(ib_bdy).NE.4)) THEN 
     417 
     418            nblen(1:jpbgrd) = idx_bdy(ib_bdy)%nblen(1:jpbgrd) 
     419            nblenrim(1:jpbgrd) = idx_bdy(ib_bdy)%nblenrim(1:jpbgrd) 
     420 
     421            IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 
     422               ilen0(:)=nblen(:) 
     423            ELSE 
     424               ilen0(:)=nblenrim(:) 
     425            ENDIF      
     426 
     427            ! We refresh nodal factors every day below 
     428            ! This should be done somewhere else 
     429            IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. lk_first_btstp ) THEN 
     430               ! 
     431               kt_tide = kt                
     432               ! 
     433               IF(lwp) THEN 
     434               WRITE(numout,*) 
     435               WRITE(numout,*) 'bdy_tide_dta : Refresh nodal factors for tidal open bdy data at kt=',kt 
     436               WRITE(numout,*) '~~~~~~~~~~~~~~ ' 
     437               ENDIF 
     438               ! 
     439               CALL tide_init_elevation ( idx=idx_bdy(ib_bdy), td=tides(ib_bdy) ) 
     440               CALL tide_init_velocities( idx=idx_bdy(ib_bdy), td=tides(ib_bdy) ) 
     441               ! 
     442            ENDIF 
     443            zoff = -kt_tide * rdt ! time offset relative to nodal factor computation time 
     444            ! 
     445            ! If time splitting, save data at first barotropic iteration 
     446            IF ( PRESENT(kit) ) THEN 
     447               IF ( lk_first_btstp ) THEN ! Save slow varying open boundary data: 
     448                  dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy(ib_bdy)%ssh(1:ilen0(1)) 
     449                  dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy(ib_bdy)%u2d(1:ilen0(2)) 
     450                  dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy(ib_bdy)%v2d(1:ilen0(3)) 
     451 
     452               ELSE ! Initialize arrays from slow varying open boundary data:             
     453                  dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 
     454                  dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 
     455                  dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 
     456               ENDIF 
     457            ENDIF 
     458            ! 
     459            ! Update open boundary data arrays: 
     460            DO itide = 1, nb_harmo 
     461               ! 
     462               z_sarg = (z_arg + zoff) * omega_tide(itide) 
     463               z_cost = zramp * COS( z_sarg ) 
     464               z_sist = zramp * SIN( z_sarg ) 
     465               ! 
     466               igrd=1                              ! SSH on tracer grid 
     467               DO ib = 1, ilen0(igrd) 
     468                  dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + & 
     469                     &                      ( tides(ib_bdy)%ssh(ib,itide,1)*z_cost + & 
     470                     &                        tides(ib_bdy)%ssh(ib,itide,2)*z_sist ) 
     471               END DO 
     472               ! 
     473               igrd=2                              ! U grid 
     474               DO ib = 1, ilen0(igrd) 
     475                  dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) + & 
     476                     &                      ( tides(ib_bdy)%u(ib,itide,1)*z_cost + & 
     477                     &                        tides(ib_bdy)%u(ib,itide,2)*z_sist ) 
     478               END DO 
     479               ! 
     480               igrd=3                              ! V grid 
     481               DO ib = 1, ilen0(igrd)  
     482                  dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) + & 
     483                     &                      ( tides(ib_bdy)%v(ib,itide,1)*z_cost + & 
     484                     &                        tides(ib_bdy)%v(ib,itide,2)*z_sist ) 
     485               END DO 
     486            END DO 
     487         END IF 
     488      END DO 
     489      ! 
     490      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_tides') 
     491      ! 
     492   END SUBROUTINE bdy_dta_tides 
    353493 
    354494   SUBROUTINE tide_init_elevation( idx, td ) 
     
    457597      WRITE(*,*) 'bdytide_update: You should not have seen this print! error?', kt, jit 
    458598   END SUBROUTINE bdytide_update 
     599   SUBROUTINE bdy_dta_tides( kt, jit )   ! Empty routine 
     600      WRITE(*,*) 'bdy_dta_tides: You should not have seen this print! error?', kt, jit 
     601   END SUBROUTINE bdy_dta_tides 
    459602#endif 
    460603 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_ubs.F90

    r3294 r4105  
    2929 
    3030   REAL(wp), PARAMETER :: gamma1 = 1._wp/3._wp  ! =1/4 quick      ; =1/3  3rd order UBS 
    31    REAL(wp), PARAMETER :: gamma2 = 1._wp/8._wp  ! =0   2nd order  ; =1/8 4th order centred 
     31   REAL(wp), PARAMETER :: gamma2 = 1._wp/32._wp ! =0   2nd order  ; =1/32 4th order centred 
    3232 
    3333   PUBLIC   dyn_adv_ubs   ! routine called by step.F90 
     
    5757      !!                       = 1/3  3rd order Upstream biased scheme 
    5858      !!                gamma2 = 0    2nd order finite differencing  
    59       !!                       = 1/8 4th order finite differencing 
     59      !!                       = 1/32 4th order finite differencing 
    6060      !!      For stability reasons, the first term of the fluxes which cor- 
    6161      !!      responds to a second order centered scheme is evaluated using   
     
    6464      !!      before velocity (forward in time).  
    6565      !!      Default value (hard coded in the begining of the module) are  
    66       !!      gamma1=1/3 and gamma2=1/8. 
     66      !!      gamma1=1/3 and gamma2=1/32. 
    6767      !! 
    6868      !! ** Action : - (ua,va) updated with the 3D advective momentum trends 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90

    r3625 r4105  
    1616   USE oce             ! ocean dynamics and tracers 
    1717   USE dom_oce         ! ocean space and time domain 
     18   USE domvvl          ! variable volume 
    1819   USE sbc_oce         ! surface boundary condition: ocean 
    1920   USE zdf_oce         ! ocean vertical physics 
     
    2425   USE wrk_nemo        ! Memory Allocation 
    2526   USE timing          ! Timing 
     27   USE dynadv          ! dynamics: vector invariant versus flux form 
     28   USE dynspg_oce, ONLY: lk_dynspg_ts 
     29   USE dynspg_ts 
    2630 
    2731   IMPLICIT NONE 
     
    2933 
    3034   PUBLIC   dyn_zdf_imp   ! called by step.F90 
     35 
     36   REAL(wp) ::  r_vvl     ! variable volume indicator, =1 if lk_vvl=T, =0 otherwise  
    3137 
    3238   !! * Substitutions 
     
    6470      INTEGER  ::   ikbu, ikbv   ! local integers 
    6571      REAL(wp) ::   z1_p2dt, zcoef, zzwi, zzws, zrhs   ! local scalars 
     72      REAL(wp) ::   ze3ua, ze3va 
    6673      !!---------------------------------------------------------------------- 
    6774 
    6875      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwi, zwd, zws 
    69       REAL(wp), POINTER, DIMENSION(:,:)   ::  zavmu, zavmv 
    7076      !!---------------------------------------------------------------------- 
    7177      ! 
     
    7379      ! 
    7480      CALL wrk_alloc( jpi,jpj,jpk, zwi, zwd, zws )  
    75       CALL wrk_alloc( jpi,jpj, zavmu, zavmv )  
    7681      ! 
    7782      IF( kt == nit000 ) THEN 
     
    7984         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 
    8085         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
     86         ! 
     87         IF( lk_vvl ) THEN   ;    r_vvl = 1._wp       ! Variable volume indicator 
     88         ELSE                ;    r_vvl = 0._wp        
     89         ENDIF 
    8190      ENDIF 
    8291 
     
    94103      IF( ln_bfrimp ) THEN 
    95104# if defined key_vectopt_loop 
    96       DO jj = 1, 1 
    97          DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
     105         DO jj = 1, 1 
     106            DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
    98107# else 
    99       DO jj = 2, jpjm1 
    100          DO ji = 2, jpim1 
     108         DO jj = 2, jpjm1 
     109            DO ji = 2, jpim1 
    101110# endif 
    102             ikbu = mbku(ji,jj)         ! ocean bottom level at u- and v-points  
    103             ikbv = mbkv(ji,jj)         ! (deepest ocean u- and v-points) 
    104             zavmu(ji,jj) = avmu(ji,jj,ikbu+1) 
    105             zavmv(ji,jj) = avmv(ji,jj,ikbv+1) 
    106             avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1)  
    107             avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1) 
    108          END DO 
    109       END DO 
    110       ENDIF 
     111               ikbu = mbku(ji,jj)       ! ocean bottom level at u- and v-points  
     112               ikbv = mbkv(ji,jj)       ! (deepest ocean u- and v-points) 
     113               avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1) 
     114               avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1) 
     115            END DO 
     116         END DO 
     117      ENDIF 
     118 
     119#if defined key_dynspg_ts 
     120      IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
     121         DO jk = 1, jpkm1 
     122            ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     123            va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     124         END DO 
     125      ELSE                                            ! applied on thickness weighted velocity 
     126         DO jk = 1, jpkm1 
     127            ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
     128               &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
     129               &                               / fse3u_a(:,:,jk) * umask(:,:,jk) 
     130            va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
     131               &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
     132               &                               / fse3v_a(:,:,jk) * vmask(:,:,jk) 
     133         END DO 
     134      ENDIF 
     135 
     136      IF ( ln_bfrimp .AND.lk_dynspg_ts ) THEN 
     137         ! remove barotropic velocities: 
     138         DO jk = 1, jpkm1 
     139            ua(:,:,jk) = (ua(:,:,jk) - ua_b(:,:)) * umask(:,:,jk) 
     140            va(:,:,jk) = (va(:,:,jk) - va_b(:,:)) * vmask(:,:,jk) 
     141         ENDDO 
     142         ! Add bottom stress due to barotropic component only: 
     143         DO jj = 2, jpjm1         
     144            DO ji = fs_2, fs_jpim1   ! vector opt. 
     145               ikbu = mbku(ji,jj)         ! ocean bottom level at u- and v-points  
     146               ikbv = mbkv(ji,jj)         ! (deepest ocean u- and v-points) 
     147               ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,ikbu) + r_vvl   * fse3u_a(ji,jj,ikbu) 
     148               ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,ikbv) + r_vvl   * fse3v_a(ji,jj,ikbv) 
     149               ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + p2dt * bfrua(ji,jj) * ua_b(ji,jj) / ze3ua 
     150               va(ji,jj,ikbv) = va(ji,jj,ikbv) + p2dt * bfrva(ji,jj) * va_b(ji,jj) / ze3va 
     151            END DO 
     152         END DO 
     153      ENDIF 
     154#endif 
    111155 
    112156      ! 2. Vertical diffusion on u 
     
    119163         DO jj = 2, jpjm1  
    120164            DO ji = fs_2, fs_jpim1   ! vector opt. 
    121                zcoef = - p2dt / fse3u(ji,jj,jk) 
     165               ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,jk) + r_vvl   * fse3u_a(ji,jj,jk)   ! after scale factor at T-point 
     166               zcoef = - p2dt / ze3ua       
    122167               zzwi          = zcoef * avmu (ji,jj,jk  ) / fse3uw(ji,jj,jk  ) 
    123168               zwi(ji,jj,jk) = zzwi  * umask(ji,jj,jk) 
     
    128173         END DO 
    129174      END DO 
    130       DO jj = 2, jpjm1        ! Surface boudary conditions 
     175      DO jj = 2, jpjm1        ! Surface boundary conditions 
    131176         DO ji = fs_2, fs_jpim1   ! vector opt. 
    132177            zwi(ji,jj,1) = 0._wp 
     
    160205      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    161206         DO ji = fs_2, fs_jpim1   ! vector opt. 
    162             ua(ji,jj,1) = ub(ji,jj,1) + p2dt * (  ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    163                &                                                       * r1_rau0 / fse3u(ji,jj,1)       ) 
     207            ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,1) + r_vvl   * fse3u_a(ji,jj,1)  
     208#if defined key_dynspg_ts 
     209            ua(ji,jj,1) = ua(ji,jj,1) + p2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
     210               &                                      / ( ze3ua * rau0 )  
     211#else 
     212            ua(ji,jj,1) = ub(ji,jj,1) + p2dt *(ua(ji,jj,1) +  0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
     213               &                                                     / ( fse3u(ji,jj,1) * rau0     ) )  
     214#endif 
    164215         END DO 
    165216      END DO 
     
    167218         DO jj = 2, jpjm1    
    168219            DO ji = fs_2, fs_jpim1   ! vector opt. 
    169                zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk)   ! zrhs=right hand side 
     220#if defined key_dynspg_ts 
     221               zrhs = ua(ji,jj,jk)   ! zrhs=right hand side 
     222#else 
     223               zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) 
     224#endif 
    170225               ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 
    171226            END DO 
     
    186241      END DO 
    187242 
     243#if ! defined key_dynspg_ts 
    188244      ! Normalization to obtain the general momentum trend ua 
    189245      DO jk = 1, jpkm1 
     
    194250         END DO 
    195251      END DO 
    196  
     252#endif 
    197253 
    198254      ! 3. Vertical diffusion on v 
     
    205261         DO jj = 2, jpjm1    
    206262            DO ji = fs_2, fs_jpim1   ! vector opt. 
    207                zcoef = -p2dt / fse3v(ji,jj,jk) 
     263               ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,jk)  + r_vvl * fse3v_a(ji,jj,jk)   ! after scale factor at T-point 
     264               zcoef = - p2dt / ze3va 
    208265               zzwi          = zcoef * avmv (ji,jj,jk  ) / fse3vw(ji,jj,jk  ) 
    209266               zwi(ji,jj,jk) =  zzwi * vmask(ji,jj,jk) 
     
    214271         END DO 
    215272      END DO 
    216       DO jj = 2, jpjm1        ! Surface boudary conditions 
     273      DO jj = 2, jpjm1        ! Surface boundary conditions 
    217274         DO ji = fs_2, fs_jpim1   ! vector opt. 
    218275            zwi(ji,jj,1) = 0._wp 
     
    246303      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    247304         DO ji = fs_2, fs_jpim1   ! vector opt. 
    248             va(ji,jj,1) = vb(ji,jj,1) + p2dt * (  va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    249                &                                                       * r1_rau0 / fse3v(ji,jj,1)       ) 
     305            ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,1) + r_vvl   * fse3v_a(ji,jj,1)  
     306#if defined key_dynspg_ts             
     307            va(ji,jj,1) = va(ji,jj,1) + p2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
     308               &                                      / ( ze3va * rau0 )  
     309#else 
     310            va(ji,jj,1) = vb(ji,jj,1) + p2dt *(va(ji,jj,1) +  0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
     311               &                                                       / ( fse3v(ji,jj,1) * rau0     )  ) 
     312#endif 
    250313         END DO 
    251314      END DO 
     
    253316         DO jj = 2, jpjm1 
    254317            DO ji = fs_2, fs_jpim1   ! vector opt. 
    255                zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk)   ! zrhs=right hand side 
     318#if defined key_dynspg_ts 
     319               zrhs = va(ji,jj,jk)   ! zrhs=right hand side 
     320#else 
     321               zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) 
     322#endif 
    256323               va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 
    257324            END DO 
     
    273340 
    274341      ! Normalization to obtain the general momentum trend va 
     342#if ! defined key_dynspg_ts 
    275343      DO jk = 1, jpkm1 
    276344         DO jj = 2, jpjm1    
     
    280348         END DO 
    281349      END DO 
    282  
     350#endif 
     351 
     352      ! J. Chanut: Lines below are useless ? 
    283353      !! restore bottom layer avmu(v)  
    284354      IF( ln_bfrimp ) THEN 
     
    292362            ikbu = mbku(ji,jj)         ! ocean bottom level at u- and v-points  
    293363            ikbv = mbkv(ji,jj)         ! (deepest ocean u- and v-points) 
    294             avmu(ji,jj,ikbu+1) = zavmu(ji,jj) 
    295             avmv(ji,jj,ikbv+1) = zavmv(ji,jj) 
     364            avmu(ji,jj,ikbu+1) = 0.e0 
     365            avmv(ji,jj,ikbv+1) = 0.e0 
    296366         END DO 
    297367      END DO 
     
    299369      ! 
    300370      CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwd, zws)  
    301       CALL wrk_dealloc( jpi,jpj, zavmu, zavmv)  
    302371      ! 
    303372      IF( nn_timing == 1 )  CALL timing_stop('dyn_zdf_imp') 
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90

    r3769 r4105  
    339339                            CALL  istate_init   ! ocean initial state (Dynamics and tracers) 
    340340 
    341       IF( lk_tide       )   CALL tide_init( nit000 )    ! Initialisation of the tidal harmonics 
    342  
    343       IF( lk_bdy        )   CALL     bdy_init       ! Open boundaries initialisation 
    344       IF( lk_bdy        )   CALL     bdy_dta_init   ! Open boundaries initialisation of external data arrays 
    345       IF( lk_bdy        )   CALL     bdytide_init   ! Open boundaries initialisation of tidal harmonic forcing 
     341      IF( lk_tide       )   CALL    tide_init( nit000 )    ! Initialisation of the tidal harmonics 
     342 
     343      IF( lk_bdy        )   CALL      bdy_init  ! Open boundaries initialisation 
     344      IF( lk_bdy        )   CALL  bdy_dta_init  ! Open boundaries initialisation of external data arrays 
     345      IF( lk_bdy .AND. lk_tide )   & 
     346         &                  CALL  bdytide_init  ! Open boundaries initialisation of tidal harmonic forcing 
    346347 
    347348                            CALL dyn_nept_init  ! simplified form of Neptune effect 
Note: See TracChangeset for help on using the changeset viewer.