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 13337 for NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/src/NST/agrif_oce_update.F90 – NEMO

Ignore:
Timestamp:
2020-07-24T16:01:24+02:00 (4 years ago)
Author:
jchanut
Message:

#2222, start suppressing key_vertical (add ln_vremap namelist flag)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/src/NST/agrif_oce_update.F90

    r13286 r13337  
    5050      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers  from grid Number',Agrif_Fixed() 
    5151 
    52 #if defined key_vertical 
    53 ! Effect of this has to be carrefully checked  
    54 ! depending on what the nesting tools ensure for 
    55 ! volume conservation: 
    56       Agrif_UseSpecialValueInUpdate = .FALSE. 
    57 #else 
    58       Agrif_UseSpecialValueInUpdate = .TRUE. 
    59 #endif 
     52      Agrif_UseSpecialValueInUpdate = .NOT.l_vremap 
    6053      Agrif_SpecialValueFineGrid    = 0._wp 
     54      l_vremap                      = ln_vremap 
    6155      !  
    6256# if ! defined DECAL_FEEDBACK 
     
    7165      ! 
    7266      Agrif_UseSpecialValueInUpdate = .FALSE. 
     67      l_vremap                      = .FALSE. 
    7368      ! 
    7469      ! 
     
    8681      Agrif_UseSpecialValueInUpdate = .FALSE. 
    8782      Agrif_SpecialValueFineGrid    = 0._wp 
    88  
    89       use_sign_north = .TRUE. 
    90       sign_north     = -1._wp 
     83      l_vremap                      = ln_vremap 
     84      use_sign_north                = .TRUE. 
     85      sign_north                    = -1._wp 
    9186 
    9287      !      
     
    133128      ! 
    134129      use_sign_north = .FALSE. 
     130      ln_vremap = .FALSE. 
    135131      ! 
    136132   END SUBROUTINE Agrif_Update_Dyn 
     
    291287   END SUBROUTINE dom_vvl_update_UVF 
    292288 
    293 #if defined key_vertical 
    294289 
    295290   SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     
    311306      ! 
    312307      IF (before) THEN 
    313 !jc_alt 
    314 !         AGRIF_SpecialValue = -999._wp 
    315          DO jn = n1,n2-1 
     308         IF ( l_vremap ) THEN 
     309            DO jn = n1,n2-1 
     310               DO jk=k1,k2 
     311                  DO jj=j1,j2 
     312                     DO ji=i1,i2 
     313                        tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Kmm_a) 
     314                     END DO 
     315                  END DO 
     316               END DO 
     317            END DO 
    316318            DO jk=k1,k2 
    317319               DO jj=j1,j2 
    318320                  DO ji=i1,i2 
    319 !jc_alt 
    320 !                     tabres(ji,jj,jk,jn) = (ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Kmm_a) ) & 
    321 !                                         &  * tmask(ji,jj,jk) + (tmask(ji,jj,jk)-1._wp) * 999._wp 
    322                      tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Kmm_a) 
     321                     tabres(ji,jj,jk,n2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) 
    323322                  END DO 
    324323               END DO 
    325324            END DO 
    326          END DO 
    327          DO jk=k1,k2 
     325         ELSE 
     326            DO jn = 1,jpts 
     327               DO jk=k1,k2 
     328                  DO jj=j1,j2 
     329                     DO ji=i1,i2 
     330                        tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)  * e3t(ji,jj,jk,Kmm_a) / e3t_0(ji,jj,jk) 
     331                     END DO 
     332                  END DO 
     333               END DO 
     334            END DO 
     335 
     336         ENDIF 
     337      ELSE 
     338         IF ( l_vremap ) THEN 
     339            tabres_child(:,:,:,:) = 0._wp 
     340            AGRIF_SpecialValue = 0._wp 
    328341            DO jj=j1,j2 
    329342               DO ji=i1,i2 
    330 !jc_alt 
    331 !                  tabres(ji,jj,jk,n2) =      tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) & 
    332 !                                      &   + (tmask(ji,jj,jk) - 1._wp) * 999._wp 
    333                   tabres(ji,jj,jk,n2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) 
    334                END DO 
    335             END DO 
    336          END DO 
    337       ELSE 
    338          tabres_child(:,:,:,:) = 0._wp 
    339          AGRIF_SpecialValue = 0._wp 
    340          DO jj=j1,j2 
    341             DO ji=i1,i2 
    342                N_in = 0 
    343                DO jk=k1,k2 !k2 = jpk of child grid 
    344 ! jc_alt 
    345 !                  IF (tabres(ji,jj,jk,n2) < -900._wp  ) EXIT 
    346                   IF (tabres(ji,jj,jk,n2) == 0._wp  ) EXIT 
    347                   N_in = N_in + 1 
    348                   tabin(jk,:) = tabres(ji,jj,jk,n1:n2-1)/tabres(ji,jj,jk,n2) 
    349                   h_in(N_in) = tabres(ji,jj,jk,n2) 
     343                  N_in = 0 
     344                  DO jk=k1,k2 !k2 = jpk of child grid 
     345                     IF (tabres(ji,jj,jk,n2) == 0._wp  ) EXIT 
     346                     N_in = N_in + 1 
     347                     tabin(jk,:) = tabres(ji,jj,jk,n1:n2-1)/tabres(ji,jj,jk,n2) 
     348                     h_in(N_in) = tabres(ji,jj,jk,n2) 
     349                  ENDDO 
     350                  N_out = 0 
     351                  DO jk=1,jpk ! jpk of parent grid 
     352                     IF (tmask(ji,jj,jk) == 0 ) EXIT ! TODO: Will not work with ISF 
     353                     N_out = N_out + 1 
     354                     h_out(N_out) = e3t(ji,jj,jk,Kmm_a)  
     355                  ENDDO 
     356                  IF (N_in*N_out > 0) THEN !Remove this? 
     357                     CALL reconstructandremap(tabin(1:N_in,1:jpts),h_in(1:N_in),tabres_child(ji,jj,1:N_out,1:jpts),h_out(1:N_out),N_in,N_out,jpts) 
     358                  ENDIF 
    350359               ENDDO 
    351                N_out = 0 
    352                DO jk=1,jpk ! jpk of parent grid 
    353                   IF (tmask(ji,jj,jk) == 0 ) EXIT ! TODO: Will not work with ISF 
    354                   N_out = N_out + 1 
    355                   h_out(N_out) = e3t(ji,jj,jk,Kmm_a)  
    356                ENDDO 
    357                IF (N_in*N_out > 0) THEN !Remove this? 
    358                   CALL reconstructandremap(tabin(1:N_in,1:jpts),h_in(1:N_in),tabres_child(ji,jj,1:N_out,1:jpts),h_out(1:N_out),N_in,N_out,jpts) 
    359                ENDIF 
    360360            ENDDO 
    361          ENDDO 
    362  
    363          IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) THEN 
    364             ! Add asselin part 
     361 
     362            IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) THEN 
     363               ! Add asselin part 
     364               DO jn = 1,jpts 
     365                  DO jk = 1, jpkm1 
     366                     DO jj = j1, j2 
     367                        DO ji = i1, i2 
     368                           IF( tabres_child(ji,jj,jk,jn) /= 0._wp ) THEN 
     369                              ztb  = ts(ji,jj,jk,jn,Kbb_a) * e3t(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
     370                              ztnu = tabres_child(ji,jj,jk,jn) * e3t(ji,jj,jk,Kmm_a) 
     371                              ztno = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Krhs_a) 
     372                              ts(ji,jj,jk,jn,Kbb_a) = ( ztb + rn_atfp * ( ztnu - ztno) )  &  
     373                                        &        * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
     374                           ENDIF 
     375                        END DO 
     376                     END DO 
     377                  END DO 
     378               END DO 
     379            ENDIF 
    365380            DO jn = 1,jpts 
    366381               DO jk = 1, jpkm1 
    367382                  DO jj = j1, j2 
    368383                     DO ji = i1, i2 
    369                         IF( tabres_child(ji,jj,jk,jn) /= 0._wp ) THEN 
    370                            ztb  = ts(ji,jj,jk,jn,Kbb_a) * e3t(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
    371                            ztnu = tabres_child(ji,jj,jk,jn) * e3t(ji,jj,jk,Kmm_a) 
    372                            ztno = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Krhs_a) 
    373                            ts(ji,jj,jk,jn,Kbb_a) = ( ztb + rn_atfp * ( ztnu - ztno) )  &  
    374                                      &        * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
    375                         ENDIF 
     384                        IF( tabres_child(ji,jj,jk,jn) /= 0._wp ) THEN  
     385                           ts(ji,jj,jk,jn,Kmm_a) = tabres_child(ji,jj,jk,jn) 
     386                        END IF 
    376387                     END DO 
    377388                  END DO 
    378389               END DO 
    379390            END DO 
    380          ENDIF 
    381          DO jn = 1,jpts 
    382             DO jk = 1, jpkm1 
    383                DO jj = j1, j2 
    384                   DO ji = i1, i2 
    385                      IF( tabres_child(ji,jj,jk,jn) /= 0._wp ) THEN  
    386                         ts(ji,jj,jk,jn,Kmm_a) = tabres_child(ji,jj,jk,jn) 
    387                      END IF 
     391         ELSE 
     392            DO jn = 1,jpts 
     393               tabres(i1:i2,j1:j2,k1:k2,jn) =  tabres(i1:i2,j1:j2,k1:k2,jn) * e3t_0(i1:i2,j1:j2,k1:k2) & 
     394                                            & * tmask(i1:i2,j1:j2,k1:k2) 
     395            ENDDO 
     396  
     397            IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) THEN 
     398               ! Add asselin part 
     399               DO jn = 1,jpts 
     400                  DO jk = k1, k2 
     401                     DO jj = j1, j2 
     402                        DO ji = i1, i2 
     403                           IF( tabres(ji,jj,jk,jn) /= 0._wp ) THEN 
     404                              ztb  = ts(ji,jj,jk,jn,Kbb_a) * e3t(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
     405                              ztnu = tabres(ji,jj,jk,jn) 
     406                              ztno = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Krhs_a) 
     407                              ts(ji,jj,jk,jn,Kbb_a) = ( ztb + rn_atfp * ( ztnu - ztno) )  &  
     408                                        &        * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
     409                           ENDIF 
     410                        END DO 
     411                     END DO 
    388412                  END DO 
    389413               END DO 
    390             END DO 
    391          END DO 
    392          ! 
     414            ENDIF 
     415            DO jn = 1,jpts 
     416               DO jk=k1,k2 
     417                  DO jj=j1,j2 
     418                     DO ji=i1,i2 
     419                        IF( tabres(ji,jj,jk,jn) /= 0._wp ) THEN  
     420                           ts(ji,jj,jk,jn,Kmm_a) = tabres(ji,jj,jk,jn) / e3t(ji,jj,jk,Kmm_a) 
     421                        END IF 
     422                     END DO 
     423                  END DO 
     424               END DO 
     425            END DO 
     426            ! 
     427         ENDIF 
    393428         IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN 
    394429            ts(i1:i2,j1:j2,1:jpkm1,1:jpts,Kbb_a)  = ts(i1:i2,j1:j2,1:jpkm1,1:jpts,Kmm_a) 
     
    398433   END SUBROUTINE updateTS 
    399434 
    400 # else 
    401  
    402    SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    403       !!--------------------------------------------- 
    404       !!           *** ROUTINE updateT *** 
    405       !!--------------------------------------------- 
    406       INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 
    407       REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    408       LOGICAL, INTENT(in) :: before 
    409       !! 
    410       INTEGER :: ji,jj,jk,jn 
    411       REAL(wp) :: ztb, ztnu, ztno 
    412       !!--------------------------------------------- 
    413       ! 
    414       IF (before) THEN 
    415          DO jn = 1,jpts 
    416             DO jk=k1,k2 
    417                DO jj=j1,j2 
    418                   DO ji=i1,i2 
    419 !> jc tmp 
    420                      tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)  * e3t(ji,jj,jk,Kmm_a) / e3t_0(ji,jj,jk) 
    421 !                     tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)  * e3t(ji,jj,jk,Kmm_a) 
    422 !< jc tmp 
    423                   END DO 
    424                END DO 
    425             END DO 
    426          END DO 
    427       ELSE 
    428 !> jc tmp 
    429          DO jn = 1,jpts 
    430             tabres(i1:i2,j1:j2,k1:k2,jn) =  tabres(i1:i2,j1:j2,k1:k2,jn) * e3t_0(i1:i2,j1:j2,k1:k2) & 
    431                                          & * tmask(i1:i2,j1:j2,k1:k2) 
    432          ENDDO 
    433 !< jc tmp 
    434          IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) THEN 
    435             ! Add asselin part 
    436             DO jn = 1,jpts 
    437                DO jk = k1, k2 
    438                   DO jj = j1, j2 
    439                      DO ji = i1, i2 
    440                         IF( tabres(ji,jj,jk,jn) /= 0._wp ) THEN 
    441                            ztb  = ts(ji,jj,jk,jn,Kbb_a) * e3t(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
    442                            ztnu = tabres(ji,jj,jk,jn) 
    443                            ztno = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Krhs_a) 
    444                            ts(ji,jj,jk,jn,Kbb_a) = ( ztb + rn_atfp * ( ztnu - ztno) )  &  
    445                                      &        * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
    446                         ENDIF 
    447                      END DO 
    448                   END DO 
    449                END DO 
    450             END DO 
    451          ENDIF 
    452          DO jn = 1,jpts 
    453             DO jk=k1,k2 
    454                DO jj=j1,j2 
    455                   DO ji=i1,i2 
    456                      IF( tabres(ji,jj,jk,jn) /= 0._wp ) THEN  
    457                         ts(ji,jj,jk,jn,Kmm_a) = tabres(ji,jj,jk,jn) / e3t(ji,jj,jk,Kmm_a) 
    458                      END IF 
    459                   END DO 
    460                END DO 
    461             END DO 
    462          END DO 
    463          ! 
    464          IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN 
    465             ts(i1:i2,j1:j2,k1:k2,1:jpts,Kbb_a)  = ts(i1:i2,j1:j2,k1:k2,1:jpts,Kmm_a) 
    466          ENDIF 
    467          ! 
    468       ENDIF 
    469       !  
    470    END SUBROUTINE updateTS 
    471  
    472 # endif 
    473  
    474 # if defined key_vertical 
    475435 
    476436   SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     
    496456      IF( before ) THEN 
    497457         zrhoy = Agrif_Rhoy() 
    498 !jc_alt 
    499 !         AGRIF_SpecialValue = -999._wp 
    500458         DO jk=k1,k2 
     459            tabres(i1:i2,j1:j2,jk,1) = zrhoy * e2u(i1:i2,j1:j2) * e3u(i1:i2,j1:j2,jk,Kmm_a) &  
     460                                     &   * umask(i1:i2,j1:j2,jk) * uu(i1:i2,j1:j2,jk,Kmm_a)   
     461         END DO 
     462 
     463         IF ( l_vremap ) THEN 
     464            DO jk=k1,k2 
     465               tabres(i1:i2,j1:j2,jk,2) = zrhoy * umask(i1:i2,j1:j2,jk) * e2u(i1:i2,j1:j2) * e3u(i1:i2,j1:j2,jk,Kmm_a) 
     466            END DO 
     467         ENDIF 
     468 
     469      ELSE 
     470 
     471         tabres_child(:,:,:) = 0._wp 
     472         AGRIF_SpecialValue = 0._wp 
     473 
     474         IF ( l_vremap ) THEN 
     475 
    501476            DO jj=j1,j2 
    502477               DO ji=i1,i2 
    503 !jc_alt 
    504 !                  tabres(ji,jj,jk,1) = zrhoy * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) * umask(ji,jj,jk) * uu(ji,jj,jk,Kmm_a)  & 
    505 !                                     &  + (umask(ji,jj,jk)-1._wp)*999._wp 
    506                   tabres(ji,jj,jk,1) = zrhoy * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) * umask(ji,jj,jk) * uu(ji,jj,jk,Kmm_a)   
    507 !jc_alt 
    508 !                  tabres(ji,jj,jk,2) = zrhoy * umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a)  & 
    509 !                                     &  + (umask(ji,jj,jk)-1._wp)*999._wp 
    510                   tabres(ji,jj,jk,2) = zrhoy * umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) 
    511                END DO 
    512             END DO 
    513          END DO 
    514       ELSE 
    515          tabres_child(:,:,:) = 0. 
    516          AGRIF_SpecialValue = 0._wp 
    517          DO jj=j1,j2 
    518             DO ji=i1,i2 
    519                N_in = 0 
    520                h_in(:) = 0._wp 
    521                tabin(:) = 0._wp 
    522                DO jk=k1,k2 !k2=jpk of child grid 
    523 !jc_alt 
    524 !                  IF( tabres(ji,jj,jk,2) < -900._wp) EXIT 
    525                   IF( tabres(ji,jj,jk,2) == 0.) EXIT 
    526                   N_in = N_in + 1 
    527                   tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
    528                   h_in(N_in) = tabres(ji,jj,jk,2)/e2u(ji,jj) 
     478                  N_in = 0 
     479                  h_in(:) = 0._wp 
     480                  tabin(:) = 0._wp 
     481                  DO jk=k1,k2 !k2=jpk of child grid 
     482                     IF( tabres(ji,jj,jk,2) == 0.) EXIT 
     483                     N_in = N_in + 1 
     484                     tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
     485                     h_in(N_in) = tabres(ji,jj,jk,2) * r1_e2u(ji,jj) 
     486                  ENDDO 
     487                  N_out = 0 
     488                  DO jk=1,jpk 
     489                     IF (umask(ji,jj,jk) == 0) EXIT 
     490                     N_out = N_out + 1 
     491                     h_out(N_out) = e3u(ji,jj,jk,Kmm_a) 
     492                  ENDDO 
     493                  IF (N_in * N_out > 0) THEN 
     494                     h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     495                     excess = 0._wp 
     496                     IF (h_diff < -1.e-4) THEN 
     497                        DO jk=N_in,1,-1 
     498                           thick = MIN(-1*h_diff, h_in(jk)) 
     499                           excess = excess + tabin(jk)*thick*e2u(ji,jj) 
     500                           tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
     501                           h_diff = h_diff + thick 
     502                           IF ( h_diff == 0) THEN 
     503                              N_in = jk 
     504                              h_in(jk) = h_in(jk) - thick 
     505                              EXIT 
     506                           ENDIF 
     507                        ENDDO 
     508                     ENDIF 
     509                     CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out,1) 
     510                     tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e2u(ji,jj)*h_out(N_out)) 
     511                  ENDIF 
    529512               ENDDO 
    530                N_out = 0 
    531                DO jk=1,jpk 
    532                   IF (umask(ji,jj,jk) == 0) EXIT 
    533                   N_out = N_out + 1 
    534                   h_out(N_out) = e3u(ji,jj,jk,Kmm_a) 
    535                ENDDO 
    536                IF (N_in * N_out > 0) THEN 
    537                   h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
    538                   excess = 0._wp 
    539                   IF (h_diff < -1.e-4) THEN 
    540 !Even if bathy at T points match it's possible for the U points to be deeper in the child grid.  
    541 !In this case we need to move transport from the child grid cells below bed of parent grid into the bottom cell. 
    542                      DO jk=N_in,1,-1 
    543                         thick = MIN(-1*h_diff, h_in(jk)) 
    544                         excess = excess + tabin(jk)*thick*e2u(ji,jj) 
    545                         tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
    546                         h_diff = h_diff + thick 
    547                         IF ( h_diff == 0) THEN 
    548                            N_in = jk 
    549                            h_in(jk) = h_in(jk) - thick 
    550                            EXIT 
    551                         ENDIF 
    552                      ENDDO 
    553                   ENDIF 
    554                   CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out,1) 
    555                   tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e2u(ji,jj)*h_out(N_out)) 
    556                ENDIF 
    557513            ENDDO 
    558          ENDDO 
     514 
     515         ELSE 
     516            DO jk=1,jpk 
     517               DO jj=j1,j2 
     518                  DO ji=i1,i2 
     519                     tabres_child(ji,jj,jk) = tabres(ji,jj,jk,1) * r1_e2u(ji,jj) /  e3u(ji,jj,jk,Kmm_a) 
     520                  END DO 
     521               END DO 
     522            END DO 
     523         ENDIF 
    559524         ! 
    560525         DO jk=1,jpk 
     
    582547   END SUBROUTINE updateu 
    583548 
    584 #else 
    585  
    586    SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
    587       !!--------------------------------------------- 
    588       !!           *** ROUTINE updateu *** 
    589       !!--------------------------------------------- 
    590       INTEGER                               , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
    591       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    592       LOGICAL                                     , INTENT(in   ) :: before 
    593       ! 
    594       INTEGER  :: ji, jj, jk 
    595       REAL(wp) :: zrhoy, zub, zunu, zuno 
    596       !!--------------------------------------------- 
    597       !  
    598       IF( before ) THEN 
    599          zrhoy = Agrif_Rhoy() 
    600          DO jk = k1, k2 
    601             tabres(i1:i2,j1:j2,jk,1) = zrhoy * e2u(i1:i2,j1:j2) * e3u(i1:i2,j1:j2,jk,Kmm_a) * uu(i1:i2,j1:j2,jk,Kmm_a) 
    602          END DO 
    603       ELSE 
    604          DO jk=k1,k2 
    605             DO jj=j1,j2 
    606                DO ji=i1,i2 
    607                   tabres(ji,jj,jk,1) = tabres(ji,jj,jk,1) * r1_e2u(ji,jj)  
    608                   ! 
    609                   IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) THEN ! Add asselin part 
    610                      zub  = uu(ji,jj,jk,Kbb_a) * e3u(ji,jj,jk,Kbb_a)  ! fse3t_b prior update should be used 
    611                      zuno = uu(ji,jj,jk,Kmm_a) * e3u(ji,jj,jk,Krhs_a) 
    612                      zunu = tabres(ji,jj,jk,1) 
    613                      uu(ji,jj,jk,Kbb_a) = ( zub + rn_atfp * ( zunu - zuno) ) &       
    614                                     & * umask(ji,jj,jk) / e3u(ji,jj,jk,Kbb_a) 
    615                   ENDIF 
    616                   ! 
    617                   uu(ji,jj,jk,Kmm_a) = tabres(ji,jj,jk,1) * umask(ji,jj,jk) / e3u(ji,jj,jk,Kmm_a) 
    618                END DO 
    619             END DO 
    620          END DO 
    621          ! 
    622          IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN 
    623             uu(i1:i2,j1:j2,k1:k2,Kbb_a)  = uu(i1:i2,j1:j2,k1:k2,Kmm_a) 
    624          ENDIF 
    625          ! 
    626       ENDIF 
    627       !  
    628    END SUBROUTINE updateu 
    629  
    630 # endif 
    631  
    632549   SUBROUTINE correct_u_bdy( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
    633550      !!--------------------------------------------- 
     
    674591   END SUBROUTINE correct_u_bdy 
    675592 
    676 # if  defined key_vertical 
    677593 
    678594   SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) 
     
    698614      IF( before ) THEN 
    699615         zrhox = Agrif_Rhox() 
    700 !jc_alt 
    701 !         AGRIF_SpecialValue = -999._wp 
    702616         DO jk=k1,k2 
     617            tabres(i1:i2,j1:j2,jk,1) = zrhox * e1v(i1:i2,j1:j2) * e3v(i1:i2,j1:j2,jk,Kmm_a) &  
     618                                     &   * vmask(i1:i2,j1:j2,jk) * vv(i1:i2,j1:j2,jk,Kmm_a)   
     619         END DO 
     620 
     621         IF ( l_vremap ) THEN 
     622            DO jk=k1,k2 
     623               tabres(i1:i2,j1:j2,jk,2) = zrhox * e1v(i1:i2,j1:j2) * e3v(i1:i2,j1:j2,jk,Kmm_a) * vmask(i1:i2,j1:j2,jk) 
     624            END DO 
     625         ENDIF 
     626 
     627      ELSE 
     628 
     629         tabres_child(:,:,:) = 0._wp 
     630         AGRIF_SpecialValue = 0._wp 
     631 
     632         IF ( l_vremap ) THEN 
     633 
    703634            DO jj=j1,j2 
    704635               DO ji=i1,i2 
    705 !jc_alt 
    706 !                  tabres(ji,jj,jk,1) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk) * vv(ji,jj,jk,Kmm_a) & 
    707 !                                     & + (vmask(ji,jj,jk)-1._wp) * 999._wp 
    708                   tabres(ji,jj,jk,1) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk) * vv(ji,jj,jk,Kmm_a)  
    709 !jc_alt 
    710 !                  tabres(ji,jj,jk,2) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk) & 
    711 !                                     & + (vmask(ji,jj,jk)-1._wp) * 999._wp 
    712                   tabres(ji,jj,jk,2) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk) 
    713                END DO 
    714             END DO 
    715          END DO 
    716       ELSE 
    717          tabres_child(:,:,:) = 0. 
    718          AGRIF_SpecialValue = 0._wp 
    719          DO jj=j1,j2 
    720             DO ji=i1,i2 
    721                N_in = 0 
    722                DO jk=k1,k2 
    723 !jc_alt 
    724 !                  IF (tabres(ji,jj,jk,2) < -900._wp) EXIT 
    725                   IF (tabres(ji,jj,jk,2) == 0) EXIT 
    726                   N_in = N_in + 1 
    727                   tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
    728                   h_in(N_in) = tabres(ji,jj,jk,2)/e1v(ji,jj) 
    729                ENDDO 
    730                N_out = 0 
    731                DO jk=1,jpk 
    732                   IF (vmask(ji,jj,jk) == 0) EXIT 
    733                   N_out = N_out + 1 
    734                   h_out(N_out) = e3v(ji,jj,jk,Kmm_a) 
    735                ENDDO 
    736                IF (N_in * N_out > 0) THEN 
    737                   h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
    738                   excess = 0._wp 
    739                   IF (h_diff < -1.e-4) then 
     636                  N_in = 0 
     637                  DO jk=k1,k2 
     638                     IF (tabres(ji,jj,jk,2) == 0) EXIT 
     639                     N_in = N_in + 1 
     640                     tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
     641                     h_in(N_in) = tabres(ji,jj,jk,2) * r1_e1v(ji,jj) 
     642                  ENDDO 
     643                  N_out = 0 
     644                  DO jk=1,jpk 
     645                     IF (vmask(ji,jj,jk) == 0) EXIT 
     646                     N_out = N_out + 1 
     647                     h_out(N_out) = e3v(ji,jj,jk,Kmm_a) 
     648                  ENDDO 
     649                  IF (N_in * N_out > 0) THEN 
     650                     h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     651                     excess = 0._wp 
     652                     IF (h_diff < -1.e-4) then 
    740653!Even if bathy at T points match it's possible for the V points to be deeper in the child grid.  
    741654!In this case we need to move transport from the child grid cells below bed of parent grid into the bottom cell. 
    742                      DO jk=N_in,1,-1 
    743                         thick = MIN(-1*h_diff, h_in(jk)) 
    744                         excess = excess + tabin(jk)*thick*e2u(ji,jj) 
    745                         tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
    746                         h_diff = h_diff + thick 
    747                         IF ( h_diff == 0) THEN 
    748                            N_in = jk 
    749                            h_in(jk) = h_in(jk) - thick 
    750                            EXIT 
    751                         ENDIF 
    752                      ENDDO 
     655                        DO jk=N_in,1,-1 
     656                           thick = MIN(-1*h_diff, h_in(jk)) 
     657                           excess = excess + tabin(jk)*thick*e2u(ji,jj) 
     658                           tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
     659                           h_diff = h_diff + thick 
     660                           IF ( h_diff == 0) THEN 
     661                              N_in = jk 
     662                              h_in(jk) = h_in(jk) - thick 
     663                              EXIT 
     664                           ENDIF 
     665                        ENDDO 
     666                     ENDIF 
     667                     CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out,1) 
     668                     tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e1v(ji,jj)*h_out(N_out)) 
    753669                  ENDIF 
    754                   CALL reconstructandremap(tabin(1:N_in),h_in(1:N_in),tabres_child(ji,jj,1:N_out),h_out(1:N_out),N_in,N_out,1) 
    755                   tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e1v(ji,jj)*h_out(N_out)) 
    756                ENDIF 
     670               ENDDO 
    757671            ENDDO 
    758          ENDDO 
     672 
     673         ELSE 
     674            DO jk=1,jpk 
     675               DO jj=j1,j2 
     676                  DO ji=i1,i2 
     677                     tabres_child(ji,jj,jk) = tabres(ji,jj,jk,1) * r1_e1v(ji,jj) /  e3v(ji,jj,jk,Kmm_a) 
     678                  END DO 
     679               END DO 
     680            END DO 
     681         ENDIF 
    759682         ! 
    760683         DO jk=1,jpkm1 
     
    782705   END SUBROUTINE updatev 
    783706 
    784 # else 
    785  
    786    SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before) 
    787       !!--------------------------------------------- 
    788       !!           *** ROUTINE updatev *** 
    789       !!--------------------------------------------- 
    790       INTEGER                                     , INTENT(in   ) :: i1, i2, j1, j2, k1, k2, n1, n2 
    791       REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 
    792       LOGICAL                                     , INTENT(in   ) :: before 
    793       ! 
    794       INTEGER  :: ji, jj, jk 
    795       REAL(wp) :: zrhox, zvb, zvnu, zvno 
    796       !!---------------------------------------------       
    797       ! 
    798       IF (before) THEN 
    799          zrhox = Agrif_Rhox() 
    800          DO jk=k1,k2 
    801             DO jj=j1,j2 
    802                DO ji=i1,i2 
    803                   tabres(ji,jj,jk,1) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vv(ji,jj,jk,Kmm_a) 
    804                END DO 
    805             END DO 
    806          END DO 
    807       ELSE 
    808          DO jk=k1,k2 
    809             DO jj=j1,j2 
    810                DO ji=i1,i2 
    811                   tabres(ji,jj,jk,1) = tabres(ji,jj,jk,1) * r1_e1v(ji,jj) 
    812                   ! 
    813                   IF (.NOT.(lk_agrif_fstep.AND.(l_1st_euler))) THEN ! Add asselin part 
    814                      zvb  = vv(ji,jj,jk,Kbb_a) * e3v(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
    815                      zvno = vv(ji,jj,jk,Kmm_a) * e3v(ji,jj,jk,Krhs_a) 
    816                      zvnu = tabres(ji,jj,jk,1) 
    817                      vv(ji,jj,jk,Kbb_a) = ( zvb + rn_atfp * ( zvnu - zvno) ) &       
    818                                     & * vmask(ji,jj,jk) / e3v(ji,jj,jk,Kbb_a) 
    819                   ENDIF 
    820                   ! 
    821                   vv(ji,jj,jk,Kmm_a) = tabres(ji,jj,jk,1) * vmask(ji,jj,jk) / e3v(ji,jj,jk,Kmm_a) 
    822                END DO 
    823             END DO 
    824          END DO 
    825          ! 
    826          IF  ((l_1st_euler).AND.(Agrif_Nb_Step()==0) ) THEN 
    827             vv(i1:i2,j1:j2,k1:k2,Kbb_a)  = vv(i1:i2,j1:j2,k1:k2,Kmm_a) 
    828          ENDIF 
    829          ! 
    830       ENDIF 
    831       !  
    832    END SUBROUTINE updatev 
    833  
    834 # endif 
    835707 
    836708   SUBROUTINE correct_v_bdy( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 
Note: See TracChangeset for help on using the changeset viewer.