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 636 – NEMO

Changeset 636


Ignore:
Timestamp:
2007-03-07T14:28:16+01:00 (17 years ago)
Author:
opalod
Message:

nemo_v2_update_008:RB: clean agrif routines and add sponge layer coefficient in namelist

Location:
trunk/NEMO/NST_SRC
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/NST_SRC/agrif_opa_interp.F90

    r469 r636  
    1 ! 
    2       Module agrif_opa_interp 
     1MODULE agrif_opa_interp 
    32#if defined key_agrif 
    4       USE par_oce 
    5       USE oce 
    6       USE dom_oce       
    7       USE sol_oce 
    8  
    9       CONTAINS 
    10       SUBROUTINE Agrif_tra( kt ) 
    11  
    12       Implicit none 
    13        
    14    !! * Substitutions 
     3   USE par_oce 
     4   USE oce 
     5   USE dom_oce       
     6   USE sol_oce 
     7 
     8   IMPLICIT NONE 
     9   PRIVATE 
     10     
     11   PUBLIC Agrif_tra, Agrif_dyn, interpu, interpv 
     12 
     13   CONTAINS 
     14    
     15   SUBROUTINE Agrif_tra( kt ) 
     16      !!--------------------------------------------- 
     17      !!   *** ROUTINE Agrif_Tra *** 
     18      !!--------------------------------------------- 
    1519#  include "domzgr_substitute.h90"   
    1620#  include "vectopt_loop_substitute.h90" 
    17 ! 
    18       INTEGER :: kt 
    19       REAL(wp) tatemp(jpi,jpj,jpk) , satemp(jpi,jpj,jpk) 
     21       
     22      INTEGER, INTENT(in) :: kt 
     23 
    2024      INTEGER :: ji,jj,jk 
    21       REAL(wp) :: rhox 
     25      REAL(wp) :: zrhox 
    2226      REAL(wp) :: alpha1, alpha2, alpha3, alpha4 
    2327      REAL(wp) :: alpha5, alpha6, alpha7 
    24 ! 
    25         IF (Agrif_Root()) RETURN 
    26  
    27            Agrif_SpecialValue=0. 
    28            Agrif_UseSpecialValue = .TRUE. 
    29            tatemp = 0. 
    30            satemp = 0. 
    31  
    32            Call Agrif_Bc_variable(tatemp,tn) 
    33            Call Agrif_Bc_variable(satemp,sn) 
    34            Agrif_UseSpecialValue = .FALSE. 
    35         
    36            rhox = Agrif_Rhox() 
    37     
    38            alpha1 = (rhox-1.)/2. 
    39            alpha2 = 1.-alpha1 
    40     
    41            alpha3 = (rhox-1)/(rhox+1) 
    42            alpha4 = 1.-alpha3 
    43     
    44            alpha6 = 2.*(rhox-1.)/(rhox+1.) 
    45            alpha7 = -(rhox-1)/(rhox+3) 
    46            alpha5 = 1. - alpha6 - alpha7 
    47     
    48 ! 
    49       If ((nbondi == 1).OR.(nbondi == 2)) THEN 
     28      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zta, zsa 
     29      ! 
     30      IF(Agrif_Root()) RETURN 
     31 
     32      Agrif_SpecialValue=0. 
     33      Agrif_UseSpecialValue = .TRUE. 
     34      zta = 0.e0 
     35      zsa = 0.e0 
     36 
     37      CALL Agrif_Bc_variable(zta,tn) 
     38      CALL Agrif_Bc_variable(zsa,sn) 
     39      Agrif_UseSpecialValue = .FALSE. 
     40 
     41      zrhox = Agrif_Rhox() 
     42 
     43      alpha1 = (zrhox-1.)/2. 
     44      alpha2 = 1.-alpha1 
     45 
     46      alpha3 = (zrhox-1)/(zrhox+1) 
     47      alpha4 = 1.-alpha3 
     48 
     49      alpha6 = 2.*(zrhox-1.)/(zrhox+1.) 
     50      alpha7 = -(zrhox-1)/(zrhox+3) 
     51      alpha5 = 1. - alpha6 - alpha7 
     52 
     53      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
     54 
     55         ta(nlci,:,:) = alpha1 * zta(nlci,:,:) + alpha2 * zta(nlci-1,:,:) 
     56         sa(nlci,:,:) = alpha1 * zsa(nlci,:,:) + alpha2 * zsa(nlci-1,:,:) 
     57 
     58         DO jk=1,jpk       
     59            DO jj=1,jpj 
     60               IF (umask(nlci-2,jj,jk).EQ.0.) THEN 
     61                  ta(nlci-1,jj,jk) = ta(nlci,jj,jk) * tmask(nlci-1,jj,jk) 
     62                  sa(nlci-1,jj,jk) = sa(nlci,jj,jk) * tmask(nlci-1,jj,jk) 
     63               ELSE 
     64                  ta(nlci-1,jj,jk)=(alpha4*ta(nlci,jj,jk)+alpha3*ta(nlci-2,jj,jk))*tmask(nlci-1,jj,jk) 
     65                  sa(nlci-1,jj,jk)=(alpha4*sa(nlci,jj,jk)+alpha3*sa(nlci-2,jj,jk))*tmask(nlci-1,jj,jk) 
     66                  IF (un(nlci-2,jj,jk).GT.0.) THEN 
     67                     ta(nlci-1,jj,jk)=( alpha6*ta(nlci-2,jj,jk)+alpha5*ta(nlci,jj,jk)  & 
     68                                      + alpha7*ta(nlci-3,jj,jk) ) * tmask(nlci-1,jj,jk) 
     69                     sa(nlci-1,jj,jk)=( alpha6*sa(nlci-2,jj,jk)+alpha5*sa(nlci,jj,jk)  & 
     70                                      + alpha7*sa(nlci-3,jj,jk) ) * tmask(nlci-1,jj,jk) 
     71                  ENDIF 
     72               ENDIF 
     73            END DO 
     74         END DO 
     75      ENDIF 
     76 
     77      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
     78 
     79         ta(:,nlcj,:) = alpha1 * zta(:,nlcj,:) + alpha2 * zta(:,nlcj-1,:) 
     80         sa(:,nlcj,:) = alpha1 * zsa(:,nlcj,:) + alpha2 * zsa(:,nlcj-1,:) 
     81 
     82         DO jk=1,jpk       
     83            DO ji=1,jpi 
     84               IF (vmask(ji,nlcj-2,jk).EQ.0.) THEN 
     85                  ta(ji,nlcj-1,jk) = ta(ji,nlcj,jk) * tmask(ji,nlcj-1,jk) 
     86                  sa(ji,nlcj-1,jk) = sa(ji,nlcj,jk) * tmask(ji,nlcj-1,jk) 
     87               ELSE 
     88                  ta(ji,nlcj-1,jk)=(alpha4*ta(ji,nlcj,jk)+alpha3*ta(ji,nlcj-2,jk))*tmask(ji,nlcj-1,jk)         
     89                  sa(ji,nlcj-1,jk)=(alpha4*sa(ji,nlcj,jk)+alpha3*sa(ji,nlcj-2,jk))*tmask(ji,nlcj-1,jk) 
     90                  IF (vn(ji,nlcj-2,jk) .GT. 0.) THEN 
     91                     ta(ji,nlcj-1,jk)=( alpha6*ta(ji,nlcj-2,jk)+alpha5*ta(ji,nlcj,jk)  & 
     92                                      + alpha7*ta(ji,nlcj-3,jk) ) * tmask(ji,nlcj-1,jk) 
     93                     sa(ji,nlcj-1,jk)=( alpha6*sa(ji,nlcj-2,jk)+alpha5*sa(ji,nlcj,jk)  & 
     94                                      + alpha7*sa(ji,nlcj-3,jk))*tmask(ji,nlcj-1,jk) 
     95                  ENDIF 
     96               ENDIF 
     97            END DO 
     98         END DO 
     99      ENDIF 
     100 
     101      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     102         ta(1,:,:) = alpha1 * zta(1,:,:) + alpha2 * zta(2,:,:) 
     103         sa(1,:,:) = alpha1 * zsa(1,:,:) + alpha2 * zsa(2,:,:)       
     104         DO jk=1,jpk       
     105            DO jj=1,jpj 
     106               IF (umask(2,jj,jk).EQ.0.) THEN 
     107                  ta(2,jj,jk) = ta(1,jj,jk) * tmask(2,jj,jk) 
     108                  sa(2,jj,jk) = sa(1,jj,jk) * tmask(2,jj,jk) 
     109               ELSE 
     110                  ta(2,jj,jk)=(alpha4*ta(1,jj,jk)+alpha3*ta(3,jj,jk))*tmask(2,jj,jk)         
     111                  sa(2,jj,jk)=(alpha4*sa(1,jj,jk)+alpha3*sa(3,jj,jk))*tmask(2,jj,jk) 
     112                  IF (un(2,jj,jk).LT.0.) THEN 
     113                     ta(2,jj,jk)=(alpha6*ta(3,jj,jk)+alpha5*ta(1,jj,jk)+alpha7*ta(4,jj,jk))*tmask(2,jj,jk) 
     114                     sa(2,jj,jk)=(alpha6*sa(3,jj,jk)+alpha5*sa(1,jj,jk)+alpha7*sa(4,jj,jk))*tmask(2,jj,jk) 
     115                  ENDIF 
     116               ENDIF 
     117            END DO 
     118         END DO 
     119      ENDIF 
     120 
     121      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     122         ta(:,1,:) = alpha1 * zta(:,1,:) + alpha2 * zta(:,2,:) 
     123         sa(:,1,:) = alpha1 * zsa(:,1,:) + alpha2 * zsa(:,2,:) 
     124         DO jk=1,jpk       
     125            DO ji=1,jpi 
     126               IF (vmask(ji,2,jk).EQ.0.) THEN 
     127                  ta(ji,2,jk)=ta(ji,1,jk) * tmask(ji,2,jk) 
     128                  sa(ji,2,jk)=sa(ji,1,jk) * tmask(ji,2,jk) 
     129               ELSE 
     130                  ta(ji,2,jk)=(alpha4*ta(ji,1,jk)+alpha3*ta(ji,3,jk))*tmask(ji,2,jk) 
     131                  sa(ji,2,jk)=(alpha4*sa(ji,1,jk)+alpha3*sa(ji,3,jk))*tmask(ji,2,jk)  
     132                  IF (vn(ji,2,jk) .LT. 0.) THEN 
     133                     ta(ji,2,jk)=(alpha6*ta(ji,3,jk)+alpha5*ta(ji,1,jk)+alpha7*ta(ji,4,jk))*tmask(ji,2,jk) 
     134                     sa(ji,2,jk)=(alpha6*sa(ji,3,jk)+alpha5*sa(ji,1,jk)+alpha7*sa(ji,4,jk))*tmask(ji,2,jk) 
     135                  ENDIF 
     136               ENDIF 
     137            END DO 
     138         END DO 
     139      ENDIF 
     140 
     141   END SUBROUTINE Agrif_tra 
     142 
     143   SUBROUTINE Agrif_dyn( kt ) 
     144      !!--------------------------------------------- 
     145      !!   *** ROUTINE Agrif_DYN *** 
     146      !!--------------------------------------------- 
     147      USE phycst 
     148      USE in_out_manager 
     149 
     150#  include "domzgr_substitute.h90" 
    50151       
    51       ta(nlci,:,:) = alpha1 * tatemp(nlci,:,:) + alpha2 * tatemp(nlci-1,:,:) 
    52       sa(nlci,:,:) = alpha1 * satemp(nlci,:,:) + alpha2 * satemp(nlci-1,:,:) 
    53        
    54       Do jk=1,jpk       
    55       Do jj=1,jpj 
    56         IF (umask(nlci-2,jj,jk).EQ.0.) THEN 
    57         ta(nlci-1,jj,jk) = ta(nlci,jj,jk) * tmask(nlci-1,jj,jk) 
    58         sa(nlci-1,jj,jk) = sa(nlci,jj,jk) * tmask(nlci-1,jj,jk) 
    59         ELSE 
    60         ta(nlci-1,jj,jk)=(alpha4*ta(nlci,jj,jk)+alpha3*ta(nlci-2,jj,jk))*tmask(nlci-1,jj,jk) 
    61         sa(nlci-1,jj,jk)=(alpha4*sa(nlci,jj,jk)+alpha3*sa(nlci-2,jj,jk))*tmask(nlci-1,jj,jk) 
    62          IF (un(nlci-2,jj,jk).GT.0.) THEN 
    63           ta(nlci-1,jj,jk)=(alpha6*ta(nlci-2,jj,jk)+alpha5*ta(nlci,jj,jk)+alpha7*ta(nlci-3,jj,jk))*tmask(nlci-1,jj,jk) 
    64           sa(nlci-1,jj,jk)=(alpha6*sa(nlci-2,jj,jk)+alpha5*sa(nlci,jj,jk)+alpha7*sa(nlci-3,jj,jk))*tmask(nlci-1,jj,jk) 
    65          ENDIF 
    66         ENDIF 
    67       End Do 
    68       enddo  
    69       ENDIF         
    70  
    71       If ((nbondj == 1).OR.(nbondj == 2)) THEN 
    72        
    73       ta(:,nlcj,:) = alpha1 * tatemp(:,nlcj,:) + alpha2 * tatemp(:,nlcj-1,:) 
    74       sa(:,nlcj,:) = alpha1 * satemp(:,nlcj,:) + alpha2 * satemp(:,nlcj-1,:) 
    75                
    76       Do jk=1,jpk       
    77       Do ji=1,jpi 
    78         IF (vmask(ji,nlcj-2,jk).EQ.0.) THEN 
    79         ta(ji,nlcj-1,jk) = ta(ji,nlcj,jk) * tmask(ji,nlcj-1,jk) 
    80         sa(ji,nlcj-1,jk) = sa(ji,nlcj,jk) * tmask(ji,nlcj-1,jk) 
    81         ELSE 
    82         ta(ji,nlcj-1,jk)=(alpha4*ta(ji,nlcj,jk)+alpha3*ta(ji,nlcj-2,jk))*tmask(ji,nlcj-1,jk)         
    83         sa(ji,nlcj-1,jk)=(alpha4*sa(ji,nlcj,jk)+alpha3*sa(ji,nlcj-2,jk))*tmask(ji,nlcj-1,jk) 
    84           IF (vn(ji,nlcj-2,jk) .GT. 0.) THEN 
    85            ta(ji,nlcj-1,jk)=(alpha6*ta(ji,nlcj-2,jk)+alpha5*ta(ji,nlcj,jk)+alpha7*ta(ji,nlcj-3,jk))*tmask(ji,nlcj-1,jk) 
    86            sa(ji,nlcj-1,jk)=(alpha6*sa(ji,nlcj-2,jk)+alpha5*sa(ji,nlcj,jk)+alpha7*sa(ji,nlcj-3,jk))*tmask(ji,nlcj-1,jk) 
    87           ENDIF 
    88         ENDIF 
    89       End Do 
    90       enddo 
    91       ENDIF 
    92  
    93       IF ((nbondi == -1).OR.(nbondi == 2)) THEN 
    94        
    95       ta(1,:,:) = alpha1 * tatemp(1,:,:) + alpha2 * tatemp(2,:,:) 
    96       sa(1,:,:) = alpha1 * satemp(1,:,:) + alpha2 * satemp(2,:,:)       
    97        
    98       Do jk=1,jpk       
    99       Do jj=1,jpj 
    100         IF (umask(2,jj,jk).EQ.0.) THEN 
    101         ta(2,jj,jk) = ta(1,jj,jk) * tmask(2,jj,jk) 
    102         sa(2,jj,jk) = sa(1,jj,jk) * tmask(2,jj,jk) 
    103         ELSE 
    104         ta(2,jj,jk)=(alpha4*ta(1,jj,jk)+alpha3*ta(3,jj,jk))*tmask(2,jj,jk)         
    105         sa(2,jj,jk)=(alpha4*sa(1,jj,jk)+alpha3*sa(3,jj,jk))*tmask(2,jj,jk) 
    106          IF (un(2,jj,jk).LT.0.) THEN 
    107            ta(2,jj,jk)=(alpha6*ta(3,jj,jk)+alpha5*ta(1,jj,jk)+alpha7*ta(4,jj,jk))*tmask(2,jj,jk) 
    108            sa(2,jj,jk)=(alpha6*sa(3,jj,jk)+alpha5*sa(1,jj,jk)+alpha7*sa(4,jj,jk))*tmask(2,jj,jk) 
    109          ENDIF 
    110         ENDIF 
    111       End Do 
    112       enddo 
    113       ENDIF 
    114  
    115       IF ((nbondj == -1).OR.(nbondj == 2)) THEN 
    116        
    117       ta(:,1,:) = alpha1 * tatemp(:,1,:) + alpha2 * tatemp(:,2,:) 
    118       sa(:,1,:) = alpha1 * satemp(:,1,:) + alpha2 * satemp(:,2,:) 
    119              
    120       Do jk=1,jpk       
    121       Do ji=1,jpi 
    122         IF (vmask(ji,2,jk).EQ.0.) THEN 
    123         ta(ji,2,jk)=ta(ji,1,jk) * tmask(ji,2,jk) 
    124         sa(ji,2,jk)=sa(ji,1,jk) * tmask(ji,2,jk) 
    125         ELSE 
    126         ta(ji,2,jk)=(alpha4*ta(ji,1,jk)+alpha3*ta(ji,3,jk))*tmask(ji,2,jk) 
    127         sa(ji,2,jk)=(alpha4*sa(ji,1,jk)+alpha3*sa(ji,3,jk))*tmask(ji,2,jk)  
    128           IF (vn(ji,2,jk) .LT. 0.) THEN 
    129             ta(ji,2,jk)=(alpha6*ta(ji,3,jk)+alpha5*ta(ji,1,jk)+alpha7*ta(ji,4,jk))*tmask(ji,2,jk) 
    130             sa(ji,2,jk)=(alpha6*sa(ji,3,jk)+alpha5*sa(ji,1,jk)+alpha7*sa(ji,4,jk))*tmask(ji,2,jk) 
    131           ENDIF 
    132         ENDIF 
    133       End Do 
    134       enddo  
    135       ENDIF 
    136  
    137       Return 
    138       End Subroutine Agrif_tra 
    139 ! 
    140 ! 
    141        SUBROUTINE Agrif_dyn(kt) 
    142 ! 
    143       USE phycst 
    144       USE sol_oce 
    145       USE in_out_manager 
    146  
    147       implicit none 
    148 #  include "domzgr_substitute.h90" 
    149 ! 
    150       REAL(wp) uatemp(jpi,jpj,jpk) , vatemp(jpi,jpj,jpk) 
     152      INTEGER, INTENT(in) :: kt 
     153 
     154      REAL(wp) :: timeref 
     155      REAL(wp) :: z2dt, znugdt 
     156      REAL(wp) :: zrhox, rhoy 
     157      REAL(wp), DIMENSION(jpi,jpj) :: zua2d, zva2d 
     158      REAL(wp), DIMENSION(jpi,jpj) :: spgu1,spgv1 
     159      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zua, zva 
    151160      INTEGER :: ji,jj,jk 
    152       INTEGER kt 
    153       REAL(wp) :: z2dt, znugdt 
    154       REAL(wp), DIMENSION(jpi,jpj) :: uatemp2D, vatemp2D 
    155       REAL(wp) :: timeref 
    156       REAL(wp), DIMENSION(jpi,jpj) :: spgu1,spgv1 
    157       REAL(wp) :: rhox, rhoy 
    158161 
    159162      IF (Agrif_Root()) RETURN 
    160163 
    161       rhox = Agrif_Rhox() 
     164      zrhox = Agrif_Rhox() 
    162165      rhoy = Agrif_Rhoy() 
    163166 
     
    171174      znugdt =  rnu * grav * z2dt     
    172175 
    173         Agrif_SpecialValue=0. 
    174         Agrif_UseSpecialValue = .TRUE. 
    175         uatemp = 0. 
    176         vatemp = 0. 
    177         Call Agrif_Bc_variable(uatemp,un,procname=interpu) 
    178         Call Agrif_Bc_variable(vatemp,vn,procname=interpv) 
    179         uatemp2d = 0. 
    180         vatemp2d = 0. 
    181  
    182           Agrif_SpecialValue=0. 
    183         Agrif_UseSpecialValue = .TRUE. 
    184        Call Agrif_Bc_variable(uatemp2d,e1u,calledweight=1.,procname=interpu2d) 
    185        Call Agrif_Bc_variable(vatemp2d,e2v,calledweight=1.,procname=interpv2d) 
    186         Agrif_UseSpecialValue = .FALSE. 
    187  
    188  
    189         If ((nbondi == -1).OR.(nbondi == 2)) THEN 
    190  
    191         DO jj=1,jpj 
    192           laplacu(2,jj) = timeref * (uatemp2d(2,jj)/(rhoy*e2u(2,jj)))*umask(2,jj,1) 
    193         ENDDO 
    194          
    195         Do jk=1,jpkm1 
    196         DO jj=1,jpj 
    197           ua(1:2,jj,jk) = (uatemp(1:2,jj,jk)/(rhoy*e2u(1:2,jj))) 
    198 #if ! defined key_zco 
    199            ua(1:2,jj,jk) = ua(1:2,jj,jk) / fse3u(1:2,jj,jk) 
    200 #endif 
    201         ENDDO 
    202         ENDDO 
    203  
    204         Do jk=1,jpkm1 
    205         DO jj=1,jpj 
    206           ua(2,jj,jk) = (ua(2,jj,jk) - z2dt * znugdt * laplacu(2,jj))*umask(2,jj,jk) 
    207         ENDDO 
    208         ENDDO 
    209  
    210         spgu(2,:)=0. 
    211  
    212         do jk=1,jpkm1 
    213         do jj=1,jpj 
    214         spgu(2,jj)=spgu(2,jj)+fse3u(2,jj,jk)*ua(2,jj,jk) 
    215         enddo 
    216         enddo 
    217  
    218         DO jj=1,jpj 
    219         IF (umask(2,jj,1).NE.0.) THEN 
    220          spgu(2,jj)=spgu(2,jj)/hu(2,jj) 
    221         ENDIF 
    222         enddo 
    223  
    224         Do jk=1,jpkm1 
    225         DO jj=1,jpj 
    226           ua(2,jj,jk) = 0.25*(ua(1,jj,jk)+2.*ua(2,jj,jk)+ua(3,jj,jk)) 
    227           ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 
    228         ENDDO 
    229         ENDDO 
    230  
    231         spgu1(2,:)=0. 
    232  
    233         do jk=1,jpkm1 
    234         do jj=1,jpj 
    235         spgu1(2,jj)=spgu1(2,jj)+fse3u(2,jj,jk)*ua(2,jj,jk) 
    236         enddo 
    237         enddo 
    238  
    239         DO jj=1,jpj 
    240         IF (umask(2,jj,1).NE.0.) THEN 
    241          spgu1(2,jj)=spgu1(2,jj)/hu(2,jj) 
    242         ENDIF 
    243         enddo 
    244  
    245         DO jk=1,jpkm1 
    246         DO jj=1,jpj 
    247          ua(2,jj,jk) = (ua(2,jj,jk)+spgu(2,jj)-spgu1(2,jj))*umask(2,jj,jk) 
    248         ENDDO 
    249         ENDDO 
    250  
    251         Do jk=1,jpkm1 
    252         Do jj=1,jpj 
    253            va(2,jj,jk) = (vatemp(2,jj,jk)/(rhox*e1v(2,jj)))*vmask(2,jj,jk) 
    254 #if ! defined key_zco 
    255            va(2,jj,jk) = va(2,jj,jk) / fse3v(2,jj,jk) 
     176      Agrif_SpecialValue=0. 
     177      Agrif_UseSpecialValue = .TRUE. 
     178      zua = 0. 
     179      zva = 0. 
     180      CALL Agrif_Bc_variable(zua,un,procname=interpu) 
     181      CALL Agrif_Bc_variable(zva,vn,procname=interpv) 
     182      zua2d = 0. 
     183      zva2d = 0. 
     184 
     185      Agrif_SpecialValue=0. 
     186      Agrif_UseSpecialValue = .TRUE. 
     187      CALL Agrif_Bc_variable(zua2d,e1u,calledweight=1.,procname=interpu2d) 
     188      CALL Agrif_Bc_variable(zva2d,e2v,calledweight=1.,procname=interpv2d) 
     189      Agrif_UseSpecialValue = .FALSE. 
     190 
     191 
     192      IF((nbondi == -1).OR.(nbondi == 2)) THEN 
     193 
     194         DO jj=1,jpj 
     195            laplacu(2,jj) = timeref * (zua2d(2,jj)/(rhoy*e2u(2,jj)))*umask(2,jj,1) 
     196         END DO 
     197 
     198         DO jk=1,jpkm1 
     199            DO jj=1,jpj 
     200               ua(1:2,jj,jk) = (zua(1:2,jj,jk)/(rhoy*e2u(1:2,jj))) 
     201#if ! defined key_zco 
     202               ua(1:2,jj,jk) = ua(1:2,jj,jk) / fse3u(1:2,jj,jk) 
     203#endif 
     204            END DO 
     205         END DO 
     206 
     207         DO jk=1,jpkm1 
     208            DO jj=1,jpj 
     209               ua(2,jj,jk) = (ua(2,jj,jk) - z2dt * znugdt * laplacu(2,jj))*umask(2,jj,jk) 
     210            END DO 
     211         END DO 
     212 
     213         spgu(2,:)=0. 
     214 
     215         DO jk=1,jpkm1 
     216            DO jj=1,jpj 
     217               spgu(2,jj)=spgu(2,jj)+fse3u(2,jj,jk)*ua(2,jj,jk) 
     218            END DO 
     219         END DO 
     220 
     221         DO jj=1,jpj 
     222            IF (umask(2,jj,1).NE.0.) THEN 
     223               spgu(2,jj)=spgu(2,jj)/hu(2,jj) 
     224            ENDIF 
     225         END DO 
     226 
     227         DO jk=1,jpkm1 
     228            DO jj=1,jpj 
     229               ua(2,jj,jk) = 0.25*(ua(1,jj,jk)+2.*ua(2,jj,jk)+ua(3,jj,jk)) 
     230               ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 
     231            END DO 
     232         END DO 
     233 
     234         spgu1(2,:)=0. 
     235 
     236         DO jk=1,jpkm1 
     237            DO jj=1,jpj 
     238               spgu1(2,jj)=spgu1(2,jj)+fse3u(2,jj,jk)*ua(2,jj,jk) 
     239            END DO 
     240         END DO 
     241 
     242         DO jj=1,jpj 
     243            IF (umask(2,jj,1).NE.0.) THEN 
     244               spgu1(2,jj)=spgu1(2,jj)/hu(2,jj) 
     245            ENDIF 
     246         END DO 
     247 
     248         DO jk=1,jpkm1 
     249            DO jj=1,jpj 
     250               ua(2,jj,jk) = (ua(2,jj,jk)+spgu(2,jj)-spgu1(2,jj))*umask(2,jj,jk) 
     251            END DO 
     252         END DO 
     253 
     254         DO jk=1,jpkm1 
     255            DO jj=1,jpj 
     256               va(2,jj,jk) = (zva(2,jj,jk)/(zrhox*e1v(2,jj)))*vmask(2,jj,jk) 
     257#if ! defined key_zco 
     258               va(2,jj,jk) = va(2,jj,jk) / fse3v(2,jj,jk) 
    256259#endif            
    257         End Do 
    258         End Do 
    259  
    260         sshn(2,:)=sshn(3,:) 
    261         sshb(2,:)=sshb(3,:) 
    262                                  
    263         ENDIF 
    264  
    265         If ((nbondi == 1).OR.(nbondi == 2)) THEN 
    266  
    267         DO jj=1,jpj 
    268           laplacu(nlci-2,jj) = timeref * (uatemp2d(nlci-2,jj)/(rhoy*e2u(nlci-2,jj))) 
    269         ENDDO 
    270  
    271         Do jk=1,jpkm1 
    272         DO jj=1,jpj 
    273           ua(nlci-2:nlci-1,jj,jk) = (uatemp(nlci-2:nlci-1,jj,jk)/(rhoy*e2u(nlci-2:nlci-1,jj))) 
    274  
    275 #if ! defined key_zco 
    276            ua(nlci-2:nlci-1,jj,jk) = ua(nlci-2:nlci-1,jj,jk) / fse3u(nlci-2:nlci-1,jj,jk) 
    277 #endif 
    278  
    279         ENDDO 
    280         ENDDO 
    281  
    282         Do jk=1,jpkm1 
    283         DO jj=1,jpj 
    284           ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)- z2dt * znugdt * laplacu(nlci-2,jj))*umask(nlci-2,jj,jk) 
    285         ENDDO 
    286         ENDDO 
    287  
    288  
    289         spgu(nlci-2,:)=0. 
    290  
    291         do jk=1,jpkm1 
    292         do jj=1,jpj 
    293         spgu(nlci-2,jj)=spgu(nlci-2,jj)+fse3u(nlci-2,jj,jk)*ua(nlci-2,jj,jk) 
    294         enddo 
    295         enddo 
    296  
    297         DO jj=1,jpj 
    298         IF (umask(nlci-2,jj,1).NE.0.) THEN 
    299          spgu(nlci-2,jj)=spgu(nlci-2,jj)/hu(nlci-2,jj) 
    300         ENDIF 
    301         enddo 
    302  
    303         Do jk=1,jpkm1 
    304         DO jj=1,jpj 
    305          ua(nlci-2,jj,jk) = 0.25*(ua(nlci-3,jj,jk)+2.*ua(nlci-2,jj,jk)+ua(nlci-1,jj,jk)) 
    306  
    307           ua(nlci-2,jj,jk) = ua(nlci-2,jj,jk) * umask(nlci-2,jj,jk) 
    308  
    309         ENDDO 
    310         ENDDO 
    311  
    312         spgu1(nlci-2,:)=0. 
    313  
    314         do jk=1,jpkm1 
    315         do jj=1,jpj 
    316         spgu1(nlci-2,jj)=spgu1(nlci-2,jj)+fse3u(nlci-2,jj,jk)*ua(nlci-2,jj,jk)*umask(nlci-2,jj,jk) 
    317         enddo 
    318         enddo 
    319  
    320         DO jj=1,jpj 
    321         IF (umask(nlci-2,jj,1).NE.0.) THEN 
    322          spgu1(nlci-2,jj)=spgu1(nlci-2,jj)/hu(nlci-2,jj) 
    323         ENDIF 
    324         enddo 
    325  
    326         DO jk=1,jpkm1 
    327         DO jj=1,jpj 
    328          ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)+spgu(nlci-2,jj)-spgu1(nlci-2,jj))*umask(nlci-2,jj,jk) 
    329         ENDDO 
    330         ENDDO 
    331  
    332         Do jk=1,jpkm1 
    333         Do jj=1,jpj-1 
    334            va(nlci-1,jj,jk) = (vatemp(nlci-1,jj,jk)/(rhox*e1v(nlci-1,jj)))*vmask(nlci-1,jj,jk) 
    335 #if ! defined key_zco 
    336            va(nlci-1,jj,jk) = va(nlci-1,jj,jk) / fse3v(nlci-1,jj,jk) 
    337 #endif 
    338         End Do 
    339         End Do 
    340  
    341         sshn(nlci-1,:)=sshn(nlci-2,:) 
    342         sshb(nlci-1,:)=sshb(nlci-2,:)         
    343         ENDIF 
    344  
    345         If ((nbondj == -1).OR.(nbondj == 2)) THEN 
    346  
    347         DO ji=1,jpi 
    348           laplacv(ji,2) = timeref * (vatemp2d(ji,2)/(rhox*e1v(ji,2))) 
    349         ENDDO 
    350  
    351         DO jk=1,jpkm1 
    352         DO ji=1,jpi 
    353           va(ji,1:2,jk) = (vatemp(ji,1:2,jk)/(rhox*e1v(ji,1:2))) 
    354 #if ! defined key_zco 
    355            va(ji,1:2,jk) = va(ji,1:2,jk) / fse3v(ji,1:2,jk) 
    356 #endif 
    357         ENDDO 
    358         ENDDO 
    359  
    360         DO jk=1,jpkm1 
    361         DO ji=1,jpi 
    362           va(ji,2,jk) = (va(ji,2,jk) - z2dt * znugdt * laplacv(ji,2))*vmask(ji,2,jk) 
    363         ENDDO 
    364         ENDDO 
    365  
    366         spgv(:,2)=0. 
    367  
    368         do jk=1,jpkm1 
    369         do ji=1,jpi 
    370         spgv(ji,2)=spgv(ji,2)+fse3v(ji,2,jk)*va(ji,2,jk) 
    371         enddo 
    372         enddo 
    373  
    374         DO ji=1,jpi 
    375         IF (vmask(ji,2,1).NE.0.) THEN 
    376          spgv(ji,2)=spgv(ji,2)/hv(ji,2) 
    377         ENDIF 
    378         enddo 
    379  
    380         DO jk=1,jpkm1 
    381         DO ji=1,jpi 
    382           va(ji,2,jk)=0.25*(va(ji,1,jk)+2.*va(ji,2,jk)+va(ji,3,jk)) 
    383            va(ji,2,jk)=va(ji,2,jk)*vmask(ji,2,jk) 
    384         ENDDO 
    385         ENDDO 
    386  
    387         spgv1(:,2)=0. 
    388  
    389         do jk=1,jpkm1 
    390         do ji=1,jpi 
    391         spgv1(ji,2)=spgv1(ji,2)+fse3v(ji,2,jk)*va(ji,2,jk)*vmask(ji,2,jk) 
    392         enddo 
    393         enddo 
    394  
    395         DO ji=1,jpi 
    396         IF (vmask(ji,2,1).NE.0.) THEN 
    397          spgv1(ji,2)=spgv1(ji,2)/hv(ji,2) 
    398         ENDIF 
    399         enddo 
    400  
    401         DO jk=1,jpkm1 
    402         DO ji=1,jpi 
    403          va(ji,2,jk) = (va(ji,2,jk)+spgv(ji,2)-spgv1(ji,2))*vmask(ji,2,jk) 
    404         ENDDO 
    405         ENDDO 
    406  
    407         DO jk=1,jpkm1 
    408         DO ji=1,jpi 
    409         ua(ji,2,jk) = (uatemp(ji,2,jk)/(rhoy*e2u(ji,2)))*umask(ji,2,jk)  
    410 #if ! defined key_zco 
    411            ua(ji,2,jk) = ua(ji,2,jk) / fse3u(ji,2,jk) 
     260            END DO 
     261         END DO 
     262 
     263         sshn(2,:)=sshn(3,:) 
     264         sshb(2,:)=sshb(3,:) 
     265 
     266      ENDIF 
     267 
     268      IF((nbondi == 1).OR.(nbondi == 2)) THEN 
     269 
     270         DO jj=1,jpj 
     271            laplacu(nlci-2,jj) = timeref * (zua2d(nlci-2,jj)/(rhoy*e2u(nlci-2,jj))) 
     272         END DO 
     273 
     274         DO jk=1,jpkm1 
     275            DO jj=1,jpj 
     276               ua(nlci-2:nlci-1,jj,jk) = (zua(nlci-2:nlci-1,jj,jk)/(rhoy*e2u(nlci-2:nlci-1,jj))) 
     277 
     278#if ! defined key_zco 
     279               ua(nlci-2:nlci-1,jj,jk) = ua(nlci-2:nlci-1,jj,jk) / fse3u(nlci-2:nlci-1,jj,jk) 
     280#endif 
     281 
     282            END DO 
     283         END DO 
     284 
     285         DO jk=1,jpkm1 
     286            DO jj=1,jpj 
     287               ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)- z2dt * znugdt * laplacu(nlci-2,jj))*umask(nlci-2,jj,jk) 
     288            END DO 
     289         END DO 
     290 
     291 
     292         spgu(nlci-2,:)=0. 
     293 
     294         do jk=1,jpkm1 
     295            do jj=1,jpj 
     296               spgu(nlci-2,jj)=spgu(nlci-2,jj)+fse3u(nlci-2,jj,jk)*ua(nlci-2,jj,jk) 
     297            enddo 
     298         enddo 
     299 
     300         DO jj=1,jpj 
     301            IF (umask(nlci-2,jj,1).NE.0.) THEN 
     302               spgu(nlci-2,jj)=spgu(nlci-2,jj)/hu(nlci-2,jj) 
     303            ENDIF 
     304         END DO 
     305 
     306         DO jk=1,jpkm1 
     307            DO jj=1,jpj 
     308               ua(nlci-2,jj,jk) = 0.25*(ua(nlci-3,jj,jk)+2.*ua(nlci-2,jj,jk)+ua(nlci-1,jj,jk)) 
     309 
     310               ua(nlci-2,jj,jk) = ua(nlci-2,jj,jk) * umask(nlci-2,jj,jk) 
     311 
     312            END DO 
     313         END DO 
     314 
     315         spgu1(nlci-2,:)=0. 
     316 
     317         DO jk=1,jpkm1 
     318            DO jj=1,jpj 
     319               spgu1(nlci-2,jj)=spgu1(nlci-2,jj)+fse3u(nlci-2,jj,jk)*ua(nlci-2,jj,jk)*umask(nlci-2,jj,jk) 
     320            END DO 
     321         END DO 
     322 
     323         DO jj=1,jpj 
     324            IF (umask(nlci-2,jj,1).NE.0.) THEN 
     325               spgu1(nlci-2,jj)=spgu1(nlci-2,jj)/hu(nlci-2,jj) 
     326            ENDIF 
     327         END DO 
     328 
     329         DO jk=1,jpkm1 
     330            DO jj=1,jpj 
     331               ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)+spgu(nlci-2,jj)-spgu1(nlci-2,jj))*umask(nlci-2,jj,jk) 
     332            END DO 
     333         END DO 
     334 
     335         DO jk=1,jpkm1 
     336            DO jj=1,jpj-1 
     337               va(nlci-1,jj,jk) = (zva(nlci-1,jj,jk)/(zrhox*e1v(nlci-1,jj)))*vmask(nlci-1,jj,jk) 
     338#if ! defined key_zco 
     339               va(nlci-1,jj,jk) = va(nlci-1,jj,jk) / fse3v(nlci-1,jj,jk) 
     340#endif 
     341            END DO 
     342         END DO 
     343 
     344         sshn(nlci-1,:)=sshn(nlci-2,:) 
     345         sshb(nlci-1,:)=sshb(nlci-2,:)         
     346      ENDIF 
     347 
     348      IF((nbondj == -1).OR.(nbondj == 2)) THEN 
     349 
     350         DO ji=1,jpi 
     351            laplacv(ji,2) = timeref * (zva2d(ji,2)/(zrhox*e1v(ji,2))) 
     352         END DO 
     353 
     354         DO jk=1,jpkm1 
     355            DO ji=1,jpi 
     356               va(ji,1:2,jk) = (zva(ji,1:2,jk)/(zrhox*e1v(ji,1:2))) 
     357#if ! defined key_zco 
     358               va(ji,1:2,jk) = va(ji,1:2,jk) / fse3v(ji,1:2,jk) 
     359#endif 
     360            END DO 
     361         END DO 
     362 
     363         DO jk=1,jpkm1 
     364            DO ji=1,jpi 
     365               va(ji,2,jk) = (va(ji,2,jk) - z2dt * znugdt * laplacv(ji,2))*vmask(ji,2,jk) 
     366            END DO 
     367         END DO 
     368 
     369         spgv(:,2)=0. 
     370 
     371         DO jk=1,jpkm1 
     372            DO ji=1,jpi 
     373               spgv(ji,2)=spgv(ji,2)+fse3v(ji,2,jk)*va(ji,2,jk) 
     374            END DO 
     375         END DO 
     376 
     377         DO ji=1,jpi 
     378            IF (vmask(ji,2,1).NE.0.) THEN 
     379               spgv(ji,2)=spgv(ji,2)/hv(ji,2) 
     380            ENDIF 
     381         END DO 
     382 
     383         DO jk=1,jpkm1 
     384            DO ji=1,jpi 
     385               va(ji,2,jk)=0.25*(va(ji,1,jk)+2.*va(ji,2,jk)+va(ji,3,jk)) 
     386               va(ji,2,jk)=va(ji,2,jk)*vmask(ji,2,jk) 
     387            END DO 
     388         END DO 
     389 
     390         spgv1(:,2)=0. 
     391 
     392         DO jk=1,jpkm1 
     393            DO ji=1,jpi 
     394               spgv1(ji,2)=spgv1(ji,2)+fse3v(ji,2,jk)*va(ji,2,jk)*vmask(ji,2,jk) 
     395            END DO 
     396         END DO 
     397 
     398         DO ji=1,jpi 
     399            IF (vmask(ji,2,1).NE.0.) THEN 
     400               spgv1(ji,2)=spgv1(ji,2)/hv(ji,2) 
     401            ENDIF 
     402         END DO 
     403 
     404         DO jk=1,jpkm1 
     405            DO ji=1,jpi 
     406               va(ji,2,jk) = (va(ji,2,jk)+spgv(ji,2)-spgv1(ji,2))*vmask(ji,2,jk) 
     407            END DO 
     408         END DO 
     409 
     410         DO jk=1,jpkm1 
     411            DO ji=1,jpi 
     412               ua(ji,2,jk) = (zua(ji,2,jk)/(rhoy*e2u(ji,2)))*umask(ji,2,jk)  
     413#if ! defined key_zco 
     414               ua(ji,2,jk) = ua(ji,2,jk) / fse3u(ji,2,jk) 
    412415#endif                 
    413         ENDDO 
    414         ENDDO 
    415  
    416         sshn(:,2)=sshn(:,3) 
    417         sshb(:,2)=sshb(:,3) 
    418         ENDIF 
    419  
    420         If ((nbondj == 1).OR.(nbondj == 2)) THEN 
    421  
    422         DO ji=1,jpi 
    423           laplacv(ji,nlcj-2) = timeref * (vatemp2d(ji,nlcj-2)/(rhox*e1v(ji,nlcj-2))) 
    424         ENDDO 
    425  
    426         DO jk=1,jpkm1 
    427         DO ji=1,jpi 
    428           va(ji,nlcj-2:nlcj-1,jk) = (vatemp(ji,nlcj-2:nlcj-1,jk)/(rhox*e1v(ji,nlcj-2:nlcj-1))) 
    429 #if ! defined key_zco 
    430            va(ji,nlcj-2:nlcj-1,jk) = va(ji,nlcj-2:nlcj-1,jk) / fse3v(ji,nlcj-2:nlcj-1,jk) 
    431 #endif 
    432         ENDDO 
    433         ENDDO 
    434  
    435         DO jk=1,jpkm1 
    436         DO ji=1,jpi 
    437           va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)-z2dt * znugdt * laplacv(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 
    438         ENDDO 
    439         ENDDO 
    440  
    441  
    442         spgv(:,nlcj-2)=0. 
    443  
    444         do jk=1,jpkm1 
    445         do ji=1,jpi 
    446         spgv(ji,nlcj-2)=spgv(ji,nlcj-2)+fse3v(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 
    447         enddo 
    448         enddo 
    449  
    450         DO ji=1,jpi 
    451         IF (vmask(ji,nlcj-2,1).NE.0.) THEN 
    452          spgv(ji,nlcj-2)=spgv(ji,nlcj-2)/hv(ji,nlcj-2) 
    453         ENDIF 
    454         enddo 
    455  
    456         DO jk=1,jpkm1 
    457         DO ji=1,jpi 
    458            va(ji,nlcj-2,jk)=0.25*(va(ji,nlcj-3,jk)+2.*va(ji,nlcj-2,jk)+va(ji,nlcj-1,jk)) 
    459            va(ji,nlcj-2,jk) = va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 
    460         ENDDO 
    461         ENDDO 
    462  
    463         spgv1(:,nlcj-2)=0. 
    464  
    465         do jk=1,jpkm1 
    466         do ji=1,jpi 
    467         spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)+fse3v(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 
    468         enddo 
    469         enddo 
    470  
    471         DO ji=1,jpi 
    472         IF (vmask(ji,nlcj-2,1).NE.0.) THEN 
    473          spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)/hv(ji,nlcj-2) 
    474         ENDIF 
    475         enddo 
    476  
    477         DO jk=1,jpkm1 
    478         DO ji=1,jpi 
    479         va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)+spgv(ji,nlcj-2)-spgv1(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 
    480         ENDDO 
    481         ENDDO 
    482  
    483         DO jk=1,jpkm1 
    484         DO ji=1,jpi 
    485           ua(ji,nlcj-1,jk) = (uatemp(ji,nlcj-1,jk)/(rhoy*e2u(ji,nlcj-1)))*umask(ji,nlcj-1,jk) 
    486 #if ! defined key_zco 
    487            ua(ji,nlcj-1,jk) = ua(ji,nlcj-1,jk) / fse3u(ji,nlcj-1,jk) 
     416            END DO 
     417         END DO 
     418 
     419         sshn(:,2)=sshn(:,3) 
     420         sshb(:,2)=sshb(:,3) 
     421      ENDIF 
     422 
     423      IF((nbondj == 1).OR.(nbondj == 2)) THEN 
     424 
     425         DO ji=1,jpi 
     426            laplacv(ji,nlcj-2) = timeref * (zva2d(ji,nlcj-2)/(zrhox*e1v(ji,nlcj-2))) 
     427         END DO 
     428 
     429         DO jk=1,jpkm1 
     430            DO ji=1,jpi 
     431               va(ji,nlcj-2:nlcj-1,jk) = (zva(ji,nlcj-2:nlcj-1,jk)/(zrhox*e1v(ji,nlcj-2:nlcj-1))) 
     432#if ! defined key_zco 
     433               va(ji,nlcj-2:nlcj-1,jk) = va(ji,nlcj-2:nlcj-1,jk) / fse3v(ji,nlcj-2:nlcj-1,jk) 
     434#endif 
     435            END DO 
     436         END DO 
     437 
     438         DO jk=1,jpkm1 
     439            DO ji=1,jpi 
     440               va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)-z2dt * znugdt * laplacv(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 
     441            END DO 
     442         END DO 
     443 
     444 
     445         spgv(:,nlcj-2)=0. 
     446 
     447         DO jk=1,jpkm1 
     448            DO ji=1,jpi 
     449               spgv(ji,nlcj-2)=spgv(ji,nlcj-2)+fse3v(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 
     450            END DO 
     451         END DO 
     452 
     453         DO ji=1,jpi 
     454            IF (vmask(ji,nlcj-2,1).NE.0.) THEN 
     455               spgv(ji,nlcj-2)=spgv(ji,nlcj-2)/hv(ji,nlcj-2) 
     456            ENDIF 
     457         END DO 
     458 
     459         DO jk=1,jpkm1 
     460            DO ji=1,jpi 
     461               va(ji,nlcj-2,jk)=0.25*(va(ji,nlcj-3,jk)+2.*va(ji,nlcj-2,jk)+va(ji,nlcj-1,jk)) 
     462               va(ji,nlcj-2,jk) = va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 
     463            END DO 
     464         END DO 
     465 
     466         spgv1(:,nlcj-2)=0. 
     467 
     468         DO jk=1,jpkm1 
     469            DO ji=1,jpi 
     470               spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)+fse3v(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 
     471            END DO 
     472         END DO 
     473 
     474         DO ji=1,jpi 
     475            IF (vmask(ji,nlcj-2,1).NE.0.) THEN 
     476               spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)/hv(ji,nlcj-2) 
     477            ENDIF 
     478         END DO 
     479 
     480         DO jk=1,jpkm1 
     481            DO ji=1,jpi 
     482               va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)+spgv(ji,nlcj-2)-spgv1(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 
     483            END DO 
     484         END DO 
     485 
     486         DO jk=1,jpkm1 
     487            DO ji=1,jpi 
     488               ua(ji,nlcj-1,jk) = (zua(ji,nlcj-1,jk)/(rhoy*e2u(ji,nlcj-1)))*umask(ji,nlcj-1,jk) 
     489#if ! defined key_zco 
     490               ua(ji,nlcj-1,jk) = ua(ji,nlcj-1,jk) / fse3u(ji,nlcj-1,jk) 
    488491#endif           
    489         ENDDO 
    490         ENDDO 
    491          
    492         sshn(:,nlcj-1)=sshn(:,nlcj-2) 
    493         sshb(:,nlcj-1)=sshb(:,nlcj-2)                 
    494         ENDIF 
    495              
    496 ! 
    497       Return 
    498       End Subroutine Agrif_dyn 
    499  
    500  
    501        subroutine interpu(tabres,i1,i2,j1,j2,k1,k2) 
    502        Implicit none 
    503 #  include "domzgr_substitute.h90"        
    504        integer i1,i2,j1,j2,k1,k2 
    505        integer ji,jj,jk 
    506        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    507  
    508        do jk=k1,k2 
    509        DO jj=j1,j2 
    510        DO ji=i1,i2 
    511          tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 
    512 #if ! defined key_zco 
    513           tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u(ji,jj,jk) 
    514 #endif 
    515        ENDDO 
    516        ENDDO 
    517        ENDDO 
    518        end subroutine interpu 
    519  
    520        subroutine interpu2d(tabres,i1,i2,j1,j2) 
    521        Implicit none 
    522        integer i1,i2,j1,j2 
    523        integer ji,jj 
    524        real,dimension(i1:i2,j1:j2) :: tabres 
    525  
    526        DO jj=j1,j2 
    527        DO ji=i1,i2 
    528          tabres(ji,jj) = e2u(ji,jj) * ((gcx(ji+1,jj) - gcx(ji,jj))/e1u(ji,jj)) & 
    529                                        *umask(ji,jj,1) 
    530        ENDDO 
    531        ENDDO 
    532        end subroutine interpu2d 
    533  
    534        subroutine interpv(tabres,i1,i2,j1,j2,k1,k2) 
    535        Implicit none 
    536 #  include "domzgr_substitute.h90"        
    537        integer i1,i2,j1,j2,k1,k2 
    538        integer ji,jj,jk 
    539        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    540  
    541        do jk=k1,k2 
    542        DO jj=j1,j2 
    543        DO ji=i1,i2 
    544          tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 
    545 #if ! defined key_zco 
    546           tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v(ji,jj,jk) 
     492            END DO 
     493         END DO 
     494 
     495         sshn(:,nlcj-1)=sshn(:,nlcj-2) 
     496         sshb(:,nlcj-1)=sshb(:,nlcj-2)                 
     497      ENDIF 
     498 
     499   END SUBROUTINE Agrif_dyn 
     500 
     501   SUBROUTINE interpu(tabres,i1,i2,j1,j2,k1,k2) 
     502      !!--------------------------------------------- 
     503      !!   *** ROUTINE interpu *** 
     504      !!--------------------------------------------- 
     505#  include "domzgr_substitute.h90"    
     506     
     507      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     508      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     509 
     510      INTEGER :: ji,jj,jk 
     511 
     512      DO jk=k1,k2 
     513         DO jj=j1,j2 
     514            DO ji=i1,i2 
     515               tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 
     516#if ! defined key_zco 
     517               tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u(ji,jj,jk) 
     518#endif 
     519            END DO 
     520         END DO 
     521      END DO 
     522   END SUBROUTINE interpu 
     523 
     524   SUBROUTINE interpu2d(tabres,i1,i2,j1,j2) 
     525      !!--------------------------------------------- 
     526      !!   *** ROUTINE interpu2d *** 
     527      !!--------------------------------------------- 
     528 
     529      INTEGER, INTENT(in) :: i1,i2,j1,j2 
     530      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     531 
     532      INTEGER :: ji,jj 
     533 
     534      DO jj=j1,j2 
     535         DO ji=i1,i2 
     536            tabres(ji,jj) = e2u(ji,jj) * ((gcx(ji+1,jj) - gcx(ji,jj))/e1u(ji,jj)) & 
     537               * umask(ji,jj,1) 
     538         END DO 
     539      END DO 
     540 
     541   END SUBROUTINE interpu2d 
     542 
     543   SUBROUTINE interpv(tabres,i1,i2,j1,j2,k1,k2) 
     544      !!--------------------------------------------- 
     545      !!   *** ROUTINE interpv *** 
     546      !!--------------------------------------------- 
     547#  include "domzgr_substitute.h90"  
     548       
     549      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     550      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     551 
     552      INTEGER :: ji, jj, jk 
     553 
     554      DO jk=k1,k2 
     555         DO jj=j1,j2 
     556            DO ji=i1,i2 
     557               tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 
     558#if ! defined key_zco 
     559               tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v(ji,jj,jk) 
    547560#endif            
    548        ENDDO 
    549        ENDDO 
    550        ENDDO 
    551        end subroutine interpv 
    552  
    553        subroutine interpv2d(tabres,i1,i2,j1,j2) 
    554        Implicit none 
    555        integer i1,i2,j1,j2 
    556        integer ji,jj 
    557        real,dimension(i1:i2,j1:j2) :: tabres 
    558  
    559        DO jj=j1,j2 
    560        DO ji=i1,i2 
    561          tabres(ji,jj) = e1v(ji,jj) * ((gcx(ji,jj+1) - gcx(ji,jj))/e2v(ji,jj)) & 
    562                                        * vmask(ji,jj,1) 
    563        ENDDO 
    564        ENDDO 
    565        end subroutine interpv2d 
     561            END DO 
     562         END DO 
     563      END DO 
     564 
     565   END SUBROUTINE interpv 
     566 
     567   SUBROUTINE interpv2d(tabres,i1,i2,j1,j2) 
     568      !!--------------------------------------------- 
     569      !!   *** ROUTINE interpv2d *** 
     570      !!--------------------------------------------- 
     571 
     572      INTEGER, INTENT(in) :: i1,i2,j1,j2 
     573      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     574 
     575      INTEGER :: ji,jj 
     576 
     577      DO jj=j1,j2 
     578         DO ji=i1,i2 
     579            tabres(ji,jj) = e1v(ji,jj) * ((gcx(ji,jj+1) - gcx(ji,jj))/e2v(ji,jj)) & 
     580               * vmask(ji,jj,1) 
     581         END DO 
     582      END DO 
     583 
     584   END SUBROUTINE interpv2d 
    566585 
    567586#else 
    568       CONTAINS 
    569       subroutine Agrif_OPA_Interp_empty 
    570  
    571       end subroutine Agrif_OPA_Interp_empty 
    572 #endif 
    573       End Module agrif_opa_interp 
    574  
     587CONTAINS 
     588 
     589   SUBROUTINE Agrif_OPA_Interp_empty 
     590      !!--------------------------------------------- 
     591      !!   *** ROUTINE agrif_OPA_Interp_empty *** 
     592      !!--------------------------------------------- 
     593      WRITE(*,*)  'agrif_opa_interp : You should not have seen this print! error?' 
     594   END SUBROUTINE Agrif_OPA_Interp_empty 
     595#endif 
     596END MODULE agrif_opa_interp 
     597 
  • trunk/NEMO/NST_SRC/agrif_opa_sponge.F90

    r469 r636  
    11#define SPONGE 
    22 
    3       Module agrif_opa_sponge 
     3Module agrif_opa_sponge 
    44#if defined key_agrif 
    5       USE par_oce 
    6       USE oce 
    7       USE dom_oce 
    8        
    9       Contains 
    10  
    11  
    12       Subroutine Agrif_Sponge_Tra( kt ) 
    13  
    14       implicit none 
    15  
    16       INTEGER :: kt 
    17       REAL(wp), DIMENSION(jpi,jpj,jpk) :: tabtemp, tbdiff, sbdiff 
     5   USE par_oce 
     6   USE oce 
     7   USE dom_oce 
     8   USE in_out_manager 
     9 
     10   IMPLICIT NONE 
     11   PRIVATE 
     12 
     13   PUBLIC Agrif_Sponge_Tra, Agrif_Sponge_Dyn, interptn, interpsn, interpun, interpvn 
     14 
     15   !! * Namelist (namagrif) 
     16   REAL(wp) :: visc_tra = rdt 
     17   REAL(wp) :: visc_dyn = rdt 
     18 
     19   CONTAINS 
     20 
     21   SUBROUTINE Agrif_Sponge_Tra( kt ) 
     22      !!--------------------------------------------- 
     23      !!   *** ROUTINE Agrif_Sponge_Tra *** 
     24      !!--------------------------------------------- 
     25#include "domzgr_substitute.h90" 
     26 
     27      INTEGER, INTENT(in) :: kt 
     28 
    1829      INTEGER :: ji,jj,jk 
    19       REAL(wp) :: viscsponge 
    2030      REAL(wp), DIMENSION(jpi,jpj,jpk) :: umasktemp,vmasktemp 
    2131      INTEGER :: spongearea 
    22       integer ipt,jpt 
    23       real,dimension(:,:),pointer :: e1tparent,e2tparent 
     32      REAL(wp) :: timecoeff 
     33      REAL(wp) :: zta, zsa, zabe1, zabe2, zbtr 
    2434      REAL(wp), DIMENSION(jpi,jpj) :: localviscsponge 
    25       real(wp) :: timecoeff 
     35      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztab, tbdiff, sbdiff 
    2636      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu ,ztv, zsu ,zsv 
    27       REAL(wp) :: zta, zsa, zabe1, zabe2, zbtr 
    28  
    29 #include "domzgr_substitute.h90" 
    30  
    31          
     37 
    3238#if defined SPONGE 
    3339 
    34       timecoeff = real(Agrif_NbStepint())/Agrif_rhot() 
     40      IF( kt == nit000  )   CALL agrif_sponge_init 
     41 
     42      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    3543 
    3644      Agrif_SpecialValue=0. 
    3745      Agrif_UseSpecialValue = .TRUE. 
    38       tabtemp = 0. 
    39       Call Agrif_Bc_Variable(tabtemp, ta,calledweight=timecoeff,procname=interptn) 
     46      ztab = 0.e0 
     47      CALL Agrif_Bc_Variable(ztab, ta,calledweight=timecoeff,procname=interptn) 
    4048      Agrif_UseSpecialValue = .FALSE. 
    4149 
    42       tbdiff(:,:,:) = tb(:,:,:) - tabtemp(:,:,:) 
    43  
    44       tabtemp = 0. 
     50      tbdiff(:,:,:) = tb(:,:,:) - ztab(:,:,:) 
     51 
     52      ztab = 0.e0 
    4553      Agrif_SpecialValue=0. 
    4654      Agrif_UseSpecialValue = .TRUE. 
    47       Call Agrif_Bc_Variable(tabtemp, sa,calledweight=timecoeff,procname=interpsn) 
     55      CALL Agrif_Bc_Variable(ztab, sa,calledweight=timecoeff,procname=interpsn) 
    4856      Agrif_UseSpecialValue = .FALSE. 
    4957 
    50       sbdiff(:,:,:) = sb(:,:,:) - tabtemp(:,:,:) 
    51         
    52       viscsponge = rdt 
     58      sbdiff(:,:,:) = sb(:,:,:) - ztab(:,:,:) 
    5359 
    5460      spongearea = 2 + 2 * Agrif_irhox() 
     
    5965 
    6066      IF ((nbondi == -1).OR.(nbondi == 2)) THEN 
    61  
    62         DO ji = 2, spongearea 
    63           localviscsponge(ji,:) = viscsponge * (spongearea-ji)/real(spongearea-2) 
    64         ENDDO 
    65  
    66         DO jk = 1, jpkm1 
    67           umasktemp(2:spongearea-1,:,jk) = umask(2:spongearea-1,:,jk) & 
    68            * 0.5 * (localviscsponge(2:spongearea-1,:) + localviscsponge(3:spongearea,:)) 
    69         ENDDO 
    70  
    71        DO jk = 1, jpkm1 
    72          vmasktemp(2:spongearea,1:jpjm1,jk) = vmask(2:spongearea,1:jpjm1,jk) & 
    73           * 0.5 * (localviscsponge(2:spongearea,1:jpjm1) + localviscsponge(2:spongearea,2:jpj)) 
    74        ENDDO 
    75  
     67         DO ji = 2, spongearea 
     68            localviscsponge(ji,:) = visc_tra * (spongearea-ji)/real(spongearea-2) 
     69         ENDDO 
     70         DO jk = 1, jpkm1 
     71            umasktemp(2:spongearea-1,:,jk) = umask(2:spongearea-1,:,jk) & 
     72               * 0.5 * (localviscsponge(2:spongearea-1,:) + localviscsponge(3:spongearea,:)) 
     73         ENDDO 
     74         DO jk = 1, jpkm1 
     75            vmasktemp(2:spongearea,1:jpjm1,jk) = vmask(2:spongearea,1:jpjm1,jk) & 
     76               * 0.5 * (localviscsponge(2:spongearea,1:jpjm1) + localviscsponge(2:spongearea,2:jpj)) 
     77         ENDDO 
    7678      ENDIF 
    7779 
    7880      IF ((nbondi == 1).OR.(nbondi == 2)) THEN 
    79  
    80         DO ji = nlci-spongearea + 1,nlci-1 
    81           localviscsponge(ji,:) = viscsponge * (ji - (nlci-spongearea+1))/real(spongearea-2) 
    82         ENDDO 
    83  
    84        DO jk = 1, jpkm1 
    85         umasktemp(nlci-spongearea + 1:nlci-2,:,jk) = umask(nlci-spongearea + 1:nlci-2,:,jk) & 
    86          * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-2,:) + localviscsponge(nlci-spongearea + 2:nlci-1,:)) 
    87        ENDDO 
    88  
    89        DO jk = 1, jpkm1 
    90         vmasktemp(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) = vmask(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) & 
    91           * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-1,1:jpjm1) + localviscsponge(nlci-spongearea + 1:nlci-1,2:jpj)) 
    92        ENDDO 
    93  
    94       ENDIF 
    95  
     81         DO ji = nlci-spongearea + 1,nlci-1 
     82            localviscsponge(ji,:) = visc_tra * (ji - (nlci-spongearea+1))/real(spongearea-2) 
     83         ENDDO 
     84         DO jk = 1, jpkm1 
     85            umasktemp(nlci-spongearea + 1:nlci-2,:,jk) = umask(nlci-spongearea + 1:nlci-2,:,jk) & 
     86               * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-2,:) + localviscsponge(nlci-spongearea + 2:nlci-1,:)) 
     87         ENDDO 
     88         DO jk = 1, jpkm1 
     89            vmasktemp(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) = vmask(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) & 
     90               * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-1,1:jpjm1) + localviscsponge(nlci-spongearea + 1:nlci-1,2:jpj)) 
     91         ENDDO 
     92      ENDIF 
    9693 
    9794 
    9895      IF ((nbondj == -1).OR.(nbondj == 2)) THEN 
    99  
    100         DO jj = 2, spongearea 
    101         localviscsponge(:,jj) = viscsponge * (spongearea-jj)/real(spongearea-2) 
    102         ENDDO 
    103  
    104       DO jk = 1, jpkm1 
    105       vmasktemp(:,2:spongearea-1,jk) = vmask(:,2:spongearea-1,jk) & 
    106          * 0.5 * (localviscsponge(:,2:spongearea-1) + localviscsponge(:,3:spongearea)) 
    107         ENDDO 
    108  
    109       DO jk = 1, jpkm1 
    110        umasktemp(1:jpim1,2:spongearea,jk) = umask(1:jpim1,2:spongearea,jk) & 
    111          * 0.5 * (localviscsponge(1:jpim1,2:spongearea) + localviscsponge(2:jpi,2:spongearea)) 
    112       ENDDO 
    113  
     96         DO jj = 2, spongearea 
     97            localviscsponge(:,jj) = visc_tra * (spongearea-jj)/real(spongearea-2) 
     98         ENDDO 
     99         DO jk = 1, jpkm1 
     100            vmasktemp(:,2:spongearea-1,jk) = vmask(:,2:spongearea-1,jk) & 
     101               * 0.5 * (localviscsponge(:,2:spongearea-1) + localviscsponge(:,3:spongearea)) 
     102         ENDDO 
     103         DO jk = 1, jpkm1 
     104            umasktemp(1:jpim1,2:spongearea,jk) = umask(1:jpim1,2:spongearea,jk) & 
     105               * 0.5 * (localviscsponge(1:jpim1,2:spongearea) + localviscsponge(2:jpi,2:spongearea)) 
     106         ENDDO 
    114107      ENDIF 
    115108 
    116109      IF ((nbondj == 1).OR.(nbondj == 2)) THEN 
    117  
    118         DO jj = nlcj-spongearea + 1,nlcj-1 
    119        localviscsponge(:,jj) = viscsponge * (jj - (nlcj-spongearea+1))/real(spongearea-2) 
    120        ENDDO 
    121  
    122       DO jk = 1, jpkm1 
    123        vmasktemp(:,nlcj-spongearea + 1:nlcj-2,jk) = vmask(:,nlcj-spongearea + 1:nlcj-2,jk) & 
    124           * 0.5 * (localviscsponge(:,nlcj-spongearea + 1:nlcj-2) + localviscsponge(:,nlcj-spongearea + 2:nlcj-1)) 
    125        ENDDO 
    126  
    127       DO jk = 1, jpkm1 
    128         umasktemp(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) = umask(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) & 
    129          * 0.5 * (localviscsponge(1:jpim1,nlcj-spongearea + 1:nlcj-1) + localviscsponge(2:jpi,nlcj-spongearea + 1:nlcj-1)) 
    130       ENDDO 
    131  
    132       ENDIF 
    133  
    134       IF (.Not. spongedoneT) THEN 
     110         DO jj = nlcj-spongearea + 1,nlcj-1 
     111            localviscsponge(:,jj) = visc_tra * (jj - (nlcj-spongearea+1))/real(spongearea-2) 
     112         ENDDO 
     113         DO jk = 1, jpkm1 
     114            vmasktemp(:,nlcj-spongearea + 1:nlcj-2,jk) = vmask(:,nlcj-spongearea + 1:nlcj-2,jk) & 
     115               * 0.5 * (localviscsponge(:,nlcj-spongearea + 1:nlcj-2) + localviscsponge(:,nlcj-spongearea + 2:nlcj-1)) 
     116         ENDDO 
     117         DO jk = 1, jpkm1 
     118            umasktemp(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) = umask(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) & 
     119               * 0.5 * (localviscsponge(1:jpim1,nlcj-spongearea + 1:nlcj-1) + localviscsponge(2:jpi,nlcj-spongearea + 1:nlcj-1)) 
     120         ENDDO 
     121      ENDIF 
     122 
     123      IF (.NOT. spongedoneT) THEN 
    135124         zspe1ur(:,:) = e2u(:,:) / e1u(:,:) 
    136125         zspe2vr(:,:) = e1v(:,:) / e2v(:,:) 
    137126         zspbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:)) 
    138           
     127 
    139128         spongedoneT = .TRUE. 
    140129      ENDIF 
    141130 
    142         DO jk = 1, jpkm1 
    143           DO jj = 1, jpjm1 
     131      DO jk = 1, jpkm1 
     132         DO jj = 1, jpjm1 
    144133            DO ji = 1, jpim1 
    145134#if defined key_zco 
     
    155144               zsv(ji,jj,jk) = zabe2 * ( sbdiff(ji  ,jj+1,jk) - sbdiff(ji,jj,jk) ) 
    156145            ENDDO 
    157           ENDDO 
     146         ENDDO 
    158147 
    159148         DO jj = 2,jpjm1 
     
    175164         END DO 
    176165 
    177         ENDDO 
    178  
    179 #endif 
    180  
    181       Return 
    182       End Subroutine Agrif_Sponge_Tra 
    183        
    184       Subroutine Agrif_Sponge_dyn( kt ) 
    185  
    186       implicit none 
    187  
    188       INTEGER :: kt 
    189       REAL(wp), DIMENSION(jpi,jpj,jpk) :: tabtemp, ubdiff, vbdiff,rotdiff,hdivdiff 
     166      ENDDO 
     167 
     168#endif 
     169 
     170   END SUBROUTINE Agrif_Sponge_Tra 
     171 
     172   SUBROUTINE Agrif_Sponge_dyn( kt ) 
     173      !!--------------------------------------------- 
     174      !!   *** ROUTINE Agrif_Sponge_dyn *** 
     175      !!--------------------------------------------- 
     176#include "domzgr_substitute.h90" 
     177 
     178      INTEGER,INTENT(in) :: kt 
     179 
    190180      INTEGER :: ji,jj,jk 
    191       REAL(wp) :: viscsponge 
     181      INTEGER :: spongearea 
     182      REAL(wp) :: timecoeff 
     183      REAL(wp) :: ze2u, ze1v, zua, zva 
     184      REAL(wp), DIMENSION(jpi,jpj) :: localviscsponge 
     185      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztab, ubdiff, vbdiff,rotdiff,hdivdiff 
    192186      REAL(wp), DIMENSION(jpi,jpj,jpk) :: umasktemp,vmasktemp 
    193       INTEGER :: spongearea 
    194       integer ipt,jpt 
    195       real,dimension(:,:),pointer :: e1tparent,e2tparent 
    196       REAL(wp), DIMENSION(jpi,jpj) :: localviscsponge 
    197       real(wp) :: timecoeff 
    198       REAL(wp):: ze2u, ze1v, zua, zva 
    199  
    200 #include "domzgr_substitute.h90" 
    201187 
    202188#if defined SPONGE 
    203189 
    204       timecoeff = real(Agrif_NbStepint())/Agrif_rhot() 
     190      timecoeff = REAL(Agrif_NbStepint(),wp)/Agrif_rhot() 
    205191 
    206192      Agrif_SpecialValue=0. 
    207193      Agrif_UseSpecialValue = .TRUE. 
    208       tabtemp = 0. 
    209       Call Agrif_Bc_Variable(tabtemp, ua,calledweight=timecoeff,procname=interpun) 
     194      ztab = 0.e0 
     195      CALL Agrif_Bc_Variable(ztab, ua,calledweight=timecoeff,procname=interpun) 
    210196      Agrif_UseSpecialValue = .FALSE. 
    211197 
    212       ubdiff(:,:,:) = ub(:,:,:) - tabtemp(:,:,:) 
    213  
    214       tabtemp = 0. 
     198      ubdiff(:,:,:) = ub(:,:,:) - ztab(:,:,:) 
     199 
     200      ztab = 0.e0 
    215201      Agrif_SpecialValue=0. 
    216202      Agrif_UseSpecialValue = .TRUE. 
    217       Call Agrif_Bc_Variable(tabtemp, va,calledweight=timecoeff,procname=interpvn) 
     203      CALL Agrif_Bc_Variable(ztab, va,calledweight=timecoeff,procname=interpvn) 
    218204      Agrif_UseSpecialValue = .FALSE. 
    219205 
    220       vbdiff(:,:,:) = vb(:,:,:) - tabtemp(:,:,:) 
    221         
    222       viscsponge = rdt 
     206      vbdiff(:,:,:) = vb(:,:,:) - ztab(:,:,:) 
    223207 
    224208      spongearea = 2 + 2 * Agrif_irhox() 
     
    229213 
    230214      IF ((nbondi == -1).OR.(nbondi == 2)) THEN 
    231  
    232         DO ji = 2, spongearea 
    233           localviscsponge(ji,:) = viscsponge * (spongearea-ji)/real(spongearea-2) 
    234         ENDDO 
    235  
    236         DO jk = 1, jpkm1 
    237           umasktemp(2:spongearea-1,:,jk) = umask(2:spongearea-1,:,jk) & 
    238            * 0.5 * (localviscsponge(2:spongearea-1,:) + localviscsponge(3:spongearea,:)) 
    239         ENDDO 
    240  
    241        DO jk = 1, jpkm1 
    242          vmasktemp(2:spongearea,1:jpjm1,jk) = vmask(2:spongearea,1:jpjm1,jk) & 
    243           * 0.5 * (localviscsponge(2:spongearea,1:jpjm1) + localviscsponge(2:spongearea,2:jpj)) 
    244        ENDDO 
    245  
     215         DO ji = 2, spongearea 
     216            localviscsponge(ji,:) = visc_dyn * (spongearea-ji)/real(spongearea-2) 
     217         ENDDO 
     218         DO jk = 1, jpkm1 
     219            umasktemp(2:spongearea-1,:,jk) = umask(2:spongearea-1,:,jk) & 
     220               * 0.5 * (localviscsponge(2:spongearea-1,:) + localviscsponge(3:spongearea,:)) 
     221         ENDDO 
     222         DO jk = 1, jpkm1 
     223            vmasktemp(2:spongearea,1:jpjm1,jk) = vmask(2:spongearea,1:jpjm1,jk) & 
     224               * 0.5 * (localviscsponge(2:spongearea,1:jpjm1) + localviscsponge(2:spongearea,2:jpj)) 
     225         ENDDO 
    246226      ENDIF 
    247227 
    248228      IF ((nbondi == 1).OR.(nbondi == 2)) THEN 
    249  
    250         DO ji = nlci-spongearea + 1,nlci-1 
    251           localviscsponge(ji,:) = viscsponge * (ji - (nlci-spongearea+1))/real(spongearea-2) 
    252         ENDDO 
    253  
    254        DO jk = 1, jpkm1 
    255         umasktemp(nlci-spongearea + 1:nlci-2,:,jk) = umask(nlci-spongearea + 1:nlci-2,:,jk) & 
    256          * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-2,:) + localviscsponge(nlci-spongearea + 2:nlci-1,:)) 
    257        ENDDO 
    258  
    259        DO jk = 1, jpkm1 
    260         vmasktemp(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) = vmask(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) & 
    261           * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-1,1:jpjm1) + localviscsponge(nlci-spongearea + 1:nlci-1,2:jpj)) 
    262        ENDDO 
    263  
    264       ENDIF 
    265  
    266  
     229         DO ji = nlci-spongearea + 1,nlci-1 
     230            localviscsponge(ji,:) = visc_dyn * (ji - (nlci-spongearea+1))/real(spongearea-2) 
     231         ENDDO 
     232         DO jk = 1, jpkm1 
     233            umasktemp(nlci-spongearea + 1:nlci-2,:,jk) = umask(nlci-spongearea + 1:nlci-2,:,jk) & 
     234               * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-2,:) + localviscsponge(nlci-spongearea + 2:nlci-1,:)) 
     235         ENDDO 
     236         DO jk = 1, jpkm1 
     237            vmasktemp(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) = vmask(nlci-spongearea + 1:nlci-1,1:jpjm1,jk) & 
     238               * 0.5 * (localviscsponge(nlci-spongearea + 1:nlci-1,1:jpjm1) + localviscsponge(nlci-spongearea + 1:nlci-1,2:jpj)) 
     239         ENDDO 
     240      ENDIF 
    267241 
    268242      IF ((nbondj == -1).OR.(nbondj == 2)) THEN 
    269  
    270         DO jj = 2, spongearea 
    271         localviscsponge(:,jj) = viscsponge * (spongearea-jj)/real(spongearea-2) 
    272         ENDDO 
    273  
    274       DO jk = 1, jpkm1 
    275       vmasktemp(:,2:spongearea-1,jk) = vmask(:,2:spongearea-1,jk) & 
    276          * 0.5 * (localviscsponge(:,2:spongearea-1) + localviscsponge(:,3:spongearea)) 
    277         ENDDO 
    278  
    279       DO jk = 1, jpkm1 
    280        umasktemp(1:jpim1,2:spongearea,jk) = umask(1:jpim1,2:spongearea,jk) & 
    281          * 0.5 * (localviscsponge(1:jpim1,2:spongearea) + localviscsponge(2:jpi,2:spongearea)) 
    282       ENDDO 
    283  
     243         DO jj = 2, spongearea 
     244            localviscsponge(:,jj) = visc_dyn * (spongearea-jj)/real(spongearea-2) 
     245         ENDDO 
     246         DO jk = 1, jpkm1 
     247            vmasktemp(:,2:spongearea-1,jk) = vmask(:,2:spongearea-1,jk) & 
     248               * 0.5 * (localviscsponge(:,2:spongearea-1) + localviscsponge(:,3:spongearea)) 
     249         ENDDO 
     250         DO jk = 1, jpkm1 
     251            umasktemp(1:jpim1,2:spongearea,jk) = umask(1:jpim1,2:spongearea,jk) & 
     252               * 0.5 * (localviscsponge(1:jpim1,2:spongearea) + localviscsponge(2:jpi,2:spongearea)) 
     253         ENDDO 
    284254      ENDIF 
    285255 
    286256      IF ((nbondj == 1).OR.(nbondj == 2)) THEN 
    287  
    288         DO jj = nlcj-spongearea + 1,nlcj-1 
    289        localviscsponge(:,jj) = viscsponge * (jj - (nlcj-spongearea+1))/real(spongearea-2) 
    290        ENDDO 
    291  
    292       DO jk = 1, jpkm1 
    293        vmasktemp(:,nlcj-spongearea + 1:nlcj-2,jk) = vmask(:,nlcj-spongearea + 1:nlcj-2,jk) & 
    294           * 0.5 * (localviscsponge(:,nlcj-spongearea + 1:nlcj-2) + localviscsponge(:,nlcj-spongearea + 2:nlcj-1)) 
    295        ENDDO 
    296  
    297       DO jk = 1, jpkm1 
    298         umasktemp(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) = umask(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) & 
    299          * 0.5 * (localviscsponge(1:jpim1,nlcj-spongearea + 1:nlcj-1) + localviscsponge(2:jpi,nlcj-spongearea + 1:nlcj-1)) 
    300       ENDDO 
    301  
    302       ENDIF 
    303        
     257         DO jj = nlcj-spongearea + 1,nlcj-1 
     258            localviscsponge(:,jj) = visc_dyn * (jj - (nlcj-spongearea+1))/real(spongearea-2) 
     259         ENDDO 
     260         DO jk = 1, jpkm1 
     261            vmasktemp(:,nlcj-spongearea + 1:nlcj-2,jk) = vmask(:,nlcj-spongearea + 1:nlcj-2,jk) & 
     262               * 0.5 * (localviscsponge(:,nlcj-spongearea + 1:nlcj-2) + localviscsponge(:,nlcj-spongearea + 2:nlcj-1)) 
     263         ENDDO 
     264         DO jk = 1, jpkm1 
     265            umasktemp(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) = umask(1:jpim1,nlcj-spongearea + 1:nlcj-1,jk) & 
     266               * 0.5 * (localviscsponge(1:jpim1,nlcj-spongearea + 1:nlcj-1) + localviscsponge(2:jpi,nlcj-spongearea + 1:nlcj-1)) 
     267         ENDDO 
     268      ENDIF 
     269 
    304270      ubdiff = ubdiff * umasktemp 
    305271      vbdiff = vbdiff * vmasktemp 
    306        
     272 
    307273      hdivdiff = 0. 
    308274      rotdiff = 0. 
     
    318284#if defined key_zco 
    319285               hdivdiff(ji,jj,jk) = (  e2u(ji,jj) * ubdiff(ji,jj,jk) & 
    320                - e2u(ji-1,jj  ) * ubdiff(ji-1,jj  ,jk)      & 
    321      &               + e1v(ji,jj) * vbdiff(ji,jj,jk) - & 
    322      &              e1v(ji  ,jj-1) * vbdiff(ji  ,jj-1,jk)  )   & 
    323      &            / ( e1t(ji,jj) * e2t(ji,jj) ) 
     286                  - e2u(ji-1,jj  ) * ubdiff(ji-1,jj  ,jk)      & 
     287                  &               + e1v(ji,jj) * vbdiff(ji,jj,jk) - & 
     288                  &              e1v(ji  ,jj-1) * vbdiff(ji  ,jj-1,jk)  )   & 
     289                  &            / ( e1t(ji,jj) * e2t(ji,jj) ) 
    324290#else 
    325291               hdivdiff(ji,jj,jk) =   & 
     
    327293                  ubdiff(ji,jj,jk) - e2u(ji-1,jj  )* & 
    328294                  fse3u(ji-1,jj  ,jk)  * ubdiff(ji-1,jj  ,jk)       & 
    329                    + e1v(ji,jj)*fse3v(ji,jj,jk) * & 
     295                  + e1v(ji,jj)*fse3v(ji,jj,jk) * & 
    330296                  vbdiff(ji,jj,jk) - e1v(ji  ,jj-1)* & 
    331297                  fse3v(ji  ,jj-1,jk)  * vbdiff(ji  ,jj-1,jk)  )    & 
     
    334300            END DO 
    335301         END DO 
    336           
     302 
    337303         DO jj = 1, jpjm1 
    338304            DO ji = 1, jpim1   ! vector opt. 
     
    342308            END DO 
    343309         END DO 
    344                    
    345          ENDDO 
    346           
     310 
     311      ENDDO 
     312 
    347313      !                                                ! =============== 
    348314      DO jk = 1, jpkm1                                 ! Horizontal slab 
     
    355321               ze1v = hdivdiff(ji,jj,jk) 
    356322               zua = - (                ze2u                  - & 
    357                rotdiff (ji,jj-1,jk) ) / e2u(ji,jj)   & 
    358                      + ( hdivdiff(ji+1,jj,jk) -     & 
    359                 ze1v                  ) / e1u(ji,jj) 
     323                  rotdiff (ji,jj-1,jk) ) / e2u(ji,jj)   & 
     324                  + ( hdivdiff(ji+1,jj,jk) -     & 
     325                  ze1v                  ) / e1u(ji,jj) 
    360326 
    361327               zva = + (                ze2u                  - & 
    362                rotdiff (ji-1,jj,jk) ) / e1v(ji,jj)   & 
    363                      + ( hdivdiff(ji,jj+1,jk) -       & 
    364                 ze1v                  ) / e2v(ji,jj) 
     328                  rotdiff (ji-1,jj,jk) ) / e1v(ji,jj)   & 
     329                  + ( hdivdiff(ji,jj+1,jk) -       & 
     330                  ze1v                  ) / e2v(ji,jj) 
    365331#else 
    366332               ze2u = rotdiff (ji,jj,jk)*fse3f(ji,jj,jk) 
     
    368334               ! horizontal diffusive trends 
    369335               zua = - ( ze2u - rotdiff (ji,jj-1,jk)* & 
    370                fse3f(ji,jj-1,jk) ) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )   & 
    371                      + ( hdivdiff(ji+1,jj,jk) - ze1v      & 
    372                ) / e1u(ji,jj) 
     336                  fse3f(ji,jj-1,jk) ) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )   & 
     337                  + ( hdivdiff(ji+1,jj,jk) - ze1v      & 
     338                  ) / e1u(ji,jj) 
    373339 
    374340               zva = + ( ze2u - rotdiff (ji-1,jj,jk)* & 
    375                fse3f(ji-1,jj,jk) ) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )   & 
    376                      + ( hdivdiff(ji,jj+1,jk) - ze1v    & 
    377                     ) / e2v(ji,jj) 
     341                  fse3f(ji-1,jj,jk) ) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )   & 
     342                  + ( hdivdiff(ji,jj+1,jk) - ze1v    & 
     343                  ) / e2v(ji,jj) 
    378344#endif 
    379345 
    380346               ! add it to the general momentum trends 
    381  
    382347               ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
    383348               va(ji,jj,jk) = va(ji,jj,jk) + zva 
     
    390355#endif 
    391356 
    392       Return 
    393       End Subroutine Agrif_Sponge_dyn 
    394  
    395        subroutine interptn(tabres,i1,i2,j1,j2,k1,k2) 
    396        Implicit none 
     357   END SUBROUTINE Agrif_Sponge_dyn 
     358 
     359   SUBROUTINE agrif_sponge_init 
     360      !!--------------------------------------------- 
     361      !!   *** ROUTINE agrif_sponge_init *** 
     362      !!--------------------------------------------- 
     363      NAMELIST/namagrif/ visc_tra, visc_dyn 
     364      REWIND ( numnam ) 
     365      READ   ( numnam, namagrif ) 
     366 
     367      IF(lwp) THEN 
     368         WRITE(numout,*) 
     369         WRITE(numout,*) 'agrif_sponge_init : agrif sponge parameters' 
     370         WRITE(numout,*) '~~~~~~~~~~~~' 
     371         WRITE(numout,*) '          Namelist namagrif : set sponge parameters' 
     372         WRITE(numout,*) '             sponge coefficient for tracers =  ', visc_tra 
     373         WRITE(numout,*) '             sponge coefficient for dynamics = ', visc_dyn 
     374      ENDIF 
     375 
     376   END SUBROUTINE agrif_sponge_init 
     377 
     378   SUBROUTINE interptn(tabres,i1,i2,j1,j2,k1,k2) 
     379      !!--------------------------------------------- 
     380      !!   *** ROUTINE interptn *** 
     381      !!--------------------------------------------- 
    397382#  include "domzgr_substitute.h90"        
    398        integer i1,i2,j1,j2,k1,k2 
    399        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    400  
    401        tabres(i1:i2,j1:j2,k1:k2) = tn(i1:i2,j1:j2,k1:k2) 
    402  
    403        end subroutine interptn     
    404         
    405        subroutine interpsn(tabres,i1,i2,j1,j2,k1,k2) 
    406        Implicit none 
     383       
     384      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     385      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     386 
     387      tabres(i1:i2,j1:j2,k1:k2) = tn(i1:i2,j1:j2,k1:k2) 
     388 
     389   END SUBROUTINE interptn 
     390 
     391   SUBROUTINE interpsn(tabres,i1,i2,j1,j2,k1,k2) 
     392      !!--------------------------------------------- 
     393      !!   *** ROUTINE interpsn *** 
     394      !!--------------------------------------------- 
    407395#  include "domzgr_substitute.h90"        
    408        integer i1,i2,j1,j2,k1,k2 
    409        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    410  
    411        tabres(i1:i2,j1:j2,k1:k2) = sn(i1:i2,j1:j2,k1:k2) 
    412  
    413        end subroutine interpsn   
    414                   
    415   
    416        subroutine interpun(tabres,i1,i2,j1,j2,k1,k2) 
    417        Implicit none 
     396       
     397      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     398      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     399 
     400      tabres(i1:i2,j1:j2,k1:k2) = sn(i1:i2,j1:j2,k1:k2) 
     401 
     402   END SUBROUTINE interpsn 
     403 
     404 
     405   SUBROUTINE interpun(tabres,i1,i2,j1,j2,k1,k2) 
     406      !!--------------------------------------------- 
     407      !!   *** ROUTINE interpun *** 
     408      !!--------------------------------------------- 
    418409#  include "domzgr_substitute.h90"        
    419        integer i1,i2,j1,j2,k1,k2 
    420        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    421  
    422        tabres(i1:i2,j1:j2,k1:k2) = un(i1:i2,j1:j2,k1:k2) 
    423  
    424        end subroutine interpun  
    425         
    426        subroutine interpvn(tabres,i1,i2,j1,j2,k1,k2) 
    427        Implicit none 
     410       
     411      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     412      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     413 
     414      tabres(i1:i2,j1:j2,k1:k2) = un(i1:i2,j1:j2,k1:k2) 
     415 
     416   END SUBROUTINE interpun 
     417 
     418   SUBROUTINE interpvn(tabres,i1,i2,j1,j2,k1,k2) 
     419      !!--------------------------------------------- 
     420      !!   *** ROUTINE interpvn *** 
     421      !!--------------------------------------------- 
    428422#  include "domzgr_substitute.h90"        
    429        integer i1,i2,j1,j2,k1,k2 
    430        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    431  
    432        tabres(i1:i2,j1:j2,k1:k2) = vn(i1:i2,j1:j2,k1:k2) 
    433  
    434        end subroutine interpvn  
     423       
     424      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     425      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     426 
     427      tabres(i1:i2,j1:j2,k1:k2) = vn(i1:i2,j1:j2,k1:k2) 
     428 
     429   END SUBROUTINE interpvn 
    435430 
    436431#else 
    437        CONTAINS 
    438        subroutine agrif_opa_sponge_empty 
    439        end subroutine agrif_opa_sponge_empty 
    440 #endif 
    441                      
    442        End Module agrif_opa_sponge 
     432CONTAINS 
     433 
     434   SUBROUTINE agrif_opa_sponge_empty 
     435      !!--------------------------------------------- 
     436      !!   *** ROUTINE agrif_OPA_sponge_empty *** 
     437      !!--------------------------------------------- 
     438      WRITE(*,*)  'agrif_opa_sponge : You should not have seen this print! error?' 
     439   END SUBROUTINE agrif_opa_sponge_empty 
     440#endif 
     441 
     442END MODULE agrif_opa_sponge 
  • trunk/NEMO/NST_SRC/agrif_opa_update.F90

    r469 r636  
    11#define TWO_WAY 
    22 
    3       Module agrif_opa_update 
     3MODULE agrif_opa_update 
    44#if defined key_agrif 
    5       USE par_oce 
    6       USE oce 
    7       USE dom_oce 
    8        
    9       Integer, Parameter :: nbclineupdate = 3 
    10       Integer :: nbcline 
    11  
    12       Contains 
    13  
    14       Subroutine Agrif_Update_Tra( kt ) 
    15 ! 
    16 !     Modules used: 
    17 ! 
    18  
    19       implicit none 
    20 ! 
    21 !     Declarations: 
    22       INTEGER :: kt 
    23 ! 
    24 ! 
    25 !     Variables 
    26 ! 
    27       Real :: tabtemp(jpi,jpj,jpk) 
    28 ! 
    29 !     Begin 
    30 ! 
    31  
    32       IF ((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) Return 
     5   USE par_oce 
     6   USE oce 
     7   USE dom_oce 
     8 
     9   IMPLICIT NONE 
     10   PRIVATE 
     11 
     12   PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn 
     13 
     14   INTEGER, PARAMETER :: nbclineupdate = 3 
     15   INTEGER :: nbcline 
     16 
     17CONTAINS 
     18 
     19   SUBROUTINE Agrif_Update_Tra( kt ) 
     20      !!--------------------------------------------- 
     21      !!   *** ROUTINE Agrif_Update_Tra *** 
     22      !!--------------------------------------------- 
     23      INTEGER, INTENT(in) :: kt 
     24 
     25      REAL :: ztab(jpi,jpj,jpk) 
     26 
     27      IF((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN 
    3328#if defined TWO_WAY 
    3429      Agrif_UseSpecialValueInUpdate = .TRUE. 
    3530      Agrif_SpecialValueFineGrid = 0. 
    36       IF (mod(nbcline,nbclineupdate) == 0) THEN 
    37       Call Agrif_Update_Variable(tabtemp,tn, procname=updateT) 
    38       Call Agrif_Update_Variable(tabtemp,sn, procname=updateS) 
    39       ELSE 
    40       Call Agrif_Update_Variable(tabtemp,tn,locupdate=(/0,2/), procname=updateT) 
    41       Call Agrif_Update_Variable(tabtemp,sn,locupdate=(/0,2/), procname=updateS) 
    42       ENDIF 
    43  
     31 
     32      IF (MOD(nbcline,nbclineupdate) == 0) THEN 
     33         CALL Agrif_Update_Variable(ztab,tn, procname=updateT) 
     34         CALL Agrif_Update_Variable(ztab,sn, procname=updateS) 
     35      ELSE 
     36         CALL Agrif_Update_Variable(ztab,tn,locupdate=(/0,2/), procname=updateT) 
     37         CALL Agrif_Update_Variable(ztab,sn,locupdate=(/0,2/), procname=updateS) 
     38      ENDIF 
    4439 
    4540      Agrif_UseSpecialValueInUpdate = .FALSE. 
    4641#endif 
    4742 
    48       Return 
    49       End subroutine Agrif_Update_Tra 
    50  
    51       Subroutine Agrif_Update_Dyn( kt ) 
    52 ! 
    53 !     Modules used: 
    54 ! 
    55 ! 
    56 !     Declarations: 
    57 ! 
    58       INTEGER :: kt 
    59 ! 
    60 !     Variables 
    61 ! 
    62       Real :: tabtemp(jpi,jpj,jpk) 
    63       Real :: tabtemp2d(jpi,jpj) 
    64 ! 
    65 !     Begin 
    66 ! 
    67 ! 
     43   END SUBROUTINE Agrif_Update_Tra 
     44 
     45   SUBROUTINE Agrif_Update_Dyn( kt ) 
     46      !!--------------------------------------------- 
     47      !!   *** ROUTINE Agrif_Update_Dyn *** 
     48      !!--------------------------------------------- 
     49      INTEGER, INTENT(in) :: kt 
     50 
     51      REAL(wp), DIMENSION(jpi,jpj) :: ztab2d 
     52      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztab 
     53 
    6854      IF ((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) Return 
    6955#if defined TWO_WAY 
    7056 
    7157      IF (mod(nbcline,nbclineupdate) == 0) THEN 
    72       Call Agrif_Update_Variable(tabtemp,un,procname = updateU) 
    73       Call Agrif_Update_Variable(tabtemp,vn,procname = updateV) 
    74       ELSE 
    75       Call Agrif_Update_Variable(tabtemp,un,locupdate=(/0,1/),procname = updateU) 
    76       Call Agrif_Update_Variable(tabtemp,vn,locupdate=(/0,1/),procname = updateV)          
    77       ENDIF 
    78  
    79       Call Agrif_Update_Variable(tabtemp2d,e1u,procname = updateU2d) 
    80       Call Agrif_Update_Variable(tabtemp2d,e2v,procname = updateV2d)   
    81        
     58         CALL Agrif_Update_Variable(ztab,un,procname = updateU) 
     59         CALL Agrif_Update_Variable(ztab,vn,procname = updateV) 
     60      ELSE 
     61         CALL Agrif_Update_Variable(ztab,un,locupdate=(/0,1/),procname = updateU) 
     62         CALL Agrif_Update_Variable(ztab,vn,locupdate=(/0,1/),procname = updateV)          
     63      ENDIF 
     64 
     65      CALL Agrif_Update_Variable(ztab2d,e1u,procname = updateU2d) 
     66      CALL Agrif_Update_Variable(ztab2d,e2v,procname = updateV2d)   
     67 
    8268      nbcline = nbcline + 1 
    8369 
    84        Agrif_UseSpecialValueInUpdate = .TRUE. 
    85        Agrif_SpecialValueFineGrid = 0. 
    86        Call Agrif_Update_Variable(tabtemp2d,sshn,procname = updateSSH) 
    87        Agrif_UseSpecialValueInUpdate = .FALSE. 
    88  
    89  
    90       Call Agrif_ChildGrid_To_ParentGrid() 
    91       Call recompute_diags( kt ) 
    92       Call Agrif_ParentGrid_To_ChildGrid() 
    93  
    94 #endif 
    95 ! 
    96       Return 
    97       End subroutine Agrif_Update_Dyn 
    98  
    99       Subroutine recompute_diags(kt) 
    100       Use divcur 
    101       Use wzvmod 
    102       Use cla_div 
    103       Use  ocfzpt 
    104       Implicit None 
    105       INTEGER kt 
    106        
     70      Agrif_UseSpecialValueInUpdate = .TRUE. 
     71      Agrif_SpecialValueFineGrid = 0. 
     72      CALL Agrif_Update_Variable(ztab2d,sshn,procname = updateSSH) 
     73      Agrif_UseSpecialValueInUpdate = .FALSE. 
     74 
     75 
     76      CALL Agrif_ChildGrid_To_ParentGrid() 
     77      CALL recompute_diags( kt ) 
     78      CALL Agrif_ParentGrid_To_ChildGrid() 
     79 
     80#endif 
     81 
     82   END SUBROUTINE Agrif_Update_Dyn 
     83 
     84   SUBROUTINE recompute_diags( kt ) 
     85      !!--------------------------------------------- 
     86      !!   *** ROUTINE recompute_diags *** 
     87      !!--------------------------------------------- 
     88      USE divcur 
     89      USE wzvmod 
     90      USE cla_div 
     91      USE  ocfzpt 
     92 
     93      INTEGER, INTENT(in) :: kt 
     94 
    10795      ta = hdivb 
    10896      sa = rotb 
     
    114102 
    115103      IF( n_cla == 1 ) CALL div_cla( kt ) 
    116       Call wzv( kt ) 
    117        
    118       End Subroutine recompute_diags 
    119  
    120        subroutine updateT(tabres,i1,i2,j1,j2,k1,k2,before) 
    121        Implicit none 
    122 #  include "domzgr_substitute.h90" 
    123        integer i1,i2,j1,j2,k1,k2 
    124        integer ji,jj,jk 
    125        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    126        LOGICAL :: before 
    127  
    128        IF (before) THEN 
    129         
    130          DO jk=k1,k2 
    131            DO jj=j1,j2 
    132              DO ji=i1,i2 
    133                tabres(ji,jj,jk) = tn(ji,jj,jk) 
    134              ENDDO 
    135            ENDDO 
    136          ENDDO 
    137           
    138        ELSE 
    139  
    140          DO jk=k1,k2 
    141            DO jj=j1,j2 
    142              DO ji=i1,i2 
    143                IF (tabres(ji,jj,jk).NE.0.) THEN 
    144                tn(ji,jj,jk) = tabres(ji,jj,jk) * tmask(ji,jj,jk) 
     104      CALL wzv( kt ) 
     105 
     106   END SUBROUTINE recompute_diags 
     107 
     108   SUBROUTINE updateT( tabres, i1, i2, j1, j2, k1, k2, before ) 
     109      !!--------------------------------------------- 
     110      !!           *** ROUTINE updateT *** 
     111      !!--------------------------------------------- 
     112#  include "domzgr_substitute.h90" 
     113 
     114      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     115      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     116      LOGICAL, iNTENT(in) :: before 
     117 
     118      INTEGER :: ji,jj,jk 
     119 
     120      IF (before) THEN 
     121         DO jk=k1,k2 
     122            DO jj=j1,j2 
     123               DO ji=i1,i2 
     124                  tabres(ji,jj,jk) = tn(ji,jj,jk) 
     125               END DO 
     126            END DO 
     127         END DO 
     128      ELSE 
     129         DO jk=k1,k2 
     130            DO jj=j1,j2 
     131               DO ji=i1,i2 
     132                  IF( tabres(ji,jj,jk) .NE. 0. ) THEN 
     133                     tn(ji,jj,jk) = tabres(ji,jj,jk) * tmask(ji,jj,jk) 
     134                  ENDIF 
     135               END DO 
     136            END DO 
     137         END DO 
     138      ENDIF 
     139 
     140   END SUBROUTINE updateT 
     141 
     142   SUBROUTINE updateS( tabres, i1, i2, j1, j2, k1, k2, before ) 
     143      !!--------------------------------------------- 
     144      !!           *** ROUTINE updateS *** 
     145      !!--------------------------------------------- 
     146#  include "domzgr_substitute.h90" 
     147 
     148      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     149      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     150      LOGICAL, iNTENT(in) :: before 
     151 
     152      INTEGER :: ji,jj,jk 
     153 
     154      IF (before) THEN 
     155         DO jk=k1,k2 
     156            DO jj=j1,j2 
     157               DO ji=i1,i2 
     158                  tabres(ji,jj,jk) = sn(ji,jj,jk) 
     159               END DO 
     160            END DO 
     161         END DO 
     162      ELSE 
     163         DO jk=k1,k2 
     164            DO jj=j1,j2 
     165               DO ji=i1,i2 
     166                  IF (tabres(ji,jj,jk).NE.0.) THEN 
     167                     sn(ji,jj,jk) = tabres(ji,jj,jk) * tmask(ji,jj,jk) 
     168                  ENDIF 
     169               END DO 
     170            END DO 
     171         END DO 
     172      ENDIF 
     173 
     174   END SUBROUTINE updateS 
     175 
     176   SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, before ) 
     177      !!--------------------------------------------- 
     178      !!           *** ROUTINE updateu *** 
     179      !!--------------------------------------------- 
     180#  include "domzgr_substitute.h90" 
     181 
     182      INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 
     183      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 
     184      LOGICAL, INTENT(in) :: before 
     185 
     186      INTEGER :: ji, jj, jk 
     187      REAL(wp) :: zrhoy 
     188 
     189      IF (before) THEN 
     190         zrhoy = Agrif_Rhoy() 
     191         DO jk=k1,k2 
     192            DO jj=j1,j2 
     193               DO ji=i1,i2 
     194                  tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 
     195#if ! defined key_zco 
     196                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u(ji,jj,jk) 
     197#endif 
     198               END DO 
     199            END DO 
     200         END DO 
     201         tabres = zrhoy * tabres 
     202      ELSE 
     203         DO jk=k1,k2 
     204            DO jj=j1,j2 
     205               DO ji=i1,i2 
     206                  un(ji,jj,jk) = tabres(ji,jj,jk) / (e2u(ji,jj)) 
     207                  un(ji,jj,jk) = un(ji,jj,jk) * umask(ji,jj,jk) 
     208#if ! defined key_zco 
     209                  un(ji,jj,jk) = un(ji,jj,jk) / fse3u(ji,jj,jk) 
     210#endif 
     211               END DO 
     212            END DO 
     213         END DO 
     214      ENDIF 
     215 
     216   END SUBROUTINE updateu 
     217 
     218   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before ) 
     219      !!--------------------------------------------- 
     220      !!           *** ROUTINE updatev *** 
     221      !!--------------------------------------------- 
     222#  include "domzgr_substitute.h90" 
     223 
     224      INTEGER :: i1,i2,j1,j2,k1,k2 
     225      INTEGER :: ji,jj,jk 
     226      REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres 
     227      LOGICAL :: before 
     228 
     229      REAL(wp) :: zrhox 
     230 
     231      IF (before) THEN 
     232         zrhox = Agrif_Rhox() 
     233         DO jk=k1,k2 
     234            DO jj=j1,j2 
     235               DO ji=i1,i2 
     236                  tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 
     237#if ! defined key_zco 
     238                  tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v(ji,jj,jk) 
     239#endif 
     240               END DO 
     241            END DO 
     242         END DO 
     243         tabres = zrhox * tabres 
     244      ELSE 
     245         DO jk=k1,k2 
     246            DO jj=j1,j2 
     247               DO ji=i1,i2 
     248                  vn(ji,jj,jk) = tabres(ji,jj,jk) / (e1v(ji,jj)) 
     249                  vn(ji,jj,jk) = vn(ji,jj,jk) * vmask(ji,jj,jk) 
     250#if ! defined key_zco 
     251                  vn(ji,jj,jk) = vn(ji,jj,jk) / fse3v(ji,jj,jk) 
     252#endif 
     253               END DO 
     254            END DO 
     255         END DO 
     256      ENDIF 
     257 
     258   END SUBROUTINE updatev 
     259 
     260   SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before ) 
     261      !!--------------------------------------------- 
     262      !!          *** ROUTINE updateu2d *** 
     263      !!--------------------------------------------- 
     264#  include "domzgr_substitute.h90" 
     265 
     266      INTEGER, INTENT(in) :: i1, i2, j1, j2 
     267      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     268      LOGICAL, INTENT(in) :: before 
     269 
     270      INTEGER :: ji, jj, jk 
     271      REAL(wp) :: zrhoy 
     272      REAL(wp) :: zhinv 
     273 
     274      IF (before) THEN 
     275         zrhoy = Agrif_Rhoy() 
     276         DO jk = 1,jpkm1 
     277            DO jj=j1,j2 
     278               DO ji=i1,i2 
     279                  tabres(ji,jj) = tabres(ji,jj) + fse3u(ji,jj,jk) * un(ji,jj,jk) 
     280               END DO 
     281            END DO 
     282         END DO 
     283         DO jj=j1,j2 
     284            DO ji=i1,i2 
     285               tabres(ji,jj) = tabres(ji,jj) * e2u(ji,jj) 
     286            END DO 
     287         END DO 
     288         tabres = zrhoy * tabres 
     289      ELSE 
     290         DO jj=j1,j2 
     291            DO ji=i1,i2 
     292               IF(umask(ji,jj,1) .NE. 0.) THEN              
     293                  spgu(ji,jj) = 0.e0 
     294                  DO jk=1,jpk 
     295                     spgu(ji,jj) = spgu(ji,jj) + fse3u(ji,jj,jk) * un(ji,jj,jk) 
     296                  END DO 
     297                  spgu(ji,jj) = spgu(ji,jj) * e2u(ji,jj) 
     298                  zhinv = (tabres(ji,jj)-spgu(ji,jj))/(hu(ji,jj)*e2u(ji,jj)) 
     299                  Do jk=1,jpk               
     300                     un(ji,jj,jk) = un(ji,jj,jk) + zhinv 
     301                     un(ji,jj,jk) = un(ji,jj,jk) * umask(ji,jj,jk)             
     302                  END DO 
    145303               ENDIF 
    146              ENDDO 
    147             ENDDO 
    148           ENDDO 
    149        ENDIF 
    150  
    151        end subroutine updateT 
    152  
    153         
    154        subroutine updateS(tabres,i1,i2,j1,j2,k1,k2,before) 
    155        Implicit none 
    156 #  include "domzgr_substitute.h90" 
    157        integer i1,i2,j1,j2,k1,k2 
    158        integer ji,jj,jk 
    159        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    160        LOGICAL :: before 
    161  
    162  
    163        IF (before) THEN 
    164         
    165          DO jk=k1,k2 
    166            DO jj=j1,j2 
    167              DO ji=i1,i2 
    168                tabres(ji,jj,jk) = sn(ji,jj,jk) 
    169              ENDDO 
    170            ENDDO 
    171          ENDDO 
    172           
    173        ELSE 
    174  
    175          DO jk=k1,k2 
    176            DO jj=j1,j2 
    177              DO ji=i1,i2 
    178                IF (tabres(ji,jj,jk).NE.0.) THEN 
    179                sn(ji,jj,jk) = tabres(ji,jj,jk) * tmask(ji,jj,jk) 
     304            END DO 
     305         END DO 
     306      ENDIF 
     307 
     308   END SUBROUTINE updateu2d 
     309 
     310   SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before ) 
     311      !!--------------------------------------------- 
     312      !!          *** ROUTINE updatev2d *** 
     313      !!--------------------------------------------- 
     314 
     315      INTEGER, INTENT(in) :: i1, i2, j1, j2 
     316      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     317      LOGICAL, INTENT(in) :: before 
     318 
     319      INTEGER :: ji, jj, jk 
     320      REAL(wp) :: zrhox 
     321      REAL(wp) :: zhinv 
     322 
     323      IF (before) THEN 
     324         zrhox = Agrif_Rhox() 
     325         tabres = 0.e0 
     326         DO jk = 1,jpkm1 
     327            DO jj=j1,j2 
     328               DO ji=i1,i2 
     329                  tabres(ji,jj) = tabres(ji,jj) + fse3v(ji,jj,jk) * vn(ji,jj,jk) 
     330               END DO 
     331            END DO 
     332         END DO 
     333         DO jj=j1,j2 
     334            DO ji=i1,i2 
     335               tabres(ji,jj) = tabres(ji,jj) * e1v(ji,jj) 
     336            END DO 
     337         END DO 
     338         tabres = zrhox * tabres 
     339      ELSE 
     340         DO jj=j1,j2 
     341            DO ji=i1,i2 
     342               IF(vmask(ji,jj,1) .NE. 0.) THEN              
     343                  spgv(ji,jj) = 0. 
     344                  DO jk=1,jpk 
     345                     spgv(ji,jj) = spgv(ji,jj) + fse3v(ji,jj,jk) * vn(ji,jj,jk) 
     346                  END DO 
     347                  spgv(ji,jj) = spgv(ji,jj) * e1v(ji,jj) 
     348                  zhinv = (tabres(ji,jj)-spgv(ji,jj))/(hv(ji,jj)*e1v(ji,jj)) 
     349                  DO jk=1,jpk              
     350                     vn(ji,jj,jk) = vn(ji,jj,jk) + zhinv 
     351                     vn(ji,jj,jk) = vn(ji,jj,jk) * vmask(ji,jj,jk) 
     352                  END DO 
    180353               ENDIF 
    181              ENDDO 
    182            ENDDO 
    183          ENDDO 
    184        ENDIF 
    185  
    186        end subroutine updateS 
    187  
    188        subroutine updateu(tabres,i1,i2,j1,j2,k1,k2,before) 
    189        Implicit none 
    190 #  include "domzgr_substitute.h90" 
    191        integer i1,i2,j1,j2,k1,k2 
    192        integer ji,jj,jk 
    193        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    194        LOGICAL :: before 
    195        REAL(wp) :: rhoy 
    196  
    197  
    198        IF (before) THEN 
    199         
    200        rhoy = Agrif_Rhoy() 
    201         
    202          DO jk=k1,k2 
    203            DO jj=j1,j2 
    204              DO ji=i1,i2 
    205                tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 
    206 #if ! defined key_zco 
    207                tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u(ji,jj,jk) 
    208 #endif 
    209              ENDDO 
    210            ENDDO 
    211          ENDDO 
    212   
    213          tabres = rhoy * tabres 
    214   
    215        ELSE 
    216  
    217          DO jk=k1,k2 
    218            DO jj=j1,j2 
    219              DO ji=i1,i2 
    220                un(ji,jj,jk) = tabres(ji,jj,jk) / (e2u(ji,jj)) 
    221                un(ji,jj,jk) = un(ji,jj,jk) * umask(ji,jj,jk) 
    222 #if ! defined key_zco 
    223                un(ji,jj,jk) = un(ji,jj,jk) / fse3u(ji,jj,jk) 
    224 #endif 
    225        ENDDO 
    226        ENDDO 
    227        ENDDO 
    228        ENDIF 
    229  
    230        end subroutine updateu 
    231  
    232        subroutine updatev(tabres,i1,i2,j1,j2,k1,k2,before) 
    233        Implicit none 
    234 #  include "domzgr_substitute.h90" 
    235        integer i1,i2,j1,j2,k1,k2 
    236        integer ji,jj,jk 
    237        real,dimension(i1:i2,j1:j2,k1:k2) :: tabres 
    238        LOGICAL :: before 
    239        REAL(wp) :: rhox 
    240  
    241  
    242        IF (before) THEN 
    243         
    244        rhox = Agrif_Rhox() 
    245         
    246          DO jk=k1,k2 
    247            DO jj=j1,j2 
    248              DO ji=i1,i2 
    249                tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 
    250 #if ! defined key_zco 
    251                tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v(ji,jj,jk) 
    252 #endif 
    253              ENDDO 
    254            ENDDO 
    255          ENDDO 
    256   
    257         tabres = rhox * tabres 
    258   
    259        ELSE 
    260  
    261          DO jk=k1,k2 
    262            DO jj=j1,j2 
    263              DO ji=i1,i2 
    264                vn(ji,jj,jk) = tabres(ji,jj,jk) / (e1v(ji,jj)) 
    265                vn(ji,jj,jk) = vn(ji,jj,jk) * vmask(ji,jj,jk) 
    266 #if ! defined key_zco 
    267                vn(ji,jj,jk) = vn(ji,jj,jk) / fse3v(ji,jj,jk) 
    268 #endif 
    269        ENDDO 
    270        ENDDO 
    271        ENDDO 
    272        ENDIF 
    273  
    274        end subroutine updatev 
    275  
    276        subroutine updateu2d(tabres,i1,i2,j1,j2,before) 
    277        Implicit none 
    278 #  include "domzgr_substitute.h90" 
    279        integer i1,i2,j1,j2 
    280        integer ji,jj,jk 
    281        real,dimension(i1:i2,j1:j2) :: tabres 
    282        LOGICAL :: before 
    283        REAL(wp) :: rhoy 
    284        REAL(wp) :: hinv 
    285  
    286  
    287        IF (before) THEN 
    288         
    289        rhoy = Agrif_Rhoy() 
    290         
    291            DO jk = 1,jpkm1 
    292              DO jj=j1,j2 
    293              DO ji=i1,i2 
    294                 tabres(ji,jj) = tabres(ji,jj) + fse3u(ji,jj,jk) * un(ji,jj,jk) 
    295              ENDDO 
    296              ENDDO 
    297            ENDDO 
    298             
    299            DO jj=j1,j2 
    300            DO ji=i1,i2 
    301              tabres(ji,jj) = tabres(ji,jj) * e2u(ji,jj) 
    302            ENDDO 
    303            ENDDO 
    304     
    305           tabres = rhoy * tabres 
    306     
    307        ELSE 
    308  
    309            DO jj=j1,j2 
    310              DO ji=i1,i2 
    311                IF (umask(ji,jj,1) .NE. 0.) THEN              
    312                spgu(ji,jj) = 0. 
    313                Do jk=1,jpk 
    314                 spgu(ji,jj) = spgu(ji,jj) + fse3u(ji,jj,jk) * un(ji,jj,jk) 
    315                EndDo 
    316                spgu(ji,jj) = spgu(ji,jj) * e2u(ji,jj) 
    317                hinv = (tabres(ji,jj)-spgu(ji,jj))/(hu(ji,jj)*e2u(ji,jj)) 
    318                Do jk=1,jpk               
    319                un(ji,jj,jk) = un(ji,jj,jk) + hinv 
    320                un(ji,jj,jk) = un(ji,jj,jk) * umask(ji,jj,jk)             
    321                EndDo 
    322                ENDIF 
    323              ENDDO 
    324            ENDDO 
    325        ENDIF 
    326  
    327        end subroutine updateu2d 
    328  
    329        subroutine updatev2d(tabres,i1,i2,j1,j2,before) 
    330        Implicit none 
    331        integer i1,i2,j1,j2 
    332        integer ji,jj,jk 
    333        real,dimension(i1:i2,j1:j2) :: tabres 
    334        LOGICAL :: before 
    335        REAL(wp) :: rhox 
    336        REAL(wp) :: hinv 
    337  
    338  
    339        IF (before) THEN 
    340         
    341        rhox = Agrif_Rhox() 
    342         
    343            tabres = 0. 
    344             
    345            DO jk = 1,jpkm1 
    346              DO jj=j1,j2 
    347              DO ji=i1,i2 
    348                 tabres(ji,jj) = tabres(ji,jj) + fse3v(ji,jj,jk) * vn(ji,jj,jk) 
    349              ENDDO 
    350              ENDDO 
    351            ENDDO 
    352             
    353            DO jj=j1,j2 
    354            DO ji=i1,i2 
    355               tabres(ji,jj) = tabres(ji,jj) * e1v(ji,jj) 
    356            ENDDO 
    357            ENDDO 
    358     
    359          tabres = rhox * tabres 
    360     
    361        ELSE 
    362  
    363            DO jj=j1,j2 
    364              DO ji=i1,i2 
    365                IF (vmask(ji,jj,1) .NE. 0.) THEN              
    366                spgv(ji,jj) = 0. 
    367                Do jk=1,jpk 
    368                 spgv(ji,jj) = spgv(ji,jj) + fse3v(ji,jj,jk) * vn(ji,jj,jk) 
    369                EndDo 
    370                spgv(ji,jj) = spgv(ji,jj) * e1v(ji,jj) 
    371                hinv = (tabres(ji,jj)-spgv(ji,jj))/(hv(ji,jj)*e1v(ji,jj)) 
    372  
    373                Do jk=1,jpk              
    374                vn(ji,jj,jk) = vn(ji,jj,jk) + hinv 
    375                vn(ji,jj,jk) = vn(ji,jj,jk) * vmask(ji,jj,jk) 
    376                EndDo 
    377                ENDIF 
    378            ENDDO 
    379            ENDDO 
    380             
    381        ENDIF 
    382  
    383        end subroutine updatev2d 
    384  
    385        subroutine updateSSH(tabres,i1,i2,j1,j2,before) 
    386        Implicit none 
    387 #  include "domzgr_substitute.h90" 
    388        integer i1,i2,j1,j2 
    389        integer ji,jj 
    390        real,dimension(i1:i2,j1:j2) :: tabres 
    391        LOGICAL :: before 
    392        REAL(wp) :: rhox, rhoy 
    393  
    394  
    395        IF (before) THEN 
    396        rhox = Agrif_Rhox() 
    397        rhoy = Agrif_Rhoy() 
    398         
    399            DO jj=j1,j2 
    400              DO ji=i1,i2 
     354            END DO 
     355         END DO 
     356      ENDIF 
     357 
     358   END SUBROUTINE updatev2d 
     359 
     360   SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) 
     361      !!--------------------------------------------- 
     362      !!          *** ROUTINE updateSSH *** 
     363      !!--------------------------------------------- 
     364#  include "domzgr_substitute.h90" 
     365 
     366      INTEGER, INTENT(in) :: i1, i2, j1, j2 
     367      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
     368      LOGICAL, INTENT(in) :: before 
     369 
     370      INTEGER :: ji, jj 
     371      REAL(wp) :: zrhox, zrhoy 
     372 
     373      IF (before) THEN 
     374         zrhox = Agrif_Rhox() 
     375         zrhoy = Agrif_Rhoy() 
     376         DO jj=j1,j2 
     377            DO ji=i1,i2 
    401378               tabres(ji,jj) = e1t(ji,jj) * e2t(ji,jj) * sshn(ji,jj) 
    402              ENDDO 
    403            ENDDO 
    404     
    405          tabres = rhox * rhoy * tabres 
    406   
    407        ELSE 
    408            DO jj=j1,j2 
    409              DO ji=i1,i2 
     379            END DO 
     380         END DO 
     381         tabres = zrhox * zrhoy * tabres 
     382      ELSE 
     383         DO jj=j1,j2 
     384            DO ji=i1,i2 
    410385               sshn(ji,jj) = tabres(ji,jj) / (e1t(ji,jj) * e2t(ji,jj)) 
    411386               sshn(ji,jj) = sshn(ji,jj) * tmask(ji,jj,1) 
    412        ENDDO 
    413        ENDDO 
    414        ENDIF 
    415  
    416        end subroutine updateSSH 
    417         
     387            END DO 
     388         END DO 
     389      ENDIF 
     390 
     391   END SUBROUTINE updateSSH 
     392 
    418393#else 
    419        CONTAINS 
    420        subroutine agrif_opa_update_empty 
    421        end subroutine agrif_opa_update_empty 
    422 #endif 
    423        End Module agrif_opa_update 
     394CONTAINS 
     395   SUBROUTINE agrif_opa_update_empty 
     396      !!--------------------------------------------- 
     397      !!   *** ROUTINE agrif_opa_update_empty *** 
     398      !!--------------------------------------------- 
     399      WRITE(*,*)  'agrif_opa_update : You should not have seen this print! error?' 
     400   END SUBROUTINE agrif_opa_update_empty 
     401#endif 
     402END MODULE agrif_opa_update 
  • trunk/NEMO/NST_SRC/agrif_top_interp.F90

    r628 r636  
    1 ! 
    2       Module agrif_top_interp 
     1MODULE agrif_top_interp 
    32#if defined key_agrif && defined key_passivetrc 
    4       USE par_oce 
    5       USE oce 
    6       USE dom_oce       
    7       USE sol_oce 
    8       USE trc 
    9       USE sms 
     3   USE par_oce 
     4   USE oce 
     5   USE dom_oce       
     6   USE sol_oce 
     7   USE trcstp 
     8   USE sms 
    109 
    11       CONTAINS 
    12       SUBROUTINE Agrif_trc( kt ) 
     10   IMPLICIT NONE 
     11   PRIVATE 
    1312 
    14       Implicit none 
    15        
    16    !! * Substitutions 
     13   PUBLIC Agrif_trc 
     14 
     15   CONTAINS 
     16 
     17   SUBROUTINE Agrif_trc( kt ) 
     18      !!--------------------------------------------- 
     19      !!   *** ROUTINE Agrif_trc *** 
     20      !!--------------------------------------------- 
    1721#  include "domzgr_substitute.h90"   
    1822#  include "vectopt_loop_substitute.h90" 
    19 ! 
    20       INTEGER :: kt 
    21       REAL(wp) tratemp(jpi,jpj,jpk,jptra) 
     23       
     24      INTEGER, INTENT(in) :: kt 
     25 
    2226      INTEGER :: ji,jj,jk,jn 
    23       REAL(wp) :: rhox 
     27      REAL(wp) :: zrhox 
    2428      REAL(wp) :: alpha1, alpha2, alpha3, alpha4 
    2529      REAL(wp) :: alpha5, alpha6, alpha7 
    26 ! 
    27         IF (Agrif_Root()) RETURN 
     30      REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: ztra 
     31       
     32      IF (Agrif_Root()) RETURN 
    2833 
    29            Agrif_SpecialValue=0. 
    30            Agrif_UseSpecialValue = .TRUE. 
    31            tratemp = 0. 
     34      Agrif_SpecialValue=0. 
     35      Agrif_UseSpecialValue = .TRUE. 
     36      ztra = 0.e0 
    3237 
    33            Call Agrif_Bc_variable(tratemp,trn) 
    34            Agrif_UseSpecialValue = .FALSE. 
    35         
    36            rhox = Agrif_Rhox() 
    37     
    38            alpha1 = (rhox-1.)/2. 
    39            alpha2 = 1.-alpha1 
    40     
    41            alpha3 = (rhox-1)/(rhox+1) 
    42            alpha4 = 1.-alpha3 
    43     
    44            alpha6 = 2.*(rhox-1.)/(rhox+1.) 
    45            alpha7 = -(rhox-1)/(rhox+3) 
    46            alpha5 = 1. - alpha6 - alpha7 
    47     
    48 ! 
    49       If ((nbondi == 1).OR.(nbondi == 2)) THEN 
    50        
    51       tra(nlci,:,:,:) = alpha1 * tratemp(nlci,:,:,:) + alpha2 * tratemp(nlci-1,:,:,:) 
    52        
    53     Do jn=1,jptra  
    54       Do jk=1,jpk       
    55       Do jj=1,jpj 
    56         IF (umask(nlci-2,jj,jk).EQ.0.) THEN 
    57         tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
    58         ELSE 
    59         tra(nlci-1,jj,jk,jn)=(alpha4*tra(nlci,jj,jk,jn)+alpha3*tra(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
    60          IF (un(nlci-2,jj,jk).GT.0.) THEN 
    61           tra(nlci-1,jj,jk,jn)=(alpha6*tra(nlci-2,jj,jk,jn)+alpha5*tra(nlci,jj,jk,jn) & 
    62                                +alpha7*tra(nlci-3,jj,jk,jn))*tmask(nlci-1,jj,jk) 
    63          ENDIF 
    64         ENDIF 
    65       End Do 
    66       enddo  
    67     END DO 
    68       ENDIF         
    69       
    70       If ((nbondj == 1).OR.(nbondj == 2)) THEN 
    71        
    72       tra(:,nlcj,:,:) = alpha1 * tratemp(:,nlcj,:,:) + alpha2 * tratemp(:,nlcj-1,:,:) 
    73   
    74    DO jn=1, jptra             
    75       Do jk=1,jpk       
    76       Do ji=1,jpi 
    77         IF (vmask(ji,nlcj-2,jk).EQ.0.) THEN 
    78         tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
    79         ELSE 
    80         tra(ji,nlcj-1,jk,jn)=(alpha4*tra(ji,nlcj,jk,jn)+alpha3*tra(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
    81           IF (vn(ji,nlcj-2,jk) .GT. 0.) THEN 
    82            tra(ji,nlcj-1,jk,jn)=(alpha6*tra(ji,nlcj-2,jk,jn)+alpha5*tra(ji,nlcj,jk,jn) & 
    83                                 +alpha7*tra(ji,nlcj-3,jk,jn))*tmask(ji,nlcj-1,jk) 
    84           ENDIF 
    85         ENDIF 
    86       End Do 
    87       enddo 
    88    END DO 
     38      CALL Agrif_Bc_variable(ztra,trn) 
     39      Agrif_UseSpecialValue = .FALSE. 
     40 
     41      zrhox = Agrif_Rhox() 
     42 
     43      alpha1 = (zrhox-1.)/2. 
     44      alpha2 = 1.-alpha1 
     45 
     46      alpha3 = (zrhox-1)/(zrhox+1) 
     47      alpha4 = 1.-alpha3 
     48 
     49      alpha6 = 2.*(zrhox-1.)/(zrhox+1.) 
     50      alpha7 = -(zrhox-1)/(zrhox+3) 
     51      alpha5 = 1. - alpha6 - alpha7 
     52 
     53      IF ((nbondi == 1).OR.(nbondi == 2)) THEN 
     54         tra(nlci,:,:,:) = alpha1 * ztra(nlci,:,:,:) + alpha2 * ztra(nlci-1,:,:,:) 
     55         DO jn=1,jptra  
     56            DO jk=1,jpk       
     57               DO jj=1,jpj 
     58                  IF (umask(nlci-2,jj,jk).EQ.0.) THEN 
     59                     tra(nlci-1,jj,jk,jn) = tra(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 
     60                  ELSE 
     61                     tra(nlci-1,jj,jk,jn)=(alpha4*tra(nlci,jj,jk,jn)+alpha3*tra(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 
     62                     IF (un(nlci-2,jj,jk).GT.0.) THEN 
     63                        tra(nlci-1,jj,jk,jn)=(alpha6*tra(nlci-2,jj,jk,jn)+alpha5*tra(nlci,jj,jk,jn) & 
     64                           +alpha7*tra(nlci-3,jj,jk,jn))*tmask(nlci-1,jj,jk) 
     65                     ENDIF 
     66                  ENDIF 
     67               END DO 
     68            END DO 
     69         END DO 
     70      ENDIF 
     71 
     72      IF ((nbondj == 1).OR.(nbondj == 2)) THEN 
     73         tra(:,nlcj,:,:) = alpha1 * ztra(:,nlcj,:,:) + alpha2 * ztra(:,nlcj-1,:,:) 
     74         DO jn=1, jptra             
     75            DO jk=1,jpk       
     76               DO ji=1,jpi 
     77                  IF (vmask(ji,nlcj-2,jk).EQ.0.) THEN 
     78                     tra(ji,nlcj-1,jk,jn) = tra(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 
     79                  ELSE 
     80                     tra(ji,nlcj-1,jk,jn)=(alpha4*tra(ji,nlcj,jk,jn)+alpha3*tra(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk)         
     81                     IF (vn(ji,nlcj-2,jk) .GT. 0.) THEN 
     82                        tra(ji,nlcj-1,jk,jn)=(alpha6*tra(ji,nlcj-2,jk,jn)+alpha5*tra(ji,nlcj,jk,jn) & 
     83                           +alpha7*tra(ji,nlcj-3,jk,jn))*tmask(ji,nlcj-1,jk) 
     84                     ENDIF 
     85                  ENDIF 
     86               END DO 
     87            END DO 
     88         END DO 
    8989      ENDIF 
    9090 
    9191      IF ((nbondi == -1).OR.(nbondi == 2)) THEN 
    92        
    93       tra(1,:,:,:) = alpha1 * tratemp(1,:,:,:) + alpha2 * tratemp(2,:,:,:) 
    94        
    95      DO jn=1, jptra 
    96       Do jk=1,jpk       
    97       Do jj=1,jpj 
    98         IF (umask(2,jj,jk).EQ.0.) THEN 
    99         tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk) 
    100         ELSE 
    101         tra(2,jj,jk,jn)=(alpha4*tra(1,jj,jk,jn)+alpha3*tra(3,jj,jk,jn))*tmask(2,jj,jk)         
    102          IF (un(2,jj,jk).LT.0.) THEN 
    103            tra(2,jj,jk,jn)=(alpha6*tra(3,jj,jk,jn)+alpha5*tra(1,jj,jk,jn) & 
     92         tra(1,:,:,:) = alpha1 * ztra(1,:,:,:) + alpha2 * ztra(2,:,:,:) 
     93         DO jn=1, jptra 
     94            DO jk=1,jpk       
     95               DO jj=1,jpj 
     96                  IF (umask(2,jj,jk).EQ.0.) THEN 
     97                     tra(2,jj,jk,jn) = tra(1,jj,jk,jn) * tmask(2,jj,jk) 
     98                  ELSE 
     99                     tra(2,jj,jk,jn)=(alpha4*tra(1,jj,jk,jn)+alpha3*tra(3,jj,jk,jn))*tmask(2,jj,jk)         
     100                     IF (un(2,jj,jk).LT.0.) THEN 
     101                        tra(2,jj,jk,jn)=(alpha6*tra(3,jj,jk,jn)+alpha5*tra(1,jj,jk,jn) & 
    104102                           +alpha7*tra(4,jj,jk,jn))*tmask(2,jj,jk) 
    105          ENDIF 
    106         ENDIF 
    107       End Do 
    108       enddo 
    109      END DO 
    110       ENDIF 
    111       IF ((nbondj == -1).OR.(nbondj == 2)) THEN 
    112        
    113       tra(:,1,:,:) = alpha1 * tratemp(:,1,:,:) + alpha2 * tratemp(:,2,:,:) 
    114              
    115    DO jn=1, jptra   
    116     Do jk=1,jpk       
    117       Do ji=1,jpi 
    118         IF (vmask(ji,2,jk).EQ.0.) THEN 
    119         tra(ji,2,jk,jn)=tra(ji,1,jk,jn) * tmask(ji,2,jk) 
    120         ELSE 
    121         tra(ji,2,jk,jn)=(alpha4*tra(ji,1,jk,jn)+alpha3*tra(ji,3,jk,jn))*tmask(ji,2,jk) 
    122           IF (vn(ji,2,jk) .LT. 0.) THEN 
    123             tra(ji,2,jk,jn)=(alpha6*tra(ji,3,jk,jn)+alpha5*tra(ji,1,jk,jn)& 
    124                             +alpha7*tra(ji,4,jk,jn))*tmask(ji,2,jk) 
    125           ENDIF 
    126         ENDIF 
    127       End Do 
    128       enddo 
    129      END DO  
     103                     ENDIF 
     104                  ENDIF 
     105               END DO 
     106            END DO 
     107         END DO 
    130108      ENDIF 
    131109 
    132       End Subroutine Agrif_trc 
    133 ! 
    134 ! 
     110      IF ((nbondj == -1).OR.(nbondj == 2)) THEN 
     111         tra(:,1,:,:) = alpha1 * ztra(:,1,:,:) + alpha2 * ztra(:,2,:,:) 
     112         DO jn=1, jptra   
     113            DO jk=1,jpk       
     114               DO ji=1,jpi 
     115                  IF (vmask(ji,2,jk).EQ.0.) THEN 
     116                     tra(ji,2,jk,jn)=tra(ji,1,jk,jn) * tmask(ji,2,jk) 
     117                  ELSE 
     118                     tra(ji,2,jk,jn)=(alpha4*tra(ji,1,jk,jn)+alpha3*tra(ji,3,jk,jn))*tmask(ji,2,jk) 
     119                     IF (vn(ji,2,jk) .LT. 0.) THEN 
     120                        tra(ji,2,jk,jn)=(alpha6*tra(ji,3,jk,jn)+alpha5*tra(ji,1,jk,jn)& 
     121                           +alpha7*tra(ji,4,jk,jn))*tmask(ji,2,jk) 
     122                     ENDIF 
     123                  ENDIF 
     124               END DO 
     125            END DO 
     126         END DO 
     127      ENDIF 
    135128 
     129   END SUBROUTINE Agrif_trc 
    136130 
    137131#else 
    138       CONTAINS 
    139       subroutine Agrif_TOP_Interp_empty 
     132CONTAINS 
     133   SUBROUTINE Agrif_TOP_Interp_empty 
     134      !!--------------------------------------------- 
     135      !!   *** ROUTINE agrif_Top_Interp_empty *** 
     136      !!--------------------------------------------- 
     137      WRITE(*,*)  'agrif_top_interp : You should not have seen this print! error?' 
     138   END SUBROUTINE Agrif_TOP_Interp_empty 
     139#endif 
     140END MODULE agrif_top_interp 
    140141 
    141       end subroutine Agrif_TOP_Interp_empty 
    142 #endif 
    143       End Module agrif_top_interp 
    144  
  • trunk/NEMO/NST_SRC/agrif_top_update.F90

    r628 r636  
    11#define TWO_WAY 
    22 
    3       Module agrif_top_update 
     3MODULE agrif_top_update 
     4 
    45#if defined key_agrif && defined key_passivetrc 
    5       USE par_oce 
    6       USE oce 
    7       USE dom_oce 
    8       USE trc 
    9       USE sms 
    10        
    11       Integer, Parameter :: nbclineupdate = 3 
    12       Integer :: nbcline 
     6   USE par_oce 
     7   USE oce 
     8   USE dom_oce 
     9   USE trcstp 
     10   USE sms 
    1311 
    14       Contains 
     12   IMPLICIT NONE 
     13   PRIVATE 
    1514 
    16       Subroutine Agrif_Update_Trc( kt ) 
    17 ! 
    18 !     Modules used: 
    19 ! 
     15   PUBLIC Agrif_Update_Trc 
    2016 
    21       implicit none 
    22 ! 
    23 !     Declarations: 
    24       INTEGER :: kt 
    25 ! 
    26 ! 
    27 !     Variables 
    28 ! 
    29       Real :: tabtemp(jpi,jpj,jpk,jptra) 
    30 ! 
    31 !     Begin 
    32 ! 
     17   INTEGER, PARAMETER :: nbclineupdate = 3 
     18   INTEGER :: nbcline 
    3319 
    34       IF ((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) Return 
    35 #if defined TWO_WAYxiv8 
     20   CONTAINS 
     21 
     22   SUBROUTINE Agrif_Update_Trc( kt ) 
     23      !!--------------------------------------------- 
     24      !!   *** ROUTINE Agrif_Update_Trc *** 
     25      !!--------------------------------------------- 
     26      INTEGER, INTENT(in) :: kt 
     27   
     28      REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: ztra 
     29 
     30      IF ((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN 
     31 
     32#if defined TWO_WAY 
    3633      Agrif_UseSpecialValueInUpdate = .TRUE. 
    3734      Agrif_SpecialValueFineGrid = 0. 
    38       IF (mod(nbcline,nbclineupdate) == 0) THEN 
    39       Call Agrif_Update_Variable(tabtemp,trn, procname=updateTRC) 
     35  
     36     IF (MOD(nbcline,nbclineupdate) == 0) THEN 
     37         CALL Agrif_Update_Variable(ztra,trn, procname=updateTRC) 
    4038      ELSE 
    41       Call Agrif_Update_Variable(tabtemp,trn,locupdate=(/0,2/), procname=updateTRC) 
     39         CALL Agrif_Update_Variable(ztra,trn,locupdate=(/0,2/), procname=updateTRC) 
    4240      ENDIF 
    43  
    4441 
    4542      Agrif_UseSpecialValueInUpdate = .FALSE. 
    4643#endif 
    4744 
    48       End subroutine Agrif_Update_Trc 
     45   END SUBROUTINE Agrif_Update_Trc 
    4946 
     47   SUBROUTINE updateTRC(tabres,i1,i2,j1,j2,k1,k2,before) 
     48      !!--------------------------------------------- 
     49      !!   *** ROUTINE UpdateTrc *** 
     50      !!--------------------------------------------- 
     51#  include "domzgr_substitute.h90" 
    5052 
    51        subroutine updateTRC(tabres,i1,i2,j1,j2,k1,k2,before) 
    52        Implicit none 
    53 #  include "domzgr_substitute.h90" 
    54        integer i1,i2,j1,j2,k1,k2 
    55        integer ji,jj,jk,jn 
    56        real,dimension(i1:i2,j1:j2,k1:k2,jptra) :: tabres 
    57        LOGICAL :: before 
     53      INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 
     54      REAL, DIMENSION(i1:i2,j1:j2,k1:k2,jptra), INTENT(inout) :: tabres 
     55      LOGICAL, INTENT(in) :: before 
     56    
     57      INTEGER :: ji,jj,jk,jn 
    5858 
    59     DO jn=1, jptra   
    60        IF (before) THEN 
    61         
    62          DO jk=k1,k2 
    63            DO jj=j1,j2 
    64              DO ji=i1,i2 
    65                tabres(ji,jj,jk,jn) = trn(ji,jj,jk,jn) 
    66              ENDDO 
    67            ENDDO 
    68          ENDDO 
    69           
    70        ELSE 
     59      DO jn=1, jptra   
    7160 
    72          DO jk=k1,k2 
    73            DO jj=j1,j2 
    74              DO ji=i1,i2 
    75                IF (tabres(ji,jj,jk,jn).NE.0.) THEN 
    76                trn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) * tmask(ji,jj,jk) 
    77                ENDIF 
    78              ENDDO 
     61         IF (before) THEN 
     62            DO jk=k1,k2 
     63               DO jj=j1,j2 
     64                  DO ji=i1,i2 
     65                     tabres(ji,jj,jk,jn) = trn(ji,jj,jk,jn) 
     66                  ENDDO 
     67               ENDDO 
    7968            ENDDO 
    80           ENDDO 
    81        ENDIF 
     69         ELSE 
     70            DO jk=k1,k2 
     71               DO jj=j1,j2 
     72                  DO ji=i1,i2 
     73                     IF (tabres(ji,jj,jk,jn).NE.0.) THEN 
     74                        trn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) * tmask(ji,jj,jk) 
     75                     ENDIF 
     76                  ENDDO 
     77               ENDDO 
     78            ENDDO 
     79         ENDIF 
    8280 
    83     END DO 
    84   
    85        end subroutine updateTRC 
     81      END DO 
    8682 
    87         
     83   END SUBROUTINE updateTRC 
    8884 
    89         
    9085#else 
    91        CONTAINS 
    92        subroutine agrif_top_update_empty 
    93        end subroutine agrif_top_update_empty 
     86CONTAINS 
     87   SUBROUTINE agrif_top_update_empty 
     88      !!--------------------------------------------- 
     89      !!   *** ROUTINE agrif_Top_update_empty *** 
     90      !!--------------------------------------------- 
     91      WRITE(*,*)  'agrif_top_update : You should not have seen this print! error?' 
     92   END SUBROUTINE agrif_top_update_empty 
    9493#endif 
    95        End Module agrif_top_update 
     94END Module agrif_top_update 
  • trunk/NEMO/NST_SRC/agrif_user.F90

    r628 r636  
    11#if defined key_agrif 
    2       SUBROUTINE Agrif_InitWorkspace 
    3 ! 
    4 !     Modules used: 
    5 ! 
    6       Use par_oce 
    7       Use dom_oce 
     2   SUBROUTINE Agrif_InitWorkspace 
     3      !!------------------------------------------ 
     4      !!   *** ROUTINE Agrif_InitWorkspace *** 
     5      !!------------------------------------------  
     6      USE par_oce 
     7      USE dom_oce 
    88      USE Agrif_Util 
    9 ! 
    10 !     Declarations: 
    11 !       
     9 
    1210      IMPLICIT NONE 
    13 ! 
    14 !     Variables       
    15 ! 
    16  
    17 ! 
    18 !     Begin 
    19 ! 
    20       if ( .NOT. Agrif_Root() ) then 
     11       
     12#if defined key_mpp_dyndist 
     13      CHARACTER(len=20) :: namelistname 
     14      INTEGER nummpp 
     15      NAMELIST/nam_mpp_dyndist/jpni,jpnj,jpnij 
     16 
     17      IF (Agrif_Nbstepint() .EQ. 0) THEN 
     18        nummpp = Agrif_Get_Unit() 
     19        namelistname='namelist' 
     20        IF (.NOT. Agrif_Root()) namelistname=TRIM(Agrif_CFixed())//'_namelist' 
     21        OPEN(nummpp,file=namelistname,status='OLD',form='formatted') 
     22        READ (nummpp,nam_mpp_dyndist) 
     23        CLOSE(nummpp) 
     24      ENDIF 
     25#endif 
     26 
     27      IF( .NOT. Agrif_Root() ) THEN 
    2128         jpiglo = nbcellsx + 2 + 2*nbghostcells 
    2229         jpjglo = nbcellsy + 2 + 2*nbghostcells 
     
    3340         nperio = 0 
    3441         jperio = 0 
    35       endif 
    36  
    37  
    38       Return 
    39       End Subroutine Agrif_InitWorkspace 
    40  
    41 ! 
    42       SUBROUTINE Agrif_InitValues 
    43 !     ------------------------------------------------------------------ 
    44 !     You should declare the variable which has to be interpolated here 
    45 !     ----------------------------------------------------------------- 
    46 ! 
    47 !     Modules used: 
    48  
     42      ENDIF 
     43 
     44   END SUBROUTINE Agrif_InitWorkspace 
     45 
     46   ! 
     47   SUBROUTINE Agrif_InitValues 
     48      !!------------------------------------------ 
     49      !!   *** ROUTINE Agrif_InitValues *** 
     50      !! 
     51      !! ** Purpose :: Declaration of variables to 
     52      !!               be interpolated 
     53      !!------------------------------------------ 
    4954      USE Agrif_Util 
    50       USE oce 
     55      USE oce  
    5156      USE dom_oce 
    5257      USE opa 
    53 #if   defined key_tradmp   ||   defined key_esopa 
     58      USE sms 
     59#if defined key_tradmp   ||   defined key_esopa 
    5460      USE tradmp 
    5561#endif 
     
    5965      USE ice_oce 
    6066#endif 
    61 #if defined key_passivetrc 
    62      USE agrif_top_update 
    63      USE agrif_top_interp 
    64      USE sms 
    65 #endif 
    6667#if defined key_agrif 
    67      USE agrif_opa_update 
    68      USE agrif_opa_interp 
    69      USE agrif_opa_sponge 
    70 #endif 
    71 ! 
    72 !     Declarations: 
    73 !       
    74       Implicit none 
    75 ! 
    76 !     Variables 
    77 ! 
    78       REAL(wp) tabtemp(jpi,jpj,jpk) 
    79 #if defined key_passivetrc 
    80       REAL(wp) tabtrtemp(jpi,jpj,jpk,jptra) 
    81 #endif 
    82 !  
     68      USE agrif_opa_update 
     69      USE agrif_opa_interp 
     70      USE agrif_opa_sponge 
     71      USE agrif_top_update 
     72      USE agrif_top_interp 
     73#endif 
     74 
     75      IMPLICIT NONE 
     76 
     77      REAL(wp) :: tabtemp(jpi,jpj,jpk) 
     78#if defined key_passivetrc 
     79      REAL(wp) :: tabtrtemp(jpi,jpj,jpk,jptra) 
     80#endif  
    8381      LOGICAL check_namelist 
    84 ! 
    85 ! 
    86 !     Begin 
    87 ! 
     82 
     83      ! 0. Initializations 
     84      !------------------- 
    8885#if defined key_orca_r025 || defined key_orca_r05 || defined key_orca_r2 || defined key_orca_r4 
    89       jp_cfg = -1  ! set special value for jp_cfg on fine grids 
     86      jp_cfg = -1    ! set special value for jp_cfg on fine grids 
    9087      cp_cfg = "default" 
    9188#endif 
    9289 
    9390      Call opa_init  ! Initializations of each fine grid 
    94 ! 
    95 !     Specific fine grid Initializations 
    96 ! 
     91 
     92      ! Specific fine grid Initializations 
    9793#if defined key_tradmp || defined key_esopa 
    98 ! no tracer damping on fine grids 
     94      ! no tracer damping on fine grids 
    9995      lk_tradmp = .FALSE. 
    10096#endif 
    101 !       
    102 !     Declaration of the type of variable which have to be interpolated 
    103 ! 
     97      ! 1. Declaration of the type of variable which have to be interpolated 
     98      !--------------------------------------------------------------------- 
    10499      Call Agrif_Set_type(un,(/1,2,0/),(/2,3,0/)) 
    105100      Call Agrif_Set_type(vn,(/2,1,0/),(/3,2,0/)) 
     
    110105      Call Agrif_Set_type(e1u,(/1,2/),(/2,3/)) 
    111106      Call Agrif_Set_type(e2v,(/2,1/),(/3,2/)) 
    112              
     107 
    113108      Call Agrif_Set_type(tn,(/2,2,0/),(/3,3,0/)) 
    114109      Call Agrif_Set_type(sn,(/2,2,0/),(/3,3,0/))  
     
    116111      Call Agrif_Set_type(tb,(/2,2,0/),(/3,3,0/)) 
    117112      Call Agrif_Set_type(sb,(/2,2,0/),(/3,3,0/))  
    118        
     113 
    119114      Call Agrif_Set_type(ta,(/2,2,0/),(/3,3,0/)) 
    120115      Call Agrif_Set_type(sa,(/2,2,0/),(/3,3,0/))        
    121              
     116 
    122117      Call Agrif_Set_type(sshn,(/2,2/),(/3,3/)) 
    123118      Call Agrif_Set_type(gcb,(/2,2/),(/3,3/)) 
     
    128123      Call Agrif_Set_type(tra,(/2,2,0,0/),(/3,3,0,0/)) 
    129124#endif 
    130  
    131  
    132  
    133 ! 
    134 !     Space directions for each variables 
    135 ! 
     125       
     126      ! 2. Space directions for each variables 
     127      !--------------------------------------- 
    136128      Call Agrif_Set_raf(un,(/'x','y','N'/)) 
    137129      Call Agrif_Set_raf(vn,(/'x','y','N'/)) 
    138        
     130 
    139131      Call Agrif_Set_raf(ua,(/'x','y','N'/)) 
    140132      Call Agrif_Set_raf(va,(/'x','y','N'/)) 
     
    145137      Call Agrif_Set_raf(tn,(/'x','y','N'/)) 
    146138      Call Agrif_Set_raf(sn,(/'x','y','N'/)) 
    147        
     139 
    148140      Call Agrif_Set_raf(tb,(/'x','y','N'/)) 
    149141      Call Agrif_Set_raf(sb,(/'x','y','N'/)) 
    150        
     142 
    151143      Call Agrif_Set_raf(ta,(/'x','y','N'/)) 
    152144      Call Agrif_Set_raf(sa,(/'x','y','N'/))       
    153              
     145 
    154146      Call Agrif_Set_raf(sshn,(/'x','y'/)) 
    155147      Call Agrif_Set_raf(gcb,(/'x','y'/)) 
     
    161153#endif 
    162154 
    163 ! 
    164 !     type of interpolation 
    165  
     155      ! 3. Type of interpolation 
     156      !-------------------------  
    166157      Call Agrif_Set_bcinterp(tn,interp=AGRIF_linear) 
    167158      Call Agrif_Set_bcinterp(sn,interp=AGRIF_linear) 
    168        
     159 
    169160      Call Agrif_Set_bcinterp(ta,interp=AGRIF_linear) 
    170161      Call Agrif_Set_bcinterp(sa,interp=AGRIF_linear) 
    171                 
     162 
    172163      Call Agrif_Set_bcinterp(un,interp1=Agrif_linear,interp2=AGRIF_ppm) 
    173164      Call Agrif_Set_bcinterp(vn,interp1=AGRIF_ppm,interp2=Agrif_linear) 
     
    175166      Call Agrif_Set_bcinterp(ua,interp1=Agrif_linear,interp2=AGRIF_ppm) 
    176167      Call Agrif_Set_bcinterp(va,interp1=AGRIF_ppm,interp2=Agrif_linear) 
    177        
     168 
    178169      Call Agrif_Set_bcinterp(e1u,interp1=Agrif_linear,interp2=AGRIF_ppm) 
    179170      Call Agrif_Set_bcinterp(e2v,interp1=AGRIF_ppm,interp2=Agrif_linear) 
     
    184175#endif 
    185176 
    186 ! 
    187 !     Location of interpolation 
    188 ! 
     177      ! 4. Location of interpolation 
     178      !----------------------------- 
    189179      Call Agrif_Set_bc(un,(/0,1/)) 
    190180      Call Agrif_Set_bc(vn,(/0,1/)) 
    191        
     181 
    192182      Call Agrif_Set_bc(e1u,(/0,0/)) 
    193183      Call Agrif_Set_bc(e2v,(/0,0/)) 
     
    207197#endif 
    208198 
    209 !    Update type 
    210        
     199      ! 5. Update type 
     200      !---------------  
    211201      Call Agrif_Set_Updatetype(tn, update = AGRIF_Update_Average) 
    212202      Call Agrif_Set_Updatetype(sn, update = AGRIF_Update_Average) 
    213        
     203 
    214204      Call Agrif_Set_Updatetype(tb, update = AGRIF_Update_Average) 
    215205      Call Agrif_Set_Updatetype(sb, update = AGRIF_Update_Average) 
     
    229219      Call Agrif_Set_Updatetype(e2v,update1 = Agrif_Update_Average, update2=Agrif_Update_Copy) 
    230220 
    231 ! First interpolations of potentially non zero fields 
    232  
    233        Agrif_SpecialValue=0. 
    234        Agrif_UseSpecialValue = .TRUE. 
    235        Call Agrif_Bc_variable(tabtemp,tn,calledweight=1.) 
    236        Call Agrif_Bc_variable(tabtemp,sn,calledweight=1.) 
    237        Call Agrif_Bc_variable(tabtemp,un,calledweight=1.,procname=interpu) 
    238        Call Agrif_Bc_variable(tabtemp,vn,calledweight=1.,procname=interpv) 
    239  
    240        Call Agrif_Bc_variable(tabtemp,ta,calledweight=1.,procname=interptn) 
    241        Call Agrif_Bc_variable(tabtemp,sa,calledweight=1.,procname=interpsn) 
    242  
    243        Call Agrif_Bc_variable(tabtemp,ua,calledweight=1.,procname=interpun) 
    244        Call Agrif_Bc_variable(tabtemp,va,calledweight=1.,procname=interpvn) 
    245  
    246 #if defined key_passivetrc 
    247        Call Agrif_Bc_variable(tabtrtemp,trn,calledweight=1.) 
    248 !       Call Agrif_Bc_variable(tabtrtemp,tra,calledweight=1.,procname=interptrn) 
    249        Call Agrif_Bc_variable(tabtrtemp,tra,calledweight=1.) 
    250  
    251 #endif 
    252        Agrif_UseSpecialValue = .FALSE. 
    253  
    254 ! 
    255  
    256 ! 
     221      ! 6. First interpolations of potentially non zero fields 
     222      !------------------------------------------------------- 
     223      Agrif_SpecialValue=0. 
     224      Agrif_UseSpecialValue = .TRUE. 
     225      Call Agrif_Bc_variable(tabtemp,tn,calledweight=1.) 
     226      Call Agrif_Bc_variable(tabtemp,sn,calledweight=1.) 
     227      Call Agrif_Bc_variable(tabtemp,un,calledweight=1.,procname=interpu) 
     228      Call Agrif_Bc_variable(tabtemp,vn,calledweight=1.,procname=interpv) 
     229 
     230      Call Agrif_Bc_variable(tabtemp,ta,calledweight=1.,procname=interptn) 
     231      Call Agrif_Bc_variable(tabtemp,sa,calledweight=1.,procname=interpsn) 
     232 
     233      Call Agrif_Bc_variable(tabtemp,ua,calledweight=1.,procname=interpun) 
     234      Call Agrif_Bc_variable(tabtemp,va,calledweight=1.,procname=interpvn) 
     235 
     236#if defined key_passivetrc 
     237      Call Agrif_Bc_variable(tabtrtemp,trn,calledweight=1.) 
     238      Call Agrif_Bc_variable(tabtrtemp,tra,calledweight=1.) 
     239#endif 
     240      Agrif_UseSpecialValue = .FALSE. 
     241 
     242      ! 7. Some controls 
     243      !----------------- 
    257244      check_namelist = .true. 
    258 !       
    259       IF( check_namelist ) then      
    260 ! 
    261 ! check time steps            
    262 ! 
    263        If( nint(Agrif_Rhot()) * nint(rdt) .ne. Agrif_Parent(rdt) ) then 
    264               Write(*,*) 'incompatible time step between grids' 
    265               Write(*,*) 'parent grid value : ',Agrif_Parent(rdt) 
    266               Write(*,*) 'child  grid value : ',nint(rdt) 
    267               Write(*,*) 'value on parent grid should be : ',rdt*Agrif_Rhot() 
    268               stop 
    269        Endif 
    270             
    271        If( Agrif_IRhot() * (Agrif_Parent(nitend)- & 
    272        Agrif_Parent(nit000)+1) .ne. (nitend-nit000+1) ) then 
    273             Write(*,*) 'incompatible run length between grids' 
    274             Write(*,*) 'parent grid value : ',(Agrif_Parent(nitend)- & 
    275             Agrif_Parent(nit000)+1),' time step' 
    276             Write(*,*) 'child  grid value : ', & 
    277             (nitend-nit000+1),' time step' 
    278             Write(*,*) 'value on child grid should be : ', & 
    279             Agrif_IRhot() * (Agrif_Parent(nitend)- & 
    280             Agrif_Parent(nit000)+1) 
    281            stop 
    282        Endif            
    283 ! 
    284 ! 
    285        IF ( ln_zps ) THEN 
    286 ! 
    287 ! check parameters for partial steps  
    288 ! 
    289        If( Agrif_Parent(e3zps_min) .ne. e3zps_min ) then 
    290             Write(*,*) 'incompatible e3zps_min between grids' 
    291             Write(*,*) 'parent grid :',Agrif_Parent(e3zps_min) 
    292             Write(*,*) 'child grid  :',e3zps_min 
    293             Write(*,*) 'those values should be identical' 
    294             stop 
    295        Endif           
    296 !           
    297        If( Agrif_Parent(e3zps_rat) .ne. e3zps_rat ) then 
    298             Write(*,*) 'incompatible e3zps_rat between grids' 
    299             Write(*,*) 'parent grid :',Agrif_Parent(e3zps_rat) 
    300             Write(*,*) 'child grid  :',e3zps_rat 
    301             Write(*,*) 'those values should be identical'                   
    302             stop 
    303        Endif                   
    304        ENDIF 
    305 !             
     245             
     246      IF( check_namelist ) THEN 
     247      
     248         ! Check time steps            
     249         IF( nint(Agrif_Rhot()) * nint(rdt) .ne. Agrif_Parent(rdt) ) THEN 
     250            WRITE(*,*) 'incompatible time step between grids' 
     251            WRITE(*,*) 'parent grid value : ',Agrif_Parent(rdt) 
     252            WRITE(*,*) 'child  grid value : ',nint(rdt) 
     253            WRITE(*,*) 'value on parent grid should be : ',rdt*Agrif_Rhot() 
     254            STOP 
     255         ENDIF 
     256          
     257         ! Check run length 
     258         IF( Agrif_IRhot() * (Agrif_Parent(nitend)- & 
     259            Agrif_Parent(nit000)+1) .ne. (nitend-nit000+1) ) THEN 
     260            WRITE(*,*) 'incompatible run length between grids' 
     261            WRITE(*,*) 'parent grid value : ',(Agrif_Parent(nitend)- & 
     262               Agrif_Parent(nit000)+1),' time step' 
     263            WRITE(*,*) 'child  grid value : ', & 
     264               (nitend-nit000+1),' time step' 
     265            WRITE(*,*) 'value on child grid should be : ', & 
     266               Agrif_IRhot() * (Agrif_Parent(nitend)- & 
     267               Agrif_Parent(nit000)+1) 
     268            STOP 
     269         ENDIF 
     270          
     271         ! Check coordinates 
     272         IF( ln_zps ) THEN 
     273            ! check parameters for partial steps  
     274            IF( Agrif_Parent(e3zps_min) .ne. e3zps_min ) THEN 
     275               WRITE(*,*) 'incompatible e3zps_min between grids' 
     276               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_min) 
     277               WRITE(*,*) 'child grid  :',e3zps_min 
     278               WRITE(*,*) 'those values should be identical' 
     279               STOP 
     280            ENDIF           
     281            IF( Agrif_Parent(e3zps_rat) .ne. e3zps_rat ) THEN 
     282               WRITE(*,*) 'incompatible e3zps_rat between grids' 
     283               WRITE(*,*) 'parent grid :',Agrif_Parent(e3zps_rat) 
     284               WRITE(*,*) 'child grid  :',e3zps_rat 
     285               WRITE(*,*) 'those values should be identical'                   
     286               STOP 
     287            ENDIF 
     288         ENDIF 
     289 
    306290      ENDIF 
    307 ! 
    308 ! 
    309  
    310       Call Agrif_Update_tra(0) 
    311       Call Agrif_Update_dyn(0) 
     291 
     292      CALL Agrif_Update_tra(0) 
     293      CALL Agrif_Update_dyn(0) 
     294 
     295      nbcline = 0 
     296 
     297   END SUBROUTINE Agrif_InitValues 
     298   ! 
     299    
     300SUBROUTINE Agrif_detect(g,sizex) 
     301      !!------------------------------------------ 
     302      !!   *** ROUTINE Agrif_detect *** 
     303      !!------------------------------------------ 
     304      USE Agrif_Types 
     305  
     306      INTEGER, DIMENSION(2) :: sizex 
     307      INTEGER, DIMENSION(sizex(1),sizex(2)) :: g  
     308 
     309      Return 
     310 
     311   End SUBROUTINE Agrif_detect 
     312 
     313#if defined key_mpp_mpi 
     314 
     315   SUBROUTINE Agrif_InvLoc(indloc,nprocloc,i,indglob) 
     316      !!------------------------------------------ 
     317      !!   *** ROUTINE Agrif_detect *** 
     318      !!------------------------------------------ 
     319      USE dom_oce 
    312320       
    313       nbcline = 0 
    314  
    315       Return 
    316       End Subroutine Agrif_InitValues 
    317 ! 
    318       SUBROUTINE Agrif_detect(g,sizex) 
    319 ! 
    320 !     Modules used: 
    321  
    322       Use Agrif_Types 
    323 ! 
    324 ! 
    325 !     Declarations: 
    326 !       
    327 ! 
    328 !     Variables       
    329 ! 
    330       Integer, Dimension(2) :: sizex 
    331       Integer, Dimension(sizex(1),sizex(2))   :: g  
    332 ! 
    333 !     Begin 
    334 ! 
    335 ! 
    336  
    337 ! 
    338       Return 
    339       End Subroutine Agrif_detect 
    340        
    341 #if defined key_mpp_mpi 
    342 ! 
    343 !     ************************************************************************** 
    344 !!!   Subroutine Agrif_InvLoc 
    345 !     ************************************************************************** 
    346 ! 
    347       Subroutine Agrif_InvLoc(indloc,nprocloc,i,indglob) 
    348  
    349 !     Description: 
    350 ! 
    351       USE dom_oce 
    352  
    353 !     Declarations: 
    354  
    355 !!      Implicit none 
    356 ! 
    357       Integer :: indglob,indloc,nprocloc,i 
    358 ! 
    359 ! 
     321      IMPLICIT NONE 
     322 
     323      INTEGER :: indglob,indloc,nprocloc,i 
     324 
    360325      SELECT CASE(i) 
    361  
    362326      CASE(1) 
    363         indglob = indloc + nimppt(nprocloc+1) - 1 
    364  
     327         indglob = indloc + nimppt(nprocloc+1) - 1 
    365328      CASE(2) 
    366         indglob = indloc + njmppt(nprocloc+1) - 1  
    367  
     329         indglob = indloc + njmppt(nprocloc+1) - 1  
    368330      CASE(3) 
    369         indglob = indloc 
    370  
     331         indglob = indloc 
    371332      CASE(4) 
    372         indglob = indloc 
    373  
     333         indglob = indloc 
    374334      END SELECT 
    375 ! 
    376 ! 
    377       End Subroutine Agrif_InvLoc 
    378 #endif 
    379  
    380               
     335 
     336   END SUBROUTINE Agrif_InvLoc 
     337 
     338#endif 
     339 
    381340#else 
    382       subroutine Subcalledbyagrif 
    383          write(*,*) 'Impossible to bet here' 
    384       end subroutine Subcalledbyagrif 
    385 #endif 
     341   SUBROUTINE Subcalledbyagrif 
     342      !!------------------------------------------ 
     343      !!   *** ROUTINE Subcalledbyagrif *** 
     344      !!------------------------------------------ 
     345      WRITE(*,*) 'Impossible to be here' 
     346   END SUBROUTINE Subcalledbyagrif 
     347#endif 
Note: See TracChangeset for help on using the changeset viewer.