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

Ignore:
Timestamp:
2017-11-21T11:15:35+01:00 (6 years ago)
Author:
jchanut
Message:

AGRIF + vvl: Final changes, update SETTE tests (these are ok except SAS) - #1965

File:
1 edited

Legend:

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

    r8741 r8762  
    139139# if defined key_zdftke 
    140140 
    141    SUBROUTINE Agrif_Update_Tke( ) 
     141   SUBROUTINE Agrif_Update_Tke( kt ) 
    142142      !!--------------------------------------------- 
    143143      !!   *** ROUTINE Agrif_Update_Tke *** 
    144144      !!--------------------------------------------- 
    145145      !! 
     146      INTEGER, INTENT(in) :: kt  
    146147      !  
    147148      IF (Agrif_Root()) RETURN 
     
    272273   END SUBROUTINE dom_vvl_update_UVF 
    273274 
    274    SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
     275   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    275276      !!--------------------------------------------- 
    276277      !!           *** ROUTINE updateT *** 
     
    279280      REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    280281      LOGICAL, INTENT(in) :: before 
    281       INTEGER, INTENT(in) :: nb, ndir 
    282282      !! 
    283       LOGICAL :: western_side, eastern_side, southern_side, northern_side  
    284283      INTEGER :: ji,jj,jk,jn 
    285284      REAL(wp) :: ztb, ztnu, ztno 
     
    340339         ENDIF 
    341340         ! 
    342          ! 
    343 # if defined DECAL_FEEDBACK 
    344          IF (.NOT.ln_linssh) THEN  
    345             western_side  = (nb == 1).AND.(ndir == 1) 
    346             eastern_side  = (nb == 1).AND.(ndir == 2) 
    347             southern_side = (nb == 2).AND.(ndir == 1) 
    348             northern_side = (nb == 2).AND.(ndir == 2) 
    349             ! 
    350             ! Asselin correction  
    351             IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 
    352                IF (southern_side) THEN 
    353                   DO jn = n1,n2 
    354                      DO jk=k1,k2 
    355                         DO ji=i1,i2 
    356                            ztb  = tsb(ji,j1-1,jk,jn) * e3t_b(ji,j1-1,jk) ! fse3t_b prior update should be used 
    357                            ztnu = tsn(ji,j1-1,jk,jn) * e3t_n(ji,j1-1,jk) 
    358                            ztno = tsn(ji,j1-1,jk,jn) * e3t_a(ji,j1-1,jk) 
    359                            tsb(ji,j1-1,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
    360                                      &        * tmask(ji,j1-1,jk) / e3t_b(ji,j1-1,jk) 
    361                         END DO 
    362                      ENDDO 
    363                   ENDDO 
    364                ENDIF 
    365                IF (northern_side) THEN 
    366                   DO jn = n1,n2 
    367                      DO jk=k1,k2 
    368                         DO ji=i1,i2 
    369                            ztb  = tsb(ji,j2+1,jk,jn) * e3t_b(ji,j2+1,jk) ! fse3t_b prior update should be used 
    370                            ztnu = tsn(ji,j2+1,jk,jn) * e3t_n(ji,j2+1,jk) 
    371                            ztno = tsn(ji,j2+1,jk,jn) * e3t_a(ji,j2+1,jk) 
    372                            tsb(ji,j2+1,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
    373                                      &        * tmask(ji,j2+1,jk) / e3t_b(ji,j2+1,jk) 
    374                         END DO 
    375                      ENDDO 
    376                   ENDDO 
    377                ENDIF 
    378                IF (western_side) THEN 
    379                   DO jn = n1,n2 
    380                      DO jk=k1,k2 
    381                         DO jj=j1,j2 
    382                            ztb  = tsb(i1-1,jj,jk,jn) * e3t_b(i1-1,jj,jk) ! fse3t_b prior update should be used 
    383                            ztnu = tsn(i1-1,jj,jk,jn) * e3t_n(i1-1,jj,jk) 
    384                            ztno = tsn(i1-1,jj,jk,jn) * e3t_a(i1-1,jj,jk) 
    385                            tsb(i1-1,jj,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
    386                                      &        * tmask(i1-1,jj,jk) / e3t_b(i1-1,jj,jk) 
    387                         END DO 
    388                      ENDDO 
    389                   ENDDO 
    390                ENDIF 
    391                IF (eastern_side) THEN 
    392                   DO jn = n1,n2 
    393                      DO jk=k1,k2 
    394                         DO jj=j1,j2 
    395                            ztb  = tsb(i2+1,jj,jk,jn) * e3t_b(i2+1,jj,jk) ! fse3t_b prior update should be used 
    396                            ztnu = tsn(i2+1,jj,jk,jn) * e3t_n(i2+1,jj,jk) 
    397                            ztno = tsn(i2+1,jj,jk,jn) * e3t_a(i2+1,jj,jk) 
    398                            tsb(i2+1,jj,jk,jn) = ( ztb + atfp * ( ztnu - ztno) )  &  
    399                                      &        * tmask(i2+1,jj,jk) / e3t_b(i2+1,jj,jk) 
    400                         END DO 
    401                      ENDDO 
    402                   ENDDO 
    403                ENDIF 
    404             ENDIF ! Asselin correction 
    405  
    406             IF (southern_side) THEN 
    407                DO jn = n1,n2 
    408                   DO jk=k1,k2 
    409                      DO ji=i1,i2 
    410                         tsn(ji,j1-1,jk,jn) = tsn(ji,j1-1,jk,jn) * e3t_a(ji,j1-1,jk) / e3t_n(ji,j1-1,jk) 
    411                      END DO 
    412                   ENDDO 
    413                ENDDO 
    414             ENDIF 
    415             IF (northern_side) THEN 
    416                DO jn = n1,n2 
    417                   DO jk=k1,k2 
    418                      DO ji=i1,i2 
    419                         tsn(ji,j2+1,jk,jn) = tsn(ji,j2+1,jk,jn) * e3t_a(ji,j2+1,jk) / e3t_n(ji,j2+1,jk) 
    420                      END DO 
    421                   ENDDO 
    422                ENDDO 
    423             ENDIF 
    424             IF (western_side) THEN 
    425                DO jn = n1,n2 
    426                   DO jk=k1,k2 
    427                      DO jj=j1,j2 
    428                         tsn(i1-1,jj,jk,jn) = tsn(i1-1,jj,jk,jn) * e3t_a(i1-1,jj,jk) / e3t_n(i1-1,jj,jk) 
    429                      END DO 
    430                   ENDDO 
    431                ENDDO 
    432             ENDIF 
    433             IF (eastern_side) THEN 
    434                DO jn = n1,n2 
    435                   DO jk=k1,k2 
    436                      DO jj=j1,j2 
    437                         tsn(i2+1,jj,jk,jn) = tsn(i2+1,jj,jk,jn) * e3t_a(i2+1,jj,jk) / e3t_n(i2+1,jj,jk) 
    438                      END DO 
    439                   ENDDO 
    440                ENDDO 
    441             ENDIF 
    442          ENDIF 
    443 #endif 
    444341      ENDIF 
    445342      !  
     
    676573 
    677574 
    678    SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before, nb, ndir ) 
     575   SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) 
    679576      !!--------------------------------------------- 
    680577      !!          *** ROUTINE updateSSH *** 
     
    683580      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    684581      LOGICAL, INTENT(in) :: before 
    685       INTEGER, INTENT(in) :: nb, ndir 
    686582      !! 
    687       LOGICAL :: western_side, eastern_side, southern_side, northern_side  
    688583      INTEGER :: ji, jj 
    689584      !!--------------------------------------------- 
     
    717612         ENDIF 
    718613         ! 
    719 # if defined DECAL_FEEDBACK 
    720 !         western_side  = (nb == 1).AND.(ndir == 1) 
    721 !         eastern_side  = (nb == 1).AND.(ndir == 2) 
    722 !         southern_side = (nb == 2).AND.(ndir == 1) 
    723 !         northern_side = (nb == 2).AND.(ndir == 2) 
    724 !         ! 
    725 !         ! Asselin correction  
    726 !         IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN 
    727 !            IF (southern_side) THEN 
    728 !               DO ji=i1,i2 
    729 !                  sshn(ji,j1-1) = sshn(ji,j1-1) - rdt * r1_e2t(ji,j1-1) * (vb2_b_s(ji,j1-1)-vb2_b(ji,j1-1)) 
    730 !               END DO 
    731 !            ENDIF 
    732 !            IF (northern_side) THEN 
    733 !               DO ji=i1,i2 
    734 !                  sshn(ji,j1+1) = sshn(ji,j1+1) + rdt * r1_e2t(ji,j1+1) * (vb2_b_s(ji,j1)-vb2_b(ji,j1)) 
    735 !               END DO 
    736 !            ENDIF 
    737 !            IF (western_side) THEN 
    738 !               DO jj=j1,j2 
    739 !                  sshn(i1-1,jj) = sshn(i1-1,jj) - rdt * r1_e2t(i1-1,jj) * (ub2_b_s(i1-1,jj)-ub2_b(i1-1,jj)) 
    740 !               END DO 
    741 !            ENDIF 
    742 !            IF (eastern_side) THEN 
    743 !               DO jj=j1,j2 
    744 !                  sshn(i1+1,jj) = sshn(i1+1,jj) + rdt * r1_e2t(i1+1,jj) * (ub2_b_s(i1,jj)-ub2_b(i1,jj)) 
    745 !               END DO 
    746 !            ENDIF 
    747 !            !  
    748 !         ENDIF 
    749 #endif 
     614 
    750615      ENDIF 
    751616      ! 
     
    753618 
    754619 
    755    SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before ) 
     620   SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before, nb, ndir ) 
    756621      !!--------------------------------------------- 
    757622      !!          *** ROUTINE updateub2b *** 
     
    760625      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    761626      LOGICAL, INTENT(in) :: before 
     627      INTEGER, INTENT(in) :: nb, ndir 
    762628      !! 
     629      LOGICAL :: western_side, eastern_side  
    763630      INTEGER :: ji, jj 
    764631      REAL(wp) :: zrhoy, za1 
     
    774641         tabres = zrhoy * tabres 
    775642      ELSE 
     643         !  
     644         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_e2u(i1:i2,j1:j2) 
     645         ! 
     646         ! Refluxing here: 
     647#if defined DECAL_FEEDBACK 
     648         western_side  = (nb == 1).AND.(ndir == 1) 
     649         eastern_side  = (nb == 1).AND.(ndir == 2) 
     650         ! 
     651         IF (western_side) THEN 
     652            DO jj=j1,j2 
     653               sshn(i1  ,jj) = sshn(i1  ,jj) + rdt * r1_e1e2t(i1  ,jj) & 
     654                     &         * e2u(i1,jj) * (ub2_b(i1,jj)-tabres(i1,jj)) 
     655            END DO 
     656         ENDIF 
     657         IF (eastern_side) THEN 
     658            DO jj=j1,j2 
     659               sshn(i2+1,jj) = sshn(i2+1,jj) - rdt * r1_e1e2t(i2+1,jj) & 
     660                     &         * e2u(i2,jj) * (ub2_b(i2,jj)-tabres(i2,jj)) 
     661            END DO 
     662         ENDIF 
     663         !  
     664#endif 
    776665         za1 = 1._wp / REAL(Agrif_rhot(), wp) 
    777          tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_e2u(i1:i2,j1:j2) 
     666         ! 
    778667         DO jj=j1,j2 
    779668            DO ji=i1,i2 
     669               ! Update time integrated fluxes also in case of multiply nested grids: 
    780670               ub2_i_b(ji,jj) = ub2_i_b(ji,jj) &  
    781671                & + za1 * (tabres(ji,jj) - ub2_b(ji,jj)) 
    782 !               ub2_b_s(ji,jj) = ub2_b(ji,jj) 
     672               ! Update half step back fluxes: 
    783673               ub2_b(ji,jj) = tabres(ji,jj) 
    784674            END DO 
     
    789679 
    790680 
    791    SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before ) 
     681   SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before, nb, ndir ) 
    792682      !!--------------------------------------------- 
    793683      !!          *** ROUTINE updatevb2b *** 
     
    796686      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 
    797687      LOGICAL, INTENT(in) :: before 
     688      INTEGER, INTENT(in) :: nb, ndir 
    798689      !! 
     690      LOGICAL :: southern_side, northern_side  
    799691      INTEGER :: ji, jj 
    800692      REAL(wp) :: zrhox, za1 
     
    810702         tabres = zrhox * tabres 
    811703      ELSE 
     704         !  
     705         tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_e1v(i1:i2,j1:j2) 
     706         ! 
     707         ! Refluxing here: 
     708#if defined DECAL_FEEDBACK 
     709         southern_side = (nb == 2).AND.(ndir == 1) 
     710         northern_side = (nb == 2).AND.(ndir == 2) 
     711         ! 
     712         IF (southern_side) THEN 
     713            DO ji=i1,i2 
     714               sshn(ji,j1  ) = sshn(ji,j1  ) + rdt * r1_e1e2t(ji,j1  ) & 
     715                     &         * e1v(ji,j1  ) * (vb2_b(ji,j1)-tabres(ji,j1)) 
     716            END DO 
     717         ENDIF 
     718         IF (northern_side) THEN                
     719            DO ji=i1,i2 
     720               sshn(ji,j2+1) = sshn(ji,j2+1) - rdt * r1_e1e2t(ji,j2+1) & 
     721                     &         * e1v(ji,j2  ) * (vb2_b(ji,j2)-tabres(ji,j2)) 
     722            END DO 
     723         ENDIF 
     724         !  
     725#endif 
    812726         za1 = 1._wp / REAL(Agrif_rhot(), wp) 
    813          tabres(i1:i2,j1:j2) = tabres(i1:i2,j1:j2) * r1_e1v(i1:i2,j1:j2) 
    814727         DO jj=j1,j2 
    815728            DO ji=i1,i2 
     729               ! Update time integrated fluxes also in case of multiply nested grids: 
    816730               vb2_i_b(ji,jj) = vb2_i_b(ji,jj) &  
    817731                & + za1 * (tabres(ji,jj) - vb2_b(ji,jj)) 
    818 !               vb2_b_s(ji,jj) = vb2_b(ji,jj) 
     732               ! Update half step back fluxes: 
    819733               vb2_b(ji,jj) = tabres(ji,jj) 
    820734            END DO 
     
    952866         ! 
    953867!> jc tmp: 
    954 !         DO jk = 1, jpkm1 
    955 !            DO jj=j1,j2 
    956 !               DO ji=i1,i2 
    957 !                  IF (tmask(ji,jj,jk)==1) THEN 
    958 !                     ptab(ji,jj,jk) = ptab(ji,jj,jk) * e3t_0(ji,jj,jk) 
    959 !                  ELSE 
    960 !                     ptab(ji,jj,jk) = e3t_0(ji,jj,jk) 
    961 !                  ENDIF 
    962 !               END DO 
    963 !            END DO 
    964 !         END DO 
    965          ptab(i1:i2,j1:j2,k1:k2) = ptab(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2) 
     868         DO jk = 1, jpkm1 
     869            DO jj=j1,j2 
     870               DO ji=i1,i2 
     871                  IF (tmask(ji,jj,jk)==1) THEN 
     872                     ptab(ji,jj,jk) = ptab(ji,jj,jk) * e3t_0(ji,jj,jk) 
     873                  ELSE 
     874                     ptab(ji,jj,jk) = e3t_0(ji,jj,jk) 
     875                  ENDIF 
     876               END DO 
     877            END DO 
     878         END DO 
     879!         ptab(i1:i2,j1:j2,k1:k2) = ptab(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2) 
    966880!< jc tmp: 
    967881 
     
    969883         ! of prognostic variables (needed to update initial state only) 
    970884         e3t_a(i1:i2,j1:j2,k1:k2) = e3t_n(i1:i2,j1:j2,k1:k2) 
    971 !         hdivb(i1:i2,j1:j2,k1:k2)   = e3t_b(i1:i2,j1:j2,k1:k2) 
     885!         hdivn(i1:i2,j1:j2,k1:k2)   = e3t_b(i1:i2,j1:j2,k1:k2) 
    972886 
    973887         IF (     (.NOT.(lk_agrif_fstep.AND.(neuler==0)).AND.(ln_dynspg_exp)) & 
Note: See TracChangeset for help on using the changeset viewer.