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.
tranpc.F90 in trunk/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/TRA/tranpc.F90 @ 4332

Last change on this file since 4332 was 3294, checked in by rblod, 12 years ago

Merge of 3.4beta into the trunk

  • Property svn:keywords set to Id
File size: 9.9 KB
RevLine 
[3]1MODULE tranpc
2   !!==============================================================================
3   !!                       ***  MODULE  tranpc  ***
4   !! Ocean active tracers:  non penetrative convection scheme
5   !!==============================================================================
[1537]6   !! History :  1.0  ! 1990-09  (G. Madec)  Original code
7   !!                 ! 1996-01  (G. Madec)  statement function for e3
8   !!   NEMO     1.0  ! 2002-06  (G. Madec)  free form F90
9   !!            3.0  ! 2008-06  (G. Madec)  applied on ta, sa and called before tranxt in step.F90
[2528]10   !!            3.3  ! 2010-05  (C. Ethe, G. Madec)  merge TRC-TRA
[503]11   !!----------------------------------------------------------------------
[3]12
13   !!----------------------------------------------------------------------
[1537]14   !!   tra_npc : apply the non penetrative convection scheme
[3]15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and active tracers
17   USE dom_oce         ! ocean space and time domain
[1537]18   USE zdf_oce         ! ocean vertical physics
[2528]19   USE trdmod_oce      ! ocean active tracer trends
[2715]20   USE trdtra          ! ocean active tracer trends
[3]21   USE eosbn2          ! equation of state (eos routine)
22   USE lbclnk          ! lateral boundary conditions (or mpp link)
[216]23   USE in_out_manager  ! I/O manager
[2715]24   USE lib_mpp         ! MPP library
[3294]25   USE wrk_nemo        ! Memory Allocation
26   USE timing          ! Timing
[3]27
28   IMPLICIT NONE
29   PRIVATE
30
[2715]31   PUBLIC   tra_npc       ! routine called by step.F90
[3]32
33   !! * Substitutions
34#  include "domzgr_substitute.h90"
35   !!----------------------------------------------------------------------
[2528]36   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[1146]37   !! $Id$
[2528]38   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]39   !!----------------------------------------------------------------------
40CONTAINS
41
42   SUBROUTINE tra_npc( kt )
43      !!----------------------------------------------------------------------
44      !!                  ***  ROUTINE tranpc  ***
45      !!
46      !! ** Purpose :   Non penetrative convective adjustment scheme. solve
[1111]47      !!      the static instability of the water column on after fields
[3]48      !!      while conserving heat and salt contents.
49      !!
50      !! ** Method  :   The algorithm used converges in a maximium of jpk
51      !!      iterations. instabilities are treated when the vertical density
52      !!      gradient is less than 1.e-5.
[503]53      !!      l_trdtra=T: the trend associated with this algorithm is saved.
[3]54      !!
[1111]55      !! ** Action  : - (ta,sa) after the application od the npc scheme
[3]56      !!              - save the associated trends (ttrd,strd) ('key_trdtra')
57      !!
[503]58      !! References : Madec, et al., 1991, JPO, 21, 9, 1349-1371.
59      !!----------------------------------------------------------------------
[2715]60      !
[503]61      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
[2715]62      !
[503]63      INTEGER  ::   ji, jj, jk   ! dummy loop indices
64      INTEGER  ::   inpcc        ! number of statically instable water column
65      INTEGER  ::   inpci        ! number of iteration for npc scheme
66      INTEGER  ::   jiter, jkdown, jkp        ! ???
67      INTEGER  ::   ikbot, ik, ikup, ikdown   ! ???
68      REAL(wp) ::   ze3tot, zta, zsa, zraua, ze3dwn
[3294]69      REAL(wp), POINTER, DIMENSION(:,:  ) :: zwx, zwy, zwz
70      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds, zrhop
[3]71      !!----------------------------------------------------------------------
[3294]72      !
73      IF( nn_timing == 1 )  CALL timing_start('tra_npc')
74      !
75      CALL wrk_alloc(jpi, jpj, jpk, zrhop )
76      CALL wrk_alloc(jpi, jpk, zwx, zwy, zwz )
77      !
[1537]78      IF( MOD( kt, nn_npc ) == 0 ) THEN
[3]79
80         inpcc = 0
81         inpci = 0
82
[2528]83         CALL eos( tsa, rhd, zrhop )         ! Potential density
[3]84
[2528]85         IF( l_trdtra )   THEN                    !* Save ta and sa trends
[3294]86            CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds )
[2715]87            ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
88            ztrds(:,:,:) = tsa(:,:,:,jp_sal)
[216]89         ENDIF
90
[3]91         !                                                ! ===============
92         DO jj = 1, jpj                                   !  Vertical slab
93            !                                             ! ===============
[503]94            !  Static instability pointer
95            ! ----------------------------
[3]96            DO jk = 1, jpkm1
97               DO ji = 1, jpi
98                  zwx(ji,jk) = ( zrhop(ji,jj,jk) - zrhop(ji,jj,jk+1) ) * tmask(ji,jj,jk+1)
99               END DO
100            END DO
101
102            ! 1.1 do not consider the boundary points
103
104            ! even if east-west cyclic b. c. do not considere ji=1 or jpi
105            DO jk = 1, jpkm1
106               zwx( 1 ,jk) = 0.e0
107               zwx(jpi,jk) = 0.e0
108            END DO
109            ! even if south-symmetric b. c. used, do not considere jj=1
[503]110            IF( jj == 1 )   zwx(:,:) = 0.e0
[3]111
112            DO jk = 1, jpkm1
113               DO ji = 1, jpi
114                  zwx(ji,jk) = 1.
[503]115                  IF( zwx(ji,jk) < 1.e-5 ) zwx(ji,jk) = 0.e0
[3]116               END DO
117            END DO
118
[503]119            zwy(:,1) = 0.e0
[3]120            DO ji = 1, jpi
121               DO jk = 1, jpkm1
122                  zwy(ji,1) = zwy(ji,1) + zwx(ji,jk)
123               END DO
124            END DO
125
[503]126            zwz(1,1) = 0.e0
[3]127            DO ji = 1, jpi
128               zwz(1,1) = zwz(1,1) + zwy(ji,1)
129            END DO
130
131            inpcc = inpcc + NINT( zwz(1,1) )
132
133
134            ! 2. Vertical mixing for each instable portion of the density profil
135            ! ------------------------------------------------------------------
136
[503]137            IF( zwz(1,1) /= 0.e0 ) THEN         ! -->> the density profil is statically instable :
[3]138               DO ji = 1, jpi
[503]139                  IF( zwy(ji,1) /= 0.e0 ) THEN
140                     !
[2528]141                     ikbot = mbkt(ji,jj)        ! ikbot: ocean bottom T-level
[503]142                     !
143                     DO jiter = 1, jpk          ! vertical iteration
144                        !
[3]145                        ! search of ikup : the first static instability from the sea surface
[503]146                        !
[3]147                        ik = 0
148220                     CONTINUE
149                        ik = ik + 1
[2528]150                        IF( ik >= ikbot ) GO TO 200
[3]151                        zwx(ji,ik) = zrhop(ji,jj,ik) - zrhop(ji,jj,ik+1)
[503]152                        IF( zwx(ji,ik) <= 0.e0 ) GO TO 220
[3]153                        ikup = ik
154                        ! the density profil is instable below ikup
155                        ! ikdown : bottom of the instable portion of the density profil
156                        ! search of ikdown and vertical mixing from ikup to ikdown
[503]157                        !
[3]158                        ze3tot= fse3t(ji,jj,ikup)
[2528]159                        zta   = tsa  (ji,jj,ikup,jp_tem)
160                        zsa   = tsa  (ji,jj,ikup,jp_sal)
[3]161                        zraua = zrhop(ji,jj,ikup)
[503]162                        !
[3]163                        DO jkdown = ikup+1, ikbot-1
164                           IF( zraua <= zrhop(ji,jj,jkdown) ) THEN
165                              ikdown = jkdown
166                              GO TO 240
167                           ENDIF
168                           ze3dwn =  fse3t(ji,jj,jkdown)
169                           ze3tot =  ze3tot + ze3dwn
[2528]170                           zta   = ( zta*(ze3tot-ze3dwn) + tsa(ji,jj,jkdown,jp_tem)*ze3dwn )/ze3tot
171                           zsa   = ( zsa*(ze3tot-ze3dwn) + tsa(ji,jj,jkdown,jp_sal)*ze3dwn )/ze3tot
[3]172                           zraua = ( zraua*(ze3tot-ze3dwn) + zrhop(ji,jj,jkdown)*ze3dwn )/ze3tot
173                           inpci = inpci+1
174                        END DO
175                        ikdown = ikbot-1
176240                     CONTINUE
[503]177                        !
[3]178                        DO jkp = ikup, ikdown-1
[2528]179                           tsa  (ji,jj,jkp,jp_tem) = zta
180                           tsa  (ji,jj,jkp,jp_sal) = zsa
181                           zrhop(ji,jj,jkp       ) = zraua
[3]182                        END DO
183                        IF (ikdown == ikbot-1 .AND. zraua >= zrhop(ji,jj,ikdown) ) THEN
[2528]184                           tsa  (ji,jj,jkp,jp_tem) = zta
185                           tsa  (ji,jj,jkp,jp_sal) = zsa
186                           zrhop(ji,jj,ikdown    ) = zraua
[3]187                        ENDIF
188                     END DO
189                  ENDIF
190200               CONTINUE
191               END DO
192               ! <<-- no more static instability on slab jj
193            ENDIF
194            !                                             ! ===============
195         END DO                                           !   End of slab
196         !                                                ! ===============
[503]197         !
198         IF( l_trdtra )   THEN         ! save the Non penetrative mixing trends for diagnostic
[2528]199            ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:)
200            ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:)
201            CALL trd_tra( kt, 'TRA', jp_tem, jptra_trd_npc, ztrdt )
202            CALL trd_tra( kt, 'TRA', jp_sal, jptra_trd_npc, ztrds )
[3294]203            CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds )
[216]204         ENDIF
[3]205     
[1111]206         ! Lateral boundary conditions on ( ta, sa )   ( Unchanged sign)
[3]207         ! ------------------------------============
[2715]208         CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. )   ;   CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. )
[3]209     
210
211         !  2. non penetrative convective scheme statistics
212         !  -----------------------------------------------
[1537]213         IF( nn_npcp /= 0 .AND. MOD( kt, nn_npcp ) == 0 ) THEN
[3]214            IF(lwp) WRITE(numout,*)' kt=',kt, ' number of statically instable',   &
[503]215               &                   ' water column : ',inpcc, ' number of iteration : ',inpci
[3]216         ENDIF
[503]217         !
[3]218      ENDIF
[503]219      !
[3294]220      CALL wrk_dealloc(jpi, jpj, jpk, zrhop )
221      CALL wrk_dealloc(jpi, jpk, zwx, zwy, zwz )
[2715]222      !
[3294]223      IF( nn_timing == 1 )  CALL timing_stop('tra_npc')
224      !
[3]225   END SUBROUTINE tra_npc
226
227   !!======================================================================
228END MODULE tranpc
Note: See TracBrowser for help on using the repository browser.