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 7761 for trunk/NEMOGCM/NEMO/NST_SRC – NEMO

Ignore:
Timestamp:
2017-03-06T18:58:35+01:00 (7 years ago)
Author:
clem
Message:

make AGRIF and LIM3 fully compatible

Location:
trunk/NEMOGCM/NEMO/NST_SRC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90

    r7646 r7761  
    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: * e1e2t ; after: * r1_e1e2t / 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       
  • trunk/NEMOGCM/NEMO/NST_SRC/agrif_lim3_update.F90

    r7646 r7761  
    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      ! 
  • trunk/NEMOGCM/NEMO/NST_SRC/agrif_user.F90

    r7646 r7761  
    3737      jpim1   = jpi-1  
    3838      jpjm1   = jpj-1  
    39       jpkm1   = jpk-1                                          
     39      jpkm1   = MAX( 1, jpk-1 )                                          
    4040      jpij    = jpi*jpj  
    4141      nperio  = 0 
     
    8383# if defined key_top 
    8484   CALL Agrif_InitValues_cont_top 
     85# endif 
     86# if defined key_lim3 
     87   CALL Agrif_InitValues_cont_lim3 
    8588# endif 
    8689   ! 
     
    290293         ! check if vmask agree with parent along northern and southern boundaries: 
    291294         CALL Agrif_Bc_variable(vmsk_id,calledweight=1.,procname=interpvmsk) 
    292     ! check if tmask and vertical scale factors agree with parent over first two coarse grid points: 
     295        ! check if tmask and vertical scale factors agree with parent over first two coarse grid points: 
    293296         CALL Agrif_Bc_variable(e3t_id,calledweight=1.,procname=interpe3t) 
    294297         ! 
    295298         IF (lk_mpp) CALL mpp_sum( kindic_agr ) 
    296          IF( kindic_agr /= 0 ) THEN                    
     299         IF( kindic_agr /= 0 ) THEN 
    297300            CALL ctl_stop('Child Bathymetry is not correct near boundaries.') 
    298301         ELSE 
     
    457460!   CALL Agrif_Set_Updatetype(vb2b_update_id,update1 = Agrif_Update_Full_Weighting, update2 = Agrif_Update_Average) 
    458461!   CALL Agrif_Set_Updatetype(sshn_id, update = Agrif_Update_Full_Weighting) 
    459   
     462 
    460463   ! 
    461464END SUBROUTINE agrif_declare_var 
     
    579582   CALL agrif_declare_var_lim3 
    580583 
    581    ! Controls (clem) 
     584   ! Controls 
     585 
     586   ! clem: For some reason, nn_fsbc(child)/=1 does not work properly (signal is largely degraded by the agrif zoom) 
     587   !          the run must satisfy CFL=Uice/(dx/dt) < 0.6/nn_fsbc(child) 
     588   !          therefore, if nn_fsbc(child)>1 one must reduce the time-step in proportion to nn_fsbc(child), which is not acceptable 
     589   !       If a solution is found, the following stop could be removed 
     590   IF( nn_fsbc > 1 )  CALL ctl_stop('nn_fsbc(child) must be set to 1 otherwise agrif and lim3 do not work properly') 
     591 
    582592   ! stop if rhot * nn_fsbc(parent) /= N * nn_fsbc(child) with N being integer 
    583593   IF( MOD( Agrif_irhot() * Agrif_Parent(nn_fsbc), nn_fsbc ) /= 0 )  THEN 
     
    591601   ! First Interpolations (using "after" ice subtime step => lim_nbstep=1) 
    592602   !---------------------------------------------------------------------- 
    593    lim_nbstep = 1 
     603!!   lim_nbstep = 1 
     604   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) 
    594605   CALL agrif_interp_lim3('U') ! interpolation of ice velocities 
    595606   CALL agrif_interp_lim3('V') ! interpolation of ice velocities 
     
    618629   ! 1. Declaration of the type of variable which have to be interpolated (parent=>child) 
    619630   !       agrif_declare_variable(position,1st point index,--,--,dimensions,name) 
     631   !           ex.:  position=> 1,1 = not-centered (in i and j) 
     632   !                            2,2 =     centered (    -     ) 
     633   !                 index   => 1,1 = one ghost line 
     634   !                            2,2 = two ghost lines 
    620635   !------------------------------------------------------------------------------------- 
    621636   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 ) 
     
    637652   ! 4. Set update type in case 2 ways (child=>parent) (normal & tangent to the grid cell for velocities) 
    638653   !-------------------------------------------------- 
    639    CALL Agrif_Set_Updatetype(tra_ice_id, update = AGRIF_Update_Average) ! clem je comprends pas average/copy 
     654   CALL Agrif_Set_Updatetype(tra_ice_id, update = AGRIF_Update_Average) 
    640655   CALL Agrif_Set_Updatetype(u_ice_id  ,update1 = Agrif_Update_Copy   , update2 = Agrif_Update_Average) 
    641656   CALL Agrif_Set_Updatetype(v_ice_id  ,update1 = Agrif_Update_Average, update2 = Agrif_Update_Copy   ) 
Note: See TracChangeset for help on using the changeset viewer.