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

Ignore:
Timestamp:
2020-09-14T17:40:34+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2195:update to trunk 13461

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

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@13382        sette 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/TRA/tranpc.F90

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