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.
limtrp.F90 in branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/LIM_SRC_3/limtrp.F90 @ 7956

Last change on this file since 7956 was 7917, checked in by timgraham, 7 years ago

A few corrections for SETTE compilation

  • Property svn:keywords set to Id
File size: 28.1 KB
RevLine 
[825]1MODULE limtrp
2   !!======================================================================
3   !!                       ***  MODULE limtrp   ***
4   !! LIM transport ice model : sea-ice advection/diffusion
5   !!======================================================================
[2715]6   !! History : LIM-2 ! 2000-01 (M.A. Morales Maqueda, H. Goosse, and T. Fichefet)  Original code
7   !!            3.0  ! 2005-11 (M. Vancoppenolle)   Multi-layer sea ice, salinity variations
8   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
9   !!----------------------------------------------------------------------
[825]10#if defined key_lim3
11   !!----------------------------------------------------------------------
[834]12   !!   'key_lim3'                                      LIM3 sea-ice model
[825]13   !!----------------------------------------------------------------------
14   !!   lim_trp      : advection/diffusion process of sea ice
15   !!----------------------------------------------------------------------
[3625]16   USE phycst         ! physical constant
17   USE dom_oce        ! ocean domain
18   USE sbc_oce        ! ocean surface boundary condition
19   USE ice            ! ice variables
20   USE limhdf         ! ice horizontal diffusion
[5123]21   USE limvar         !
[7646]22   USE limadv_prather ! advection scheme (Prather)
23   USE limadv_umx     ! advection scheme (ultimate-macho)
[5123]24   !
[3625]25   USE in_out_manager ! I/O manager
26   USE lbclnk         ! lateral boundary conditions -- MPP exchanges
27   USE lib_mpp        ! MPP library
28   USE prtctl         ! Print control
29   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
[5123]30   USE timing         ! Timing
[4688]31   USE limcons        ! conservation tests
[5123]32   USE limctl         ! control prints
[825]33
34   IMPLICIT NONE
35   PRIVATE
36
[5123]37   PUBLIC   lim_trp    ! called by sbcice_lim
[825]38
[5123]39   INTEGER  ::   ncfl                 ! number of ice time step with CFL>1/2 
40
[825]41   !! * Substitution
42#  include "vectopt_loop_substitute.h90"
43   !!----------------------------------------------------------------------
[4161]44   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
[1156]45   !! $Id$
[2715]46   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[825]47   !!----------------------------------------------------------------------
48CONTAINS
49
[921]50   SUBROUTINE lim_trp( kt ) 
[825]51      !!-------------------------------------------------------------------
52      !!                   ***  ROUTINE lim_trp ***
53      !!                   
54      !! ** purpose : advection/diffusion process of sea ice
55      !!
56      !! ** method  : variables included in the process are scalar,   
57      !!     other values are considered as second order.
[7646]58      !!     For advection, one can choose between
59      !!     a) an Ultimate-Macho scheme (whose order is defined by nn_limadv_ord) => nn_limadv=0
60      !!     b) and a second order Prather scheme => nn_limadv=-1
[825]61      !!
62      !! ** action :
63      !!---------------------------------------------------------------------
[7646]64      INTEGER, INTENT(in) ::   kt   ! number of iteration
[2715]65      !
[7646]66      INTEGER  ::   ji, jj, jk, jm, jl, jt  ! dummy loop indices
[2715]67      INTEGER  ::   initad                  ! number of sub-timestep for the advection
[4990]68      REAL(wp) ::   zcfl , zusnit           !   -      -
[7646]69      CHARACTER(len=80) :: cltmp
[2715]70      !
[7646]71      REAL(wp) ::    zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b
72      REAL(wp) ::    zdv, zda
[7910]73      REAL(wp), DIMENSION(jpi,jpj)      ::   zatold, zeiold, zesold, zsmvold 
74      REAL(wp), DIMENSION(jpi,jpj,jpl)    ::   zhimax, zviold, zvsold
[7646]75      ! --- diffusion --- !
76      INTEGER , PARAMETER                    ::   ihdf_vars  = 6 ! Number of variables in which we apply horizontal diffusion
77                                                                 !  inside limtrp for each ice category , not counting the
78                                                                 !  variables corresponding to ice_layers
[7917]79      REAL(wp), DIMENSION(jpi,jpj,jpl*(ihdf_vars+nlay_i)+1)    ::   zhdfptab
[7646]80      ! --- ultimate macho only --- !
81      REAL(wp)                               ::   zdt
[7910]82      REAL(wp), DIMENSION(jpi,jpj)      ::   zudy, zvdx, zcu_box, zcv_box
[7646]83      ! --- prather only --- !
[7910]84      REAL(wp), DIMENSION(jpi,jpj)      ::   zarea
85      REAL(wp), DIMENSION(jpi,jpj,1)    ::   z0opw
86      REAL(wp), DIMENSION(jpi,jpj,jpl)    ::   z0ice, z0snw, z0ai, z0es , z0smi , z0oi
87      REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl)  ::   z0ei
[7646]88      !!
[2715]89      !!---------------------------------------------------------------------
[4161]90      IF( nn_timing == 1 )  CALL timing_start('limtrp')
[825]91
[7646]92 
93      IF( kt == nit000 .AND. lwp ) THEN
94         WRITE(numout,*)''
95         WRITE(numout,*)'limtrp'
96         WRITE(numout,*)'~~~~~~'
[5123]97         ncfl = 0                ! nb of time step with CFL > 1/2
[2715]98      ENDIF
99     
[7646]100      CALL lim_var_agg( 1 ) ! integrated values + ato_i
[4688]101
[7646]102      !-------------------------------------!
103      !   Advection of sea ice properties   !
104      !-------------------------------------!
[4688]105
[7646]106      ! conservation test
107      IF( ln_limdiachk )   CALL lim_cons_hsm(0, 'limtrp', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b)
108     
109      ! store old values for diag
110      zviold = v_i
111      zvsold = v_s
[7753]112      zsmvold(:,:) = SUM( smv_i(:,:,:), dim=3 )
113      zeiold (:,:) = et_i
114      zesold (:,:) = et_s 
[825]115
[7753]116      !--- Thickness correction init. --- !
117      zatold(:,:) = at_i
[7646]118      DO jl = 1, jpl
119         DO jj = 1, jpj
120            DO ji = 1, jpi
121               rswitch          = MAX( 0._wp , SIGN( 1._wp, a_i(ji,jj,jl) - epsi20 ) )
122               ht_i  (ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch
123               ht_s  (ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch
[5167]124            END DO
125         END DO
[7646]126      END DO
127      ! --- Record max of the surrounding ice thicknesses for correction in case advection creates ice too thick --- !
[7753]128      zhimax(:,:,:) = ht_i(:,:,:) + ht_s(:,:,:)
[7646]129      DO jl = 1, jpl
130         DO jj = 2, jpjm1
131            DO ji = 2, jpim1
132               zhimax(ji,jj,jl) = MAXVAL( ht_i(ji-1:ji+1,jj-1:jj+1,jl) + ht_s(ji-1:ji+1,jj-1:jj+1,jl) )
133            END DO
134         END DO
135         CALL lbc_lnk(zhimax(:,:,jl),'T',1.)
136      END DO
137         
138      ! --- If ice drift field is too fast, use an appropriate time step for advection --- !       
139      zcfl  =            MAXVAL( ABS( u_ice(:,:) ) * rdt_ice * r1_e1u(:,:) )    ! CFL test for stability
140      zcfl  = MAX( zcfl, MAXVAL( ABS( v_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) )
141      IF( lk_mpp )   CALL mpp_max( zcfl )
142     
143      IF( zcfl > 0.5 ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp
144      ELSE                    ;   initad = 1   ;   zusnit = 1.0_wp
145      ENDIF
146     
147!!      IF( zcfl > 0.5_wp .AND. lwp ) THEN
148!!         ncfl = ncfl + 1
149!!         IF( ncfl > 0 ) THEN   
150!!            WRITE(cltmp,'(i6.1)') ncfl
151!!            CALL ctl_warn( 'lim_trp: ncfl= ', TRIM(cltmp), 'advective ice time-step using a split in sub-time-step ')
152!!         ENDIF
153!!      ENDIF
154
155      SELECT CASE ( nn_limadv )
156         
157                       !=============================!
158      CASE ( 0 )       !==  Ultimate-MACHO scheme  ==!                   
159                       !=============================!
160     
161     
162         IF( kt == nit000 .AND. lwp ) THEN
163            WRITE(numout,*)''
164            WRITE(numout,*)'lim_adv_umx : Ultimate-MACHO advection scheme'
165            WRITE(numout,*)'~~~~~~~~~~~'
166         ENDIF
167         !
168         zdt = rdt_ice / REAL(initad)
169         
170         ! transport
[7753]171         zudy(:,:) = u_ice(:,:) * e2u(:,:)
172         zvdx(:,:) = v_ice(:,:) * e1v(:,:)
[7646]173         
174         ! define velocity for advection: u*grad(H)
175         DO jj = 2, jpjm1
176            DO ji = fs_2, fs_jpim1
177               IF    ( u_ice(ji,jj) * u_ice(ji-1,jj) <= 0._wp ) THEN   ;   zcu_box(ji,jj) = 0._wp
178               ELSEIF( u_ice(ji,jj)                  >  0._wp ) THEN   ;   zcu_box(ji,jj) = u_ice(ji-1,jj)
179               ELSE                                                    ;   zcu_box(ji,jj) = u_ice(ji  ,jj)
180               ENDIF
181               
182               IF    ( v_ice(ji,jj) * v_ice(ji,jj-1) <= 0._wp ) THEN   ;   zcv_box(ji,jj) = 0._wp
183               ELSEIF( v_ice(ji,jj)                  >  0._wp ) THEN   ;   zcv_box(ji,jj) = v_ice(ji,jj-1)
184               ELSE                                                    ;   zcv_box(ji,jj) = v_ice(ji,jj  )
185               ENDIF
186            END DO
187         END DO
188         
189         ! advection
190         DO jt = 1, initad
191            CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, ato_i(:,:) )       ! Open water area
192            DO jl = 1, jpl
193               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, a_i(:,:,jl) )      ! Ice area
194               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_i(:,:,jl) )      ! Ice  volume
195               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, smv_i(:,:,jl) )    ! Salt content
196               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, oa_i (:,:,jl) )    ! Age content
197               DO jk = 1, nlay_i
198                  CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, e_i(:,:,jk,jl) )   ! Ice  heat content
[4161]199               END DO
[7646]200               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_s(:,:,jl) )      ! Snow volume
201               CALL lim_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, e_s(:,:,1,jl) )    ! Snow heat content
[4161]202            END DO
203         END DO
[7646]204         !
[7753]205         at_i(:,:) = a_i(:,:,1)      ! total ice fraction
[7646]206         DO jl = 2, jpl
[7753]207            at_i(:,:) = at_i(:,:) + a_i(:,:,jl)
[7646]208         END DO
209         !
[4161]210         
[7646]211                       !=============================!
212      CASE ( -1 )      !==     Prather scheme      ==!                   
213                       !=============================!
[5123]214
[7646]215         
216         IF( kt == nit000 .AND. lwp ) THEN
217            WRITE(numout,*)''
218            WRITE(numout,*)'lim_adv_xy : Prather advection scheme'
219            WRITE(numout,*)'~~~~~~~~~~~'
[5123]220         ENDIF
[7646]221         
[7753]222         zarea(:,:) = e1e2t(:,:)
[7646]223         
[7753]224         !-------------------------
225         ! transported fields                                       
226         !-------------------------
227         z0opw(:,:,1) = ato_i(:,:) * e1e2t(:,:)             ! Open water area
[2715]228         DO jl = 1, jpl
[7753]229            z0snw (:,:,jl)  = v_s  (:,:,  jl) * e1e2t(:,:)  ! Snow volume
230            z0ice(:,:,jl)   = v_i  (:,:,  jl) * e1e2t(:,:)  ! Ice  volume
231            z0ai  (:,:,jl)  = a_i  (:,:,  jl) * e1e2t(:,:)  ! Ice area
232            z0smi (:,:,jl)  = smv_i(:,:,  jl) * e1e2t(:,:)  ! Salt content
233            z0oi (:,:,jl)   = oa_i (:,:,  jl) * e1e2t(:,:)  ! Age content
234            z0es (:,:,jl)   = e_s  (:,:,1,jl) * e1e2t(:,:)  ! Snow heat content
[7646]235            DO jk = 1, nlay_i
[7753]236               z0ei  (:,:,jk,jl) = e_i  (:,:,jk,jl) * e1e2t(:,:) ! Ice  heat content
[5123]237            END DO
[825]238         END DO
239
[921]240
[2715]241         IF( MOD( ( kt - 1) / nn_fsbc , 2 ) == 0 ) THEN       !==  odd ice time step:  adv_x then adv_y  ==!
[5123]242            DO jt = 1, initad
[7646]243               CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &             !--- ice open water area
244                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
245               CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &
246                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
[825]247               DO jl = 1, jpl
[7646]248                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &    !--- ice volume  ---
249                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
250                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &
251                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
252                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &    !--- snow volume  ---
253                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
254                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &
255                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
256                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &    !--- ice salinity ---
257                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
258                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &
259                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
260                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &    !--- ice age      ---     
261                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
262                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &
263                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
264                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &    !--- ice concentrations ---
265                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
266                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   & 
267                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
268                  CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &    !--- snow heat contents ---
269                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
270                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &
271                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
[5123]272                  DO jk = 1, nlay_i                                                                !--- ice heat contents ---
[7646]273                     CALL lim_adv_x( zusnit, u_ice, 1._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
274                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
275                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
276                     CALL lim_adv_y( zusnit, v_ice, 0._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
277                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
278                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
[825]279                  END DO
280               END DO
281            END DO
282         ELSE
[5123]283            DO jt = 1, initad
[7646]284               CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &             !--- ice open water area
285                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
286               CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &
287                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
[825]288               DO jl = 1, jpl
[7646]289                  CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &    !--- ice volume  ---
290                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
291                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &
292                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
293                  CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &    !--- snow volume  ---
294                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
295                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &
296                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
297                  CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &    !--- ice salinity ---
298                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
299                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &
300                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
301                  CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &   !--- ice age      ---
302                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
303                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &
304                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
305                  CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &   !--- ice concentrations ---
306                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
307                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &
308                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
309                  CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &  !--- snow heat contents ---
310                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
311                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &
312                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
[4870]313                  DO jk = 1, nlay_i                                                           !--- ice heat contents ---
[7646]314                     CALL lim_adv_y( zusnit, v_ice, 1._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
315                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
316                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
317                     CALL lim_adv_x( zusnit, u_ice, 0._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
318                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
319                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
[825]320                  END DO
321               END DO
322            END DO
323         ENDIF
324
325         !-------------------------------------------
326         ! Recover the properties from their contents
327         !-------------------------------------------
[7753]328         ato_i(:,:) = z0opw(:,:,1) * r1_e1e2t(:,:)
[825]329         DO jl = 1, jpl
[7753]330            v_i  (:,:,  jl) = z0ice(:,:,jl) * r1_e1e2t(:,:)
331            v_s  (:,:,  jl) = z0snw(:,:,jl) * r1_e1e2t(:,:)
332            smv_i(:,:,  jl) = z0smi(:,:,jl) * r1_e1e2t(:,:)
333            oa_i (:,:,  jl) = z0oi (:,:,jl) * r1_e1e2t(:,:)
334            a_i  (:,:,  jl) = z0ai (:,:,jl) * r1_e1e2t(:,:)
335            e_s  (:,:,1,jl) = z0es (:,:,jl) * r1_e1e2t(:,:)
[5123]336            DO jk = 1, nlay_i
[7753]337               e_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:)
[5123]338            END DO
[825]339         END DO
340
[7753]341         at_i(:,:) = a_i(:,:,1)      ! total ice fraction
[5123]342         DO jl = 2, jpl
[7753]343            at_i(:,:) = at_i(:,:) + a_i(:,:,jl)
[5123]344         END DO
[7646]345         
[5123]346
[7646]347      END SELECT
348     
349      !------------------------------!
350      ! Diffusion of Ice fields                 
351      !------------------------------!
352      IF( nn_ahi0 /= -1 .AND. nn_limdyn == 2 ) THEN
353         !
354         ! --- Prepare diffusion for variables with categories --- !
355         !     mask eddy diffusivity coefficient at ocean U- and V-points
[6490]356         jm=1
357         DO jl = 1, jpl
358            DO jj = 1, jpjm1                 ! NB: has not to be defined on jpj line and jpi row
[7646]359               DO ji = 1 , fs_jpim1
[6490]360                  pahu3D(ji,jj,jl) = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, -a_i(ji  ,jj,  jl ) ) ) )   &
361                  &                * ( 1._wp - MAX( 0._wp, SIGN( 1._wp, -a_i(ji+1,jj,  jl ) ) ) ) * ahiu(ji,jj)
362                  pahv3D(ji,jj,jl) = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, -a_i(ji,  jj,  jl ) ) ) )   &
363                  &                * ( 1._wp - MAX( 0._wp, SIGN( 1._wp,- a_i(ji,  jj+1,jl ) ) ) ) * ahiv(ji,jj)
364               END DO
365            END DO
[825]366
[7753]367            zhdfptab(:,:,jm)= a_i  (:,:,  jl); jm = jm + 1
368            zhdfptab(:,:,jm)= v_i  (:,:,  jl); jm = jm + 1
369            zhdfptab(:,:,jm)= v_s  (:,:,  jl); jm = jm + 1
370            zhdfptab(:,:,jm)= smv_i(:,:,  jl); jm = jm + 1
371            zhdfptab(:,:,jm)= oa_i (:,:,  jl); jm = jm + 1
372            zhdfptab(:,:,jm)= e_s  (:,:,1,jl); jm = jm + 1
[7646]373            ! Sample of adding more variables to apply lim_hdf (ihdf_vars must be increased)
374            !   zhdfptab(:,:,jm) = variable_1 (:,:,1,jl); jm = jm + 1 
375            !   zhdfptab(:,:,jm) = variable_2 (:,:,1,jl); jm = jm + 1
[6490]376            DO jk = 1, nlay_i
[7753]377              zhdfptab(:,:,jm)=e_i(:,:,jk,jl); jm= jm+1
[6490]378            END DO
379         END DO
[7646]380
381         ! --- Prepare diffusion for open water area --- !
382         !     mask eddy diffusivity coefficient at ocean U- and V-points
[2715]383         DO jj = 1, jpjm1                    ! NB: has not to be defined on jpj line and jpi row
[7646]384            DO ji = 1 , fs_jpim1
[6490]385               pahu3D(ji,jj,jpl+1) = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, -at_i(ji  ,jj) ) ) )   &
386                  &                * ( 1._wp - MAX( 0._wp, SIGN( 1._wp, -at_i(ji+1,jj) ) ) ) * ahiu(ji,jj)
387               pahv3D(ji,jj,jpl+1) = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, -at_i(ji,jj  ) ) ) )   &
388                  &                * ( 1._wp - MAX( 0._wp, SIGN( 1._wp,- at_i(ji,jj+1) ) ) ) * ahiv(ji,jj)
[2715]389            END DO
390         END DO
391         !
[7753]392         zhdfptab(:,:,jm)= ato_i  (:,:);
[2715]393
[7646]394         ! --- Apply diffusion --- !
395         CALL lim_hdf( zhdfptab, ihdf_vars )
396
397         ! --- Recover properties --- !
[6490]398         jm=1
[825]399         DO jl = 1, jpl
[7753]400            a_i  (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1
401            v_i  (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1
402            v_s  (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1
403            smv_i(:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1
404            oa_i (:,:,  jl) = zhdfptab(:,:,jm); jm = jm + 1
405            e_s  (:,:,1,jl) = zhdfptab(:,:,jm); jm = jm + 1
[7646]406            ! Sample of adding more variables to apply lim_hdf
407            !   variable_1  (:,:,1,jl) = zhdfptab(:,:, jm  ) ; jm + 1
408            !   variable_2  (:,:,1,jl) = zhdfptab(:,:, jm  ) ; jm + 1
[825]409            DO jk = 1, nlay_i
[7753]410               e_i(:,:,jk,jl) = zhdfptab(:,:,jm);jm= jm + 1
[2715]411            END DO
412         END DO
[7753]413         ato_i  (:,:) = zhdfptab(:,:,jm)
[7646]414             
415      ENDIF
[6490]416
[7646]417      ! --- diags ---
418      DO jj = 1, jpj
419         DO ji = 1, jpi
420            diag_trp_ei (ji,jj) = ( SUM( e_i  (ji,jj,1:nlay_i,:) ) -  zeiold(ji,jj) ) * r1_rdtice
421            diag_trp_es (ji,jj) = ( SUM( e_s  (ji,jj,1:nlay_s,:) ) -  zesold(ji,jj) ) * r1_rdtice
422            diag_trp_smv(ji,jj) = ( SUM( smv_i(ji,jj,:)          ) - zsmvold(ji,jj) ) * r1_rdtice
423            diag_trp_vi (ji,jj) =   SUM(   v_i(ji,jj,:)            -  zviold(ji,jj,:) ) * r1_rdtice
424            diag_trp_vs (ji,jj) =   SUM(   v_s(ji,jj,:)            -  zvsold(ji,jj,:) ) * r1_rdtice
[5123]425         END DO
[7646]426      END DO
427     
428      IF( nn_limdyn == 2) THEN
[4688]429
[5123]430         ! zap small areas
431         CALL lim_var_zapsmall
[7646]432           
433         !--- Thickness correction in case too high --- !
[4161]434         DO jl = 1, jpl
435            DO jj = 1, jpj
436               DO ji = 1, jpi
[7646]437                 
[4161]438                  IF ( v_i(ji,jj,jl) > 0._wp ) THEN
[7646]439                     
[5167]440                     rswitch          = MAX( 0._wp , SIGN( 1._wp, a_i(ji,jj,jl) - epsi20 ) )
441                     ht_i  (ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch
442                     ht_s  (ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch
443                     
[5134]444                     zdv  = v_i(ji,jj,jl) + v_s(ji,jj,jl) - zviold(ji,jj,jl) - zvsold(ji,jj,jl) 
[7646]445                     
[5134]446                     IF ( ( zdv >  0.0 .AND. (ht_i(ji,jj,jl)+ht_s(ji,jj,jl)) > zhimax(ji,jj,jl) .AND. zatold(ji,jj) < 0.80 ) .OR. &
[5167]447                        & ( zdv <= 0.0 .AND. (ht_i(ji,jj,jl)+ht_s(ji,jj,jl)) > zhimax(ji,jj,jl) ) ) THEN
[7646]448                       
[5134]449                        rswitch        = MAX( 0._wp, SIGN( 1._wp, zhimax(ji,jj,jl) - epsi20 ) )
450                        a_i(ji,jj,jl)  = rswitch * ( v_i(ji,jj,jl) + v_s(ji,jj,jl) ) / MAX( zhimax(ji,jj,jl), epsi20 )
[7646]451                       
[5134]452                        ! small correction due to *rswitch for a_i
453                        v_i  (ji,jj,jl)        = rswitch * v_i  (ji,jj,jl)
454                        v_s  (ji,jj,jl)        = rswitch * v_s  (ji,jj,jl)
455                        smv_i(ji,jj,jl)        = rswitch * smv_i(ji,jj,jl)
456                        e_s(ji,jj,1,jl)        = rswitch * e_s(ji,jj,1,jl)
457                        e_i(ji,jj,1:nlay_i,jl) = rswitch * e_i(ji,jj,1:nlay_i,jl)
[7646]458                                               
[4161]459                     ENDIF
[7646]460                     
[4161]461                  ENDIF
[7646]462               
[825]463               END DO
464            END DO
465         END DO
[4688]466         ! -------------------------------------------------
[5123]467         
[7646]468         ! Force the upper limit of ht_i to always be < hi_max (99 m).
469         DO jj = 1, jpj
470            DO ji = 1, jpi
471               rswitch         = MAX( 0._wp , SIGN( 1._wp, ht_i(ji,jj,jpl) - epsi20 ) )
472               ht_i(ji,jj,jpl) = MIN( ht_i(ji,jj,jpl) , hi_max(jpl) )
473               a_i (ji,jj,jpl) = v_i(ji,jj,jpl) / MAX( ht_i(ji,jj,jpl) , epsi20 ) * rswitch
[5123]474            END DO
[7646]475         END DO
[825]476
[7646]477      ENDIF
478         
479      !------------------------------------------------------------
480      ! Impose a_i < amax if no ridging/rafting or in mono-category
481      !------------------------------------------------------------
482      !
[7753]483      at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
[7646]484      IF ( nn_limdyn == 1 .OR. ( ( nn_monocat == 2 ) .AND. ( jpl == 1 ) ) ) THEN ! simple conservative piling, comparable with LIM2
[825]485         DO jl = 1, jpl
486            DO jj = 1, jpj
487               DO ji = 1, jpi
[7646]488                  rswitch       = MAX( 0._wp, SIGN( 1._wp, at_i(ji,jj) - epsi20 ) )
489                  zda           = rswitch * MIN( rn_amax_2d(ji,jj) - at_i(ji,jj), 0._wp )  &
490                     &                    * a_i(ji,jj,jl) / MAX( at_i(ji,jj), epsi20 )
491                  a_i(ji,jj,jl) = a_i(ji,jj,jl) + zda
[4688]492               END DO
493            END DO
494         END DO
[825]495      ENDIF
[7646]496     
497      ! --- agglomerate variables -----------------
[7753]498      vt_i(:,:) = SUM( v_i(:,:,:), dim=3 )
499      vt_s(:,:) = SUM( v_s(:,:,:), dim=3 )
500      at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
[7646]501     
502      ! --- open water = 1 if at_i=0 --------------------------------
[7753]503      WHERE( at_i == 0._wp ) ato_i = 1._wp 
[7646]504     
505      ! conservation test
506      IF( ln_limdiachk )   CALL lim_cons_hsm(1, 'limtrp', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b)
507       
[5123]508      ! -------------------------------------------------
509      ! control prints
510      ! -------------------------------------------------
[7646]511      IF( ln_limctl )   CALL lim_prt( kt, iiceprt, jiceprt,-1, ' - ice dyn & trp - ' )
[2715]512      !
[5123]513      !
[4161]514      IF( nn_timing == 1 )  CALL timing_stop('limtrp')
[7646]515      !
[825]516   END SUBROUTINE lim_trp
517
518#else
519   !!----------------------------------------------------------------------
520   !!   Default option         Empty Module                No sea-ice model
521   !!----------------------------------------------------------------------
522CONTAINS
523   SUBROUTINE lim_trp        ! Empty routine
524   END SUBROUTINE lim_trp
525#endif
526   !!======================================================================
527END MODULE limtrp
[6490]528
Note: See TracBrowser for help on using the repository browser.