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 3294 for trunk/NEMOGCM/NEMO/NST_SRC/agrif_opa_sponge.F90 – NEMO

Ignore:
Timestamp:
2012-01-28T17:44:18+01:00 (12 years ago)
Author:
rblod
Message:

Merge of 3.4beta into the trunk

File:
1 edited

Legend:

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

    r2715 r3294  
    88   USE in_out_manager 
    99   USE agrif_oce 
     10   USE wrk_nemo   
    1011 
    1112   IMPLICIT NONE 
    1213   PRIVATE 
    1314 
    14    PUBLIC Agrif_Sponge_Tra, Agrif_Sponge_Dyn, interptn, interpsn, interpun, interpvn 
     15   PUBLIC Agrif_Sponge_Tra, Agrif_Sponge_Dyn, interptsn, interpun, interpvn 
    1516 
    1617   !!---------------------------------------------------------------------- 
     
    2728      !!--------------------------------------------- 
    2829#include "domzgr_substitute.h90" 
    29       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    30       USE wrk_nemo, ONLY: wrk_2d_1 
    31       USE wrk_nemo, ONLY: wrk_3d_1, wrk_3d_2 
    32       USE wrk_nemo, ONLY: wrk_3d_3, wrk_3d_4 
    33       USE wrk_nemo, ONLY: wrk_3d_7, wrk_3d_6 
    34       USE wrk_nemo, ONLY: wrk_3d_8 
    3530      !! 
    36       INTEGER :: ji,jj,jk 
     31      INTEGER :: ji,jj,jk,jn 
    3732      INTEGER :: spongearea 
    3833      REAL(wp) :: timecoeff 
    39       REAL(wp) :: zta, zsa, zabe1, zabe2, zbtr 
    40       REAL(wp), POINTER, DIMENSION(:,:) :: localviscsponge 
    41       REAL(wp), POINTER, DIMENSION(:,:,:) :: tbdiff, sbdiff 
    42       REAL(wp), POINTER, DIMENSION(:,:,:) :: ztu, zsu, ztv, zsv 
    43       REAL(wp), POINTER, DIMENSION(:,:,:) :: ztab 
     34      REAL(wp) :: ztsa, zabe1, zabe2, zbtr 
     35      REAL(wp), POINTER, DIMENSION(:,:    ) :: localviscsponge 
     36      REAL(wp), POINTER, DIMENSION(:,:    ) :: ztu, ztv 
     37      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztab 
     38      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: tsbdiff 
    4439 
    4540#if defined SPONGE 
    46       localviscsponge => wrk_2d_1 
    47       tbdiff => wrk_3d_1 ;sbdiff => wrk_3d_2 
    48       ztu => wrk_3d_3 ; zsu => wrk_3d_4 
    49       ztv => wrk_3d_7 ; zsv => wrk_3d_6 
    50       ztab => wrk_3d_8 
     41      CALL wrk_alloc( jpi, jpj, localviscsponge, ztu, ztv ) 
     42      CALL wrk_alloc( jpi, jpj, jpk, jpts, ztab, tsbdiff  ) 
    5143 
    5244      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
     
    5547      Agrif_UseSpecialValue = .TRUE. 
    5648      ztab = 0.e0 
    57       CALL Agrif_Bc_Variable(ztab, ta_id,calledweight=timecoeff,procname=interptn) 
     49      CALL Agrif_Bc_Variable(ztab, tsa_id,calledweight=timecoeff,procname=interptsn) 
    5850      Agrif_UseSpecialValue = .FALSE. 
    5951 
    60       tbdiff(:,:,:) = tb(:,:,:) - ztab(:,:,:) 
    61  
    62       ztab = 0.e0 
    63       Agrif_SpecialValue=0. 
    64       Agrif_UseSpecialValue = .TRUE. 
    65       CALL Agrif_Bc_Variable(ztab, sa_id,calledweight=timecoeff,procname=interpsn) 
    66       Agrif_UseSpecialValue = .FALSE. 
    67  
    68       sbdiff(:,:,:) = sb(:,:,:) - ztab(:,:,:) 
     52      tsbdiff(:,:,:,:) = tsb(:,:,:,:) - ztab(:,:,:,:) 
    6953 
    7054      spongearea = 2 + 2 * Agrif_irhox() 
     
    137121      ENDIF 
    138122 
    139       DO jk = 1, jpkm1 
    140          DO jj = 1, jpjm1 
    141             DO ji = 1, jpim1 
    142                zabe1 = umask(ji,jj,jk) * spe1ur(ji,jj) * fse3u(ji,jj,jk) 
    143                zabe2 = vmask(ji,jj,jk) * spe2vr(ji,jj) * fse3v(ji,jj,jk) 
    144                ztu(ji,jj,jk) = zabe1 * ( tbdiff(ji+1,jj  ,jk) - tbdiff(ji,jj,jk) ) 
    145                zsu(ji,jj,jk) = zabe1 * ( sbdiff(ji+1,jj  ,jk) - sbdiff(ji,jj,jk) ) 
    146                ztv(ji,jj,jk) = zabe2 * ( tbdiff(ji  ,jj+1,jk) - tbdiff(ji,jj,jk) ) 
    147                zsv(ji,jj,jk) = zabe2 * ( sbdiff(ji  ,jj+1,jk) - sbdiff(ji,jj,jk) ) 
     123      DO jn = 1, jpts 
     124         DO jk = 1, jpkm1 
     125            ! 
     126            DO jj = 1, jpjm1 
     127               DO ji = 1, jpim1 
     128                  zabe1 = umask(ji,jj,jk) * spe1ur(ji,jj) * fse3u(ji,jj,jk) 
     129                  zabe2 = vmask(ji,jj,jk) * spe2vr(ji,jj) * fse3v(ji,jj,jk) 
     130                  ztu(ji,jj) = zabe1 * ( tsbdiff(ji+1,jj  ,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
     131                  ztv(ji,jj) = zabe2 * ( tsbdiff(ji  ,jj+1,jk,jn) - tsbdiff(ji,jj,jk,jn) ) 
     132               ENDDO 
    148133            ENDDO 
    149          ENDDO 
    150  
    151          DO jj = 2,jpjm1 
    152             DO ji = 2,jpim1 
    153                zbtr = spbtr2(ji,jj) / fse3t(ji,jj,jk) 
    154                ! horizontal diffusive trends 
    155                zta = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   & 
    156                   &          + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) 
    157                zsa = zbtr * (  zsu(ji,jj,jk) - zsu(ji-1,jj,jk)   & 
    158                   &          + zsv(ji,jj,jk) - zsv(ji,jj-1,jk)  ) 
    159                ! add it to the general tracer trends 
    160                ta(ji,jj,jk) = (ta(ji,jj,jk) + zta) 
    161                sa(ji,jj,jk) = (sa(ji,jj,jk) + zsa) 
     134 
     135            DO jj = 2, jpjm1 
     136               DO ji = 2, jpim1 
     137                  zbtr = spbtr2(ji,jj) / fse3t(ji,jj,jk) 
     138                  ! horizontal diffusive trends 
     139                  ztsa = zbtr * (  ztu(ji,jj) - ztu(ji-1,jj  )   & 
     140                  &              + ztv(ji,jj) - ztv(ji  ,jj-1)  ) 
     141                  ! add it to the general tracer trends 
     142                  tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + ztsa 
     143               END DO 
    162144            END DO 
    163          END DO 
    164  
     145            ! 
     146         ENDDO 
    165147      ENDDO 
    166148 
     149      CALL wrk_dealloc( jpi, jpj, localviscsponge, ztu, ztv ) 
     150      CALL wrk_dealloc( jpi, jpj, jpk, jpts, ztab, tsbdiff  ) 
    167151#endif 
    168152 
     
    174158      !!--------------------------------------------- 
    175159#include "domzgr_substitute.h90" 
    176       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    177       USE wrk_nemo, ONLY: wrk_2d_1 
    178       USE wrk_nemo, ONLY: wrk_3d_1, wrk_3d_2 
    179       USE wrk_nemo, ONLY: wrk_3d_3, wrk_3d_4 
    180       USE wrk_nemo, ONLY: wrk_3d_5 
    181160      !! 
    182161      INTEGER :: ji,jj,jk 
     
    190169 
    191170#if defined SPONGE 
    192       localviscsponge => wrk_2d_1 
    193       ubdiff => wrk_3d_1 ; vbdiff => wrk_3d_2 
    194       rotdiff => wrk_3d_3 ; hdivdiff => wrk_3d_4 
    195       ztab => wrk_3d_5 
     171      CALL wrk_alloc( jpi, jpj, localviscsponge ) 
     172      CALL wrk_alloc( jpi, jpj, jpk, ztab, ubdiff, vbdiff, rotdiff, hdivdiff ) 
    196173 
    197174      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
     
    340317      END DO                                           !   End of slab 
    341318      !                                                ! =============== 
     319      CALL wrk_dealloc( jpi, jpj, localviscsponge ) 
     320      CALL wrk_dealloc( jpi, jpj, jpk, ztab, ubdiff, vbdiff, rotdiff, hdivdiff ) 
    342321 
    343322#endif 
     
    345324   END SUBROUTINE Agrif_Sponge_dyn 
    346325 
    347    SUBROUTINE interptn(tabres,i1,i2,j1,j2,k1,k2) 
    348       !!--------------------------------------------- 
    349       !!   *** ROUTINE interptn *** 
     326   SUBROUTINE interptsn(tabres,i1,i2,j1,j2,k1,k2,n1,n2) 
     327      !!--------------------------------------------- 
     328      !!   *** ROUTINE interptsn *** 
    350329      !!--------------------------------------------- 
    351330#  include "domzgr_substitute.h90"        
    352331       
    353       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    354       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    355  
    356       tabres(i1:i2,j1:j2,k1:k2) = tn(i1:i2,j1:j2,k1:k2) 
    357  
    358    END SUBROUTINE interptn 
    359  
    360    SUBROUTINE interpsn(tabres,i1,i2,j1,j2,k1,k2) 
    361       !!--------------------------------------------- 
    362       !!   *** ROUTINE interpsn *** 
    363       !!--------------------------------------------- 
    364 #  include "domzgr_substitute.h90"        
    365        
    366       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
    367       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
    368  
    369       tabres(i1:i2,j1:j2,k1:k2) = sn(i1:i2,j1:j2,k1:k2) 
    370  
    371    END SUBROUTINE interpsn 
     332      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
     333      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
     334 
     335      tabres(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 
     336 
     337   END SUBROUTINE interptsn 
    372338 
    373339   SUBROUTINE interpun(tabres,i1,i2,j1,j2,k1,k2) 
Note: See TracChangeset for help on using the changeset viewer.