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 7158 for branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90 – NEMO

Ignore:
Timestamp:
2016-10-29T01:21:05+02:00 (7 years ago)
Author:
clem
Message:

debug branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/NST_SRC/agrif_lim3_interp.F90

    r7069 r7158  
    2424   USE ice 
    2525   USE agrif_ice 
    26  
     26    
    2727   IMPLICIT NONE 
    2828   PRIVATE 
     
    3838CONTAINS 
    3939 
    40    SUBROUTINE agrif_interp_lim3( cd_type ) 
     40   SUBROUTINE agrif_interp_lim3( cd_type, kiter, kitermax ) 
    4141      !!----------------------------------------------------------------------- 
    4242      !!                 *** ROUTINE agrif_rhg_lim3  *** 
    4343      !! 
    4444      !!  ** Method  : simple call to atomic routines using stored values to 
    45       !!  fill the boundaries depending of the position of the point and  
    46       !!  computing factor for time interpolation  
    47       !!----------------------------------------------------------------------- 
    48       CHARACTER(len=1), INTENT( in ) :: cd_type 
    49       !!     
     45      !!  fill the boundaries depending of the position of the point and 
     46      !!  computing factor for time interpolation 
     47      !!----------------------------------------------------------------------- 
     48      CHARACTER(len=1), INTENT( in )           :: cd_type 
     49      INTEGER         , INTENT( in ), OPTIONAL :: kiter, kitermax 
     50      !! 
    5051      REAL(wp) :: zbeta 
    5152      !!----------------------------------------------------------------------- 
     
    5354      IF( Agrif_Root() )  RETURN 
    5455      ! 
    55       zbeta = REAL(lim_nbstep) / ( Agrif_Rhot() * REAL(Agrif_Parent(nn_fsbc)) / REAL(nn_fsbc) ) 
    56       ! 
    57       ! clem: calledweight = zbeta(1/3;2/3;1) => 2/3*var1+1/3*var2 puis 1/3;2/3 puis 0;1 
     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 
     62      ! 
    5863      Agrif_SpecialValue=-9999. 
    5964      Agrif_UseSpecialValue = .TRUE. 
     
    126131 
    127132 
    128    SUBROUTINE interp_tra_ice( ptab, i1, i2, j1, j2, k1, k2, before ) 
     133   SUBROUTINE interp_tra_ice( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
    129134      !!----------------------------------------------------------------------- 
    130135      !!                    *** ROUTINE interp_tra_ice ***                            
     
    137142      INTEGER , INTENT(in) :: i1, i2, j1, j2, k1, k2 
    138143      LOGICAL , INTENT(in) :: before 
    139       !! 
    140       INTEGER :: jk, jl, jm 
     144      INTEGER , INTENT(in) :: nb, ndir 
     145      !! 
     146      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztab 
     147      INTEGER  ::   ji, jj, jk, jl, jm 
     148      INTEGER  ::   imin, imax, jmin, jmax 
     149      REAL(wp) ::   zrhox, z1, z2, z3, z4, z5, z6, z7 
     150      LOGICAL  ::   western_side, eastern_side, northern_side, southern_side 
     151 
    141152      !!----------------------------------------------------------------------- 
    142153      ! clem: pkoi on n'utilise pas les quantités intégrées ici => before: * e12t ; after: * r1_e12t / rhox / rhoy 
    143154      ! a priori c'est ok comme ca (cf ce qui est fait dans l'ocean). Je ne sais pas pkoi ceci dit 
    144        
     155      ALLOCATE( ztab(SIZE(a_i_b,1),SIZE(a_i_b,2),SIZE(ptab,3)) ) 
     156      
    145157      IF( before ) THEN  ! parent grid 
    146158         jm = 1 
    147159         DO jl = 1, jpl 
    148             ptab(:,:,jm) = a_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    149             ptab(:,:,jm) = v_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    150             ptab(:,:,jm) = v_s_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
    151             ptab(:,:,jm) = smv_i_b(i1:i2,j1:j2,jl) ; jm = jm + 1 
    152             ptab(:,:,jm) = oa_i_b (i1:i2,j1:j2,jl) ; jm = jm + 1 
     160            ptab(i1:i2,j1:j2,jm) = a_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
     161            ptab(i1:i2,j1:j2,jm) = v_i_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
     162            ptab(i1:i2,j1:j2,jm) = v_s_b  (i1:i2,j1:j2,jl) ; jm = jm + 1 
     163            ptab(i1:i2,j1:j2,jm) = smv_i_b(i1:i2,j1:j2,jl) ; jm = jm + 1 
     164            ptab(i1:i2,j1:j2,jm) = oa_i_b (i1:i2,j1:j2,jl) ; jm = jm + 1 
    153165            DO jk = 1, nlay_s 
    154                ptab(:,:,jm) = e_s_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
     166               ptab(i1:i2,j1:j2,jm) = e_s_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    155167            ENDDO 
    156168            DO jk = 1, nlay_i 
    157                ptab(:,:,jm) = e_i_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
     169               ptab(i1:i2,j1:j2,jm) = e_i_b(i1:i2,j1:j2,jk,jl) ; jm = jm + 1 
    158170            ENDDO 
    159171         ENDDO 
    160          !!ptab(:,:,jm) = ato_i(i1:i2,j1:j2) 
    161172          
    162173         DO jk = k1, k2 
    163             WHERE( tmask(i1:i2,j1:j2,1) == 0. )  ptab(:,:,jk) = -9999. 
     174            WHERE( tmask(i1:i2,j1:j2,1) == 0. )  ptab(i1:i2,j1:j2,jk) = -9999. 
    164175         ENDDO 
    165176          
    166177      ELSE               ! child grid 
     178!! ==> 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 
     193 
     194!! ==> this is a more complex interpolation since we mix solutions over a couple of grid points 
     195!!     it is advised to use it for fields modified by high order schemes (e.g. advection UM5...) 
     196         ! record ztab 
    167197         jm = 1 
    168198         DO jl = 1, jpl 
    169             a_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    170             v_i  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    171             v_s  (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    172             smv_i(i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
    173             oa_i (i1:i2,j1:j2,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     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 
    174204            DO jk = 1, nlay_s 
    175                e_s(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     205               ztab(:,:,jm) = e_s_b(:,:,jk,jl) ; jm = jm + 1 
    176206            ENDDO 
    177207            DO jk = 1, nlay_i 
    178                e_i(i1:i2,j1:j2,jk,jl) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) ; jm = jm + 1 
     208               ztab(:,:,jm) = e_i_b(:,:,jk,jl) ; jm = jm + 1 
    179209            ENDDO 
    180210         ENDDO 
    181          !!ato_i(i1:i2,j1:j2) = ptab(:,:,jm) * tmask(i1:i2,j1:j2,1) 
     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 
    182307          
    183308      ENDIF 
     309       
     310      DEALLOCATE( ztab ) 
    184311      ! 
    185312   END SUBROUTINE interp_tra_ice 
Note: See TracChangeset for help on using the changeset viewer.