Skip to content
Snippets Groups Projects
agrif_oce_sponge.F90 45.6 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
                  ze2u = rotdiff (ji,jj)
                  ze1v = hdivdiff(ji,jj)
                  ! horizontal diffusive trends
                  zua = - ( ze2u - rotdiff (ji,jj-1) ) * r1_e2u(ji,jj) * r1_hu(ji,jj,Kmm_a)  &
                      & + ( hdivdiff(ji+1,jj) - ze1v ) * r1_e1u(ji,jj)                       & 
                      & - rn_trelax_dyn * r1_Dt * fspu_2d(ji,jj) * ubdiff(ji,jj)

                  ! add it to the general momentum trends
                  uu(ji,jj,:,Krhs_a) = uu(ji,jj,:,Krhs_a) + zua                                 
               ENDIF
            END DO
         END DO

         tabspongedone_u(i1+1:i2-1,j1+1:j2-1) = .TRUE.

         jmax = j2-1
         ind1 = jpjglo - ( nn_hls + nbghostcells + 1 )   ! North
         DO jj = mj0(ind1), mj1(ind1)                 
            jmax = MIN(jmax,jj)
         END DO

         DO jj = j1+1, jmax
            DO ji = i1+1, i2   ! vector opt.
               IF (.NOT. tabspongedone_v(ji,jj)) THEN
                     ze2u = rotdiff (ji,jj)
                     ze1v = hdivdiff(ji,jj)
                     zva = + ( ze2u - rotdiff (ji-1,jj) ) * r1_e1v(ji,jj) * r1_hv(ji,jj,Kmm_a) &
                           + ( hdivdiff(ji,jj+1) - ze1v ) * r1_e2v(ji,jj)
                     vv(ji,jj,:,Krhs_a) = vv(ji,jj,:,Krhs_a) + zva
               ENDIF
            END DO
         END DO
         !
         tabspongedone_v(i1+1:i2,j1+1:jmax) = .TRUE.
         !
      ENDIF
      !
   END SUBROUTINE interpunb_sponge

   
   SUBROUTINE interpvnb_sponge(tabres,i1,i2,j1,j2, before)
      !!---------------------------------------------
      !!   *** ROUTINE interpvnb_sponge ***
      !!--------------------------------------------- 
      INTEGER, INTENT(in) :: i1,i2,j1,j2
      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres
      LOGICAL, INTENT(in) :: before
      !
      INTEGER  ::   ji, jj, ind1, imax
      REAL(wp) ::   ze2u, ze1v, zua, zva, zbtr
      REAL(wp), DIMENSION(i1:i2,j1:j2) :: vbdiff
      REAL(wp), DIMENSION(i1:i2,j1:j2) :: rotdiff, hdivdiff
      !!--------------------------------------------- 
      
      IF( before ) THEN 
         DO jj=j1,j2
            DO ji=i1,i2
               tabres(ji,jj) = vv_b(ji,jj,Kmm_a)
            END DO
         END DO
      ELSE
         vbdiff(i1:i2,j1:j2) = (vv_b(i1:i2,j1:j2,Kmm_a) - tabres(i1:i2,j1:j2))*vmask(i1:i2,j1:j2,1)
         !                                             ! --------
         ! Horizontal divergence                       !   div
         !                                             ! --------
         DO jj = j1+1,j2
            DO ji = i1,i2   ! vector opt.
               zbtr = rn_sponge_dyn * r1_Dt * fspt_2d(ji,jj) * r1_ht_0(ji,jj)
               hdivdiff(ji,jj) = ( e1v(ji,jj  ) * hv(ji,jj  ,Kbb_a) * vbdiff(ji,jj  )  &
                               &  -e1v(ji,jj-1) * hv(ji,jj-1,Kbb_a) * vbdiff(ji,jj-1)  ) * zbtr
            END DO
         END DO
         DO jj = j1,j2
            DO ji = i1,i2-1   ! vector opt.
               zbtr = rn_sponge_dyn * r1_Dt * fspf_2d(ji,jj) * hf_0(ji,jj) 
               rotdiff(ji,jj) = ( e2v(ji+1,jj) * vbdiff(ji+1,jj) & 
                              &  -e2v(ji  ,jj) * vbdiff(ji  ,jj)  ) * fmask(ji,jj,1) * zbtr
            END DO
         END DO
         !                                                ! ===============
         !                                                

         imax = i2 - 1
         ind1 = jpiglo - ( nn_hls + nbghostcells + 1 )   ! East
         DO ji = mi0(ind1), mi1(ind1)                
            imax = MIN(imax,ji)
         END DO
         
         DO jj = j1+1, j2
            DO ji = i1+1, imax   ! vector opt.
               IF( .NOT. tabspongedone_u(ji,jj) ) THEN                                                     
                  zua = - ( rotdiff (ji  ,jj) - rotdiff (ji,jj-1)) * r1_e2u(ji,jj) * r1_hu(ji,jj,Kmm_a)  &
                      & + ( hdivdiff(ji+1,jj) - hdivdiff(ji,jj  )) * r1_e1u(ji,jj)
                  uu(ji,jj,:,Krhs_a) = uu(ji,jj,:,Krhs_a) + zua
               ENDIF
            END DO
         END DO
         !
         tabspongedone_u(i1+1:imax,j1+1:j2) = .TRUE.
         !
         DO jj = j1+1, j2-1
            DO ji = i1+1, i2-1   ! vector opt.
               IF( .NOT. tabspongedone_v(ji,jj) ) THEN
                  zva  =  ( rotdiff (ji,jj  ) - rotdiff (ji-1,jj) ) * r1_e1v(ji,jj) *r1_hv(ji,jj,Kmm_a) &
                     &  + ( hdivdiff(ji,jj+1) - hdivdiff(ji  ,jj) ) * r1_e2v(ji,jj)                     &
                     &  - rn_trelax_dyn * r1_Dt * fspv_2d(ji,jj) * vbdiff(ji,jj)
                  vv(ji,jj,:,Krhs_a) = vv(ji,jj,:,Krhs_a) + zva
               ENDIF
            END DO
         END DO
         tabspongedone_v(i1+1:i2-1,j1+1:j2-1) = .TRUE.
      ENDIF
      !
   END SUBROUTINE interpvnb_sponge


#else
   !!----------------------------------------------------------------------
   !!   Empty module                                          no AGRIF zoom
   !!----------------------------------------------------------------------
CONTAINS
   SUBROUTINE agrif_oce_sponge_empty
      WRITE(*,*)  'agrif_oce_sponge : You should not have seen this print! error?'
   END SUBROUTINE agrif_oce_sponge_empty
#endif

   !!======================================================================
END MODULE agrif_oce_sponge