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 12928 for NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/TRA/tranpc.F90 – NEMO

Ignore:
Timestamp:
2020-05-14T21:46:00+02:00 (4 years ago)
Author:
smueller
Message:

Synchronizing with /NEMO/trunk@12925 (ticket #2170)

Location:
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser

    • Property svn:externals
      •  

        old new  
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@HEAD         sette 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/TRA/tranpc.F90

    r10425 r12928  
    3434 
    3535   !! * Substitutions 
    36 #  include "vectopt_loop_substitute.h90" 
     36#  include "do_loop_substitute.h90" 
    3737   !!---------------------------------------------------------------------- 
    3838   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4242CONTAINS 
    4343 
    44    SUBROUTINE tra_npc( kt ) 
     44   SUBROUTINE tra_npc( kt, Kmm, Krhs, pts, Kaa ) 
    4545      !!---------------------------------------------------------------------- 
    4646      !!                  ***  ROUTINE tranpc  *** 
     
    5858      !! References :     Madec, et al., 1991, JPO, 21, 9, 1349-1371. 
    5959      !!---------------------------------------------------------------------- 
    60       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     60      INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step index 
     61      INTEGER,                                   INTENT(in   ) :: Kmm, Krhs, Kaa  ! time level indices 
     62      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation 
    6163      ! 
    6264      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    6567      LOGICAL  ::   l_bottom_reached, l_column_treated 
    6668      REAL(wp) ::   zta, zalfa, zsum_temp, zsum_alfa, zaw, zdz, zsum_z 
    67       REAL(wp) ::   zsa, zbeta, zsum_sali, zsum_beta, zbw, zrw, z1_r2dt 
    68       REAL(wp), PARAMETER ::   zn2_zero = 1.e-14_wp      ! acceptance criteria for neutrality (N2==0) 
    69       REAL(wp), DIMENSION(        jpk     ) ::   zvn2         ! vertical profile of N2 at 1 given point... 
    70       REAL(wp), DIMENSION(        jpk,jpts) ::   zvts, zvab   ! vertical profile of T & S , and  alpha & betaat 1 given point 
    71       REAL(wp), DIMENSION(jpi,jpj,jpk     ) ::   zn2          ! N^2  
    72       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) ::   zab          ! alpha and beta 
    73       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds   ! 3D workspace 
     69      REAL(wp) ::   zsa, zbeta, zsum_sali, zsum_beta, zbw, zrw, z1_rDt 
     70      REAL(wp), PARAMETER ::   zn2_zero = 1.e-14_wp             ! acceptance criteria for neutrality (N2==0) 
     71      REAL(wp), DIMENSION(        jpk     )   ::   zvn2         ! vertical profile of N2 at 1 given point... 
     72      REAL(wp), DIMENSION(        jpk,jpts)   ::   zvts, zvab   ! vertical profile of T & S , and  alpha & betaat 1 given point 
     73      REAL(wp), DIMENSION(jpi,jpj,jpk     )   ::   zn2          ! N^2  
     74      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts)   ::   zab          ! alpha and beta 
     75      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds ! 3D workspace 
    7476      ! 
    7577      LOGICAL, PARAMETER :: l_LB_debug = .FALSE. ! set to true if you want to follow what is 
     
    8486         IF( l_trdtra )   THEN                    !* Save initial after fields 
    8587            ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 
    86             ztrdt(:,:,:) = tsa(:,:,:,jp_tem)  
    87             ztrds(:,:,:) = tsa(:,:,:,jp_sal) 
     88            ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kaa)  
     89            ztrds(:,:,:) = pts(:,:,:,jp_sal,Kaa) 
    8890         ENDIF 
    8991         ! 
     
    9597         ENDIF 
    9698         ! 
    97          CALL eos_rab( tsa, zab )         ! after alpha and beta (given on T-points) 
    98          CALL bn2    ( tsa, zab, zn2 )    ! after Brunt-Vaisala  (given on W-points) 
     99         CALL eos_rab( pts(:,:,:,:,Kaa), zab, Kmm )         ! after alpha and beta (given on T-points) 
     100         CALL bn2    ( pts(:,:,:,:,Kaa), zab, zn2, Kmm )    ! after Brunt-Vaisala  (given on W-points) 
    99101         ! 
    100102         inpcc = 0 
    101103         ! 
    102          DO jj = 2, jpjm1                 ! interior column only 
    103             DO ji = fs_2, fs_jpim1 
     104         DO_2D_00_00 
     105            ! 
     106            IF( tmask(ji,jj,2) == 1 ) THEN      ! At least 2 ocean points 
     107               !                                     ! consider one ocean column  
     108               zvts(:,jp_tem) = pts(ji,jj,:,jp_tem,Kaa)      ! temperature 
     109               zvts(:,jp_sal) = pts(ji,jj,:,jp_sal,Kaa)      ! salinity 
    104110               ! 
    105                IF( tmask(ji,jj,2) == 1 ) THEN      ! At least 2 ocean points 
    106                   !                                     ! consider one ocean column  
    107                   zvts(:,jp_tem) = tsa(ji,jj,:,jp_tem)      ! temperature 
    108                   zvts(:,jp_sal) = tsa(ji,jj,:,jp_sal)      ! salinity 
    109                   ! 
    110                   zvab(:,jp_tem)  = zab(ji,jj,:,jp_tem)     ! Alpha  
    111                   zvab(:,jp_sal)  = zab(ji,jj,:,jp_sal)     ! Beta   
    112                   zvn2(:)         = zn2(ji,jj,:)            ! N^2  
    113                   ! 
    114                   IF( l_LB_debug ) THEN                  !LB debug: 
    115                      lp_monitor_point = .FALSE. 
    116                      IF( ( ji == ilc1 ).AND.( jj == jlc1 ) ) lp_monitor_point = .TRUE. 
    117                      ! writing only if on CPU domain where conv region is: 
    118                      lp_monitor_point = (narea == nncpu).AND.lp_monitor_point                       
    119                   ENDIF                                  !LB debug  end 
    120                   ! 
    121                   ikbot = mbkt(ji,jj)   ! ikbot: ocean bottom T-level 
    122                   ikp = 1                  ! because N2 is irrelevant at the surface level (will start at ikp=2) 
    123                   ilayer = 0 
    124                   jiter  = 0 
    125                   l_column_treated = .FALSE. 
    126                   ! 
    127                   DO WHILE ( .NOT. l_column_treated ) 
    128                      ! 
    129                      jiter = jiter + 1 
    130                      !  
    131                      IF( jiter >= 400 ) EXIT 
    132                      ! 
    133                      l_bottom_reached = .FALSE. 
    134                      ! 
    135                      DO WHILE ( .NOT. l_bottom_reached ) 
    136                         ! 
    137                         ikp = ikp + 1 
    138                         ! 
    139                         !! Testing level ikp for instability 
    140                         !! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    141                         IF( zvn2(ikp) <  -zn2_zero ) THEN ! Instability found! 
    142                            ! 
    143                            ilayer = ilayer + 1    ! yet another instable portion of the water column found.... 
    144                            ! 
    145                            IF( lp_monitor_point ) THEN  
     111               zvab(:,jp_tem)  = zab(ji,jj,:,jp_tem)     ! Alpha  
     112               zvab(:,jp_sal)  = zab(ji,jj,:,jp_sal)     ! Beta   
     113               zvn2(:)         = zn2(ji,jj,:)            ! N^2  
     114               ! 
     115               IF( l_LB_debug ) THEN                  !LB debug: 
     116                  lp_monitor_point = .FALSE. 
     117                  IF( ( ji == ilc1 ).AND.( jj == jlc1 ) ) lp_monitor_point = .TRUE. 
     118                  ! writing only if on CPU domain where conv region is: 
     119                  lp_monitor_point = (narea == nncpu).AND.lp_monitor_point                       
     120               ENDIF                                  !LB debug  end 
     121               ! 
     122               ikbot = mbkt(ji,jj)   ! ikbot: ocean bottom T-level 
     123               ikp = 1                  ! because N2 is irrelevant at the surface level (will start at ikp=2) 
     124               ilayer = 0 
     125               jiter  = 0 
     126               l_column_treated = .FALSE. 
     127               ! 
     128               DO WHILE ( .NOT. l_column_treated ) 
     129                  ! 
     130                  jiter = jiter + 1 
     131                  !  
     132                  IF( jiter >= 400 ) EXIT 
     133                  ! 
     134                  l_bottom_reached = .FALSE. 
     135                  ! 
     136                  DO WHILE ( .NOT. l_bottom_reached ) 
     137                     ! 
     138                     ikp = ikp + 1 
     139                     ! 
     140                     !! Testing level ikp for instability 
     141                     !! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     142                     IF( zvn2(ikp) <  -zn2_zero ) THEN ! Instability found! 
     143                        ! 
     144                        ilayer = ilayer + 1    ! yet another instable portion of the water column found.... 
     145                        ! 
     146                        IF( lp_monitor_point ) THEN  
     147                           WRITE(numout,*) 
     148                           IF( ilayer == 1 .AND. jiter == 1 ) THEN   ! first time a column is spoted with an instability 
    146149                              WRITE(numout,*) 
    147                               IF( ilayer == 1 .AND. jiter == 1 ) THEN   ! first time a column is spoted with an instability 
    148                                  WRITE(numout,*) 
    149                                  WRITE(numout,*) 'Time step = ',kt,' !!!' 
    150                               ENDIF 
    151                               WRITE(numout,*)  ' * Iteration #',jiter,': found instable portion #',ilayer,   & 
    152                                  &                                    ' in column! Starting at ikp =', ikp 
    153                               WRITE(numout,*)  ' *** N2 for point (i,j) = ',ji,' , ',jj 
    154                               DO jk = 1, klc1 
    155                                  WRITE(numout,*) jk, zvn2(jk) 
    156                               END DO 
    157                               WRITE(numout,*) 
     150                              WRITE(numout,*) 'Time step = ',kt,' !!!' 
    158151                           ENDIF 
    159                            ! 
    160                            IF( jiter == 1 )   inpcc = inpcc + 1  
    161                            ! 
    162                            IF( lp_monitor_point )   WRITE(numout, *) 'Negative N2 at ikp =',ikp,' for layer #', ilayer 
    163                            ! 
    164                            !! ikup is the uppermost point where mixing will start: 
    165                            ikup = ikp - 1 ! ikup is always "at most at ikp-1", less if neutral levels overlying 
    166                            ! 
    167                            !! If the points above ikp-1 have N2 == 0 they must also be mixed: 
    168                            IF( ikp > 2 ) THEN 
    169                               DO jk = ikp-1, 2, -1 
    170                                  IF( ABS(zvn2(jk)) < zn2_zero ) THEN 
    171                                     ikup = ikup - 1  ! 1 more upper level has N2=0 and must be added for the mixing 
    172                                  ELSE 
    173                                     EXIT 
    174                                  ENDIF 
    175                               END DO 
    176                            ENDIF 
    177                            ! 
    178                            IF( ikup < 1 )   CALL ctl_stop( 'tra_npc :  PROBLEM #1') 
    179                            ! 
    180                            zsum_temp = 0._wp 
    181                            zsum_sali = 0._wp 
    182                            zsum_alfa = 0._wp 
    183                            zsum_beta = 0._wp 
    184                            zsum_z    = 0._wp 
    185                                                      
    186                            DO jk = ikup, ikbot      ! Inside the instable (and overlying neutral) portion of the column 
    187                               ! 
    188                               zdz       = e3t_n(ji,jj,jk) 
    189                               zsum_temp = zsum_temp + zvts(jk,jp_tem)*zdz 
    190                               zsum_sali = zsum_sali + zvts(jk,jp_sal)*zdz 
    191                               zsum_alfa = zsum_alfa + zvab(jk,jp_tem)*zdz 
    192                               zsum_beta = zsum_beta + zvab(jk,jp_sal)*zdz 
    193                               zsum_z    = zsum_z    + zdz 
    194                               !                               
    195                               IF( jk == ikbot ) EXIT ! avoid array-index overshoot in case ikbot = jpk, cause we're calling jk+1 next line 
    196                               !! EXIT when we have reached the last layer that is instable (N2<0) or neutral (N2=0): 
    197                               IF( zvn2(jk+1) > zn2_zero ) EXIT 
    198                            END DO 
    199                            
    200                            ikdown = jk ! for the current unstable layer, ikdown is the deepest point with a negative or neutral N2 
    201                            IF( ikup == ikdown )   CALL ctl_stop( 'tra_npc :  PROBLEM #2') 
    202  
    203                            ! Mixing Temperature, salinity, alpha and beta from ikup to ikdown included: 
    204                            zta   = zsum_temp/zsum_z 
    205                            zsa   = zsum_sali/zsum_z 
    206                            zalfa = zsum_alfa/zsum_z 
    207                            zbeta = zsum_beta/zsum_z 
    208  
    209                            IF( lp_monitor_point ) THEN 
    210                               WRITE(numout,*) 'MIXED T, S, alfa and beta between ikup =',ikup,   & 
    211                                  &            ' and ikdown =',ikdown,', in layer #',ilayer 
    212                               WRITE(numout,*) '  => Mean temp. in that portion =', zta 
    213                               WRITE(numout,*) '  => Mean sali. in that portion =', zsa 
    214                               WRITE(numout,*) '  => Mean Alfa  in that portion =', zalfa 
    215                               WRITE(numout,*) '  => Mean Beta  in that portion =', zbeta 
    216                            ENDIF 
    217  
    218                            !! Homogenaizing the temperature, salinity, alpha and beta in this portion of the column 
    219                            DO jk = ikup, ikdown 
    220                               zvts(jk,jp_tem) = zta 
    221                               zvts(jk,jp_sal) = zsa 
    222                               zvab(jk,jp_tem) = zalfa 
    223                               zvab(jk,jp_sal) = zbeta 
    224                            END DO 
    225                             
    226                             
    227                            !! Updating N2 in the relvant portion of the water column 
    228                            !! Temperature, Salinity, Alpha and Beta have been homogenized in the unstable portion 
    229                            !! => Need to re-compute N2! will use Alpha and Beta! 
    230                             
    231                            ikup   = MAX(2,ikup)         ! ikup can never be 1 ! 
    232                            ik_low = MIN(ikdown+1,ikbot) ! we must go 1 point deeper than ikdown! 
    233                             
    234                            DO jk = ikup, ik_low              ! we must go 1 point deeper than ikdown! 
    235  
    236                               !! Interpolating alfa and beta at W point: 
    237                               zrw =  (gdepw_n(ji,jj,jk  ) - gdept_n(ji,jj,jk)) & 
    238                                  & / (gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk)) 
    239                               zaw = zvab(jk,jp_tem) * (1._wp - zrw) + zvab(jk-1,jp_tem) * zrw 
    240                               zbw = zvab(jk,jp_sal) * (1._wp - zrw) + zvab(jk-1,jp_sal) * zrw 
    241  
    242                               !! N2 at W point, doing exactly as in eosbn2.F90: 
    243                               zvn2(jk) = grav*( zaw * ( zvts(jk-1,jp_tem) - zvts(jk,jp_tem) )     & 
    244                                  &            - zbw * ( zvts(jk-1,jp_sal) - zvts(jk,jp_sal) )  )  & 
    245                                  &       / e3w_n(ji,jj,jk) * tmask(ji,jj,jk) 
    246  
    247                               !! OR, faster  => just considering the vertical gradient of density 
    248                               !! as only the signa maters... 
    249                               !zvn2(jk) = (  zaw * ( zvts(jk-1,jp_tem) - zvts(jk,jp_tem) )     & 
    250                               !     &      - zbw * ( zvts(jk-1,jp_sal) - zvts(jk,jp_sal) )  ) 
    251  
    252                            END DO 
    253                          
    254                            ikp = MIN(ikdown+1,ikbot) 
    255                             
    256  
    257                         ENDIF  !IF( zvn2(ikp) < 0. ) 
    258  
    259  
    260                         IF( ikp == ikbot ) l_bottom_reached = .TRUE. 
    261                         ! 
    262                      END DO ! DO WHILE ( .NOT. l_bottom_reached ) 
    263  
    264                      IF( ikp /= ikbot )   CALL ctl_stop( 'tra_npc :  PROBLEM #3') 
    265                      
    266                      ! ******* At this stage ikp == ikbot ! ******* 
    267                      
    268                      IF( ilayer > 0 ) THEN      !! least an unstable layer has been found 
    269                         ! 
    270                         IF( lp_monitor_point ) THEN 
    271                            WRITE(numout,*) 
    272                            WRITE(numout,*) 'After ',jiter,' iteration(s), we neutralized ',ilayer,' instable layer(s)' 
    273                            WRITE(numout,*) '   ==> N2 at i,j=',ji,',',jj,' now looks like this:' 
     152                           WRITE(numout,*)  ' * Iteration #',jiter,': found instable portion #',ilayer,   & 
     153                              &                                    ' in column! Starting at ikp =', ikp 
     154                           WRITE(numout,*)  ' *** N2 for point (i,j) = ',ji,' , ',jj 
    274155                           DO jk = 1, klc1 
    275156                              WRITE(numout,*) jk, zvn2(jk) 
     
    278159                        ENDIF 
    279160                        ! 
    280                         ikp    = 1     ! starting again at the surface for the next iteration 
    281                         ilayer = 0 
     161                        IF( jiter == 1 )   inpcc = inpcc + 1  
     162                        ! 
     163                        IF( lp_monitor_point )   WRITE(numout, *) 'Negative N2 at ikp =',ikp,' for layer #', ilayer 
     164                        ! 
     165                        !! ikup is the uppermost point where mixing will start: 
     166                        ikup = ikp - 1 ! ikup is always "at most at ikp-1", less if neutral levels overlying 
     167                        ! 
     168                        !! If the points above ikp-1 have N2 == 0 they must also be mixed: 
     169                        IF( ikp > 2 ) THEN 
     170                           DO jk = ikp-1, 2, -1 
     171                              IF( ABS(zvn2(jk)) < zn2_zero ) THEN 
     172                                 ikup = ikup - 1  ! 1 more upper level has N2=0 and must be added for the mixing 
     173                              ELSE 
     174                                 EXIT 
     175                              ENDIF 
     176                           END DO 
     177                        ENDIF 
     178                        ! 
     179                        IF( ikup < 1 )   CALL ctl_stop( 'tra_npc :  PROBLEM #1') 
     180                        ! 
     181                        zsum_temp = 0._wp 
     182                        zsum_sali = 0._wp 
     183                        zsum_alfa = 0._wp 
     184                        zsum_beta = 0._wp 
     185                        zsum_z    = 0._wp 
     186                                                  
     187                        DO jk = ikup, ikbot      ! Inside the instable (and overlying neutral) portion of the column 
     188                           ! 
     189                           zdz       = e3t(ji,jj,jk,Kmm) 
     190                           zsum_temp = zsum_temp + zvts(jk,jp_tem)*zdz 
     191                           zsum_sali = zsum_sali + zvts(jk,jp_sal)*zdz 
     192                           zsum_alfa = zsum_alfa + zvab(jk,jp_tem)*zdz 
     193                           zsum_beta = zsum_beta + zvab(jk,jp_sal)*zdz 
     194                           zsum_z    = zsum_z    + zdz 
     195                           !                               
     196                           IF( jk == ikbot ) EXIT ! avoid array-index overshoot in case ikbot = jpk, cause we're calling jk+1 next line 
     197                           !! EXIT when we have reached the last layer that is instable (N2<0) or neutral (N2=0): 
     198                           IF( zvn2(jk+1) > zn2_zero ) EXIT 
     199                        END DO 
     200                        
     201                        ikdown = jk ! for the current unstable layer, ikdown is the deepest point with a negative or neutral N2 
     202                        IF( ikup == ikdown )   CALL ctl_stop( 'tra_npc :  PROBLEM #2') 
     203 
     204                        ! Mixing Temperature, salinity, alpha and beta from ikup to ikdown included: 
     205                        zta   = zsum_temp/zsum_z 
     206                        zsa   = zsum_sali/zsum_z 
     207                        zalfa = zsum_alfa/zsum_z 
     208                        zbeta = zsum_beta/zsum_z 
     209 
     210                        IF( lp_monitor_point ) THEN 
     211                           WRITE(numout,*) 'MIXED T, S, alfa and beta between ikup =',ikup,   & 
     212                              &            ' and ikdown =',ikdown,', in layer #',ilayer 
     213                           WRITE(numout,*) '  => Mean temp. in that portion =', zta 
     214                           WRITE(numout,*) '  => Mean sali. in that portion =', zsa 
     215                           WRITE(numout,*) '  => Mean Alfa  in that portion =', zalfa 
     216                           WRITE(numout,*) '  => Mean Beta  in that portion =', zbeta 
     217                        ENDIF 
     218 
     219                        !! Homogenaizing the temperature, salinity, alpha and beta in this portion of the column 
     220                        DO jk = ikup, ikdown 
     221                           zvts(jk,jp_tem) = zta 
     222                           zvts(jk,jp_sal) = zsa 
     223                           zvab(jk,jp_tem) = zalfa 
     224                           zvab(jk,jp_sal) = zbeta 
     225                        END DO 
     226                         
     227                         
     228                        !! Updating N2 in the relvant portion of the water column 
     229                        !! Temperature, Salinity, Alpha and Beta have been homogenized in the unstable portion 
     230                        !! => Need to re-compute N2! will use Alpha and Beta! 
     231                         
     232                        ikup   = MAX(2,ikup)         ! ikup can never be 1 ! 
     233                        ik_low = MIN(ikdown+1,ikbot) ! we must go 1 point deeper than ikdown! 
     234                         
     235                        DO jk = ikup, ik_low              ! we must go 1 point deeper than ikdown! 
     236 
     237                           !! Interpolating alfa and beta at W point: 
     238                           zrw =  (gdepw(ji,jj,jk  ,Kmm) - gdept(ji,jj,jk,Kmm)) & 
     239                              & / (gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm)) 
     240                           zaw = zvab(jk,jp_tem) * (1._wp - zrw) + zvab(jk-1,jp_tem) * zrw 
     241                           zbw = zvab(jk,jp_sal) * (1._wp - zrw) + zvab(jk-1,jp_sal) * zrw 
     242 
     243                           !! N2 at W point, doing exactly as in eosbn2.F90: 
     244                           zvn2(jk) = grav*( zaw * ( zvts(jk-1,jp_tem) - zvts(jk,jp_tem) )     & 
     245                              &            - zbw * ( zvts(jk-1,jp_sal) - zvts(jk,jp_sal) )  )  & 
     246                              &       / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) 
     247 
     248                           !! OR, faster  => just considering the vertical gradient of density 
     249                           !! as only the signa maters... 
     250                           !zvn2(jk) = (  zaw * ( zvts(jk-1,jp_tem) - zvts(jk,jp_tem) )     & 
     251                           !     &      - zbw * ( zvts(jk-1,jp_sal) - zvts(jk,jp_sal) )  ) 
     252 
     253                        END DO 
     254                      
     255                        ikp = MIN(ikdown+1,ikbot) 
     256                         
     257 
     258                     ENDIF  !IF( zvn2(ikp) < 0. ) 
     259 
     260 
     261                     IF( ikp == ikbot ) l_bottom_reached = .TRUE. 
     262                     ! 
     263                  END DO ! DO WHILE ( .NOT. l_bottom_reached ) 
     264 
     265                  IF( ikp /= ikbot )   CALL ctl_stop( 'tra_npc :  PROBLEM #3') 
     266                  
     267                  ! ******* At this stage ikp == ikbot ! ******* 
     268                  
     269                  IF( ilayer > 0 ) THEN      !! least an unstable layer has been found 
     270                     ! 
     271                     IF( lp_monitor_point ) THEN 
     272                        WRITE(numout,*) 
     273                        WRITE(numout,*) 'After ',jiter,' iteration(s), we neutralized ',ilayer,' instable layer(s)' 
     274                        WRITE(numout,*) '   ==> N2 at i,j=',ji,',',jj,' now looks like this:' 
     275                        DO jk = 1, klc1 
     276                           WRITE(numout,*) jk, zvn2(jk) 
     277                        END DO 
     278                        WRITE(numout,*) 
    282279                     ENDIF 
    283280                     ! 
    284                      IF( ikp >= ikbot )   l_column_treated = .TRUE. 
    285                      ! 
    286                   END DO ! DO WHILE ( .NOT. l_column_treated ) 
    287  
    288                   !! Updating tsa: 
    289                   tsa(ji,jj,:,jp_tem) = zvts(:,jp_tem) 
    290                   tsa(ji,jj,:,jp_sal) = zvts(:,jp_sal) 
    291  
    292                   !! LB:  Potentially some other global variable beside theta and S can be treated here 
    293                   !!      like BGC tracers. 
    294  
    295                   IF( lp_monitor_point )   WRITE(numout,*) 
    296  
    297                ENDIF ! IF( tmask(ji,jj,3) == 1 ) THEN 
    298  
    299             END DO ! ji 
    300          END DO ! jj 
     281                     ikp    = 1     ! starting again at the surface for the next iteration 
     282                     ilayer = 0 
     283                  ENDIF 
     284                  ! 
     285                  IF( ikp >= ikbot )   l_column_treated = .TRUE. 
     286                  ! 
     287               END DO ! DO WHILE ( .NOT. l_column_treated ) 
     288 
     289               !! Updating pts: 
     290               pts(ji,jj,:,jp_tem,Kaa) = zvts(:,jp_tem) 
     291               pts(ji,jj,:,jp_sal,Kaa) = zvts(:,jp_sal) 
     292 
     293               !! LB:  Potentially some other global variable beside theta and S can be treated here 
     294               !!      like BGC tracers. 
     295 
     296               IF( lp_monitor_point )   WRITE(numout,*) 
     297 
     298            ENDIF ! IF( tmask(ji,jj,3) == 1 ) THEN 
     299 
     300         END_2D 
    301301         ! 
    302302         IF( l_trdtra ) THEN         ! send the Non penetrative mixing trends for diagnostic 
    303             z1_r2dt = 1._wp / (2._wp * rdt) 
    304             ztrdt(:,:,:) = ( tsa(:,:,:,jp_tem) - ztrdt(:,:,:) ) * z1_r2dt 
    305             ztrds(:,:,:) = ( tsa(:,:,:,jp_sal) - ztrds(:,:,:) ) * z1_r2dt 
    306             CALL trd_tra( kt, 'TRA', jp_tem, jptra_npc, ztrdt ) 
    307             CALL trd_tra( kt, 'TRA', jp_sal, jptra_npc, ztrds ) 
     303            z1_rDt = 1._wp / (2._wp * rn_Dt) 
     304            ztrdt(:,:,:) = ( pts(:,:,:,jp_tem,Kaa) - ztrdt(:,:,:) ) * z1_rDt 
     305            ztrds(:,:,:) = ( pts(:,:,:,jp_sal,Kaa) - ztrds(:,:,:) ) * z1_rDt 
     306            CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_npc, ztrdt ) 
     307            CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_npc, ztrds ) 
    308308            DEALLOCATE( ztrdt, ztrds ) 
    309309         ENDIF 
    310310         ! 
    311          CALL lbc_lnk_multi( 'tranpc', tsa(:,:,:,jp_tem), 'T', 1., tsa(:,:,:,jp_sal), 'T', 1. ) 
     311         CALL lbc_lnk_multi( 'tranpc', pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. ) 
    312312         ! 
    313313         IF( lwp .AND. l_LB_debug ) THEN 
Note: See TracChangeset for help on using the changeset viewer.