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 12229 for NEMO/branches/2019/dev_r11943_MERGE_2019/src/NST/agrif_oce_update.F90 – NEMO

Ignore:
Timestamp:
2019-12-12T17:41:04+01:00 (4 years ago)
Author:
acc
Message:

2019/dev_r11943_MERGE_2019: Merge in dev_AGRIF-01-05_merged. Fully SETTE tested

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11943_MERGE_2019/src/NST/agrif_oce_update.F90

    r11949 r12229  
    1 #define TWO_WAY        /* TWO WAY NESTING */ 
    2 #undef DECAL_FEEDBACK  /* SEPARATION of INTERFACES*/ 
    3 #undef VOL_REFLUX      /* VOLUME REFLUXING*/ 
     1#undef DECAL_FEEDBACK     /* SEPARATION of INTERFACES */ 
     2#undef DECAL_FEEDBACK_2D  /* SEPARATION of INTERFACES (Barotropic mode) */ 
     3#undef VOL_REFLUX         /* VOLUME REFLUXING*/ 
    44  
    55MODULE agrif_oce_update 
     
    2525   USE lib_mpp        ! MPP library 
    2626   USE domvvl         ! Need interpolation routines  
     27   USE vremap         ! Vertical remapping 
    2728 
    2829   IMPLICIT NONE 
     
    4647      IF (Agrif_Root()) RETURN 
    4748      ! 
    48 #if defined TWO_WAY   
    4949      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers  from grid Number',Agrif_Fixed() 
    5050 
     51#if defined key_vertical 
     52! Effect of this has to be carrefully checked  
     53! depending on what the nesting tools ensure for 
     54! volume conservation: 
     55      Agrif_UseSpecialValueInUpdate = .FALSE. 
     56#else 
    5157      Agrif_UseSpecialValueInUpdate = .TRUE. 
     58#endif 
    5259      Agrif_SpecialValueFineGrid    = 0._wp 
    5360      !  
     
    6471      Agrif_UseSpecialValueInUpdate = .FALSE. 
    6572      ! 
    66 #endif 
    6773      ! 
    6874   END SUBROUTINE Agrif_Update_Tra 
     
    7581      IF (Agrif_Root()) RETURN 
    7682      ! 
    77 #if defined TWO_WAY 
    7883      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed() 
    7984 
     
    95100# endif 
    96101 
    97 # if ! defined DECAL_FEEDBACK 
     102# if ! defined DECAL_FEEDBACK_2D 
    98103      CALL Agrif_Update_Variable(e1u_id,procname = updateU2d) 
    99104      CALL Agrif_Update_Variable(e2v_id,procname = updateV2d)   
     
    103108# endif 
    104109      ! 
    105 # if ! defined DECAL_FEEDBACK 
     110# if ! defined DECAL_FEEDBACK_2D 
    106111      ! Account for updated thicknesses at boundary edges 
    107112      IF (.NOT.ln_linssh) THEN 
     
    113118      IF ( ln_dynspg_ts .AND. ln_bt_fw ) THEN 
    114119         ! Update time integrated transports 
    115 #  if ! defined DECAL_FEEDBACK 
     120#  if ! defined DECAL_FEEDBACK_2D 
    116121         CALL Agrif_Update_Variable(ub2b_update_id,procname = updateub2b) 
    117122         CALL Agrif_Update_Variable(vb2b_update_id,procname = updatevb2b) 
     
    121126#  endif 
    122127      END IF 
    123 #endif 
    124128      ! 
    125129   END SUBROUTINE Agrif_Update_Dyn 
     
    131135      !  
    132136      IF (Agrif_Root()) RETURN 
    133       ! 
    134 #if defined TWO_WAY 
    135137      ! 
    136138      Agrif_UseSpecialValueInUpdate = .TRUE. 
    137139      Agrif_SpecialValueFineGrid = 0. 
    138 # if ! defined DECAL_FEEDBACK 
     140# if ! defined DECAL_FEEDBACK_2D 
    139141      CALL Agrif_Update_Variable(sshn_id,procname = updateSSH) 
    140142# else 
     
    147149      IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN 
    148150         ! Refluxing on ssh: 
    149 #  if defined DECAL_FEEDBACK 
     151#  if defined DECAL_FEEDBACK_2D 
    150152         CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0, 0/),locupdate2=(/1, 1/),procname = reflux_sshu) 
    151153         CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1, 1/),locupdate2=(/0, 0/),procname = reflux_sshv) 
     
    157159#  endif 
    158160      ! 
    159 #endif 
    160       ! 
    161161   END SUBROUTINE Agrif_Update_ssh 
    162162 
     
    170170      IF (Agrif_Root()) RETURN 
    171171      !        
    172 #  if defined TWO_WAY 
    173  
    174172      Agrif_UseSpecialValueInUpdate = .TRUE. 
    175173      Agrif_SpecialValueFineGrid = 0. 
     
    180178 
    181179      Agrif_UseSpecialValueInUpdate = .FALSE. 
    182  
    183 #  endif 
    184180       
    185181   END SUBROUTINE Agrif_Update_Tke 
     
    192188      ! 
    193189      IF (Agrif_Root()) RETURN 
    194       ! 
    195 #if defined TWO_WAY   
    196190      ! 
    197191      IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update e3 from grid Number',Agrif_Fixed(), 'Step', Agrif_Nb_Step() 
     
    209203      CALL dom_vvl_update_UVF 
    210204      CALL Agrif_ParentGrid_To_ChildGrid() 
    211       ! 
    212 #endif 
    213205      ! 
    214206   END SUBROUTINE Agrif_Update_vvl 
     
    300292      !! 
    301293      INTEGER :: ji,jj,jk,jn 
    302       REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk,n1:n2) :: tabres_child 
     294      INTEGER  :: N_in, N_out 
     295      REAL(wp) :: ztb, ztnu, ztno 
    303296      REAL(wp) :: h_in(k1:k2) 
    304297      REAL(wp) :: h_out(1:jpk) 
    305       INTEGER  :: N_in, N_out 
    306       REAL(wp) :: zrho_xy, h_diff 
    307       REAL(wp) :: tabin(k1:k2,n1:n2) 
     298      REAL(wp) :: tabin(k1:k2,1:jpts) 
     299      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk,1:jpts) :: tabres_child 
    308300      !!--------------------------------------------- 
    309301      ! 
    310302      IF (before) THEN 
    311          AGRIF_SpecialValue = -999._wp 
    312          zrho_xy = Agrif_rhox() * Agrif_rhoy()  
     303!jc_alt 
     304!         AGRIF_SpecialValue = -999._wp 
    313305         DO jn = n1,n2-1 
    314306            DO jk=k1,k2 
    315307               DO jj=j1,j2 
    316308                  DO ji=i1,i2 
    317                      tabres(ji,jj,jk,jn) = (    ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Kmm_a) )          & 
    318                        &                   * tmask(ji,jj,jk)       + (tmask(ji,jj,jk) - 1._wp)*999._wp 
     309!jc_alt 
     310!                     tabres(ji,jj,jk,jn) = (ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Kmm_a) ) & 
     311!                                         &  * tmask(ji,jj,jk) + (tmask(ji,jj,jk)-1._wp) * 999._wp 
     312                     tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Kmm_a) 
    319313                  END DO 
    320314               END DO 
     
    324318            DO jj=j1,j2 
    325319               DO ji=i1,i2 
    326                   tabres(ji,jj,jk,n2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) & 
    327                     &                      + (tmask(ji,jj,jk) - 1._wp)*999._wp 
     320!jc_alt 
     321!                  tabres(ji,jj,jk,n2) =      tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) & 
     322!                                      &   + (tmask(ji,jj,jk) - 1._wp) * 999._wp 
     323                  tabres(ji,jj,jk,n2) = tmask(ji,jj,jk) * e3t(ji,jj,jk,Kmm_a) 
    328324               END DO 
    329325            END DO 
     
    336332               N_in = 0 
    337333               DO jk=k1,k2 !k2 = jpk of child grid 
    338                   IF (tabres(ji,jj,jk,n2) == 0  ) EXIT 
     334! jc_alt 
     335!                  IF (tabres(ji,jj,jk,n2) < -900._wp  ) EXIT 
     336                  IF (tabres(ji,jj,jk,n2) == 0._wp  ) EXIT 
    339337                  N_in = N_in + 1 
    340338                  tabin(jk,:) = tabres(ji,jj,jk,n1:n2-1)/tabres(ji,jj,jk,n2) 
     
    343341               N_out = 0 
    344342               DO jk=1,jpk ! jpk of parent grid 
    345                   IF (tmask(ji,jj,jk) < -900) EXIT ! TODO: Will not work with ISF 
     343                  IF (tmask(ji,jj,jk) == 0 ) EXIT ! TODO: Will not work with ISF 
    346344                  N_out = N_out + 1 
    347345                  h_out(N_out) = e3t(ji,jj,jk,Kmm_a)  
    348346               ENDDO 
    349                IF (N_in > 0) THEN !Remove this? 
    350                   h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
    351                   IF (h_diff < -1.e-4) THEN 
    352                      print *,'CHECK YOUR bathy T points ...',ji,jj,h_diff,sum(h_in(1:N_in)),sum(h_out(1:N_out)) 
    353                      print *,h_in(1:N_in) 
    354                      print *,h_out(1:N_out) 
    355                      STOP 
    356                   ENDIF 
    357                   DO jn=n1,n2-1 
    358                      CALL reconstructandremap( tabin(1:N_in,jn), h_in(1:N_in), tabres_child(ji,jj,1:N_out,jn),  & 
    359                        &                       h_out(1:N_out)  , N_in        , N_out                           ) 
    360                   ENDDO 
     347               IF (N_in*N_out > 0) THEN !Remove this? 
     348                  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) 
    361349               ENDIF 
    362350            ENDDO 
     
    365353         IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 
    366354            ! Add asselin part 
    367             DO jn = n1,n2-1 
    368                DO jk=1,jpk 
    369                   DO jj=j1,j2 
    370                      DO ji=i1,i2 
    371                         IF( tabres_child(ji,jj,jk,jn) .NE. 0. ) THEN 
    372                            ts(ji,jj,jk,jn,Kbb_a) =                     ts(ji,jj,jk,jn,Kbb_a) &  
    373                                  &                + atfp * ( tabres_child(ji,jj,jk,jn)       & 
    374                                  &                                   - ts(ji,jj,jk,jn,Kmm_a) & 
    375                                  &                         ) * tmask(ji,jj,jk) 
     355            DO jn = 1,jpts 
     356               DO jk = 1, jpkm1 
     357                  DO jj = j1, j2 
     358                     DO ji = i1, i2 
     359                        IF( tabres_child(ji,jj,jk,jn) /= 0._wp ) THEN 
     360                           ztb  = ts(ji,jj,jk,jn,Kbb_a) * e3t(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
     361                           ztnu = tabres_child(ji,jj,jk,jn) * e3t(ji,jj,jk,Kmm_a) 
     362                           ztno = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Krhs_a) 
     363                           ts(ji,jj,jk,jn,Kbb_a) = ( ztb + atfp * ( ztnu - ztno) )  &  
     364                                     &        * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
    376365                        ENDIF 
    377                      ENDDO 
    378                   ENDDO 
    379                ENDDO 
    380             ENDDO 
    381          ENDIF 
    382          DO jn = n1,n2-1 
    383             DO jk=1,jpk 
    384                DO jj=j1,j2 
    385                   DO ji=i1,i2 
    386                      IF( tabres_child(ji,jj,jk,jn) .NE. 0. ) THEN  
    387                         ts(ji,jj,jk,jn,Kmm_a) = tabres_child(ji,jj,jk,jn) * tmask(ji,jj,jk) 
     366                     END DO 
     367                  END DO 
     368               END DO 
     369            END DO 
     370         ENDIF 
     371         DO jn = 1,jpts 
     372            DO jk = 1, jpkm1 
     373               DO jj = j1, j2 
     374                  DO ji = i1, i2 
     375                     IF( tabres_child(ji,jj,jk,jn) /= 0._wp ) THEN  
     376                        ts(ji,jj,jk,jn,Kmm_a) = tabres_child(ji,jj,jk,jn) 
    388377                     END IF 
    389378                  END DO 
     
    391380            END DO 
    392381         END DO 
     382         ! 
     383         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN 
     384            ts(i1:i2,j1:j2,1:jpkm1,1:jpts,Kbb_a)  = ts(i1:i2,j1:j2,1:jpkm1,1:jpts,Kmm_a) 
     385         ENDIF 
    393386      ENDIF 
    394387      !  
     
    416409!> jc tmp 
    417410                     tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)  * e3t(ji,jj,jk,Kmm_a) / e3t_0(ji,jj,jk) 
    418 !                    tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)  * e3t(ji,jj,jk,Kmm_a) 
     411!                     tabres(ji,jj,jk,jn) = ts(ji,jj,jk,jn,Kmm_a)  * e3t(ji,jj,jk,Kmm_a) 
    419412!< jc tmp 
    420413                  END DO 
     
    440433                           ztno = ts(ji,jj,jk,jn,Kmm_a) * e3t(ji,jj,jk,Krhs_a) 
    441434                           ts(ji,jj,jk,jn,Kbb_a) = ( ztb + atfp * ( ztnu - ztno) )  &  
    442                                      &            * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
     435                                     &        * tmask(ji,jj,jk) / e3t(ji,jj,jk,Kbb_a) 
    443436                        ENDIF 
    444437                     END DO 
     
    480473      ! 
    481474      INTEGER ::   ji, jj, jk 
    482       REAL(wp)::   zrhoy 
     475      REAL(wp)::   zrhoy, zub, zunu, zuno 
    483476! VERTICAL REFINEMENT BEGIN 
    484477      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     
    493486      IF( before ) THEN 
    494487         zrhoy = Agrif_Rhoy() 
    495          AGRIF_SpecialValue = -999._wp 
     488!jc_alt 
     489!         AGRIF_SpecialValue = -999._wp 
    496490         DO jk=k1,k2 
    497491            DO jj=j1,j2 
    498492               DO ji=i1,i2 
    499                   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)  & 
    500                     &                  + (umask(ji,jj,jk)-1._wp)*999._wp 
    501                   tabres(ji,jj,jk,2) = zrhoy * umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a)  & 
    502                     &                  + (umask(ji,jj,jk)-1._wp)*999._wp 
     493!jc_alt 
     494!                  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)  & 
     495!                                     &  + (umask(ji,jj,jk)-1._wp)*999._wp 
     496                  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)   
     497!jc_alt 
     498!                  tabres(ji,jj,jk,2) = zrhoy * umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a)  & 
     499!                                     &  + (umask(ji,jj,jk)-1._wp)*999._wp 
     500                  tabres(ji,jj,jk,2) = zrhoy * umask(ji,jj,jk) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm_a) 
    503501               END DO 
    504502            END DO 
     
    513511               tabin(:) = 0._wp 
    514512               DO jk=k1,k2 !k2=jpk of child grid 
    515                   IF( tabres(ji,jj,jk,2) < -900) EXIT 
     513!jc_alt 
     514!                  IF( tabres(ji,jj,jk,2) < -900._wp) EXIT 
     515                  IF( tabres(ji,jj,jk,2) == 0.) EXIT 
    516516                  N_in = N_in + 1 
    517                   tabin(jk)  = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
     517                  tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
    518518                  h_in(N_in) = tabres(ji,jj,jk,2)/e2u(ji,jj) 
    519519               ENDDO 
     
    525525               ENDDO 
    526526               IF (N_in * N_out > 0) THEN 
    527                   h_diff = SUM( h_out(1:N_out) ) - SUM( h_in(1:N_in) ) 
     527                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     528                  excess = 0._wp 
    528529                  IF (h_diff < -1.e-4) THEN 
    529530!Even if bathy at T points match it's possible for the U points to be deeper in the child grid.  
    530531!In this case we need to move transport from the child grid cells below bed of parent grid into the bottom cell. 
    531                      excess = 0._wp 
    532532                     DO jk=N_in,1,-1 
    533533                        thick = MIN(-1*h_diff, h_in(jk)) 
     
    542542                     ENDDO 
    543543                  ENDIF 
    544                   CALL reconstructandremap( tabin(1:N_in) , h_in(1:N_in), tabres_child(ji,jj,1:N_out),       & 
    545                     &                       h_out(1:N_out), N_in        , N_out                            ) 
    546                   tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/( e2u(ji,jj)*h_out(N_out) ) 
     544                  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) 
     545                  tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e2u(ji,jj)*h_out(N_out)) 
    547546               ENDIF 
    548547            ENDDO 
    549548         ENDDO 
    550  
     549         ! 
    551550         DO jk=1,jpk 
    552551            DO jj=j1,j2 
    553552               DO ji=i1,i2 
    554553                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
    555                      uu(ji,jj,jk,Kbb_a) =                     uu(ji,jj,jk,Kbb_a)                                   &  
    556                            &             + atfp * ( tabres_child(ji,jj,jk) - uu(ji,jj,jk,Kmm_a) ) * umask(ji,jj,jk) 
     554                     zub  = uu(ji,jj,jk,Kbb_a) * e3u(ji,jj,jk,Kbb_a)  ! fse3t_b prior update should be used 
     555                     zuno = uu(ji,jj,jk,Kmm_a) * e3u(ji,jj,jk,Krhs_a) 
     556                     zunu = tabres_child(ji,jj,jk) * e3u(ji,jj,jk,Kmm_a) 
     557                     uu(ji,jj,jk,Kbb_a) = ( zub + atfp * ( zunu - zuno) ) &       
     558                                    & * umask(ji,jj,jk) / e3u(ji,jj,jk,Kbb_a) 
    557559                  ENDIF 
    558560                  ! 
     
    561563            END DO 
    562564         END DO 
     565         ! 
     566         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN 
     567            uu(i1:i2,j1:j2,1:jpkm1,Kbb_a)  = uu(i1:i2,j1:j2,1:jpkm1,Kmm_a) 
     568         ENDIF 
     569         ! 
    563570      ENDIF 
    564571      !  
     
    582589         zrhoy = Agrif_Rhoy() 
    583590         DO jk = k1, k2 
    584             tabres(i1:i2,j1:j2,jk,1) = zrhoy * e2u(i1:i2,j1:j2) * e3u(i1:i2,j1:j2,jk,Kmm_a) & 
    585               &                                                 *  uu(i1:i2,j1:j2,jk,Kmm_a) 
     591            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) 
    586592         END DO 
    587593      ELSE 
     
    595601                     zuno = uu(ji,jj,jk,Kmm_a) * e3u(ji,jj,jk,Krhs_a) 
    596602                     zunu = tabres(ji,jj,jk,1) 
    597                      uu(ji,jj,jk,Kbb_a) = ( zub + atfp * ( zunu - zuno ) )      &       
    598                        &                  * umask(ji,jj,jk) / e3u(ji,jj,jk,Kbb_a) 
     603                     uu(ji,jj,jk,Kbb_a) = ( zub + atfp * ( zunu - zuno) ) &       
     604                                    & * umask(ji,jj,jk) / e3u(ji,jj,jk,Kbb_a) 
    599605                  ENDIF 
    600606                  ! 
     
    669675      ! 
    670676      INTEGER  ::   ji, jj, jk 
    671       REAL(wp) ::   zrhox 
     677      REAL(wp) ::   zrhox, zvb, zvnu, zvno 
    672678! VERTICAL REFINEMENT BEGIN 
    673679      REAL(wp), DIMENSION(i1:i2,j1:j2,1:jpk) :: tabres_child 
     
    682688      IF( before ) THEN 
    683689         zrhox = Agrif_Rhox() 
    684          AGRIF_SpecialValue = -999._wp 
     690!jc_alt 
     691!         AGRIF_SpecialValue = -999._wp 
    685692         DO jk=k1,k2 
    686693            DO jj=j1,j2 
    687694               DO ji=i1,i2 
    688                   tabres(ji,jj,jk,1) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a)                   & 
    689                     &                  *  vmask(ji,jj,jk) *  vv(ji,jj,jk,Kmm_a)                   & 
    690                     &                  + (vmask(ji,jj,jk)-1)*999._wp 
    691                   tabres(ji,jj,jk,2) = vmask(ji,jj,jk) * zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) & 
    692                                        + (vmask(ji,jj,jk)-1)*999._wp 
     695!jc_alt 
     696!                  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) & 
     697!                                     & + (vmask(ji,jj,jk)-1._wp) * 999._wp 
     698                  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)  
     699!jc_alt 
     700!                  tabres(ji,jj,jk,2) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk) & 
     701!                                     & + (vmask(ji,jj,jk)-1._wp) * 999._wp 
     702                  tabres(ji,jj,jk,2) = zrhox * e1v(ji,jj) * e3v(ji,jj,jk,Kmm_a) * vmask(ji,jj,jk) 
    693703               END DO 
    694704            END DO 
     
    701711               N_in = 0 
    702712               DO jk=k1,k2 
    703                   IF (tabres(ji,jj,jk,2) < -900) EXIT 
     713!jc_alt 
     714!                  IF (tabres(ji,jj,jk,2) < -900._wp) EXIT 
     715                  IF (tabres(ji,jj,jk,2) == 0) EXIT 
    704716                  N_in = N_in + 1 
    705717                  tabin(jk) = tabres(ji,jj,jk,1)/tabres(ji,jj,jk,2) 
     
    713725               ENDDO 
    714726               IF (N_in * N_out > 0) THEN 
    715                   h_diff = SUM( h_out(1:N_out) ) - SUM( h_in(1:N_in) ) 
     727                  h_diff = sum(h_out(1:N_out))-sum(h_in(1:N_in)) 
     728                  excess = 0._wp 
    716729                  IF (h_diff < -1.e-4) then 
    717 !Even if bathy at T points match it's possible for the U points to be deeper in the child grid.  
     730!Even if bathy at T points match it's possible for the V points to be deeper in the child grid.  
    718731!In this case we need to move transport from the child grid cells below bed of parent grid into the bottom cell. 
    719                      excess = 0._wp 
    720732                     DO jk=N_in,1,-1 
    721                         thick = MIN( -1._wp*h_diff, h_in(jk) ) 
     733                        thick = MIN(-1*h_diff, h_in(jk)) 
    722734                        excess = excess + tabin(jk)*thick*e2u(ji,jj) 
    723                         tabin(jk) = tabin(jk)*(1._wp - thick/h_in(jk)) 
     735                        tabin(jk) = tabin(jk)*(1. - thick/h_in(jk)) 
    724736                        h_diff = h_diff + thick 
    725737                        IF ( h_diff == 0) THEN 
     
    730742                     ENDDO 
    731743                  ENDIF 
    732                   CALL reconstructandremap( tabin(1:N_in) , h_in(1:N_in), tabres_child(ji,jj,1:N_out),     & 
    733                     &                       h_out(1:N_out), N_in        , N_out                          ) 
     744                  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) 
    734745                  tabres_child(ji,jj,N_out) = tabres_child(ji,jj,N_out) + excess/(e1v(ji,jj)*h_out(N_out)) 
    735746               ENDIF 
    736747            ENDDO 
    737748         ENDDO 
    738  
    739          DO jk=1,jpk 
     749         ! 
     750         DO jk=1,jpkm1 
    740751            DO jj=j1,j2 
    741752               DO ji=i1,i2 
    742                   ! 
    743                   IF( .NOT.(lk_agrif_fstep.AND.(neuler==0)) ) THEN ! Add asselin part 
    744                      vv(ji,jj,jk,Kbb_a) =                     vv(ji,jj,jk,Kbb_a)                  &  
    745                            &             + atfp * ( tabres_child(ji,jj,jk) - vv(ji,jj,jk,Kmm_a) ) & 
    746                            &                      *        vmask(ji,jj,jk) 
     753                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
     754                     zvb  = vv(ji,jj,jk,Kbb_a) * e3v(ji,jj,jk,Kbb_a) ! fse3t_b prior update should be used 
     755                     zvno = vv(ji,jj,jk,Kmm_a) * e3v(ji,jj,jk,Krhs_a) 
     756                     zvnu = tabres_child(ji,jj,jk) * e3v(ji,jj,jk,Kmm_a) 
     757                     vv(ji,jj,jk,Kbb_a) = ( zvb + atfp * ( zvnu - zvno) ) &       
     758                                    & * vmask(ji,jj,jk) / e3v(ji,jj,jk,Kbb_a) 
    747759                  ENDIF 
    748760                  ! 
     
    751763            END DO 
    752764         END DO 
     765         ! 
     766         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN 
     767            vv(i1:i2,j1:j2,1:jpkm1,Kbb_a)  = vv(i1:i2,j1:j2,1:jpkm1,Kmm_a) 
     768         ENDIF 
     769         ! 
    753770      ENDIF 
    754771      !  
     
    788805                     zvno = vv(ji,jj,jk,Kmm_a) * e3v(ji,jj,jk,Krhs_a) 
    789806                     zvnu = tabres(ji,jj,jk,1) 
    790                      vv(ji,jj,jk,Kbb_a) = ( zvb + atfp * ( zvnu - zvno) )        &       
    791                        &                  * vmask(ji,jj,jk) / e3v(ji,jj,jk,Kbb_a) 
     807                     vv(ji,jj,jk,Kbb_a) = ( zvb + atfp * ( zvnu - zvno) ) &       
     808                                    & * vmask(ji,jj,jk) / e3v(ji,jj,jk,Kbb_a) 
    792809                  ENDIF 
    793810                  ! 
     
    890907               ! Update barotropic velocities: 
    891908               IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN 
    892                   IF ( .NOT.( lk_agrif_fstep .AND. (neuler==0) ) ) THEN                          ! Add asselin part 
     909                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
    893910                     zcorr = (tabres(ji,jj) - uu_b(ji,jj,Kmm_a) * hu(ji,jj,Krhs_a)) * r1_hu(ji,jj,Kbb_a) 
    894911                     uu_b(ji,jj,Kbb_a) = uu_b(ji,jj,Kbb_a) + atfp * zcorr * umask(ji,jj,1) 
     
    955972               ! 
    956973               ! Update barotropic velocities: 
    957                IF ( .NOT.ln_dynspg_ts .OR. ( ln_dynspg_ts .AND. ( .NOT.ln_bt_fw ) ) ) THEN 
    958                   IF ( .NOT. ( lk_agrif_fstep .AND. ( neuler==0 ) ) ) THEN                      ! Add asselin part 
     974               IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN 
     975                  IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 
    959976                     zcorr = (tabres(ji,jj) - vv_b(ji,jj,Kmm_a) * hv(ji,jj,Krhs_a)) * r1_hv(ji,jj,Kbb_a) 
    960                      vv_b(ji,jj,Kbb_a) =       vv_b(ji,jj,Kbb_a) + atfp * zcorr  *  vmask(ji,jj,1) 
     977                     vv_b(ji,jj,Kbb_a) = vv_b(ji,jj,Kbb_a) + atfp * zcorr * vmask(ji,jj,1) 
    961978                  END IF 
    962979               ENDIF               
     
    10071024            DO jj=j1,j2 
    10081025               DO ji=i1,i2 
    1009                   ssh(ji,jj,Kbb_a) =              ssh(ji,jj,Kbb_a)                & 
    1010                     &               + atfp * ( tabres(ji,jj) - ssh(ji,jj,Kmm_a) ) & 
    1011                     &                        *  tmask(ji,jj,1) 
     1026                  ssh(ji,jj,Kbb_a) =   ssh(ji,jj,Kbb_a) & 
     1027                        & + atfp * ( tabres(ji,jj) - ssh(ji,jj,Kmm_a) ) * tmask(ji,jj,1) 
    10121028               END DO 
    10131029            END DO 
     
    11031119               zcor = rdt * r1_e1e2t(i1  ,jj) * e2u(i1,jj) * (ub2_b(i1,jj)-tabres(i1,jj))  
    11041120               ssh(i1  ,jj,Kmm_a) = ssh(i1  ,jj,Kmm_a) + zcor 
    1105                IF ( .NOT. ( lk_agrif_fstep .AND. ( neuler==0 ) ) )  & 
    1106                  &                  ssh(i1  ,jj,Kbb_a) = ssh(i1  ,jj,Kbb_a) + atfp * zcor 
     1121               IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) ssh(i1  ,jj,Kbb_a) = ssh(i1  ,jj,Kbb_a) + atfp * zcor 
    11071122            END DO 
    11081123         ENDIF 
     
    11111126               zcor = - rdt * r1_e1e2t(i2+1,jj) * e2u(i2,jj) * (ub2_b(i2,jj)-tabres(i2,jj)) 
    11121127               ssh(i2+1,jj,Kmm_a) = ssh(i2+1,jj,Kmm_a) + zcor 
    1113                IF ( .NOT. ( lk_agrif_fstep .AND. ( neuler==0 ) ) )   & 
    1114                  &                  ssh(i2+1,jj,Kbb_a) = ssh(i2+1,jj,Kbb_a) + atfp * zcor 
     1128               IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) ssh(i2+1,jj,Kbb_a) = ssh(i2+1,jj,Kbb_a) + atfp * zcor 
    11151129            END DO 
    11161130         ENDIF 
     
    11911205         IF (southern_side) THEN 
    11921206            DO ji=i1,i2 
    1193                zcor = rdt * r1_e1e2t(ji,j1  ) * e1v(ji,j1  ) * ( vb2_b(ji,j1)-tabres(ji,j1) ) 
     1207               zcor = rdt * r1_e1e2t(ji,j1  ) * e1v(ji,j1  ) * (vb2_b(ji,j1)-tabres(ji,j1)) 
    11941208               ssh(ji,j1  ,Kmm_a) = ssh(ji,j1  ,Kmm_a) + zcor 
    1195                IF ( .NOT. ( lk_agrif_fstep .AND. ( neuler==0 ) ) )   & 
    1196                  &                 ssh(ji,j1  ,Kbb_a) = ssh(ji,j1,Kbb_a) + atfp * zcor 
     1209               IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) ssh(ji,j1  ,Kbb_a) = ssh(ji,j1,Kbb_a) + atfp * zcor 
    11971210            END DO 
    11981211         ENDIF 
    11991212         IF (northern_side) THEN                
    12001213            DO ji=i1,i2 
    1201                zcor = - rdt * r1_e1e2t(ji,j2+1) * e1v(ji,j2  ) * ( vb2_b(ji,j2)-tabres(ji,j2) ) 
     1214               zcor = - rdt * r1_e1e2t(ji,j2+1) * e1v(ji,j2  ) * (vb2_b(ji,j2)-tabres(ji,j2)) 
    12021215               ssh(ji,j2+1,Kmm_a) = ssh(ji,j2+1,Kmm_a) + zcor 
    1203                IF ( .NOT. ( lk_agrif_fstep .AND. ( neuler==0 ) ) )   & 
    1204                  &                  ssh(ji,j2+1,Kbb_a) = ssh(ji,j2+1,Kbb_a) + atfp * zcor 
     1216               IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) ssh(ji,j2+1,Kbb_a) = ssh(ji,j2+1,Kbb_a) + atfp * zcor 
    12051217            END DO 
    12061218         ENDIF 
     
    12351247            END DO 
    12361248         END DO 
    1237          tabres(:,:,:,1) = tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy() 
    1238          tabres(:,:,:,2) = tabres(:,:,:,2)*Agrif_Rhox() 
    1239          tabres(:,:,:,3) = tabres(:,:,:,3)*Agrif_Rhoy() 
     1249         tabres(:,:,:,1)=tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy() 
     1250         tabres(:,:,:,2)=tabres(:,:,:,2)*Agrif_Rhox() 
     1251         tabres(:,:,:,3)=tabres(:,:,:,3)*Agrif_Rhoy() 
    12401252      ELSE 
    12411253         DO jk=k1,k2 
     
    12461258                     print *,'VAL2 = ',ji,jj,jk,tabres(ji,jj,jk,2),e1t(ji,jj)*tmask(ji,jj,jk) 
    12471259                     print *,'VAL3 = ',ji,jj,jk,tabres(ji,jj,jk,3),e2t(ji,jj)*tmask(ji,jj,jk) 
    1248                      ztemp = SQRT( tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3)) ) 
     1260                     ztemp = sqrt(tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3))) 
    12491261                     print *,'CORR = ',ztemp-1. 
    12501262                     print *,'NEW VALS = ',tabres(ji,jj,jk,2)*ztemp,tabres(ji,jj,jk,3)*ztemp, & 
    12511263                           tabres(ji,jj,jk,2)*ztemp*tabres(ji,jj,jk,3)*ztemp 
    1252                      e1t(ji,jj) = tabres(ji,jj,jk,2) * ztemp 
    1253                      e2t(ji,jj) = tabres(ji,jj,jk,3) * ztemp 
     1264                     e1t(ji,jj) = tabres(ji,jj,jk,2)*ztemp 
     1265                     e2t(ji,jj) = tabres(ji,jj,jk,3)*ztemp 
    12541266                  END IF 
    12551267               END DO 
     
    13311343            DO jj=j1,j2 
    13321344               DO ji=i1,i2 
    1333                   ptab(ji,jj,jk) =   e3t_0(ji,jj,jk)                                    & 
    1334                     &                * ( 1._wp + ssh(ji,jj,Kmm_a)                       & 
    1335                     &                          * ssmask(ji,jj)                          & 
    1336                     &                          / ( ht_0(ji,jj)-1._wp + ssmask(ji,jj) ) ) 
     1345                  ptab(ji,jj,jk) = e3t_0(ji,jj,jk) * (1._wp + ssh(ji,jj,Kmm_a) & 
     1346                                     & *ssmask(ji,jj)/(ht_0(ji,jj)-1._wp + ssmask(ji,jj))) 
    13371347               END DO 
    13381348            END DO 
     
    13531363               DO jj=j1,j2 
    13541364                  DO ji=i1,i2 
    1355                      e3t(ji,jj,jk,Kbb_a) =             e3t(ji,jj,jk,Kbb_a)                  & 
    1356                        &                  + atfp * ( ptab(ji,jj,jk) - e3t(ji,jj,jk,Kmm_a) ) 
     1365                     e3t(ji,jj,jk,Kbb_a) =  e3t(ji,jj,jk,Kbb_a) & 
     1366                           & + atfp * ( ptab(ji,jj,jk) - e3t(ji,jj,jk,Kmm_a) ) 
    13571367                  END DO 
    13581368               END DO 
     
    13671377                  DO ji = i1,i2             
    13681378                     zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk)) 
    1369                      e3w(ji,jj,jk,Kbb_a)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) )          &  
    1370                        &                                    * ( e3t(ji,jj,jk-1,Kbb_a) - e3t_0(ji,jj,jk-1) )  & 
    1371                        &                                    + 0.5_wp * tmask(ji,jj,jk)                       & 
    1372                        &                                    * ( e3t(ji,jj,jk  ,Kbb_a) - e3t_0(ji,jj,jk  ) ) 
    1373                      gdepw(ji,jj,jk,Kbb_a) =                       gdepw(ji,jj,jk-1,Kbb_a) +      e3t(ji,jj,jk-1,Kbb_a) 
    1374                      gdept(ji,jj,jk,Kbb_a) =            zcoef  * ( gdepw(ji,jj,jk  ,Kbb_a) + 0.5 * e3w(ji,jj,jk  ,Kbb_a) )  & 
    1375                        &                     + (1._wp - zcoef) * ( gdept(ji,jj,jk-1,Kbb_a) +       e3w(ji,jj,jk  ,Kbb_a) )  
     1379                     e3w(ji,jj,jk,Kbb_a)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) ) *        &  
     1380                     &                                        ( e3t(ji,jj,jk-1,Kbb_a) - e3t_0(ji,jj,jk-1) )  & 
     1381                     &                                  +            0.5_wp * tmask(ji,jj,jk)   *        & 
     1382                     &                                        ( e3t(ji,jj,jk  ,Kbb_a) - e3t_0(ji,jj,jk  ) ) 
     1383                     gdepw(ji,jj,jk,Kbb_a) = gdepw(ji,jj,jk-1,Kbb_a) + e3t(ji,jj,jk-1,Kbb_a) 
     1384                     gdept(ji,jj,jk,Kbb_a) =      zcoef  * ( gdepw(ji,jj,jk  ,Kbb_a) + 0.5 * e3w(ji,jj,jk,Kbb_a))  & 
     1385                         &               + (1-zcoef) * ( gdept(ji,jj,jk-1,Kbb_a) +       e3w(ji,jj,jk,Kbb_a))  
    13761386                  END DO 
    13771387               END DO 
     
    13931403         ! 
    13941404         ! Update vertical scale factor at W-points and depths: 
    1395            e3w(i1:i2,j1:j2,1,Kmm_a) = e3w_0(i1:i2,j1:j2,1) + e3t(i1:i2,j1:j2,1,Kmm_a) - e3t_0(i1:i2,j1:j2,1) 
     1405         e3w (i1:i2,j1:j2,1,Kmm_a) = e3w_0(i1:i2,j1:j2,1) + e3t(i1:i2,j1:j2,1,Kmm_a) - e3t_0(i1:i2,j1:j2,1) 
    13961406         gdept(i1:i2,j1:j2,1,Kmm_a) = 0.5_wp * e3w(i1:i2,j1:j2,1,Kmm_a) 
    13971407         gdepw(i1:i2,j1:j2,1,Kmm_a) = 0.0_wp 
    1398          gde3w(i1:i2,j1:j2,1      ) = gdept(i1:i2,j1:j2,1,Kmm_a) - ( ht(i1:i2,j1:j2) - ht_0(i1:i2,j1:j2) ) ! Last term in the rhs is ssh 
     1408         gde3w(i1:i2,j1:j2,1) = gdept(i1:i2,j1:j2,1,Kmm_a) - (ht(i1:i2,j1:j2)-ht_0(i1:i2,j1:j2)) ! Last term in the rhs is ssh 
    13991409         ! 
    14001410         DO jk = 2, jpk 
     
    14021412               DO ji = i1,i2             
    14031413               zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk)) 
    1404                 e3w(ji,jj,jk,Kmm_a)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) )          & 
    1405                  &                                     * ( e3t(ji,jj,jk-1,Kmm_a) - e3t_0(ji,jj,jk-1) )  & 
    1406                  &                                     + 0.5_wp * tmask(ji,jj,jk)                       & 
    1407                  &                                     * ( e3t(ji,jj,jk  ,Kmm_a) - e3t_0(ji,jj,jk  ) ) 
    1408                gdepw(ji,jj,jk,Kmm_a) =                         gdepw(ji,jj,jk-1,Kmm_a) +       e3t(ji,jj,jk-1,Kmm_a) 
    1409                gdept(ji,jj,jk,Kmm_a) =             zcoef   * ( gdepw(ji,jj,jk  ,Kmm_a) + 0.5 * e3w(ji,jj,jk  ,Kmm_a) )  & 
    1410                  &                     + ( 1._wp - zcoef ) * ( gdept(ji,jj,jk-1,Kmm_a) +       e3w(ji,jj,jk  ,Kmm_a) )  
    1411                gde3w(ji,jj,jk      ) =                         gdept(ji,jj,jk  ,Kmm_a) - ( ht(ji,jj)-ht_0(ji,jj) )    ! Last term in the rhs is ssh 
     1414               e3w(ji,jj,jk,Kmm_a)  = e3w_0(ji,jj,jk) + ( 1.0_wp - 0.5_wp * tmask(ji,jj,jk) ) * ( e3t(ji,jj,jk-1,Kmm_a) - e3t_0(ji,jj,jk-1) )   & 
     1415               &                                  +            0.5_wp * tmask(ji,jj,jk)   * ( e3t(ji,jj,jk  ,Kmm_a) - e3t_0(ji,jj,jk  ) ) 
     1416               gdepw(ji,jj,jk,Kmm_a) = gdepw(ji,jj,jk-1,Kmm_a) + e3t(ji,jj,jk-1,Kmm_a) 
     1417               gdept(ji,jj,jk,Kmm_a) =      zcoef  * ( gdepw(ji,jj,jk  ,Kmm_a) + 0.5 * e3w(ji,jj,jk,Kmm_a))  & 
     1418                   &               + (1-zcoef) * ( gdept(ji,jj,jk-1,Kmm_a) +       e3w(ji,jj,jk,Kmm_a))  
     1419               gde3w(ji,jj,jk) = gdept(ji,jj,jk,Kmm_a) - (ht(ji,jj)-ht_0(ji,jj)) ! Last term in the rhs is ssh 
    14121420               END DO 
    14131421            END DO 
     
    14151423         ! 
    14161424         IF  ((neuler==0).AND.(Agrif_Nb_Step()==0) ) THEN 
    1417               e3t(i1:i2,j1:j2,1:jpk,Kbb_a) =   e3t(i1:i2,j1:j2,1:jpk,Kmm_a) 
    1418               e3w(i1:i2,j1:j2,1:jpk,Kbb_a) =   e3w(i1:i2,j1:j2,1:jpk,Kmm_a) 
     1425            e3t (i1:i2,j1:j2,1:jpk,Kbb_a)  = e3t (i1:i2,j1:j2,1:jpk,Kmm_a) 
     1426            e3w (i1:i2,j1:j2,1:jpk,Kbb_a)  = e3w (i1:i2,j1:j2,1:jpk,Kmm_a) 
    14191427            gdepw(i1:i2,j1:j2,1:jpk,Kbb_a) = gdepw(i1:i2,j1:j2,1:jpk,Kmm_a) 
    14201428            gdept(i1:i2,j1:j2,1:jpk,Kbb_a) = gdept(i1:i2,j1:j2,1:jpk,Kmm_a) 
Note: See TracChangeset for help on using the changeset viewer.