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 8998 for branches/2017 – NEMO

Changeset 8998 for branches/2017


Ignore:
Timestamp:
2017-12-13T09:34:57+01:00 (6 years ago)
Author:
timgraham
Message:

First commit of Jerome's modified versions of agrif_opa routines

Location:
branches/2017/dev_METO_MERCATOR_2017_agrif/NEMOGCM/NEMO/NST_SRC
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_METO_MERCATOR_2017_agrif/NEMOGCM/NEMO/NST_SRC/agrif_oce.F90

    r8993 r8998  
    1717 
    1818   PUBLIC agrif_oce_alloc ! routine called by nemo_init in nemogcm.F90 
    19  
     19#if defined key_vertical 
     20   PUBLIC reconstructandremap ! remapping routine 
     21#endif    
    2022   !                                              !!* Namelist namagrif: AGRIF parameters 
    2123   LOGICAL , PUBLIC ::   ln_spc_dyn    = .FALSE.   !: 
     
    2426   REAL(wp), PUBLIC ::   rn_sponge_dyn = 2800.     !: sponge coeff. for dynamics 
    2527   LOGICAL , PUBLIC ::   ln_chk_bathy  = .FALSE.   !: check of parent bathymetry  
    26    LOGICAL , PUBLIC ::   lk_agrif_clp  = .FALSE.   !: Flag to retrieve clamped open boundaries 
    27  
     28   LOGICAL , PUBLIC ::   lk_agrif_clp  = .TRUE.    !: Force clamped bcs 
    2829   !                                              !!! OLD namelist names 
    2930   REAL(wp), PUBLIC ::   visc_tra                  !: sponge coeff. for tracers 
     
    101102   END FUNCTION agrif_oce_alloc 
    102103 
     104#if defined key_vertical 
     105   SUBROUTINE reconstructandremap(tabin,hin,tabout,hout,N,Nout)       
     106      !!---------------------------------------------------------------------- 
     107      !!                ***  FUNCTION reconstructandremap  *** 
     108      !!---------------------------------------------------------------------- 
     109      IMPLICIT NONE 
     110      INTEGER N, Nout 
     111      REAL(wp) tabin(N), tabout(Nout) 
     112      REAL(wp) hin(N), hout(Nout) 
     113      REAL(wp) coeffremap(N,3),zwork(N,3) 
     114      REAL(wp) zwork2(N+1,3) 
     115      INTEGER jk 
     116      DOUBLE PRECISION, PARAMETER :: dsmll=1.0d-8   
     117      REAL(wp) q,q01,q02,q001,q002,q0 
     118      REAL(wp) z_win(1:N+1), z_wout(1:Nout+1) 
     119      REAL(wp),PARAMETER :: dpthin = 1.D-3 
     120      INTEGER :: k1, kbox, ktop, ka, kbot 
     121      REAL(wp) :: tsum, qbot, rpsum, zbox, ztop, zthk, zbot, offset, qtop 
     122 
     123      z_win(1)=0.; z_wout(1)= 0. 
     124      DO jk=1,N 
     125         z_win(jk+1)=z_win(jk)+hin(jk) 
     126      ENDDO  
     127       
     128      DO jk=1,Nout 
     129         z_wout(jk+1)=z_wout(jk)+hout(jk)        
     130      ENDDO        
     131 
     132      DO jk=2,N 
     133         zwork(jk,1)=1./(hin(jk-1)+hin(jk)) 
     134      ENDDO 
     135         
     136      DO jk=2,N-1 
     137         q0 = 1./(hin(jk-1)+hin(jk)+hin(jk+1)) 
     138         zwork(jk,2)=hin(jk-1)+2.*hin(jk)+hin(jk+1) 
     139         zwork(jk,3)=q0 
     140      ENDDO        
     141      
     142      DO jk= 2,N 
     143         zwork2(jk,1)=zwork(jk,1)*(tabin(jk)-tabin(jk-1)) 
     144      ENDDO 
     145         
     146      coeffremap(:,1) = tabin(:) 
     147  
     148      DO jk=2,N-1 
     149         q001 = hin(jk)*zwork2(jk+1,1) 
     150         q002 = hin(jk)*zwork2(jk,1)         
     151         IF (q001*q002 < 0) then 
     152            q001 = 0. 
     153            q002 = 0. 
     154         ENDIF 
     155         q=zwork(jk,2) 
     156         q01=q*zwork2(jk+1,1) 
     157         q02=q*zwork2(jk,1) 
     158         IF (abs(q001) > abs(q02)) q001 = q02 
     159         IF (abs(q002) > abs(q01)) q002 = q01 
     160         
     161         q=(q001-q002)*zwork(jk,3) 
     162         q001=q001-q*hin(jk+1) 
     163         q002=q002+q*hin(jk-1) 
     164         
     165         coeffremap(jk,3)=coeffremap(jk,1)+q001 
     166         coeffremap(jk,2)=coeffremap(jk,1)-q002 
     167         
     168         zwork2(jk,1)=(2.*q001-q002)**2 
     169         zwork2(jk,2)=(2.*q002-q001)**2 
     170      ENDDO 
     171         
     172      DO jk=1,N 
     173         IF(jk.EQ.1 .OR. jk.EQ.N .OR. hin(jk).LE.dpthin) THEN 
     174            coeffremap(jk,3) = coeffremap(jk,1) 
     175            coeffremap(jk,2) = coeffremap(jk,1) 
     176            zwork2(jk,1) = 0. 
     177            zwork2(jk,2) = 0. 
     178         ENDIF 
     179      ENDDO 
     180         
     181      DO jk=2,N 
     182         q002=max(zwork2(jk-1,2),dsmll) 
     183         q001=max(zwork2(jk,1),dsmll) 
     184         zwork2(jk,3)=(q001*coeffremap(jk-1,3)+q002*coeffremap(jk,2))/(q001+q002) 
     185      ENDDO 
     186         
     187      zwork2(1,3) = 2*coeffremap(1,1)-zwork2(2,3) 
     188      zwork2(N+1,3)=2*coeffremap(N,1)-zwork2(N,3) 
     189  
     190      DO jk=1,N 
     191         q01=zwork2(jk+1,3)-coeffremap(jk,1) 
     192         q02=coeffremap(jk,1)-zwork2(jk,3) 
     193         q001=2.*q01 
     194         q002=2.*q02 
     195         IF (q01*q02<0) then 
     196            q01=0. 
     197            q02=0. 
     198         ELSEIF (abs(q01)>abs(q002)) then 
     199            q01=q002 
     200         ELSEIF (abs(q02)>abs(q001)) then 
     201            q02=q001 
     202         ENDIF 
     203         coeffremap(jk,2)=coeffremap(jk,1)-q02 
     204         coeffremap(jk,3)=coeffremap(jk,1)+q01 
     205      ENDDO 
     206 
     207      zbot=0.0 
     208      kbot=1 
     209      DO jk=1,Nout 
     210         ztop=zbot  !top is bottom of previous layer 
     211         ktop=kbot 
     212         IF     (ztop.GE.z_win(ktop+1)) then 
     213            ktop=ktop+1 
     214         ENDIF 
     215         
     216         zbot=z_wout(jk+1) 
     217         zthk=zbot-ztop 
     218 
     219         IF(zthk.GT.dpthin .AND. ztop.LT.z_wout(Nout+1)) THEN 
     220 
     221            kbot=ktop 
     222            DO while (z_win(kbot+1).lt.zbot.and.kbot.lt.N) 
     223               kbot=kbot+1 
     224            ENDDO 
     225            zbox=zbot 
     226            DO k1= jk+1,Nout 
     227               IF     (z_wout(k1+1)-z_wout(k1).GT.dpthin) THEN 
     228                  exit !thick layer 
     229               ELSE 
     230                  zbox=z_wout(k1+1)  !include thin adjacent layers 
     231                  IF(zbox.EQ.z_wout(Nout+1)) THEN 
     232                     exit !at bottom 
     233                  ENDIF 
     234               ENDIF 
     235            ENDDO 
     236            zthk=zbox-ztop 
     237 
     238            kbox=ktop 
     239            DO while (z_win(kbox+1).lt.zbox.and.kbox.lt.N) 
     240               kbox=kbox+1 
     241            ENDDO 
     242           
     243            IF(ktop.EQ.kbox) THEN 
     244               IF(z_wout(jk).NE.z_win(kbox).OR.z_wout(jk+1).NE.z_win(kbox+1)) THEN 
     245                  IF(hin(kbox).GT.dpthin) THEN 
     246                     q001 = (zbox-z_win(kbox))/hin(kbox) 
     247                     q002 = (ztop-z_win(kbox))/hin(kbox) 
     248                     q01=q001**2+q002**2+q001*q002+1.-2.*(q001+q002) 
     249                     q02=q01-1.+(q001+q002) 
     250                     q0=1.-q01-q02 
     251                  ELSE 
     252                     q0 = 1.0 
     253                     q01 = 0. 
     254                     q02 = 0. 
     255                  ENDIF 
     256                  tabout(jk)=q0*coeffremap(kbox,1)+q01*coeffremap(kbox,2)+q02*coeffremap(kbox,3) 
     257               ELSE 
     258                  tabout(jk) = tabin(kbox) 
     259               ENDIF  
     260            ELSE 
     261               IF(ktop.LE.jk .AND. kbox.GE.jk) THEN 
     262                  ka = jk 
     263               ELSEIF (kbox-ktop.GE.3) THEN 
     264                  ka = (kbox+ktop)/2 
     265               ELSEIF (hin(ktop).GE.hin(kbox)) THEN 
     266                  ka = ktop 
     267               ELSE 
     268                  ka = kbox 
     269               ENDIF !choose ka 
     270     
     271               offset=coeffremap(ka,1) 
     272     
     273               qtop = z_win(ktop+1)-ztop !partial layer thickness 
     274               IF(hin(ktop).GT.dpthin) THEN 
     275                  q=(ztop-z_win(ktop))/hin(ktop) 
     276                  q01=q*(q-1.) 
     277                  q02=q01+q 
     278                  q0=1-q01-q02             
     279               ELSE 
     280                  q0 = 1. 
     281                  q01 = 0. 
     282                  q02 = 0. 
     283               ENDIF 
     284                
     285               tsum =((q0*coeffremap(ktop,1)+q01*coeffremap(ktop,2)+q02*coeffremap(ktop,3))-offset)*qtop 
     286     
     287               DO k1= ktop+1,kbox-1 
     288                  tsum =tsum +(coeffremap(k1,1)-offset)*hin(k1) 
     289               ENDDO !k1 
     290                
     291               qbot = zbox-z_win(kbox) !partial layer thickness 
     292               IF(hin(kbox).GT.dpthin) THEN 
     293                  q=qbot/hin(kbox) 
     294                  q01=(q-1.)**2 
     295                  q02=q01-1.+q 
     296                  q0=1-q01-q02                             
     297               ELSE 
     298                  q0 = 1.0 
     299                  q01 = 0. 
     300                  q02 = 0. 
     301               ENDIF 
     302               
     303               tsum = tsum +((q0*coeffremap(kbox,1)+q01*coeffremap(kbox,2)+q02*coeffremap(kbox,3))-offset)*qbot 
     304                
     305               rpsum=1.0d0/zthk 
     306               tabout(jk)=offset+tsum*rpsum 
     307                  
     308            ENDIF !single or multiple layers 
     309         ELSE 
     310            IF (jk==1) THEN 
     311               write(*,'(a7,i4,i4,3f12.5)')'problem = ',N,Nout,zthk,z_wout(jk+1),hout(1) 
     312            ENDIF 
     313            tabout(jk) = tabout(jk-1) 
     314              
     315         ENDIF !normal:thin layer 
     316      ENDDO !jk 
     317             
     318      return 
     319      end subroutine reconstructandremap 
     320#endif 
     321 
    103322#endif 
    104323   !!====================================================================== 
  • branches/2017/dev_METO_MERCATOR_2017_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90

    r8993 r8998  
    118118         ! 
    119119         IF (.NOT.lk_agrif_clp) THEN 
    120             DO jk=1,jpkm1              ! Smooth 
     120            DO jk=1,jpkm1                 ! Smooth 
    121121               DO jj=j1,j2 
    122122                  ua(2,jj,jk) = 0.25_wp*(ua(1,jj,jk)+2._wp*ua(2,jj,jk)+ua(3,jj,jk)) 
     
    124124               END DO 
    125125            END DO 
    126          END IF 
     126         ENDIF 
    127127         ! 
    128128         zub(2,:) = 0._wp              ! Correct transport 
     
    189189 
    190190         IF (.NOT.lk_agrif_clp) THEN 
    191             DO jk = 1, jpkm1           ! Smooth 
     191            DO jk = 1, jpkm1              ! Smooth 
    192192               DO jj = j1, j2 
    193193                  ua(nlci-2,jj,jk) = 0.25_wp * umask(nlci-2,jj,jk)      & 
     
    196196            END DO 
    197197         ENDIF 
    198  
    199198         zub(nlci-2,:) = 0._wp        ! Correct transport 
    200199         DO jk = 1, jpkm1 
     
    331330         ! 
    332331         IF (.NOT.lk_agrif_clp) THEN 
    333             DO jk = 1, jpkm1           ! Smooth 
     332            DO jk = 1, jpkm1              ! Smooth 
    334333               DO ji = i1, i2 
    335334                  va(ji,nlcj-2,jk) = 0.25_wp * vmask(ji,nlcj-2,jk)   & 
     
    337336               END DO 
    338337            END DO 
    339          ENDIF 
     338         END IF 
    340339         ! 
    341340         zvb(:,nlcj-2) = 0._wp         ! Correct transport 
     
    614613      INTEGER                                     , INTENT(in   ) ::   nb , ndir 
    615614      ! 
    616       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    617       INTEGER  ::   imin, imax, jmin, jmax 
     615      INTEGER  ::   ji, jj, jk, jn, iref, jref   ! dummy loop indices 
     616      INTEGER  ::   imin, imax, jmin, jmax, N_in, N_out 
    618617      REAL(wp) ::   zrhox , zalpha1, zalpha2, zalpha3 
    619618      REAL(wp) ::   zalpha4, zalpha5, zalpha6, zalpha7 
    620       LOGICAL  ::   western_side, eastern_side,northern_side,southern_side 
    621       !!---------------------------------------------------------------------- 
    622       ! 
     619      LOGICAL :: western_side, eastern_side,northern_side,southern_side 
     620      ! vertical interpolation: 
     621      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk,n1:n2) :: ptab_child 
     622      REAL(wp), DIMENSION(k1:k2,n1:n2-1) :: tabin 
     623      REAL(wp), DIMENSION(k1:k2) :: h_in 
     624      REAL(wp), DIMENSION(1:jpk) :: h_out(1:jpk) 
     625      REAL(wp) :: h_diff, zrhoxy 
     626 
     627      zrhoxy = Agrif_rhox()*Agrif_rhoy() 
    623628      IF (before) THEN          
    624          ptab(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
    625       ELSE 
     629         DO jn = 1,jpts 
     630            DO jk=k1,k2 
     631               DO jj=j1,j2 
     632                 DO ji=i1,i2 
     633                       ptab(ji,jj,jk,jn) = tsn(ji,jj,jk,jn) 
     634                 END DO 
     635              END DO 
     636           END DO 
     637        END DO 
     638 
     639# if defined key_vertical 
     640        DO jk=k1,k2 
     641           DO jj=j1,j2 
     642              DO ji=i1,i2 
     643                 ptab(ji,jj,jk,jpts+1) = tmask(ji,jj,jk) * e3t_n(ji,jj,jk)  
     644              END DO 
     645           END DO 
     646        END DO 
     647# endif 
     648      ELSE  
     649 
     650         western_side  = (nb == 1).AND.(ndir == 1) 
     651         eastern_side  = (nb == 1).AND.(ndir == 2) 
     652         southern_side = (nb == 2).AND.(ndir == 1) 
     653         northern_side = (nb == 2).AND.(ndir == 2) 
     654 
     655# if defined key_vertical               
     656         DO jj=j1,j2 
     657            DO ji=i1,i2 
     658               iref = ji 
     659               jref = jj 
     660               if(western_side) iref=MAX(2,ji) 
     661               if(eastern_side) iref=MIN(nlci-1,ji) 
     662               if(southern_side) jref=MAX(2,jj) 
     663               if(northern_side) jref=MIN(nlcj-1,jj) 
     664               N_in = 0 
     665               DO jk=k1,k2 !k2 = jpk of parent grid 
     666                  IF (ptab(ji,jj,jk,n2) == 0) EXIT 
     667                  N_in = N_in + 1 
     668                  tabin(jk,:) = ptab(ji,jj,jk,n1:n2-1) 
     669                  h_in(N_in) = ptab(ji,jj,jk,n2) 
     670               END DO 
     671               N_out = 0 
     672               DO jk=1,jpk ! jpk of child grid 
     673                  IF (tmask(iref,jref,jk) == 0) EXIT  
     674                  N_out = N_out + 1 
     675                  h_out(jk) = e3t_n(iref,jref,jk) 
     676               ENDDO 
     677               IF (N_in > 0) THEN 
     678                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     679                  DO jn=1,jpts 
     680                     call reconstructandremap(tabin(1:N_in,jn),h_in,ptab_child(ji,jj,1:N_out,jn),h_out,N_in,N_out) 
     681                  ENDDO 
     682               ENDIF 
     683            ENDDO 
     684         ENDDO 
     685# else 
     686         ptab_child(i1:i2,j1:j2,1:jpk,1:jpts) = ptab(i1:i2,j1:j2,1:jpk,1:jpts) 
     687# endif 
     688         ! 
    626689         IF (lk_agrif_clp) THEN 
    627690            DO jn = 1, jpts 
     
    629692                  DO ji = i1,i2 
    630693                     DO jj = j1,j2 
    631                         tsa(ji,jj,jk,jn) = ptab(ji,jj,jk,jn) 
     694                        tsa(ji,jj,jk,jn) = ptab_child(ji,jj,jk,jn) 
    632695                     END DO 
    633696                  END DO 
     
    636699            return 
    637700         ENDIF 
    638          ! 
    639          western_side  = (nb == 1).AND.(ndir == 1) 
    640          eastern_side  = (nb == 1).AND.(ndir == 2) 
    641          southern_side = (nb == 2).AND.(ndir == 1) 
    642          northern_side = (nb == 2).AND.(ndir == 2) 
    643701         ! 
    644702         zrhox = Agrif_Rhox() 
     
    667725         IF( eastern_side ) THEN 
    668726            DO jn = 1, jpts 
    669                tsa(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn) 
     727               tsa(nlci,j1:j2,1:jpk,jn) = zalpha1 * ptab_child(nlci,j1:j2,1:jpk,jn) + zalpha2 * ptab_child(nlci-1,j1:j2,1:jpk,jn) 
    670728               DO jk = 1, jpkm1 
    671729                  DO jj = jmin,jmax 
     
    687745         IF( northern_side ) THEN             
    688746            DO jn = 1, jpts 
    689                tsa(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 
     747               tsa(i1:i2,nlcj,1:jpk,jn) = zalpha1 * ptab_child(i1:i2,nlcj,1:jpk,jn) + zalpha2 * ptab_child(i1:i2,nlcj-1,1:jpk,jn) 
    690748               DO jk = 1, jpkm1 
    691749                  DO ji = imin,imax 
     
    707765         IF( western_side ) THEN             
    708766            DO jn = 1, jpts 
    709                tsa(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn) 
     767               tsa(1,j1:j2,1:jpk,jn) = zalpha1 * ptab_child(1,j1:j2,1:jpk,jn) + zalpha2 * ptab_child(2,j1:j2,1:jpk,jn) 
    710768               DO jk = 1, jpkm1 
    711769                  DO jj = jmin,jmax 
     
    726784         IF( southern_side ) THEN            
    727785            DO jn = 1, jpts 
    728                tsa(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn) 
     786               tsa(i1:i2,1,1:jpk,jn) = zalpha1 * ptab_child(i1:i2,1,1:jpk,jn) + zalpha2 * ptab_child(i1:i2,2,1:jpk,jn) 
    729787               DO jk = 1, jpk       
    730788                  DO ji=imin,imax 
     
    747805         ! East south 
    748806         IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
    749             tsa(nlci-1,2,:,:) = ptab(nlci-1,2,:,:) 
     807            tsa(nlci-1,2,:,:) = ptab_child(nlci-1,2,:,1:jpts) 
    750808         ENDIF 
    751809         ! East north 
    752810         IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
    753             tsa(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:) 
     811            tsa(nlci-1,nlcj-1,:,:) = ptab_child(nlci-1,nlcj-1,:,1:jpts) 
    754812         ENDIF 
    755813         ! West south 
    756814         IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 
    757             tsa(2,2,:,:) = ptab(2,2,:,:) 
     815            tsa(2,2,:,:) = ptab_child(2,2,:,1:jpts) 
    758816         ENDIF 
    759817         ! West north 
    760818         IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 
    761             tsa(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:) 
     819            tsa(2,nlcj-1,:,:) = ptab_child(2,nlcj-1,:,1:jpts) 
    762820         ENDIF 
    763821         ! 
     
    765823      ! 
    766824   END SUBROUTINE interptsn 
    767  
    768825 
    769826   SUBROUTINE interpsshn( ptab, i1, i2, j1, j2, before, nb, ndir ) 
     
    794851   END SUBROUTINE interpsshn 
    795852 
    796  
    797    SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, before ) 
     853   SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before, nb, ndir ) 
    798854      !!---------------------------------------------------------------------- 
    799855      !!   *** ROUTINE interpun *** 
    800       !!---------------------------------------------------------------------- 
    801       INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
    802       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
    803       LOGICAL                               , INTENT(in   ) ::   before 
    804       ! 
    805       INTEGER  ::   ji, jj, jk 
    806       REAL(wp) ::   zrhoy   
    807       !!---------------------------------------------------------------------- 
    808       ! 
    809       IF( before ) THEN  
    810          DO jk = 1, jpkm1 
    811             ptab(i1:i2,j1:j2,jk) = e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk) 
     856      !!---------------------------------------------     
     857      !! 
     858      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2 
     859      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: ptab 
     860      LOGICAL, INTENT(in) :: before 
     861      INTEGER, INTENT(in) :: nb , ndir 
     862      !! 
     863      INTEGER :: ji,jj,jk 
     864      REAL(wp) :: zrhoy 
     865      ! vertical interpolation: 
     866      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
     867      REAL(wp), DIMENSION(1:jpk) :: h_out 
     868      INTEGER  :: N_in, N_out, iref 
     869      REAL(wp) :: h_diff 
     870      LOGICAL  :: western_side, eastern_side 
     871      !!---------------------------------------------     
     872      ! 
     873      zrhoy = Agrif_rhoy() 
     874      IF (before) THEN  
     875         !We can't use zero as the special value because we need to include zeros 
     876         !when interpolating the scale factors 
     877         IF(Agrif_UseSpecialValue) THEN  
     878!             Agrif_SpecialValue = -999._wp 
     879             Agrif_SpecialValue = 0._wp 
     880         ELSE 
     881             Agrif_SpecialValue = 0._wp 
     882         ENDIF 
     883         DO jk=1,jpk 
     884            DO jj=j1,j2 
     885               DO ji=i1,i2 
     886                  ptab(ji,jj,jk,1) = (e2u(ji,jj) * e3u_n(ji,jj,jk) * un(ji,jj,jk)*umask(ji,jj,jk)) - & 
     887                                   & ((umask(ji,jj,jk)-1) * Agrif_SpecialValue) 
     888# if defined key_vertical 
     889                  ptab(ji,jj,jk,2) = (umask(ji,jj,jk) * e2u(ji,jj) * e3u_n(ji,jj,jk)) 
     890# endif 
     891               END DO 
     892            END DO 
    812893         END DO 
    813894      ELSE 
    814          zrhoy = Agrif_Rhoy() 
     895         zrhoy = Agrif_rhoy() 
     896# if defined key_vertical 
     897! VERTICAL REFINEMENT BEGIN 
     898         western_side  = (nb == 1).AND.(ndir == 1) 
     899         eastern_side  = (nb == 1).AND.(ndir == 2) 
     900 
     901         Agrif_SpecialValue = 0._wp ! reset specialvalue to zero now interpolation completed 
     902 
     903         DO ji=i1,i2 
     904            iref = ji 
     905            IF (western_side) iref = MAX(2,ji) 
     906            IF (eastern_side) iref = MIN(nlci-2,ji) 
     907            DO jj=j1,j2 
     908               N_in = 0 
     909               DO jk=k1,k2 
     910                  IF (ptab(ji,jj,jk,2) == 0) EXIT 
     911                  N_in = N_in + 1 
     912                  tabin(jk) = ptab(ji,jj,jk,1)/ptab(ji,jj,jk,2) 
     913                  h_in(N_in) = ptab(ji,jj,jk,2)/(e2u(ji,jj)*zrhoy)  
     914              ENDDO 
     915          
     916              IF (N_in == 0) THEN 
     917                 ua(ji,jj,:) = 0._wp 
     918                 CYCLE 
     919              ENDIF 
     920          
     921              N_out = 0 
     922              DO jk=1,jpk 
     923                 if (umask(iref,jj,jk) == 0) EXIT 
     924                 N_out = N_out + 1 
     925                 h_out(N_out) = e3u_a(iref,jj,jk) 
     926              ENDDO 
     927          
     928              IF (N_out == 0) THEN 
     929                 ua(ji,jj,:) = 0._wp 
     930                 CYCLE 
     931              ENDIF 
     932          
     933              IF (N_in * N_out > 0) THEN 
     934                 h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     935! Should be able to remove the next IF/ELSEIF statement once scale factors are dealt with properly 
     936                 if (h_diff < -1.e4) then 
     937                    print *,'CHECK YOUR BATHY ...', h_diff, sum(h_out(1:N_out)), sum(h_in(1:N_in)) 
     938!                    stop 
     939                 endif 
     940              ENDIF 
     941              call reconstructandremap(tabin(1:N_in),h_in(1:N_in),ua(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out) 
     942            ENDDO 
     943         ENDDO 
     944 
     945# else 
    815946         DO jk = 1, jpkm1 
    816947            DO jj=j1,j2 
    817                ua(i1:i2,jj,jk) = ptab(i1:i2,jj,jk) / ( zrhoy * e2u(i1:i2,jj) * e3u_a(i1:i2,jj,jk) ) 
    818             END DO 
    819          END DO 
     948               ua(i1:i2,jj,jk) = ptab(i1:i2,jj,jk,1) / ( zrhoy * e2u(i1:i2,jj) * e3u_a(i1:i2,jj,jk) ) 
     949            END DO 
     950         END DO 
     951# endif 
     952 
    820953      ENDIF 
    821954      !  
    822955   END SUBROUTINE interpun 
    823956 
    824  
    825    SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, before ) 
     957   SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, m1, m2, before, nb, ndir ) 
    826958      !!---------------------------------------------------------------------- 
    827959      !!   *** ROUTINE interpvn *** 
    828960      !!---------------------------------------------------------------------- 
    829       INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
    830       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   ptab 
    831       LOGICAL                               , INTENT(in   ) ::   before 
    832       ! 
    833       INTEGER  ::   ji, jj, jk 
    834       REAL(wp) ::   zrhox   
    835       !!---------------------------------------------------------------------- 
     961      ! 
     962      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2 
     963      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: ptab 
     964      LOGICAL, INTENT(in) :: before 
     965      INTEGER, INTENT(in) :: nb , ndir 
     966      ! 
     967      INTEGER :: ji,jj,jk 
     968      REAL(wp) :: zrhox 
     969      ! vertical interpolation: 
     970      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
     971      REAL(wp), DIMENSION(1:jpk) :: h_out 
     972      INTEGER  :: N_in, N_out, jref 
     973      REAL(wp) :: h_diff 
     974      LOGICAL  :: northern_side,southern_side 
     975      !!---------------------------------------------     
    836976      !       
    837       IF( before ) THEN   
     977      IF (before) THEN           
     978         IF(Agrif_UseSpecialValue) THEN  
     979!             Agrif_SpecialValue = -999._wp 
     980             Agrif_SpecialValue = 0._wp 
     981         ELSE 
     982             Agrif_SpecialValue = 0._wp 
     983         ENDIF 
     984         DO jk=k1,k2 
     985            DO jj=j1,j2 
     986               DO ji=i1,i2 
     987                  ptab(ji,jj,jk,1) = (e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk)*vmask(ji,jj,jk)) - & 
     988                                   & ((vmask(ji,jj,jk)-1) * Agrif_SpecialValue) 
     989# if defined key_vertical 
     990                  ptab(ji,jj,jk,2) = vmask(ji,jj,jk) * e1v(ji,jj) * e3v_n(ji,jj,jk) 
     991# endif 
     992               END DO 
     993            END DO 
     994         END DO 
     995      ELSE        
     996         zrhox = Agrif_rhox() 
     997# if defined key_vertical 
     998         Agrif_SpecialValue = 0._wp !Reset special value to zero now interpolation is done 
     999 
     1000         southern_side = (nb == 2).AND.(ndir == 1) 
     1001         northern_side = (nb == 2).AND.(ndir == 2) 
     1002 
     1003         DO jj=j1,j2 
     1004            jref = jj 
     1005            IF (southern_side) jref = MAX(2,jj) 
     1006            IF (northern_side) jref = MIN(nlcj-2,jj) 
     1007            DO ji=i1,i2 
     1008               N_in = 0 
     1009               DO jk=k1,k2 
     1010                  if (ptab(ji,jj,jk,2) == 0) EXIT 
     1011                  N_in = N_in + 1 
     1012                  tabin(jk) = ptab(ji,jj,jk,1)/ptab(ji,jj,jk,2) 
     1013                  h_in(N_in) = ptab(ji,jj,jk,2)/(e1v(ji,jj)*zrhox) 
     1014               END DO 
     1015               IF (N_in == 0) THEN 
     1016                  va(ji,jj,:) = 0._wp 
     1017                  CYCLE 
     1018               ENDIF 
     1019          
     1020               N_out = 0 
     1021               DO jk=1,jpk 
     1022                  if (vmask(ji,jref,jk) == 0) EXIT 
     1023                  N_out = N_out + 1 
     1024                  h_out(N_out) = e3v_a(ji,jref,jk) 
     1025               END DO 
     1026               IF (N_out == 0) THEN 
     1027                 va(ji,jj,:) = 0._wp 
     1028                 CYCLE 
     1029               ENDIF 
     1030               call reconstructandremap(tabin(1:N_in),h_in(1:N_in),va(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out) 
     1031            END DO 
     1032         END DO 
     1033# else 
    8381034         DO jk = 1, jpkm1 
    839             ptab(i1:i2,j1:j2,jk) = e1v(i1:i2,j1:j2) * e3v_n(i1:i2,j1:j2,jk) * vn(i1:i2,j1:j2,jk) 
    840          END DO 
    841       ELSE           
    842          zrhox= Agrif_Rhox() 
    843          DO jk = 1, jpkm1 
    844             va(i1:i2,j1:j2,jk) = ptab(i1:i2,j1:j2,jk) / ( zrhox * e1v(i1:i2,j1:j2) * e3v_a(i1:i2,j1:j2,jk) ) 
    845          END DO 
     1035            va(i1:i2,j1:j2,jk) = ptab(i1:i2,j1:j2,jk,1) / ( zrhox * e1v(i1:i2,j1:j2) * e3v_a(i1:i2,j1:j2,jk) ) 
     1036         END DO 
     1037# endif 
    8461038      ENDIF 
    8471039      !         
    8481040   END SUBROUTINE interpvn 
    849     
    8501041 
    8511042   SUBROUTINE interpunb( ptab, i1, i2, j1, j2, before, nb, ndir ) 
  • branches/2017/dev_METO_MERCATOR_2017_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r8993 r8998  
    3939#if defined SPONGE 
    4040!!      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    41 !! Assume persistence: 
     41      !! Assume persistence: 
    4242      timecoeff = REAL(Agrif_rhot()-1,wp)/REAL(Agrif_rhot()) 
    4343 
     
    195195   END SUBROUTINE Agrif_Sponge 
    196196 
    197  
    198197   SUBROUTINE interptsn_sponge(tabres,i1,i2,j1,j2,k1,k2,n1,n2,before) 
    199198      !!--------------------------------------------- 
     
    207206      INTEGER  ::   iku, ikv 
    208207      REAL(wp) :: ztsa, zabe1, zabe2, zbtr 
    209       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ztu, ztv 
    210       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 
     208      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk) :: ztu, ztv 
     209      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk,n1:n2) ::tsbdiff 
     210      ! vertical interpolation: 
     211      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk,n1:n2) ::tabres_child 
     212      REAL(wp), DIMENSION(k1:k2,n1:n2-1) :: tabin 
     213      REAL(wp), DIMENSION(k1:k2) :: h_in 
     214      REAL(wp), DIMENSION(1:jpk) :: h_out 
     215      INTEGER :: N_in, N_out 
     216      REAL(wp) :: h_diff 
    211217      ! 
    212218      IF( before ) THEN 
    213          tabres(i1:i2,j1:j2,k1:k2,n1:n2) = tsb(i1:i2,j1:j2,k1:k2,n1:n2) 
     219         DO jn = 1, jpts 
     220            DO jk=k1,k2 
     221               DO jj=j1,j2 
     222                  DO ji=i1,i2 
     223                     tabres(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) 
     224                  END DO 
     225               END DO 
     226            END DO 
     227         END DO 
     228 
     229# if defined key_vertical 
     230         DO jk=k1,k2 
     231            DO jj=j1,j2 
     232               DO ji=i1,i2 
     233                  tabres(ji,jj,jk,jpts+1) = tmask(ji,jj,jk) * e3t_n(ji,jj,jk)  
     234               END DO 
     235            END DO 
     236         END DO 
     237# endif 
     238 
    214239      ELSE    
    215240         ! 
    216          tsbdiff(:,:,:,:) = tsb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)     
     241# if defined key_vertical 
     242         tabres_child(:,:,:,:) = 0. 
     243         DO jj=j1,j2 
     244            DO ji=i1,i2 
     245               N_in = 0 
     246               DO jk=k1,k2 !k2 = jpk of parent grid 
     247                  IF (tabres(ji,jj,jk,n2) == 0) EXIT 
     248                  N_in = N_in + 1 
     249                  tabin(jk,:) = tabres(ji,jj,jk,n1:n2-1) 
     250                  h_in(N_in) = tabres(ji,jj,jk,n2) 
     251               END DO 
     252               N_out = 0 
     253               DO jk=1,jpk ! jpk of child grid 
     254                  IF (tmask(ji,jj,jk) == 0) EXIT  
     255                  N_out = N_out + 1 
     256                  h_out(jk) = e3t_n(ji,jj,jk) !Child grid scale factors. Could multiply by e1e2t here instead of division above 
     257               ENDDO 
     258               IF (N_in > 0) THEN 
     259                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     260                  tabres(ji,jj,k2,:) = tabres(ji,jj,k2-1,:) !what is this line for????? 
     261                  DO jn=1,jpts 
     262                     call reconstructandremap(tabin(1:N_in,jn),h_in,tabres_child(ji,jj,1:N_out,jn),h_out,N_in,N_out) 
     263                  ENDDO 
     264               ENDIF 
     265            ENDDO 
     266         ENDDO 
     267# endif 
     268 
     269         DO jj=j1,j2 
     270            DO ji=i1,i2 
     271               DO jk=1,jpkm1 
     272# if defined key_vertical 
     273                  tsbdiff(ji,jj,jk,1:jpts) = tsb(ji,jj,jk,1:jpts) - tabres_child(ji,jj,jk,1:jpts) 
     274# else 
     275                  tsbdiff(ji,jj,jk,1:jpts) = tsb(ji,jj,jk,1:jpts) - tabres(ji,jj,jk,1:jpts) 
     276# endif 
     277               ENDDO 
     278            ENDDO 
     279         ENDDO 
     280 
    217281         DO jn = 1, jpts             
    218282            DO jk = 1, jpkm1 
     
    261325   END SUBROUTINE interptsn_sponge 
    262326 
    263  
    264    SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2, before) 
     327   SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2,m1,m2, before) 
    265328      !!--------------------------------------------- 
    266329      !!   *** ROUTINE interpun_sponge *** 
    267330      !!---------------------------------------------     
    268       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    269       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     331      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2 
     332      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: tabres 
    270333      LOGICAL, INTENT(in) :: before 
    271334 
    272       INTEGER :: ji,jj,jk 
     335      INTEGER :: ji,jj,jk,jmax 
    273336 
    274337      ! sponge parameters  
    275       REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
    276       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ubdiff 
    277       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    278       INTEGER :: jmax 
     338      REAL(wp) :: ze2u, ze1v, zua, zva, zbtr, h_diff 
     339      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: ubdiff 
     340      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: rotdiff, hdivdiff 
     341      ! vertical interpolation: 
     342      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     343      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
     344      REAL(wp), DIMENSION(1:jpk) :: h_out 
     345      INTEGER ::N_in,N_out 
    279346      !!---------------------------------------------     
    280347      ! 
    281348      IF( before ) THEN 
    282          tabres = ub(i1:i2,j1:j2,:) 
     349         DO jk=1,jpkm1 
     350            DO jj=j1,j2 
     351               DO ji=i1,i2 
     352                  tabres(ji,jj,jk,m1) = ub(ji,jj,jk) 
     353# if defined key_vertical 
     354                  tabres(ji,jj,jk,m2) = e3u_n(ji,jj,jk)*umask(ji,jj,jk) 
     355# endif 
     356               END DO 
     357            END DO 
     358         END DO 
     359 
    283360      ELSE 
    284          ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(:,:,:))*umask(i1:i2,j1:j2,:) 
     361 
     362# if defined key_vertical 
     363         tabres_child(:,:,:) = 0._wp 
     364         DO jj=j1,j2 
     365            DO ji=i1,i2 
     366               N_in = 0 
     367               DO jk=k1,k2 
     368                  IF (tabres(ji,jj,jk,m2) == 0) EXIT 
     369                  N_in = N_in + 1 
     370                  tabin(jk) = tabres(ji,jj,jk,m1) 
     371                  h_in(N_in) = tabres(ji,jj,jk,m2) 
     372              ENDDO 
     373              ! 
     374              IF (N_in == 0) THEN 
     375                 tabres_child(ji,jj,:) = 0. 
     376                 CYCLE 
     377              ENDIF 
     378          
     379              N_out = 0 
     380              DO jk=1,jpk 
     381                 if (umask(ji,jj,jk) == 0) EXIT 
     382                 N_out = N_out + 1 
     383                 h_out(N_out) = e3u_n(ji,jj,jk) 
     384              ENDDO 
     385          
     386              IF (N_out == 0) THEN 
     387                 tabres_child(ji,jj,:) = 0. 
     388                 CYCLE 
     389              ENDIF 
     390          
     391              IF (N_in * N_out > 0) THEN 
     392                 h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     393                 if (h_diff < -1.e4) then 
     394                    print *,'CHECK YOUR BATHY ...', h_diff, sum(h_out(1:N_out)), sum(h_in(1:N_in)) 
     395                 endif 
     396              ENDIF 
     397              call reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out) 
     398          
     399            ENDDO 
     400         ENDDO 
     401 
     402         ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres_child(i1:i2,j1:j2,:))*umask(i1:i2,j1:j2,:) 
     403#else 
     404         ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(i1:i2,j1:j2,:,1))*umask(i1:i2,j1:j2,:) 
     405#endif 
    285406         ! 
    286407         DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    359480   END SUBROUTINE interpun_sponge 
    360481 
    361  
    362    SUBROUTINE interpvn_sponge(tabres,i1,i2,j1,j2,k1,k2, before,nb,ndir) 
     482   SUBROUTINE interpvn_sponge(tabres,i1,i2,j1,j2,k1,k2,m1,m2, before,nb,ndir) 
    363483      !!--------------------------------------------- 
    364484      !!   *** ROUTINE interpvn_sponge *** 
    365485      !!---------------------------------------------  
    366       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    367       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     486      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2 
     487      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: tabres 
    368488      LOGICAL, INTENT(in) :: before 
    369489      INTEGER, INTENT(in) :: nb , ndir 
    370490      ! 
    371       INTEGER  ::   ji, jj, jk 
    372       REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr 
    373       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: vbdiff 
    374       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    375       INTEGER :: imax 
     491      INTEGER  ::   ji, jj, jk, imax 
     492      REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr, h_diff 
     493      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: vbdiff 
     494      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: rotdiff, hdivdiff 
     495      ! vertical interpolation: 
     496      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     497      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
     498      REAL(wp), DIMENSION(1:jpk) :: h_out 
     499      INTEGER :: N_in, N_out 
    376500      !!---------------------------------------------  
    377  
     501       
    378502      IF( before ) THEN  
    379          tabres = vb(i1:i2,j1:j2,:) 
     503         DO jk=1,jpkm1 
     504            DO jj=j1,j2 
     505               DO ji=i1,i2 
     506                  tabres(ji,jj,jk,m1) = vb(ji,jj,jk) 
     507# if defined key_vertical 
     508                  tabres(ji,jj,jk,m2) = vmask(ji,jj,jk) * e3v_n(ji,jj,jk) 
     509# endif 
     510               END DO 
     511            END DO 
     512         END DO 
    380513      ELSE 
    381          ! 
    382          vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(:,:,:))*vmask(i1:i2,j1:j2,:) 
     514 
     515# if defined key_vertical 
     516         tabres_child(:,:,:) = 0._wp 
     517         DO jj=j1,j2 
     518            DO ji=i1,i2 
     519               N_in = 0 
     520               DO jk=k1,k2 
     521                  IF (tabres(ji,jj,jk,m2) == 0) EXIT 
     522                  N_in = N_in + 1 
     523                  tabin(jk) = tabres(ji,jj,jk,m1) 
     524                  h_in(N_in) = tabres(ji,jj,jk,m2) 
     525              ENDDO 
     526          
     527              IF (N_in == 0) THEN 
     528                 tabres_child(ji,jj,:) = 0. 
     529                 CYCLE 
     530              ENDIF 
     531          
     532              N_out = 0 
     533              DO jk=1,jpk 
     534                 if (vmask(ji,jj,jk) == 0) EXIT 
     535                 N_out = N_out + 1 
     536                 h_out(N_out) = e3v_n(ji,jj,jk) 
     537              ENDDO 
     538          
     539              IF (N_in * N_out > 0) THEN 
     540                 h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     541                 if (h_diff < -1.e4) then 
     542                    print *,'CHECK YOUR BATHY ...', h_diff, sum(h_out(1:N_out)), sum(h_in(1:N_in)) 
     543                 endif 
     544              ENDIF 
     545              call reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out) 
     546            ENDDO 
     547         ENDDO 
     548 
     549         vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres_child(i1:i2,j1:j2,:))*vmask(i1:i2,j1:j2,:)   
     550# else 
     551         vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(i1:i2,j1:j2,:,1))*vmask(i1:i2,j1:j2,:) 
     552# endif 
    383553         ! 
    384554         DO jk = 1, jpkm1                                 ! Horizontal slab 
  • branches/2017/dev_METO_MERCATOR_2017_agrif/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90

    r8993 r8998  
    11#define TWO_WAY        /* TWO WAY NESTING */ 
    2 #undef DECAL_FEEDBACK /* SEPARATION of INTERFACES*/ 
     2#define DECAL_FEEDBACK /* SEPARATION of INTERFACES*/ 
    33#undef VOL_REFLUX      /* VOLUME REFLUXING*/ 
    44  
     
    9797      ! Account for updated thicknesses at boundary edges 
    9898      IF (.NOT.ln_linssh) THEN 
    99 ! For the time being calls below do not ensure reproducible results  
    10099!         CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,0/),locupdate2=(/0,0/),procname = correct_u_bdy) 
    101100!         CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/0,0/),locupdate2=(/0,0/),procname = correct_v_bdy) 
     
    283282   END SUBROUTINE dom_vvl_update_UVF 
    284283 
     284#if defined key_vertical 
     285 
     286   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     287      !!--------------------------------------------- 
     288      !!           *** ROUTINE updateT *** 
     289      !!--------------------------------------------- 
     290      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
     291      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     292      LOGICAL, INTENT(in) :: before 
     293      !! 
     294      INTEGER :: ji,jj,jk,jn 
     295      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk,n1:n2) :: tabres_child 
     296      REAL(wp) :: h_in(k1:k2) 
     297      REAL(wp) :: h_out(1:jpk) 
     298      INTEGER  :: N_in, N_out 
     299      REAL(wp) :: h_diff 
     300      REAL(wp) :: zrho_xy 
     301      REAL(wp) :: tabin(k1:k2,n1:n2) 
     302      !!--------------------------------------------- 
     303      ! 
     304      IF (before) THEN 
     305         AGRIF_SpecialValue = -999._wp 
     306         zrho_xy = Agrif_rhox() * Agrif_rhoy()  
     307         DO jn = n1,n2-1 
     308            DO jk=k1,k2 
     309               DO jj=j1,j2 
     310                  DO ji=i1,i2 
     311                     tabres(ji,jj,jk,jn) = (tsn(ji,jj,jk,jn) * e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) & 
     312                                           * tmask(ji,jj,jk) * zrho_xy + (tmask(ji,jj,jk)-1)*999._wp 
     313                  END DO 
     314               END DO 
     315            END DO 
     316         END DO 
     317         DO jk=k1,k2 
     318            DO jj=j1,j2 
     319               DO ji=i1,i2 
     320                  tabres(ji,jj,jk,n2) = tmask(ji,jj,jk) * e1e2t(ji,jj) * e3t_n(ji,jj,jk) * zrho_xy  & 
     321                                           + (tmask(ji,jj,jk)-1)*999._wp 
     322               END DO 
     323            END DO 
     324         END DO 
     325      ELSE 
     326         tabres_child(:,:,:,:) = 0. 
     327         AGRIF_SpecialValue = 0._wp 
     328         DO jj=j1,j2 
     329            DO ji=i1,i2 
     330               N_in = 0 
     331               DO jk=k1,k2 !k2 = jpk of child grid 
     332                  IF (tabres(ji,jj,jk,n2) == 0  ) EXIT 
     333                  N_in = N_in + 1 
     334                  tabin(jk,:) = tabres(ji,jj,jk,n1:n2-1)/tabres(ji,jj,jk,n2) 
     335                  h_in(N_in) = tabres(ji,jj,jk,n2)/e1e2t(ji,jj) 
     336               ENDDO 
     337               N_out = 0 
     338               DO jk=1,jpk ! jpk of parent grid 
     339                  IF (tmask(ji,jj,jk) < -900) EXIT ! TODO: Will not work with ISF 
     340                  N_out = N_out + 1 
     341                  h_out(N_out) = e3t_n(ji,jj,jk) !Parent grid scale factors. Could multiply by e1e2t here instead of division above 
     342               ENDDO 
     343               IF (N_in > 0) THEN !Remove this? 
     344                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     345                  IF (h_diff < -1.e-4) THEN 
     346                     print *,'CHECK YOUR bathy T points ...',ji,jj,h_diff,sum(h_in(1:N_in)),sum(h_out(1:N_out)) 
     347                     print *,h_in(1:N_in) 
     348                     print *,h_out(1:N_out) 
     349                     STOP 
     350                  ENDIF 
     351                  DO jn=n1,n2-1 
     352                     CALL reconstructandremap(tabin(1:N_in,jn),h_in(1:N_in),tabres_child(ji,jj,1:N_out,jn),h_out(1:N_out),N_in,N_out) 
     353                  ENDDO 
     354               ENDIF 
     355            ENDDO 
     356         ENDDO 
     357 
     358         IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 
     359            ! Add asselin part 
     360            DO jn = n1,n2-1 
     361               DO jk=1,jpk 
     362                  DO jj=j1,j2 
     363                     DO ji=i1,i2 
     364                        IF( tabres_child(ji,jj,jk,jn) .NE. 0. ) THEN 
     365                           tsb(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) &  
     366                                 & + atfp * ( tabres_child(ji,jj,jk,jn) & 
     367                                 &          - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
     368                        ENDIF 
     369                     ENDDO 
     370                  ENDDO 
     371               ENDDO 
     372            ENDDO 
     373         ENDIF 
     374         DO jn = n1,n2-1 
     375            DO jk=1,jpk 
     376               DO jj=j1,j2 
     377                  DO ji=i1,i2 
     378                     IF( tabres_child(ji,jj,jk,jn) .NE. 0. ) THEN  
     379                        tsn(ji,jj,jk,jn) = tabres_child(ji,jj,jk,jn) * tmask(ji,jj,jk) 
     380                     END IF 
     381                  END DO 
     382               END DO 
     383            END DO 
     384         END DO 
     385      ENDIF 
     386      !  
     387   END SUBROUTINE updateTS 
     388 
     389# else 
     390 
    285391   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    286392      !!--------------------------------------------- 
     
    296402      ! 
    297403      IF (before) THEN 
    298          DO jn = n1,n2 
     404         DO jn = 1,jpts 
    299405            DO jk=k1,k2 
    300406               DO jj=j1,j2 
     
    310416      ELSE 
    311417!> jc tmp 
    312          DO jn = n1,n2 
     418         DO jn = 1,jpts 
    313419            tabres(i1:i2,j1:j2,k1:k2,jn) =  tabres(i1:i2,j1:j2,k1:k2,jn) * e3t_0(i1:i2,j1:j2,k1:k2) & 
    314420                                         & * tmask(i1:i2,j1:j2,k1:k2) 
     
    317423         IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 
    318424            ! Add asselin part 
    319             DO jn = n1,n2 
     425            DO jn = 1,jpts 
    320426               DO jk=k1,k2 
    321427                  DO jj=j1,j2 
     
    333439            ENDDO 
    334440         ENDIF 
    335          DO jn = n1,n2 
     441         DO jn = 1,jpts 
    336442            DO jk=k1,k2 
    337443               DO jj=j1,j2 
     
    346452         ! 
    347453         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN 
    348             tsb(i1:i2,j1:j2,k1:k2,n1:n2)  = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
     454            tsb(i1:i2,j1:j2,k1:k2,1:jpts)  = tsn(i1:i2,j1:j2,k1:k2,1:jpts) 
    349455         ENDIF 
    350456         ! 
     
    353459   END SUBROUTINE updateTS 
    354460 
    355  
    356    SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, before ) 
     461# endif 
     462 
     463# if defined key_vertical 
     464 
     465   SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    357466      !!--------------------------------------------- 
    358467      !!           *** ROUTINE updateu *** 
    359468      !!--------------------------------------------- 
    360       INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
    361       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    362       LOGICAL                               , INTENT(in   ) :: before 
     469      INTEGER                                     , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
     470      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     471      LOGICAL                                     , INTENT(in   ) :: before 
     472      ! 
     473      INTEGER  ::   ji, jj, jk 
     474      REAL(wp) ::   zrhoy 
     475! VERTICAL REFINEMENT BEGIN 
     476      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     477      REAL(wp) :: h_in(k1:k2) 
     478      REAL(wp) :: h_out(1:jpk) 
     479      INTEGER  :: N_in, N_out 
     480      REAL(wp) :: h_diff, excess, thick 
     481      REAL(wp) :: tabin(k1:k2) 
     482! VERTICAL REFINEMENT END 
     483      !!--------------------------------------------- 
     484      !  
     485      IF( before ) THEN 
     486         zrhoy = Agrif_Rhoy() 
     487         AGRIF_SpecialValue = -999._wp 
     488         DO jk=k1,k2 
     489            DO jj=j1,j2 
     490               DO ji=i1,i2 
     491                  tabres(ji,jj,jk,1) = zrhoy * e2u(ji,jj) * e3u_n(ji,jj,jk) * umask(ji,jj,jk) * un(ji,jj,jk)  & 
     492                                       + (umask(ji,jj,jk)-1)*999._wp 
     493                  tabres(ji,jj,jk,2) = zrhoy * umask(ji,jj,jk) * e2u(ji,jj) * e3u_n(ji,jj,jk)  & 
     494                                       + (umask(ji,jj,jk)-1)*999._wp 
     495               END DO 
     496            END DO 
     497         END DO 
     498      ELSE 
     499         tabres_child(:,:,:) = 0. 
     500         AGRIF_SpecialValue = 0._wp 
     501         DO jj=j1,j2 
     502            DO ji=i1,i2 
     503               N_in = 0 
     504               h_in(:) = 0._wp 
     505               tabin(:) = 0._wp 
     506               DO jk=k1,k2 !k2=jpk of child grid 
     507                  IF( tabres(ji,jj,jk,2) < -900) EXIT 
     508                  N_in = N_in + 1 
     509                  tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
     510                  h_in(N_in) = tabres(ji,jj,jk,2)/e2u(ji,jj) 
     511               ENDDO 
     512               N_out = 0 
     513               DO jk=1,jpk 
     514                  IF (umask(ji,jj,jk) == 0) EXIT 
     515                  N_out = N_out + 1 
     516                  h_out(N_out) = e3u_n(ji,jj,jk) 
     517               ENDDO 
     518               IF (N_in * N_out > 0) THEN 
     519                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     520                  IF (h_diff < -1.e-4) THEN 
     521!Even if bathy at T points match it's possible for the U points to be deeper in the child grid.  
     522!In this case we need to move transport from the child grid cells below bed of parent grid into the bottom cell. 
     523                     excess = 0._wp 
     524                     DO jk=N_in,1,-1 
     525                        thick = MIN(-1*h_diff, h_in(jk)) 
     526                        excess = excess + tabin(jk)*thick*e2u(ji,jj) 
     527                        tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
     528                        h_diff = h_diff + thick 
     529                        IF ( h_diff == 0) THEN 
     530                           N_in = jk 
     531                           h_in(jk) = h_in(jk) - thick 
     532                           EXIT 
     533                        ENDIF 
     534                     ENDDO 
     535                  ENDIF 
     536                  CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out) 
     537                  tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e2u(ji,jj)*h_out(N_out)) 
     538               ENDIF 
     539            ENDDO 
     540         ENDDO 
     541 
     542         DO jk=1,jpk 
     543            DO jj=j1,j2 
     544               DO ji=i1,i2 
     545                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
     546                     ub(ji,jj,jk) = ub(ji,jj,jk) &  
     547                           & + atfp * ( tabres_child(ji,jj,jk) - un(ji,jj,jk) ) * umask(ji,jj,jk) 
     548                  ENDIF 
     549                  ! 
     550                  un(ji,jj,jk) = tabres_child(ji,jj,jk) * umask(ji,jj,jk) 
     551               END DO 
     552            END DO 
     553         END DO 
     554      ENDIF 
     555      !  
     556   END SUBROUTINE updateu 
     557 
     558#else 
     559 
     560   SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     561      !!--------------------------------------------- 
     562      !!           *** ROUTINE updateu *** 
     563      !!--------------------------------------------- 
     564      INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
     565      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     566      LOGICAL                                     , INTENT(in   ) :: before 
    363567      ! 
    364568      INTEGER  :: ji, jj, jk 
     
    369573         zrhoy = Agrif_Rhoy() 
    370574         DO jk = k1, k2 
    371             tabres(i1:i2,j1:j2,jk) = zrhoy * e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk) 
     575            tabres(i1:i2,j1:j2,jk,1) = zrhoy * e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk) 
    372576         END DO 
    373577      ELSE 
     
    375579            DO jj=j1,j2 
    376580               DO ji=i1,i2 
    377                   tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e2u(ji,jj)  
     581                  tabres(ji,jj,jk,1) = tabres(ji,jj,jk,1) * r1_e2u(ji,jj)  
    378582                  ! 
    379583                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
    380584                     zub  = ub(ji,jj,jk) * e3u_b(ji,jj,jk)  ! fse3t_b prior update should be used 
    381585                     zuno = un(ji,jj,jk) * e3u_a(ji,jj,jk) 
    382                      zunu = tabres(ji,jj,jk) 
     586                     zunu = tabres(ji,jj,jk,1) 
    383587                     ub(ji,jj,jk) = ( zub + atfp * ( zunu - zuno) ) &       
    384588                                    & * umask(ji,jj,jk) / e3u_b(ji,jj,jk) 
    385589                  ENDIF 
    386590                  ! 
    387                   un(ji,jj,jk) = tabres(ji,jj,jk) * umask(ji,jj,jk) / e3u_n(ji,jj,jk) 
     591                  un(ji,jj,jk) = tabres(ji,jj,jk,1) * umask(ji,jj,jk) / e3u_n(ji,jj,jk) 
    388592               END DO 
    389593            END DO 
     
    398602   END SUBROUTINE updateu 
    399603 
    400    SUBROUTINE correct_u_bdy( tabres, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     604# endif 
     605 
     606   SUBROUTINE correct_u_bdy( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
    401607      !!--------------------------------------------- 
    402608      !!           *** ROUTINE correct_u_bdy *** 
    403609      !!--------------------------------------------- 
    404       INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
    405       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    406       LOGICAL                               , INTENT(in   ) :: before 
    407       INTEGER                               , INTENT(in)    :: nb, ndir 
     610      INTEGER                                     , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
     611      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     612      LOGICAL                                     , INTENT(in   ) :: before 
     613      INTEGER                                     , INTENT(in)    :: nb, ndir 
    408614      !! 
    409615      LOGICAL :: western_side, eastern_side  
     
    442648   END SUBROUTINE correct_u_bdy 
    443649 
    444  
    445    SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before) 
     650# if  defined key_vertical 
     651 
     652   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    446653      !!--------------------------------------------- 
    447654      !!           *** ROUTINE updatev *** 
    448655      !!--------------------------------------------- 
    449       INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
    450       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    451       LOGICAL                               , INTENT(in   ) :: before 
     656      INTEGER                                     , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
     657      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     658      LOGICAL                                     , INTENT(in   ) :: before 
     659      ! 
     660      INTEGER  ::   ji, jj, jk 
     661      REAL(wp) ::   zrhox 
     662! VERTICAL REFINEMENT BEGIN 
     663      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     664      REAL(wp) :: h_in(k1:k2) 
     665      REAL(wp) :: h_out(1:jpk) 
     666      INTEGER :: N_in, N_out 
     667      REAL(wp) :: h_diff, excess, thick 
     668      REAL(wp) :: tabin(k1:k2) 
     669! VERTICAL REFINEMENT END 
     670      !!---------------------------------------------       
     671      ! 
     672      IF (before) THEN 
     673         zrhox = Agrif_Rhox() 
     674         AGRIF_SpecialValue = -999._wp 
     675         DO jk=k1,k2 
     676            DO jj=j1,j2 
     677               DO ji=i1,i2 
     678                  tabres(ji,jj,jk,1) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vmask(ji,jj,jk) * vn(ji,jj,jk) & 
     679                                       + (vmask(ji,jj,jk)-1)*999._wp 
     680                  tabres(ji,jj,jk,2) = vmask(ji,jj,jk) * zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) & 
     681                                       + (vmask(ji,jj,jk)-1)*999._wp 
     682               END DO 
     683            END DO 
     684         END DO 
     685      ELSE 
     686         tabres_child(:,:,:) = 0. 
     687         AGRIF_SpecialValue = 0._wp 
     688         DO jj=j1,j2 
     689            DO ji=i1,i2 
     690               N_in = 0 
     691               DO jk=k1,k2 
     692                  IF (tabres(ji,jj,jk,2) < -900) EXIT 
     693                  N_in = N_in + 1 
     694                  tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
     695                  h_in(N_in) = tabres(ji,jj,jk,2)/e1v(ji,jj) 
     696               ENDDO 
     697               N_out = 0 
     698               DO jk=1,jpk 
     699                  IF (vmask(ji,jj,jk) == 0) EXIT 
     700                  N_out = N_out + 1 
     701                  h_out(N_out) = e3v_n(ji,jj,jk) 
     702               ENDDO 
     703               IF (N_in * N_out > 0) THEN 
     704                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     705                  IF (h_diff < -1.e-4) then 
     706!Even if bathy at T points match it's possible for the U points to be deeper in the child grid.  
     707!In this case we need to move transport from the child grid cells below bed of parent grid into the bottom cell. 
     708                     excess = 0._wp 
     709                     DO jk=N_in,1,-1 
     710                        thick = MIN(-1*h_diff, h_in(jk)) 
     711                        excess = excess + tabin(jk)*thick*e2u(ji,jj) 
     712                        tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
     713                        h_diff = h_diff + thick 
     714                        IF ( h_diff == 0) THEN 
     715                           N_in = jk 
     716                           h_in(jk) = h_in(jk) - thick 
     717                           EXIT 
     718                        ENDIF 
     719                     ENDDO 
     720                  ENDIF 
     721                  CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out) 
     722                  tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e1v(ji,jj)*h_out(N_out)) 
     723               ENDIF 
     724            ENDDO 
     725         ENDDO 
     726 
     727         DO jk=1,jpk 
     728            DO jj=j1,j2 
     729               DO ji=i1,i2 
     730                  ! 
     731                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
     732                     vb(ji,jj,jk) = vb(ji,jj,jk) &  
     733                           & + atfp * ( tabres_child(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk) 
     734                  ENDIF 
     735                  ! 
     736                  vn(ji,jj,jk) = tabres_child(ji,jj,jk) * vmask(ji,jj,jk) 
     737               END DO 
     738            END DO 
     739         END DO 
     740      ENDIF 
     741      !  
     742   END SUBROUTINE updatev 
     743 
     744# else 
     745 
     746   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before) 
     747      !!--------------------------------------------- 
     748      !!           *** ROUTINE updatev *** 
     749      !!--------------------------------------------- 
     750      INTEGER                                     , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
     751      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     752      LOGICAL                                     , INTENT(in   ) :: before 
    452753      ! 
    453754      INTEGER  :: ji, jj, jk 
     
    460761            DO jj=j1,j2 
    461762               DO ji=i1,i2 
    462                   tabres(ji,jj,jk) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk) 
     763                  tabres(ji,jj,jk,1) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk) 
    463764               END DO 
    464765            END DO 
     
    468769            DO jj=j1,j2 
    469770               DO ji=i1,i2 
    470                   tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e1v(ji,jj) 
     771                  tabres(ji,jj,jk,1) = tabres(ji,jj,jk,1) * r1_e1v(ji,jj) 
    471772                  ! 
    472773                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
    473774                     zvb  = vb(ji,jj,jk) * e3v_b(ji,jj,jk) ! fse3t_b prior update should be used 
    474775                     zvno = vn(ji,jj,jk) * e3v_a(ji,jj,jk) 
    475                      zvnu = tabres(ji,jj,jk) 
     776                     zvnu = tabres(ji,jj,jk,1) 
    476777                     vb(ji,jj,jk) = ( zvb + atfp * ( zvnu - zvno) ) &       
    477778                                    & * vmask(ji,jj,jk) / e3v_b(ji,jj,jk) 
    478779                  ENDIF 
    479780                  ! 
    480                   vn(ji,jj,jk) = tabres(ji,jj,jk) * vmask(ji,jj,jk) / e3v_n(ji,jj,jk) 
     781                  vn(ji,jj,jk) = tabres(ji,jj,jk,1) * vmask(ji,jj,jk) / e3v_n(ji,jj,jk) 
    481782               END DO 
    482783            END DO 
     
    491792   END SUBROUTINE updatev 
    492793 
    493    SUBROUTINE correct_v_bdy( tabres, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
     794# endif 
     795 
     796   SUBROUTINE correct_v_bdy( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
    494797      !!--------------------------------------------- 
    495798      !!           *** ROUTINE correct_u_bdy *** 
    496799      !!--------------------------------------------- 
    497       INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2 
    498       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    499       LOGICAL                               , INTENT(in   ) :: before 
    500       INTEGER                               , INTENT(in)    :: nb, ndir 
     800      INTEGER                                     , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
     801      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     802      LOGICAL                                     , INTENT(in   ) :: before 
     803      INTEGER                                     , INTENT(in)    :: nb, ndir 
    501804      !! 
    502805      LOGICAL :: southern_side, northern_side  
  • branches/2017/dev_METO_MERCATOR_2017_agrif/NEMOGCM/NEMO/NST_SRC/agrif_user.F90

    r8993 r8998  
    1 #undef UPD_HIGH   /* MIX HIGH UPDATE */ 
     1#define UPD_HIGH   /* MIX HIGH UPDATE */ 
    22#if defined key_agrif 
    33!!---------------------------------------------------------------------- 
     
    330330   IF (Agrif_Root()) RETURN 
    331331   ! 
    332                        CALL Agrif_Update_ssh() 
    333332   IF (.NOT.ln_linssh) CALL Agrif_Update_vvl() 
    334                        CALL Agrif_Update_tra() 
     333   CALL Agrif_Update_tra() 
    335334#if defined key_top 
    336                        CALL Agrif_Update_Trc() 
     335   CALL Agrif_Update_Trc() 
    337336#endif 
    338                        CALL Agrif_Update_dyn() 
     337   CALL Agrif_Update_dyn() 
    339338# if defined key_zdftke 
    340339! JC remove update because this precludes from perfect restartability 
    341 !!                       CALL Agrif_Update_tke(0) 
     340!!   CALL Agrif_Update_tke(0) 
    342341# endif 
    343342 
     
    364363   ! 1. Declaration of the type of variable which have to be interpolated 
    365364   !--------------------------------------------------------------------- 
     365# if defined key_vertical 
     366   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts+1/),tsn_id) 
     367   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts+1/),tsn_sponge_id) 
     368 
     369   CALL agrif_declare_variable((/1,2,0,0/),(/2,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),un_interp_id) 
     370   CALL agrif_declare_variable((/2,1,0,0/),(/3,2,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),vn_interp_id) 
     371   CALL agrif_declare_variable((/1,2,0,0/),(/2,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),un_update_id) 
     372   CALL agrif_declare_variable((/2,1,0,0/),(/3,2,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),vn_update_id) 
     373   CALL agrif_declare_variable((/1,2,0,0/),(/2,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),un_sponge_id) 
     374   CALL agrif_declare_variable((/2,1,0,0/),(/3,2,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,2/),vn_sponge_id) 
     375# else 
    366376   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_id) 
    367377   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jpts/),tsn_sponge_id) 
    368378 
    369    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_interp_id) 
    370    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_interp_id) 
    371    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_update_id) 
    372    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_update_id) 
    373    CALL agrif_declare_variable((/1,2,0/),(/2,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),un_sponge_id) 
    374    CALL agrif_declare_variable((/2,1,0/),(/3,2,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),vn_sponge_id) 
     379   CALL agrif_declare_variable((/1,2,0,0/),(/2,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),un_interp_id) 
     380   CALL agrif_declare_variable((/2,1,0,0/),(/3,2,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),vn_interp_id) 
     381   CALL agrif_declare_variable((/1,2,0,0/),(/2,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),un_update_id) 
     382   CALL agrif_declare_variable((/2,1,0,0/),(/3,2,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),vn_update_id) 
     383   CALL agrif_declare_variable((/1,2,0,0/),(/2,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),un_sponge_id) 
     384   CALL agrif_declare_variable((/2,1,0,0/),(/3,2,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,1/),vn_sponge_id) 
     385# endif 
    375386 
    376387   CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),e3t_id) 
     
    392403   CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/), en_id) 
    393404   CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),avt_id) 
     405# if defined key_vertical 
     406   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/jpi,jpj,jpk,2/),avm_id) 
     407# else 
    394408   CALL agrif_declare_variable((/2,2,0/),(/3,3,0/),(/'x','y','N'/),(/1,1,1/),(/nlci,nlcj,jpk/),avm_id) 
     409# endif 
    395410# endif 
    396411 
     
    777792   ! 1. Declaration of the type of variable which have to be interpolated 
    778793   !--------------------------------------------------------------------- 
     794# if defined key_vertical 
     795   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra+1/),trn_id) 
     796   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra+1/),trn_sponge_id) 
     797# else 
    779798   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_id) 
    780799   CALL agrif_declare_variable((/2,2,0,0/),(/3,3,0,0/),(/'x','y','N','N'/),(/1,1,1,1/),(/nlci,nlcj,jpk,jptra/),trn_sponge_id) 
     800# endif 
    781801 
    782802   ! 2. Type of interpolation 
Note: See TracChangeset for help on using the changeset viewer.