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 9031 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90 – NEMO

Ignore:
Timestamp:
2017-12-14T11:10:02+01:00 (6 years ago)
Author:
timgraham
Message:

Resolved AGRIF conflicts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_merge_2017/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90

    r9019 r9031  
    4444      ! 
    4545#if defined SPONGE 
    46       zcoef = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
    47       ! 
     46      !! Assume persistence: 
     47      timecoeff = REAL(Agrif_rhot()-1,wp)/REAL(Agrif_rhot()) 
     48 
    4849      CALL Agrif_Sponge 
    4950      Agrif_SpecialValue    = 0._wp 
     
    6768      ! 
    6869#if defined SPONGE 
    69       zcoef = REAL( Agrif_NbStepint(), wp ) / Agrif_rhot() 
    70       ! 
    71       Agrif_SpecialValue    = 0._wp 
     70      timecoeff = REAL(Agrif_rhot()-1,wp)/REAL(Agrif_rhot()) 
     71 
     72      Agrif_SpecialValue=0. 
    7273      Agrif_UseSpecialValue = ln_spc_dyn 
    7374      ! 
     
    189190   END SUBROUTINE Agrif_Sponge 
    190191 
    191  
    192192   SUBROUTINE interptsn_sponge( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    193193      !!---------------------------------------------------------------------- 
     
    201201      INTEGER  ::   iku, ikv 
    202202      REAL(wp) :: ztsa, zabe1, zabe2, zbtr 
    203       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ztu, ztv 
    204       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2) ::tsbdiff 
     203      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk) :: ztu, ztv 
     204      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk,n1:n2) ::tsbdiff 
     205      ! vertical interpolation: 
     206      REAL(wp), DIMENSION(i1:i2,j1:j2,jpk,n1:n2) ::tabres_child 
     207      REAL(wp), DIMENSION(k1:k2,n1:n2-1) :: tabin 
     208      REAL(wp), DIMENSION(k1:k2) :: h_in 
     209      REAL(wp), DIMENSION(1:jpk) :: h_out 
     210      INTEGER :: N_in, N_out 
     211      REAL(wp) :: h_diff 
    205212      !!---------------------------------------------------------------------- 
    206213      ! 
    207214      IF( before ) THEN 
    208          tabres(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
     215         DO jn = 1, jpts 
     216            DO jk=k1,k2 
     217               DO jj=j1,j2 
     218                  DO ji=i1,i2 
     219                     tabres(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) 
     220                  END DO 
     221               END DO 
     222            END DO 
     223         END DO 
     224 
     225# if defined key_vertical 
     226         DO jk=k1,k2 
     227            DO jj=j1,j2 
     228               DO ji=i1,i2 
     229                  tabres(ji,jj,jk,jpts+1) = tmask(ji,jj,jk) * e3t_n(ji,jj,jk)  
     230               END DO 
     231            END DO 
     232         END DO 
     233# endif 
     234 
    209235      ELSE    
    210236         ! 
    211          tsbdiff(:,:,:,:) = tsb(i1:i2,j1:j2,:,:) - tabres(:,:,:,:)     
     237# if defined key_vertical 
     238         tabres_child(:,:,:,:) = 0. 
     239         DO jj=j1,j2 
     240            DO ji=i1,i2 
     241               N_in = 0 
     242               DO jk=k1,k2 !k2 = jpk of parent grid 
     243                  IF (tabres(ji,jj,jk,n2) == 0) EXIT 
     244                  N_in = N_in + 1 
     245                  tabin(jk,:) = tabres(ji,jj,jk,n1:n2-1) 
     246                  h_in(N_in) = tabres(ji,jj,jk,n2) 
     247               END DO 
     248               N_out = 0 
     249               DO jk=1,jpk ! jpk of child grid 
     250                  IF (tmask(ji,jj,jk) == 0) EXIT  
     251                  N_out = N_out + 1 
     252                  h_out(jk) = e3t_n(ji,jj,jk) !Child grid scale factors. Could multiply by e1e2t here instead of division above 
     253               ENDDO 
     254               IF (N_in > 0) THEN 
     255                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     256                  tabres(ji,jj,k2,:) = tabres(ji,jj,k2-1,:) !what is this line for????? 
     257                  DO jn=1,jpts 
     258                     call reconstructandremap(tabin(1:N_in,jn),h_in,tabres_child(ji,jj,1:N_out,jn),h_out,N_in,N_out) 
     259                  ENDDO 
     260               ENDIF 
     261            ENDDO 
     262         ENDDO 
     263# endif 
     264 
     265         DO jj=j1,j2 
     266            DO ji=i1,i2 
     267               DO jk=1,jpkm1 
     268# if defined key_vertical 
     269                  tsbdiff(ji,jj,jk,1:jpts) = tsb(ji,jj,jk,1:jpts) - tabres_child(ji,jj,jk,1:jpts) 
     270# else 
     271                  tsbdiff(ji,jj,jk,1:jpts) = tsb(ji,jj,jk,1:jpts) - tabres(ji,jj,jk,1:jpts) 
     272# endif 
     273               ENDDO 
     274            ENDDO 
     275         ENDDO 
     276 
    212277         DO jn = 1, jpts             
    213278            DO jk = 1, jpkm1 
     
    256321   END SUBROUTINE interptsn_sponge 
    257322 
    258  
    259    SUBROUTINE interpun_sponge( tabres, i1, i2, j1, j2, k1, k2, before ) 
    260       !!---------------------------------------------------------------------- 
    261       !!                 *** ROUTINE interpun_sponge *** 
    262       !!---------------------------------------------------------------------- 
    263       INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
    264       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   tabres 
    265       LOGICAL                               , INTENT(in   ) ::   before 
    266       !! 
    267       INTEGER :: ji, jj, jk 
     323   SUBROUTINE interpun_sponge(tabres,i1,i2,j1,j2,k1,k2,m1,m2, before) 
     324      !!--------------------------------------------- 
     325      !!   *** ROUTINE interpun_sponge *** 
     326      !!---------------------------------------------     
     327      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2 
     328      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: tabres 
     329      LOGICAL, INTENT(in) :: before 
     330 
     331      INTEGER :: ji,jj,jk,jmax 
     332 
    268333      ! sponge parameters  
    269       INTEGER :: jmax 
    270       REAL(wp) :: ze2u, ze1v, zua, zva, zbtr 
    271       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: ubdiff 
    272       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: rotdiff, hdivdiff 
    273       !!---------------------------------------------------------------------- 
     334      REAL(wp) :: ze2u, ze1v, zua, zva, zbtr, h_diff 
     335      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: ubdiff 
     336      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: rotdiff, hdivdiff 
     337      ! vertical interpolation: 
     338      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     339      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
     340      REAL(wp), DIMENSION(1:jpk) :: h_out 
     341      INTEGER ::N_in,N_out 
     342      !!---------------------------------------------     
    274343      ! 
    275344      IF( before ) THEN 
    276          tabres = un(i1:i2,j1:j2,:) 
     345         DO jk=1,jpkm1 
     346            DO jj=j1,j2 
     347               DO ji=i1,i2 
     348                  tabres(ji,jj,jk,m1) = ub(ji,jj,jk) 
     349# if defined key_vertical 
     350                  tabres(ji,jj,jk,m2) = e3u_n(ji,jj,jk)*umask(ji,jj,jk) 
     351# endif 
     352               END DO 
     353            END DO 
     354         END DO 
     355 
    277356      ELSE 
    278          ubdiff(i1:i2,j1:j2,:) = ( ub(i1:i2,j1:j2,:) - tabres(:,:,:) )*umask(i1:i2,j1:j2,:) 
     357 
     358# if defined key_vertical 
     359         tabres_child(:,:,:) = 0._wp 
     360         DO jj=j1,j2 
     361            DO ji=i1,i2 
     362               N_in = 0 
     363               DO jk=k1,k2 
     364                  IF (tabres(ji,jj,jk,m2) == 0) EXIT 
     365                  N_in = N_in + 1 
     366                  tabin(jk) = tabres(ji,jj,jk,m1) 
     367                  h_in(N_in) = tabres(ji,jj,jk,m2) 
     368              ENDDO 
     369              ! 
     370              IF (N_in == 0) THEN 
     371                 tabres_child(ji,jj,:) = 0. 
     372                 CYCLE 
     373              ENDIF 
     374          
     375              N_out = 0 
     376              DO jk=1,jpk 
     377                 if (umask(ji,jj,jk) == 0) EXIT 
     378                 N_out = N_out + 1 
     379                 h_out(N_out) = e3u_n(ji,jj,jk) 
     380              ENDDO 
     381          
     382              IF (N_out == 0) THEN 
     383                 tabres_child(ji,jj,:) = 0. 
     384                 CYCLE 
     385              ENDIF 
     386          
     387              IF (N_in * N_out > 0) THEN 
     388                 h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     389                 if (h_diff < -1.e4) then 
     390                    print *,'CHECK YOUR BATHY ...', h_diff, sum(h_out(1:N_out)), sum(h_in(1:N_in)) 
     391                 endif 
     392              ENDIF 
     393              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) 
     394          
     395            ENDDO 
     396         ENDDO 
     397 
     398         ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres_child(i1:i2,j1:j2,:))*umask(i1:i2,j1:j2,:) 
     399#else 
     400         ubdiff(i1:i2,j1:j2,:) = (ub(i1:i2,j1:j2,:) - tabres(i1:i2,j1:j2,:,1))*umask(i1:i2,j1:j2,:) 
     401#endif 
     402>>>>>>> .merge-right.r9019 
    279403         ! 
    280404         DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    352476   END SUBROUTINE interpun_sponge 
    353477 
    354  
    355    SUBROUTINE interpvn_sponge( tabres, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 
    356       !!---------------------------------------------------------------------- 
    357       !!                 *** ROUTINE interpvn_sponge *** 
    358       !!---------------------------------------------------------------------- 
    359       INTEGER                               , INTENT(in   ) ::   i1, i2, j1, j2, k1, k2 
    360       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) ::   tabres 
    361       LOGICAL                               , INTENT(in   ) ::   before 
    362       INTEGER                               , INTENT(in   ) ::   nb , ndir 
     478   SUBROUTINE interpvn_sponge(tabres,i1,i2,j1,j2,k1,k2,m1,m2, before,nb,ndir) 
     479      !!--------------------------------------------- 
     480      !!   *** ROUTINE interpvn_sponge *** 
     481      !!---------------------------------------------  
     482      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,m1,m2 
     483      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,m1:m2), INTENT(inout) :: tabres 
     484      LOGICAL, INTENT(in) :: before 
     485      INTEGER, INTENT(in) :: nb , ndir 
    363486      ! 
    364487      INTEGER ::   ji, jj, jk 
     
    367490      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) ::   vbdiff, rotdiff, hdivdiff 
    368491      !!---------------------------------------------------------------------- 
    369  
     492      INTEGER  ::   ji, jj, jk, imax 
     493      REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr, h_diff 
     494      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: vbdiff 
     495      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: rotdiff, hdivdiff 
     496      ! vertical interpolation: 
     497      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     498      REAL(wp), DIMENSION(k1:k2) :: tabin, h_in 
     499      REAL(wp), DIMENSION(1:jpk) :: h_out 
     500      INTEGER :: N_in, N_out 
     501      !!---------------------------------------------  
     502>>>>>>> .merge-right.r9019 
     503       
    370504      IF( before ) THEN  
    371          tabres = vn(i1:i2,j1:j2,:) 
     505         DO jk=1,jpkm1 
     506            DO jj=j1,j2 
     507               DO ji=i1,i2 
     508                  tabres(ji,jj,jk,m1) = vb(ji,jj,jk) 
     509# if defined key_vertical 
     510                  tabres(ji,jj,jk,m2) = vmask(ji,jj,jk) * e3v_n(ji,jj,jk) 
     511# endif 
     512               END DO 
     513            END DO 
     514         END DO 
    372515      ELSE 
    373          ! 
    374          vbdiff(i1:i2,j1:j2,:) = ( vb(i1:i2,j1:j2,:) - tabres(:,:,:) ) * vmask(i1:i2,j1:j2,:) 
     516 
     517# if defined key_vertical 
     518         tabres_child(:,:,:) = 0._wp 
     519         DO jj=j1,j2 
     520            DO ji=i1,i2 
     521               N_in = 0 
     522               DO jk=k1,k2 
     523                  IF (tabres(ji,jj,jk,m2) == 0) EXIT 
     524                  N_in = N_in + 1 
     525                  tabin(jk) = tabres(ji,jj,jk,m1) 
     526                  h_in(N_in) = tabres(ji,jj,jk,m2) 
     527              ENDDO 
     528          
     529              IF (N_in == 0) THEN 
     530                 tabres_child(ji,jj,:) = 0. 
     531                 CYCLE 
     532              ENDIF 
     533          
     534              N_out = 0 
     535              DO jk=1,jpk 
     536                 if (vmask(ji,jj,jk) == 0) EXIT 
     537                 N_out = N_out + 1 
     538                 h_out(N_out) = e3v_n(ji,jj,jk) 
     539              ENDDO 
     540          
     541              IF (N_in * N_out > 0) THEN 
     542                 h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     543                 if (h_diff < -1.e4) then 
     544                    print *,'CHECK YOUR BATHY ...', h_diff, sum(h_out(1:N_out)), sum(h_in(1:N_in)) 
     545                 endif 
     546              ENDIF 
     547              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) 
     548            ENDDO 
     549         ENDDO 
     550 
     551         vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres_child(i1:i2,j1:j2,:))*vmask(i1:i2,j1:j2,:)   
     552# else 
     553         vbdiff(i1:i2,j1:j2,:) = (vb(i1:i2,j1:j2,:) - tabres(i1:i2,j1:j2,:,1))*vmask(i1:i2,j1:j2,:) 
     554# endif 
    375555         ! 
    376556         DO jk = 1, jpkm1                                 ! Horizontal slab 
Note: See TracChangeset for help on using the changeset viewer.