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 8741 for branches/2017/dev_r8624_AGRIF3_VVL/NEMOGCM/NEMO/NST_SRC/agrif_top_update.F90 – NEMO

Ignore:
Timestamp:
2017-11-17T17:19:55+01:00 (6 years ago)
Author:
jchanut
Message:

AGRIF + vvl Main changes - #1965

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8624_AGRIF3_VVL/NEMOGCM/NEMO/NST_SRC/agrif_top_update.F90

    r6140 r8741  
    3333CONTAINS 
    3434 
    35    SUBROUTINE Agrif_Update_Trc( kt ) 
     35   SUBROUTINE Agrif_Update_Trc( ) 
    3636      !!---------------------------------------------------------------------- 
    3737      !!                   *** ROUTINE Agrif_Update_Trc *** 
    3838      !!---------------------------------------------------------------------- 
    39       INTEGER, INTENT(in) ::   kt 
    40       !!---------------------------------------------------------------------- 
    4139      !  
    42       IF((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN 
     40      IF (Agrif_Root()) RETURN  
     41      ! 
    4342#if defined TWO_WAY    
    4443      Agrif_UseSpecialValueInUpdate = .TRUE. 
     
    6665 
    6766 
    68    SUBROUTINE updateTRC( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     67   SUBROUTINE updateTRC( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
    6968      !!---------------------------------------------------------------------- 
    7069      !!                      *** ROUTINE updateT *** 
     
    7372      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) ::   ptab 
    7473      LOGICAL                                    , INTENT(in   ) ::   before 
     74      INTEGER, INTENT(in) :: nb, ndir 
    7575      !! 
    76       INTEGER ::   ji, jj, jk, jn 
    77       !!---------------------------------------------------------------------- 
    78       ! 
    79       IF( before ) THEN 
    80          ptab(i1:i2,j1:j2,k1:k2,n1:n2) = trn(i1:i2,j1:j2,k1:k2,n1:n2) 
    81       ELSE 
    82          IF( .NOT.(lk_agrif_fstep.AND.(neuler==0)) ) THEN 
    83             ! Add asselin part 
    84             DO jn = n1,n2 
    85                DO jk = k1, k2 
    86                   DO jj = j1, j2 
    87                      DO ji = i1, i2 
    88                         IF( ptab(ji,jj,jk,jn) /= 0._wp ) THEN 
    89                            trb(ji,jj,jk,jn) = trb(ji,jj,jk,jn)             &  
    90                               &             + atfp * ( ptab(ji,jj,jk,jn)   & 
    91                                  &                    - trn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
    92                         ENDIF 
    93                      END DO 
     76      LOGICAL :: western_side, eastern_side, southern_side, northern_side  
     77      INTEGER :: ji,jj,jk,jn 
     78      REAL(wp) :: ztb, ztnu, ztno 
     79      !!---------------------------------------------------------------------- 
     80      ! 
     81      ! 
     82      IF (before) THEN 
     83         DO jn = n1,n2 
     84            DO jk=k1,k2 
     85               DO jj=j1,j2 
     86                  DO ji=i1,i2 
     87!> jc tmp 
     88                     tabres(ji,jj,jk,jn) = trn(ji,jj,jk,jn)  * e3t_n(ji,jj,jk) / e3t_0(ji,jj,jk) 
     89!                     tabres(ji,jj,jk,jn) = trn(ji,jj,jk,jn)  * e3t_n(ji,jj,jk) 
     90!< jc tmp 
    9491                  END DO 
    9592               END DO 
    9693            END DO 
     94         END DO 
     95      ELSE 
     96!> jc tmp 
     97         DO jn = n1,n2 
     98            tabres(i1:i2,j1:j2,k1:k2,jn) =  tabres(i1:i2,j1:j2,k1:k2,jn) * e3t_0(i1:i2,j1:j2,k1:k2) & 
     99                                         & * tmask(i1:i2,j1:j2,k1:k2) 
     100         ENDDO 
     101!< jc tmp 
     102         IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 
     103            ! Add asselin part 
     104            DO jn = n1,n2 
     105               DO jk=k1,k2 
     106                  DO jj=j1,j2 
     107                     DO ji=i1,i2 
     108                        IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN 
     109                           ztb  = trb(ji,jj,jk,jn) * e3t_b(ji,jj,jk) ! fse3t_b prior update should be used 
     110                           ztnu = tabres(ji,jj,jk,jn) 
     111                           ztno = trn(ji,jj,jk,jn) * e3t_a(ji,jj,jk) 
     112                           trb(ji,jj,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
     113                                     &        * tmask(ji,jj,jk) / e3t_b(ji,jj,jk) 
     114                        ENDIF 
     115                     ENDDO 
     116                  ENDDO 
     117               ENDDO 
     118            ENDDO 
    97119         ENDIF 
    98          DO jn = n1, n2 
    99             DO jk = k1, k2 
    100                DO jj = j1, j2 
    101                   DO ji = i1, i2 
    102                      IF( ptab(ji,jj,jk,jn) /= 0._wp ) THEN  
    103                         trn(ji,jj,jk,jn) = ptab(ji,jj,jk,jn) * tmask(ji,jj,jk) 
     120         DO jn = n1,n2 
     121            DO jk=k1,k2 
     122               DO jj=j1,j2 
     123                  DO ji=i1,i2 
     124                     IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN  
     125                        trn(ji,jj,jk,jn) = tabres(ji,jj,jk,jn) / e3t_n(ji,jj,jk) 
    104126                     END IF 
    105127                  END DO 
     
    107129            END DO 
    108130         END DO 
     131         ! 
     132         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN 
     133            trb(i1:i2,j1:j2,k1:k2,n1:n2)  = trn(i1:i2,j1:j2,k1:k2,n1:n2) 
     134         ENDIF 
     135         ! 
     136         ! 
     137# if defined DECAL_FEEDBACK 
     138         IF (.NOT.ln_linssh) THEN  
     139            western_side  = (nb == 1).AND.(ndir == 1) 
     140            eastern_side  = (nb == 1).AND.(ndir == 2) 
     141            southern_side = (nb == 2).AND.(ndir == 1) 
     142            northern_side = (nb == 2).AND.(ndir == 2) 
     143            ! 
     144            ! Asselin correction  
     145            IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 
     146               IF (southern_side) THEN 
     147                  DO jn = n1,n2 
     148                     DO jk=k1,k2 
     149                        DO ji=i1,i2 
     150                           ztb  = trb(ji,j1-1,jk,jn) * e3t_b(ji,j1-1,jk) ! fse3t_b prior update should be used 
     151                           ztnu = trn(ji,j1-1,jk,jn) * e3t_n(ji,j1-1,jk) 
     152                           ztno = trn(ji,j1-1,jk,jn) * e3t_a(ji,j1-1,jk) 
     153                           trb(ji,j1-1,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
     154                                     &        * tmask(ji,j1-1,jk) / e3t_b(ji,j1-1,jk) 
     155                        END DO 
     156                     ENDDO 
     157                  ENDDO 
     158               ENDIF 
     159               IF (northern_side) THEN 
     160                  DO jn = n1,n2 
     161                     DO jk=k1,k2 
     162                        DO ji=i1,i2 
     163                           ztb  = trb(ji,j2+1,jk,jn) * e3t_b(ji,j2+1,jk) ! fse3t_b prior update should be used 
     164                           ztnu = trn(ji,j2+1,jk,jn) * e3t_n(ji,j2+1,jk) 
     165                           ztno = trn(ji,j2+1,jk,jn) * e3t_a(ji,j2+1,jk) 
     166                           trb(ji,j2+1,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
     167                                     &        * tmask(ji,j2+1,jk) / e3t_b(ji,j2+1,jk) 
     168                        END DO 
     169                     ENDDO 
     170                  ENDDO 
     171               ENDIF 
     172               IF (western_side) THEN 
     173                  DO jn = n1,n2 
     174                     DO jk=k1,k2 
     175                        DO jj=j1,j2 
     176                           ztb  = trb(i1-1,jj,jk,jn) * e3t_b(i1-1,jj,jk) ! fse3t_b prior update should be used 
     177                           ztnu = trn(i1-1,jj,jk,jn) * e3t_n(i1-1,jj,jk) 
     178                           ztno = trn(i1-1,jj,jk,jn) * e3t_a(i1-1,jj,jk) 
     179                           trb(i1-1,jj,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
     180                                     &        * tmask(i1-1,jj,jk) / e3t_b(i1-1,jj,jk) 
     181                        END DO 
     182                     ENDDO 
     183                  ENDDO 
     184               ENDIF 
     185               IF (eastern_side) THEN 
     186                  DO jn = n1,n2 
     187                     DO jk=k1,k2 
     188                        DO jj=j1,j2 
     189                           ztb  = trb(i2+1,jj,jk,jn) * e3t_b(i2+1,jj,jk) ! fse3t_b prior update should be used 
     190                           ztnu = trn(i2+1,jj,jk,jn) * e3t_n(i2+1,jj,jk) 
     191                           ztno = trn(i2+1,jj,jk,jn) * e3t_a(i2+1,jj,jk) 
     192                           trb(i2+1,jj,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
     193                                     &        * tmask(i2+1,jj,jk) / e3t_b(i2+1,jj,jk) 
     194                        END DO 
     195                     ENDDO 
     196                  ENDDO 
     197               ENDIF 
     198            ENDIF ! Asselin correction 
     199 
     200            IF (southern_side) THEN 
     201               DO jn = n1,n2 
     202                  DO jk=k1,k2 
     203                     DO ji=i1,i2 
     204                        trn(ji,j1-1,jk,jn) = trn(ji,j1-1,jk,jn) * e3t_a(ji,j1-1,jk) / e3t_n(ji,j1-1,jk) 
     205                     END DO 
     206                  ENDDO 
     207               ENDDO 
     208            ENDIF 
     209            IF (northern_side) THEN 
     210               DO jn = n1,n2 
     211                  DO jk=k1,k2 
     212                     DO ji=i1,i2 
     213                        trn(ji,j2+1,jk,jn) = trn(ji,j2+1,jk,jn) * e3t_a(ji,j2+1,jk) / e3t_n(ji,j2+1,jk) 
     214                     END DO 
     215                  ENDDO 
     216               ENDDO 
     217            ENDIF 
     218            IF (western_side) THEN 
     219               DO jn = n1,n2 
     220                  DO jk=k1,k2 
     221                     DO jj=j1,j2 
     222                        trn(i1-1,jj,jk,jn) = trn(i1-1,jj,jk,jn) * e3t_a(i1-1,jj,jk) / e3t_n(i1-1,jj,jk) 
     223                     END DO 
     224                  ENDDO 
     225               ENDDO 
     226            ENDIF 
     227            IF (eastern_side) THEN 
     228               DO jn = n1,n2 
     229                  DO jk=k1,k2 
     230                     DO jj=j1,j2 
     231                        trn(i2+1,jj,jk,jn) = trn(i2+1,jj,jk,jn) * e3t_a(i2+1,jj,jk) / e3t_n(i2+1,jj,jk) 
     232                     END DO 
     233                  ENDDO 
     234               ENDDO 
     235            ENDIF 
     236         ENDIF 
     237#endif 
    109238      ENDIF 
    110239      !  
Note: See TracChangeset for help on using the changeset viewer.