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

Changeset 7757


Ignore:
Timestamp:
2017-03-06T14:10:56+01:00 (7 years ago)
Author:
clem
Message:

make LIM3 and AGRIF fully compatible

Location:
branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r7510 r7757  
    445445      sxyage (:,:,:)  = 0._wp 
    446446 
     447      !------------------------------------ 
     448      ! 6) store fields at before time-step 
     449      !------------------------------------ 
     450      ! it is only necessary for the 1st interpolation by Agrif 
     451      a_i_b  (:,:,:)   = a_i  (:,:,:) 
     452      e_i_b  (:,:,:,:) = e_i  (:,:,:,:) 
     453      v_i_b  (:,:,:)   = v_i  (:,:,:) 
     454      v_s_b  (:,:,:)   = v_s  (:,:,:) 
     455      e_s_b  (:,:,:,:) = e_s  (:,:,:,:) 
     456      smv_i_b(:,:,:)   = smv_i(:,:,:) 
     457      oa_i_b (:,:,:)   = oa_i (:,:,:) 
     458      u_ice_b(:,:)     = u_ice(:,:) 
     459      v_ice_b(:,:)     = v_ice(:,:) 
     460 
    447461!!!clem 
    448462!!      ! Output the initial state and forcings 
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90

    r7158 r7757  
    5454      IF( Agrif_Root() )  RETURN 
    5555      ! 
    56       IF( PRESENT( kiter ) ) THEN  ! interpolation at the child sub-time step (for ice rheology) 
    57          zbeta = ( REAL(lim_nbstep) - REAL(kitermax - kiter) / REAL(kitermax) ) /  & 
    58             &    ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) ) 
    59       ELSE                         ! interpolation at the child time step 
    60          zbeta = REAL(lim_nbstep) / ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) ) 
    61       ENDIF 
     56      SELECT CASE(cd_type) 
     57      CASE('U','V') 
     58         IF( PRESENT( kiter ) ) THEN  ! interpolation at the child sub-time step (only for ice rheology) 
     59            zbeta = ( REAL(lim_nbstep) - REAL(kitermax - kiter) / REAL(kitermax) ) /  & 
     60               &    ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) ) 
     61         ELSE                         ! interpolation at the child time step 
     62            zbeta = REAL(lim_nbstep) / ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) ) 
     63         ENDIF 
     64      CASE('T') 
     65            zbeta = REAL(lim_nbstep-1) / ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) ) 
     66      END SELECT 
    6267      ! 
    6368      Agrif_SpecialValue=-9999. 
     
    151156 
    152157      !!----------------------------------------------------------------------- 
    153       ! clem: pkoi on n'utilise pas les quantités intégrées ici => before: * e12t ; after: * r1_e12t / rhox / rhoy 
    154       ! a priori c'est ok comme ca (cf ce qui est fait dans l'ocean). Je ne sais pas pkoi ceci dit 
     158      ! tracers are not multiplied by grid cell here => before: * e12t ; after: * r1_e12t / rhox / rhoy 
     159      ! and it is ok since we conserve tracers (same as in the ocean). 
    155160      ALLOCATE( ztab(SIZE(a_i_b,1),SIZE(a_i_b,2),SIZE(ptab,3)) ) 
    156161      
     
    177182      ELSE               ! child grid 
    178183!! ==> The easiest interpolation is the following commented lines 
    179 !!         jm = 1 
    180 !!         DO jl = 1, jpl 
    181 !!            a_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    182 !!            v_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    183 !!            v_s  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    184 !!            smv_i(i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    185 !!            oa_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    186 !!            DO jk = 1, nlay_s 
    187 !!               e_s(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    188 !!            ENDDO 
    189 !!            DO jk = 1, nlay_i 
    190 !!               e_i(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    191 !!            ENDDO 
    192 !!         ENDDO 
     184         jm = 1 
     185         DO jl = 1, jpl 
     186            a_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     187            v_i  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     188            v_s  (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     189            smv_i(i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     190            oa_i (i1:i2,j1:j2,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     191            DO jk = 1, nlay_s 
     192               e_s(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     193            ENDDO 
     194            DO jk = 1, nlay_i 
     195               e_i(i1:i2,j1:j2,jk,jl) = ptab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     196            ENDDO 
     197         ENDDO 
    193198 
    194199!! ==> this is a more complex interpolation since we mix solutions over a couple of grid points 
    195200!!     it is advised to use it for fields modified by high order schemes (e.g. advection UM5...) 
    196          ! record ztab 
    197          jm = 1 
    198          DO jl = 1, jpl 
    199             ztab(:,:,jm) = a_i_b  (:,:,jl) ; jm = jm + 1 
    200             ztab(:,:,jm) = v_i_b  (:,:,jl) ; jm = jm + 1 
    201             ztab(:,:,jm) = v_s_b  (:,:,jl) ; jm = jm + 1 
    202             ztab(:,:,jm) = smv_i_b(:,:,jl) ; jm = jm + 1 
    203             ztab(:,:,jm) = oa_i_b (:,:,jl) ; jm = jm + 1 
    204             DO jk = 1, nlay_s 
    205                ztab(:,:,jm) = e_s_b(:,:,jk,jl) ; jm = jm + 1 
    206             ENDDO 
    207             DO jk = 1, nlay_i 
    208                ztab(:,:,jm) = e_i_b(:,:,jk,jl) ; jm = jm + 1 
    209             ENDDO 
    210          ENDDO 
    211          ! 
    212          ! borders of the domain 
    213          western_side  = (nb == 1).AND.(ndir == 1)  ;  eastern_side  = (nb == 1).AND.(ndir == 2) 
    214          southern_side = (nb == 2).AND.(ndir == 1)  ;  northern_side = (nb == 2).AND.(ndir == 2) 
    215          ! 
    216          ! spatial smoothing 
    217          zrhox = Agrif_Rhox() 
    218          z1 =      ( zrhox - 1. ) * 0.5  
    219          z3 =      ( zrhox - 1. ) / ( zrhox + 1. ) 
    220          z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
    221          z7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
    222          z2 = 1. - z1 
    223          z4 = 1. - z3 
    224          z5 = 1. - z6 - z7 
    225          ! 
    226          ! Remove corners 
    227          imin = i1  ;  imax = i2  ;  jmin = j1  ;  jmax = j2 
    228          IF( (nbondj == -1) .OR. (nbondj == 2) )   jmin = 3 
    229          IF( (nbondj == +1) .OR. (nbondj == 2) )   jmax = nlcj-2 
    230          IF( (nbondi == -1) .OR. (nbondi == 2) )   imin = 3 
    231          IF( (nbondi == +1) .OR. (nbondi == 2) )   imax = nlci-2 
    232  
    233          ! smoothed fields 
    234          IF( eastern_side ) THEN 
    235             ztab(nlci,j1:j2,:) = z1 * ptab(nlci,j1:j2,:) + z2 * ptab(nlci-1,j1:j2,:) 
    236             DO jj = jmin, jmax 
    237                rswitch = 0. 
    238                IF( u_ice(nlci-2,jj) > 0._wp ) rswitch = 1. 
    239                ztab(nlci-1,jj,:) = ( 1. - umask(nlci-2,jj,1) ) * ztab(nlci,jj,:)  & 
    240                   &                +      umask(nlci-2,jj,1)   *  & 
    241                   &                ( ( 1. - rswitch ) * ( z4 * ztab(nlci,jj,:)   + z3 * ztab(nlci-2,jj,:) )  & 
    242                   &                  +      rswitch   * ( z6 * ztab(nlci-2,jj,:) + z5 * ztab(nlci,jj,:) + z7 * ztab(nlci-3,jj,:) ) ) 
    243                ztab(nlci-1,jj,:) = ztab(nlci-1,jj,:) * tmask(nlci-1,jj,1) 
    244             END DO 
    245          ENDIF 
    246          !  
    247          IF( northern_side ) THEN 
    248             ztab(i1:i2,nlcj,:) = z1 * ptab(i1:i2,nlcj,:) + z2 * ptab(i1:i2,nlcj-1,:) 
    249             DO ji = imin, imax 
    250                rswitch = 0. 
    251                IF( v_ice(ji,nlcj-2) > 0._wp ) rswitch = 1. 
    252                ztab(ji,nlcj-1,:) = ( 1. - vmask(ji,nlcj-2,1) ) * ztab(ji,nlcj,:)  & 
    253                   &                +      vmask(ji,nlcj-2,1)   *  & 
    254                   &                ( ( 1. - rswitch ) * ( z4 * ztab(ji,nlcj,:)   + z3 * ztab(ji,nlcj-2,:) ) & 
    255                   &                  +      rswitch   * ( z6 * ztab(ji,nlcj-2,:) + z5 * ztab(ji,nlcj,:) + z7 * ztab(ji,nlcj-3,:) ) ) 
    256                ztab(ji,nlcj-1,:) = ztab(ji,nlcj-1,:) * tmask(ji,nlcj-1,1) 
    257             END DO 
    258          END IF 
    259          ! 
    260          IF( western_side) THEN 
    261             ztab(1,j1:j2,:) = z1 * ptab(1,j1:j2,:) + z2 * ptab(2,j1:j2,:) 
    262             DO jj = jmin, jmax 
    263                rswitch = 0. 
    264                IF( u_ice(2,jj) > 0._wp ) rswitch = 1. 
    265                ztab(2,jj,:) = ( 1. - umask(2,jj,1) ) * ztab(1,jj,:)  & 
    266                   &           +      umask(2,jj,1)   *   & 
    267                   &           ( ( 1. - rswitch ) * ( z4 * ztab(1,jj,:) + z3 * ztab(3,jj,:) ) & 
    268                   &             +      rswitch   * ( z6 * ztab(3,jj,:) + z5 * ztab(1,jj,:) + z7 * ztab(4,jj,:) ) ) 
    269                ztab(2,jj,:) = ztab(2,jj,:) * tmask(2,jj,1) 
    270             END DO 
    271          ENDIF 
    272          ! 
    273          IF( southern_side ) THEN 
    274             ztab(i1:i2,1,:) = z1 * ptab(i1:i2,1,:) + z2 * ptab(i1:i2,2,:) 
    275             DO ji = imin, imax 
    276                rswitch = 0. 
    277                IF( v_ice(ji,2) > 0._wp ) rswitch = 1. 
    278                ztab(ji,2,:) = ( 1. - vmask(ji,2,1) ) * ztab(ji,1,:)  & 
    279                   &           +      vmask(ji,2,1)   *  & 
    280                   &           ( ( 1. - rswitch ) * ( z4 * ztab(ji,1,:) + z3 * ztab(ji,3,:) ) & 
    281                   &             +      rswitch   * ( z6 * ztab(ji,3,:) + z5 * ztab(ji,1,:) + z7 * ztab(ji,4,:) ) ) 
    282                ztab(ji,2,:) = ztab(ji,2,:) * tmask(ji,2,1) 
    283             END DO 
    284          END IF 
    285          ! 
    286          ! Treatment of corners 
    287          IF( (eastern_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(nlci-1,2,:)      = ptab(nlci-1,2,:)      ! East south 
    288          IF( (eastern_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(nlci-1,nlcj-1,:) = ptab(nlci-1,nlcj-1,:) ! East north 
    289          IF( (western_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(2,2,:)           = ptab(2,2,:)           ! West south 
    290          IF( (western_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(2,nlcj-1,:)      = ptab(2,nlcj-1,:)      ! West north 
    291  
    292          ! retrieve ice tracers 
    293          jm = 1 
    294          DO jl = 1, jpl 
    295             a_i  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    296             v_i  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    297             v_s  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    298             smv_i(i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    299             oa_i (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    300             DO jk = 1, nlay_s 
    301                e_s(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    302             ENDDO 
    303             DO jk = 1, nlay_i 
    304                e_i(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    305             ENDDO 
    306          ENDDO 
    307           
     201!!        clem: for some reason (I don't know why), the following lines do not work  
     202!!              with mpp (or in realistic configurations?). It makes the model crash 
     203!         ! record ztab 
     204!         jm = 1 
     205!         DO jl = 1, jpl 
     206!            ztab(:,:,jm) = a_i  (:,:,jl) ; jm = jm + 1 
     207!            ztab(:,:,jm) = v_i  (:,:,jl) ; jm = jm + 1 
     208!            ztab(:,:,jm) = v_s  (:,:,jl) ; jm = jm + 1 
     209!            ztab(:,:,jm) = smv_i(:,:,jl) ; jm = jm + 1 
     210!            ztab(:,:,jm) = oa_i (:,:,jl) ; jm = jm + 1 
     211!            DO jk = 1, nlay_s 
     212!               ztab(:,:,jm) = e_s(:,:,jk,jl) ; jm = jm + 1 
     213!            ENDDO 
     214!            DO jk = 1, nlay_i 
     215!               ztab(:,:,jm) = e_i(:,:,jk,jl) ; jm = jm + 1 
     216!            ENDDO 
     217!         ENDDO 
     218!         ! 
     219!         ! borders of the domain 
     220!         western_side  = (nb == 1).AND.(ndir == 1)  ;  eastern_side  = (nb == 1).AND.(ndir == 2) 
     221!         southern_side = (nb == 2).AND.(ndir == 1)  ;  northern_side = (nb == 2).AND.(ndir == 2) 
     222!         ! 
     223!         ! spatial smoothing 
     224!         zrhox = Agrif_Rhox() 
     225!         z1 =      ( zrhox - 1. ) * 0.5  
     226!         z3 =      ( zrhox - 1. ) / ( zrhox + 1. ) 
     227!         z6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 
     228!         z7 =    - ( zrhox - 1. ) / ( zrhox + 3. ) 
     229!         z2 = 1. - z1 
     230!         z4 = 1. - z3 
     231!         z5 = 1. - z6 - z7 
     232!         ! 
     233!         ! Remove corners 
     234!         imin = i1  ;  imax = i2  ;  jmin = j1  ;  jmax = j2 
     235!         IF( (nbondj == -1) .OR. (nbondj == 2) )   jmin = 3 
     236!         IF( (nbondj == +1) .OR. (nbondj == 2) )   jmax = nlcj-2 
     237!         IF( (nbondi == -1) .OR. (nbondi == 2) )   imin = 3 
     238!         IF( (nbondi == +1) .OR. (nbondi == 2) )   imax = nlci-2 
     239! 
     240!         ! smoothed fields 
     241!         IF( eastern_side ) THEN 
     242!            ztab(nlci,j1:j2,:) = z1 * ptab(nlci,j1:j2,:) + z2 * ptab(nlci-1,j1:j2,:) 
     243!            DO jj = jmin, jmax 
     244!               rswitch = 0. 
     245!               IF( u_ice(nlci-2,jj) > 0._wp ) rswitch = 1. 
     246!               ztab(nlci-1,jj,:) = ( 1. - umask(nlci-2,jj,1) ) * ztab(nlci,jj,:)  & 
     247!                  &                +      umask(nlci-2,jj,1)   *  & 
     248!                  &                ( ( 1. - rswitch ) * ( z4 * ztab(nlci,jj,:)   + z3 * ztab(nlci-2,jj,:) )  & 
     249!                  &                  +      rswitch   * ( z6 * ztab(nlci-2,jj,:) + z5 * ztab(nlci,jj,:) + z7 * ztab(nlci-3,jj,:) ) ) 
     250!               ztab(nlci-1,jj,:) = ztab(nlci-1,jj,:) * tmask(nlci-1,jj,1) 
     251!            END DO 
     252!         ENDIF 
     253!         !  
     254!         IF( northern_side ) THEN 
     255!            ztab(i1:i2,nlcj,:) = z1 * ptab(i1:i2,nlcj,:) + z2 * ptab(i1:i2,nlcj-1,:) 
     256!            DO ji = imin, imax 
     257!               rswitch = 0. 
     258!               IF( v_ice(ji,nlcj-2) > 0._wp ) rswitch = 1. 
     259!               ztab(ji,nlcj-1,:) = ( 1. - vmask(ji,nlcj-2,1) ) * ztab(ji,nlcj,:)  & 
     260!                  &                +      vmask(ji,nlcj-2,1)   *  & 
     261!                  &                ( ( 1. - rswitch ) * ( z4 * ztab(ji,nlcj,:)   + z3 * ztab(ji,nlcj-2,:) ) & 
     262!                  &                  +      rswitch   * ( z6 * ztab(ji,nlcj-2,:) + z5 * ztab(ji,nlcj,:) + z7 * ztab(ji,nlcj-3,:) ) ) 
     263!               ztab(ji,nlcj-1,:) = ztab(ji,nlcj-1,:) * tmask(ji,nlcj-1,1) 
     264!            END DO 
     265!         END IF 
     266!         ! 
     267!         IF( western_side) THEN 
     268!            ztab(1,j1:j2,:) = z1 * ptab(1,j1:j2,:) + z2 * ptab(2,j1:j2,:) 
     269!            DO jj = jmin, jmax 
     270!               rswitch = 0. 
     271!               IF( u_ice(2,jj) < 0._wp ) rswitch = 1. 
     272!               ztab(2,jj,:) = ( 1. - umask(2,jj,1) ) * ztab(1,jj,:)  & 
     273!                  &           +      umask(2,jj,1)   *   & 
     274!                  &           ( ( 1. - rswitch ) * ( z4 * ztab(1,jj,:) + z3 * ztab(3,jj,:) ) & 
     275!                  &             +      rswitch   * ( z6 * ztab(3,jj,:) + z5 * ztab(1,jj,:) + z7 * ztab(4,jj,:) ) ) 
     276!               ztab(2,jj,:) = ztab(2,jj,:) * tmask(2,jj,1) 
     277!            END DO 
     278!         ENDIF 
     279!         ! 
     280!         IF( southern_side ) THEN 
     281!            ztab(i1:i2,1,:) = z1 * ptab(i1:i2,1,:) + z2 * ptab(i1:i2,2,:) 
     282!            DO ji = imin, imax 
     283!               rswitch = 0. 
     284!               IF( v_ice(ji,2) < 0._wp ) rswitch = 1. 
     285!               ztab(ji,2,:) = ( 1. - vmask(ji,2,1) ) * ztab(ji,1,:)  & 
     286!                  &           +      vmask(ji,2,1)   *  & 
     287!                  &           ( ( 1. - rswitch ) * ( z4 * ztab(ji,1,:) + z3 * ztab(ji,3,:) ) & 
     288!                  &             +      rswitch   * ( z6 * ztab(ji,3,:) + z5 * ztab(ji,1,:) + z7 * ztab(ji,4,:) ) ) 
     289!               ztab(ji,2,:) = ztab(ji,2,:) * tmask(ji,2,1) 
     290!            END DO 
     291!         END IF 
     292!         ! 
     293!         ! Treatment of corners 
     294!         IF( (eastern_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(nlci-1,2,:)      = ptab(nlci-1,2,:)      ! East south 
     295!         IF( (eastern_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(nlci-1,nlcj-1,:) = ptab(nlci-1,nlcj-1,:) ! East north 
     296!         IF( (western_side) .AND. ((nbondj == -1).OR.(nbondj == 2)) )  ztab(2,2,:)           = ptab(2,2,:)           ! West south 
     297!         IF( (western_side) .AND. ((nbondj ==  1).OR.(nbondj == 2)) )  ztab(2,nlcj-1,:)      = ptab(2,nlcj-1,:)      ! West north 
     298! 
     299!         ! retrieve ice tracers 
     300!         jm = 1 
     301!         DO jl = 1, jpl 
     302!            a_i  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     303!            v_i  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     304!            v_s  (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     305!            smv_i(i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     306!            oa_i (i1:i2,j1:j2,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     307!            DO jk = 1, nlay_s 
     308!               e_s(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     309!            ENDDO 
     310!            DO jk = 1, nlay_i 
     311!               e_i(i1:i2,j1:j2,jk,jl) = ztab(i1:i2,j1:j2,jm) ; jm = jm + 1 
     312!            ENDDO 
     313!         ENDDO 
     314        
     315         ! integrated values 
     316         vt_i (i1:i2,j1:j2) = SUM( v_i(i1:i2,j1:j2,:), dim=3 ) 
     317         vt_s (i1:i2,j1:j2) = SUM( v_s(i1:i2,j1:j2,:), dim=3 ) 
     318         at_i (i1:i2,j1:j2) = SUM( a_i(i1:i2,j1:j2,:), dim=3 ) 
     319         et_s(i1:i2,j1:j2)  = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
     320         et_i(i1:i2,j1:j2)  = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
     321 
    308322      ENDIF 
    309323       
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_update.F90

    r7158 r7757  
    5252      !!---------------------------------------------------------------------- 
    5353      ! 
    54 !      IF( ( MOD( kt-nit000, Agrif_irhot() * Agrif_Parent(nn_fsbc) ) /=0 ) .AND. (kt /= 0) ) THEN 
    55 !         PRINT *, 'clem NOT udpate, kt=',kt,Agrif_NbStepint() 
    56 !      ELSE 
    57 !         PRINT *, 'clem     UPDATE, kt=',kt,Agrif_NbStepint() 
    58 !      ENDIF 
    59  
    60       !! clem: I think the update should take place each time the ocean sees the surface forcings (but maybe I am wrong and we should update every rhot time steps)  
    61       IF( ( MOD( kt-nit000, Agrif_irhot() * Agrif_Parent(nn_fsbc) ) /=0 ) .AND. (kt /= 0) ) RETURN ! do not update if nb of child time steps differ from time refinement 
    62                                                                                                    ! i.e. update only at the parent time step 
    63       !! clem: this condition is clearly wrong if nn_fsbc/=1 (==> Agrif_NbStepint /= (Agrif_irhot()-1) all the time) 
    64       !!IF( ( Agrif_NbStepint() .NE. (Agrif_irhot()-1) ) .AND. (kt /= 0) )  RETURN 
    65        
     54      !! clem: I think the update should take place each time the ocean sees the surface forcings 
     55      !!       (but maybe I am wrong and we should update every rhot time steps)  
     56      IF( ( MOD( (kt-nit000)/nn_fsbc + 1, Agrif_irhot() * Agrif_Parent(nn_fsbc) / nn_fsbc ) /=0 ) .AND. (kt /= 0) ) RETURN ! do not update if nb of child time steps differ from time refinement 
     57                                                                                                                           ! i.e. update only at the parent time step 
    6658      Agrif_UseSpecialValueInUpdate = .TRUE. 
    6759      Agrif_SpecialValueFineGrid = -9999. 
     
    9890      INTEGER  :: jk, jl, jm 
    9991      !!----------------------------------------------------------------------- 
    100       ! clem: it is ok not to multiply by e1 e2 since we conserve tracers here (cf ce qui est fait dans opa). 
     92      ! it is ok not to multiply by e1*e2 since we conserve tracers here (same as in the ocean). 
    10193      IF( before ) THEN 
    10294         jm = 1 
     
    135127         ENDDO 
    136128 
     129         ! integrated values 
     130         vt_i (i1:i2,j1:j2) = SUM( v_i(i1:i2,j1:j2,:), dim=3 ) 
     131         vt_s (i1:i2,j1:j2) = SUM( v_s(i1:i2,j1:j2,:), dim=3 ) 
     132         at_i (i1:i2,j1:j2) = SUM( a_i(i1:i2,j1:j2,:), dim=3 ) 
     133         et_s(i1:i2,j1:j2)  = SUM( SUM( e_s(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
     134         et_i(i1:i2,j1:j2)  = SUM( SUM( e_i(i1:i2,j1:j2,:,:), dim=4 ), dim=3 ) 
     135          
    137136      ENDIF 
    138137      ! 
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/NST_SRC/agrif_user.F90

    r7510 r7757  
    3535!     hold parent grid vertical levels number (set earlier) 
    3636!      jpk     = jpkdta  
     37# if defined key_sas2D 
     38      jpkm1   = 1 
     39# else 
     40      jpkm1   = jpk-1 
     41# endif 
    3742      jpim1   = jpi-1  
    3843      jpjm1   = jpj-1  
    39       jpkm1   = jpk-1                                          
    4044      jpij    = jpi*jpj  
    4145      jpidta  = jpiglo 
     
    9094# if defined key_top 
    9195   CALL Agrif_InitValues_cont_top 
     96# endif 
     97# if defined key_lim3 
     98   CALL Agrif_InitValues_cont_lim3 
    9299# endif 
    93100   ! 
     
    289296         ! check if vmask agree with parent along northern and southern boundaries: 
    290297         CALL Agrif_Bc_variable(vmsk_id,calledweight=1.,procname=interpvmsk) 
    291     ! check if tmask and vertical scale factors agree with parent over first two coarse grid points: 
     298        ! check if tmask and vertical scale factors agree with parent over first two coarse grid points: 
    292299         CALL Agrif_Bc_variable(e3t_id,calledweight=1.,procname=interpe3t) 
    293300         ! 
    294301         IF (lk_mpp) CALL mpp_sum( kindic_agr ) 
    295          IF( kindic_agr /= 0 ) THEN                    
     302         IF( kindic_agr /= 0 ) THEN 
    296303            CALL ctl_stop('Child Bathymetry is not correct near boundaries.') 
    297304         ELSE 
     
    579586   CALL agrif_declare_var_lim3 
    580587 
    581    ! Controls (clem) 
     588   ! Controls 
     589 
     590   ! clem: For some reason, nn_fsbc(child)/=1 does not work properly (signal is largely degraded by the agrif zoom) 
     591   !          the run must satisfy CFL=Uice/(dx/dt) < 0.6/nn_fsbc(child) 
     592   !          therefore, if nn_fsbc(child)>1 one must reduce the time-step in proportion to nn_fsbc(child), which is not acceptable 
     593   !       If a solution is found, the following stop could be removed 
     594   IF( nn_fsbc > 1 )  CALL ctl_stop('nn_fsbc(child) must be set to 1 otherwise agrif and lim3 do not work properly') 
     595 
    582596   ! stop if rhot * nn_fsbc(parent) /= N * nn_fsbc(child) with N being integer 
    583597   IF( MOD( Agrif_irhot() * Agrif_Parent(nn_fsbc), nn_fsbc ) /= 0 )  THEN 
     
    591605   ! First Interpolations (using "after" ice subtime step => lim_nbstep=1) 
    592606   !---------------------------------------------------------------------- 
    593    lim_nbstep = 1 
     607!!   lim_nbstep = 1. 
     608   lim_nbstep = ( Agrif_irhot() * Agrif_Parent(nn_fsbc) / nn_fsbc ) ! clem: to have calledweight=1 in interp (otherwise the western border of the zoom is wrong) 
    594609   CALL agrif_interp_lim3('U') ! interpolation of ice velocities 
    595610   CALL agrif_interp_lim3('V') ! interpolation of ice velocities 
    596611   CALL agrif_interp_lim3('T') ! interpolation of ice tracers 
    597    lim_nbstep = 0 
     612   lim_nbstep = 0. 
    598613    
    599614   ! Update in case 2 ways 
     
    618633   ! 1. Declaration of the type of variable which have to be interpolated (parent=>child) 
    619634   !       agrif_declare_variable(position,1st point index,--,--,dimensions,name) 
     635   !           ex.:  position=> 1,1 = not-centered (in i and j) 
     636   !                            2,2 =     centered (    -     ) 
     637   !                 index   => 1,1 = one ghost line 
     638   !                            2,2 = two ghost lines 
    620639   !------------------------------------------------------------------------------------- 
    621640   CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpl*(5+nlay_s+nlay_i)/),tra_ice_id ) 
     
    637656   ! 4. Set update type in case 2 ways (child=>parent) (normal & tangent to the grid cell for velocities) 
    638657   !-------------------------------------------------- 
    639    CALL Agrif_Set_Updatetype(tra_ice_id, update = AGRIF_Update_Average) ! clem je comprends pas average/copy 
     658   CALL Agrif_Set_Updatetype(tra_ice_id, update = AGRIF_Update_Average) 
    640659   CALL Agrif_Set_Updatetype(u_ice_id  ,update1 = Agrif_Update_Copy   , update2 = Agrif_Update_Average) 
    641660   CALL Agrif_Set_Updatetype(v_ice_id  ,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy   ) 
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90

    r7510 r7757  
    116116      IF( nn_timing == 1 )   CALL timing_start('sbc_ice_lim') 
    117117 
    118       ! clem: it is important to initialize agrif_lim3 variables here and not in sbc_lim_init 
    119 # if defined key_agrif 
    120       IF( kt == nit000 ) THEN 
    121          IF( .NOT. Agrif_Root() )   CALL Agrif_InitValues_cont_lim3 
    122       ENDIF 
    123 # endif 
    124  
    125118      !-----------------------! 
    126119      ! --- Ice time step --- ! 
     
    262255                                      CALL lim_var_agg( 2 )     ! necessary calls (at least for coupling) 
    263256                                      ! 
    264 # if defined key_agrif 
    265 !!         IF( .NOT. Agrif_Root() )     CALL Agrif_ChildGrid_To_ParentGrid()  ! clem: should be called at the update frequency only (cf agrif_lim3_update) 
    266 # endif 
     257!! clem: one should switch the calculation of the fluxes onto the parent grid but the following calls do not work 
     258!!       moreover it should only be called at the update frequency (as in agrif_lim3_update.F90) 
     259!!# if defined key_agrif 
     260!!         IF( .NOT. Agrif_Root() )     CALL Agrif_ChildGrid_To_ParentGrid() 
     261!!# endif 
    267262                                      CALL lim_sbc_flx( kt )    ! -- Update surface ocean mass, heat and salt fluxes 
    268 # if defined key_agrif 
    269 !!         IF( .NOT. Agrif_Root() )     CALL Agrif_ParentGrid_To_ChildGrid()  ! clem: should be called at the update frequency only (cf agrif_lim3_update) 
    270 # endif 
     263!!# if defined key_agrif 
     264!!         IF( .NOT. Agrif_Root() )     CALL Agrif_ParentGrid_To_ChildGrid() 
     265!!# endif 
    271266         IF( ln_limdiahsb )           CALL lim_diahsb( kt )     ! -- Diagnostics and outputs  
    272267         ! 
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/SAS_SRC/diawri.F90

    r7158 r7757  
    4646#if defined key_lim2 
    4747   USE limwri_2  
     48#elif defined key_lim3 
     49   USE limwri 
    4850#endif 
    4951   USE lib_mpp         ! MPP library 
     
    114116      !!---------------------------------------------------------------------- 
    115117      !  
    116       !! no relevant 2D arrays to write in iomput case 
     118      ! Output the initial state and forcings 
     119      IF( ninist == 1 ) THEN 
     120         CALL dia_wri_state( 'output.init', kt ) 
     121         ninist = 0 
     122      ENDIF 
    117123      ! 
    118124   END SUBROUTINE dia_wri 
     
    412418#if defined key_lim2 
    413419      CALL lim_wri_state_2( kt, id_i, nh_i ) 
     420#elif defined key_lim3 
     421      CALL lim_wri_state( kt, id_i, nh_i ) 
    414422#else 
    415423      CALL histend( id_i, snc4chunks=snc4set ) 
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/SAS_SRC/sbcssm.F90

    r7069 r7757  
    8888         !  
    8989         IF( ln_3d_uve ) THEN 
    90             IF( lk_vvl )   e3t_m(:,:) = sf_ssm_3d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1)    ! v-velocity  
    91                            ssu_m(:,:) = sf_ssm_3d(jf_usp)%fnow(:,:,1) * umask(:,:,1)    ! u-velocity 
    92                            ssv_m(:,:) = sf_ssm_3d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity  
     90            IF( lk_vvl ) THEN 
     91               e3t_m(:,:) = sf_ssm_3d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1) ! vertical scale factor  
     92            ELSE 
     93               e3t_m(:,:) = e3t_0(:,:,1)                                 ! vertical scale factor 
     94            ENDIF 
     95            ssu_m(:,:) = sf_ssm_3d(jf_usp)%fnow(:,:,1) * umask(:,:,1)    ! u-velocity 
     96            ssv_m(:,:) = sf_ssm_3d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity  
    9397         ELSE 
    94             IF( lk_vvl )   e3t_m(:,:) = sf_ssm_2d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1)    ! v-velocity  
    95                            ssu_m(:,:) = sf_ssm_2d(jf_usp)%fnow(:,:,1) * umask(:,:,1)    ! u-velocity 
    96                            ssv_m(:,:) = sf_ssm_2d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity  
     98            IF( lk_vvl ) THEN 
     99               e3t_m(:,:) = sf_ssm_2d(jf_e3t)%fnow(:,:,1) * tmask(:,:,1) ! vertical scale factor  
     100            ELSE 
     101               e3t_m(:,:) = e3t_0(:,:,1)                                 ! vertical scale factor 
     102            ENDIF 
     103            ssu_m(:,:) = sf_ssm_2d(jf_usp)%fnow(:,:,1) * umask(:,:,1)    ! u-velocity 
     104            ssv_m(:,:) = sf_ssm_2d(jf_vsp)%fnow(:,:,1) * vmask(:,:,1)    ! v-velocity  
    97105         ENDIF 
    98106         ! 
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/SAS_SRC/step.F90

    r7060 r7757  
    6363 
    6464#if defined key_agrif 
    65    SUBROUTINE stp( ) 
     65   RECURSIVE SUBROUTINE stp( ) 
    6666      INTEGER             ::   kstp   ! ocean time-step index 
    6767#else 
Note: See TracChangeset for help on using the changeset viewer.