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

source: branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/iceadv.F90 @ 8500

Last change on this file since 8500 was 8500, checked in by clem, 7 years ago

changes in style - part3 - move output into proper files and correct a bug in debug mode

File size: 27.7 KB
Line 
1MODULE iceadv
2   !!======================================================================
3   !!                       ***  MODULE iceadv   ***
4   !! LIM transport ice model : sea-ice advection/diffusion
5   !!======================================================================
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   !!----------------------------------------------------------------------
10#if defined key_lim3
11   !!----------------------------------------------------------------------
12   !!   'key_lim3'                                       LIM3 sea-ice model
13   !!----------------------------------------------------------------------
14   !!   ice_adv       : advection/diffusion process of sea ice
15   !!----------------------------------------------------------------------
16   USE phycst         ! physical constant
17   USE dom_oce        ! ocean domain
18   USE sbc_oce , ONLY : nn_fsbc   ! frequency of sea-ice call
19   USE ice            ! sea-ice: variables
20   USE icevar         ! sea-ice: operations
21   USE iceadv_prather ! sea-ice: advection scheme (Prather)
22   USE iceadv_umx     ! sea-ice: advection scheme (ultimate-macho)
23   USE icectl         ! sea-ice: control prints
24   !
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) 
30   USE timing         ! Timing
31   USE iom            !
32
33   IMPLICIT NONE
34   PRIVATE
35
36   PUBLIC   ice_adv    ! called by icestp
37
38   INTEGER ::   ncfl   ! number of ice time step with CFL>1/2 
39
40   !! * Substitution
41#  include "vectopt_loop_substitute.h90"
42   !!----------------------------------------------------------------------
43   !! NEMO/ICE 4.0 , NEMO Consortium (2017)
44   !! $Id: iceadv.F90 8373 2017-07-25 17:44:54Z clem $
45   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
46   !!----------------------------------------------------------------------
47CONTAINS
48
49   SUBROUTINE ice_adv( kt ) 
50      !!----------------------------------------------------------------------
51      !!                   ***  ROUTINE ice_adv ***
52      !!                   
53      !! ** purpose : advection/diffusion process of sea ice
54      !!
55      !! ** method  : variables included in the process are scalar,   
56      !!     other values are considered as second order.
57      !!     For advection, one can choose between
58      !!     a) an Ultimate-Macho scheme (whose order is defined by nn_limadv_ord) => nn_limadv=0
59      !!     b) and a second order Prather scheme => nn_limadv=-1
60      !!
61      !! ** action :
62      !!----------------------------------------------------------------------
63      INTEGER, INTENT(in) ::   kt   ! number of iteration
64      !
65      INTEGER  ::   ji, jj, jk, jl, jt      ! dummy loop indices
66      INTEGER  ::   initad                  ! number of sub-timestep for the advection
67      REAL(wp) ::   zcfl , zusnit           !   -      -
68      CHARACTER(len=80) :: cltmp
69      !
70      REAL(wp) ::    zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b
71      REAL(wp) ::    zdv
72      REAL(wp), DIMENSION(jpi,jpj)           ::   zatold, zeiold, zesold, zsmvold 
73      REAL(wp), DIMENSION(jpi,jpj,jpl)       ::   zhimax, zviold, zvsold
74      ! --- ultimate macho only --- !
75      REAL(wp) ::   zdt
76      REAL(wp), ALLOCATABLE, DIMENSION(:,:)      ::   zudy, zvdx, zcu_box, zcv_box
77      ! --- prather only --- !
78      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zarea
79      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0opw
80      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0ice, z0snw, z0ai, z0es , z0smi , z0oi
81      ! MV MP 2016
82      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0ap , z0vp
83      ! END MV MP 2016
84      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   z0ei
85      !!---------------------------------------------------------------------
86      IF( nn_timing == 1 )  CALL timing_start('iceadv')
87 
88      IF( kt == nit000 .AND. lwp ) THEN
89         WRITE(numout,*)''
90         WRITE(numout,*)'iceadv : sea-ice advection'
91         WRITE(numout,*)'~~~~~~~'
92         ncfl = 0                ! nb of time step with CFL > 1/2
93      ENDIF
94     
95      CALL ice_var_agg( 1 ) ! integrated values + ato_i
96
97      !-------------------------------------!
98      !   Advection of sea ice properties   !
99      !-------------------------------------!
100
101      ! conservation test
102      IF( ln_limdiachk )   CALL ice_cons_hsm(0, 'iceadv', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b)
103     
104      ! store old values for diag
105      zviold = v_i
106      zvsold = v_s
107      zsmvold(:,:) = SUM( smv_i(:,:,:), dim=3 )
108      zeiold (:,:) = et_i
109      zesold (:,:) = et_s 
110
111      !--- Thickness correction init. --- !
112      zatold(:,:) = at_i
113      WHERE( a_i(:,:,:) >= epsi20 )
114         ht_i(:,:,:) = v_i(:,:,:) / a_i(:,:,:)
115         ht_s(:,:,:) = v_s(:,:,:) / a_i(:,:,:)
116      ELSEWHERE
117         ht_i(:,:,:) = 0._wp
118         ht_s(:,:,:) = 0._wp         
119      END WHERE
120         
121      ! --- Record max of the surrounding ice thicknesses for correction in case advection creates ice too thick --- !
122      zhimax(:,:,:) = ht_i(:,:,:) + ht_s(:,:,:)
123      DO jl = 1, jpl
124         DO jj = 2, jpjm1
125            DO ji = 2, jpim1
126!!gm use of MAXVAL here is very probably less efficient than expending the 9 values
127               zhimax(ji,jj,jl) = MAX( epsi20, MAXVAL( ht_i(ji-1:ji+1,jj-1:jj+1,jl) + ht_s(ji-1:ji+1,jj-1:jj+1,jl) ) )
128            END DO
129         END DO
130      END DO
131      CALL lbc_lnk( zhimax(:,:,:), 'T', 1. )
132         
133      ! --- If ice drift field is too fast, use an appropriate time step for advection --- !       
134      zcfl  =            MAXVAL( ABS( u_ice(:,:) ) * rdt_ice * r1_e1u(:,:) )    ! CFL test for stability
135      zcfl  = MAX( zcfl, MAXVAL( ABS( v_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) )
136      IF( lk_mpp )   CALL mpp_max( zcfl )
137     
138      IF( zcfl > 0.5 ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp
139      ELSE                    ;   initad = 1   ;   zusnit = 1.0_wp
140      ENDIF
141     
142!!      IF( zcfl > 0.5_wp .AND. lwp ) THEN
143!!         ncfl = ncfl + 1
144!!         IF( ncfl > 0 ) THEN   
145!!            WRITE(cltmp,'(i6.1)') ncfl
146!!            CALL ctl_warn( 'ice_adv: ncfl= ', TRIM(cltmp), 'advective ice time-step using a split in sub-time-step ')
147!!         ENDIF
148!!      ENDIF
149
150      SELECT CASE ( nn_limadv )
151         
152                       !=============================!
153      CASE ( 0 )       !==  Ultimate-MACHO scheme  ==!                   
154                       !=============================!
155     
156         ALLOCATE( zudy(jpi,jpj) , zvdx(jpi,jpj) , zcu_box(jpi,jpj) , zcv_box(jpi,jpj) )
157     
158         IF( kt == nit000 .AND. lwp ) THEN
159            WRITE(numout,*)''
160            WRITE(numout,*)'ice_adv_umx : Ultimate-MACHO advection scheme'
161            WRITE(numout,*)'~~~~~~~~~~~'
162         ENDIF
163         !
164         zdt = rdt_ice / REAL(initad)
165         
166         ! transport
167         zudy(:,:) = u_ice(:,:) * e2u(:,:)
168         zvdx(:,:) = v_ice(:,:) * e1v(:,:)
169         
170         ! define velocity for advection: u*grad(H)
171         DO jj = 2, jpjm1
172            DO ji = fs_2, fs_jpim1
173               IF    ( u_ice(ji,jj) * u_ice(ji-1,jj) <= 0._wp ) THEN   ;   zcu_box(ji,jj) = 0._wp
174               ELSEIF( u_ice(ji,jj)                  >  0._wp ) THEN   ;   zcu_box(ji,jj) = u_ice(ji-1,jj)
175               ELSE                                                    ;   zcu_box(ji,jj) = u_ice(ji  ,jj)
176               ENDIF
177               
178               IF    ( v_ice(ji,jj) * v_ice(ji,jj-1) <= 0._wp ) THEN   ;   zcv_box(ji,jj) = 0._wp
179               ELSEIF( v_ice(ji,jj)                  >  0._wp ) THEN   ;   zcv_box(ji,jj) = v_ice(ji,jj-1)
180               ELSE                                                    ;   zcv_box(ji,jj) = v_ice(ji,jj  )
181               ENDIF
182            END DO
183         END DO
184         
185         ! advection
186         DO jt = 1, initad
187            CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, ato_i(:,:) )       ! Open water area
188            DO jl = 1, jpl
189               CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, a_i(:,:,jl) )      ! Ice area
190               CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_i(:,:,jl) )      ! Ice  volume
191               CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, smv_i(:,:,jl) )    ! Salt content
192               CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, oa_i (:,:,jl) )    ! Age content
193               DO jk = 1, nlay_i
194                  CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, e_i(:,:,jk,jl) )   ! Ice  heat content
195               END DO
196               CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_s(:,:,jl) )      ! Snow volume
197               CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, e_s(:,:,1,jl) )    ! Snow heat content
198               ! MV MP 2016
199               IF ( nn_pnd_scheme > 0 ) THEN
200                  CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, a_ip(:,:,jl) )  ! Melt pond fraction
201                  CALL ice_adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, v_ip(:,:,jl) )  ! Melt pond volume
202               ENDIF
203               ! END MV MP 2016
204            END DO
205         END DO
206         !
207         at_i(:,:) = a_i(:,:,1)      ! total ice fraction
208         DO jl = 2, jpl
209            at_i(:,:) = at_i(:,:) + a_i(:,:,jl)
210         END DO
211         !
212         DEALLOCATE( zudy, zvdx, zcu_box, zcv_box )
213         
214                       !=============================!
215      CASE ( -1 )      !==     Prather scheme      ==!                   
216                       !=============================!
217
218         ALLOCATE( zarea(jpi,jpj)     , z0opw(jpi,jpj, 1 ) ,                                           &
219            &      z0ice(jpi,jpj,jpl) , z0snw(jpi,jpj,jpl) , z0ai(jpi,jpj,jpl) , z0es(jpi,jpj,jpl) ,   &
220            &      z0smi(jpi,jpj,jpl) , z0oi (jpi,jpj,jpl) , z0ap(jpi,jpj,jpl) , z0vp(jpi,jpj,jpl) ,   &
221            &      z0ei (jpi,jpj,nlay_i,jpl)                                                           )
222         
223         IF( kt == nit000 .AND. lwp ) THEN
224            WRITE(numout,*)''
225            WRITE(numout,*)'ice_adv_xy : Prather advection scheme'
226            WRITE(numout,*)'~~~~~~~~~~~'
227         ENDIF
228         
229         zarea(:,:) = e1e2t(:,:)
230         
231         !-------------------------
232         ! transported fields                                       
233         !-------------------------
234         z0opw(:,:,1) = ato_i(:,:) * e1e2t(:,:)             ! Open water area
235         DO jl = 1, jpl
236            z0snw(:,:,jl) = v_s  (:,:,  jl) * e1e2t(:,:)  ! Snow volume
237            z0ice(:,:,jl) = v_i  (:,:,  jl) * e1e2t(:,:)  ! Ice  volume
238            z0ai (:,:,jl) = a_i  (:,:,  jl) * e1e2t(:,:)  ! Ice area
239            z0smi(:,:,jl) = smv_i(:,:,  jl) * e1e2t(:,:)  ! Salt content
240            z0oi (:,:,jl) = oa_i (:,:,  jl) * e1e2t(:,:)  ! Age content
241            z0es (:,:,jl) = e_s  (:,:,1,jl) * e1e2t(:,:)  ! Snow heat content
242            DO jk = 1, nlay_i
243               z0ei(:,:,jk,jl) = e_i(:,:,jk,jl) * e1e2t(:,:) ! Ice  heat content
244            END DO
245            ! MV MP 2016
246            IF ( nn_pnd_scheme > 0 ) THEN
247               z0ap(:,:,jl)  = a_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction
248               z0vp(:,:,jl)  = v_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume
249            ENDIF
250            ! END MV MP 2016
251         END DO
252
253         IF( MOD( ( kt - 1) / nn_fsbc , 2 ) == 0 ) THEN       !==  odd ice time step:  adv_x then adv_y  ==!
254            DO jt = 1, initad
255               CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &             !--- ice open water area
256                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
257               CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &
258                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
259               DO jl = 1, jpl
260                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &    !--- ice volume  ---
261                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
262                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &
263                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
264                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &    !--- snow volume  ---
265                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
266                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &
267                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
268                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &    !--- ice salinity ---
269                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
270                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &
271                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
272                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &    !--- ice age      ---     
273                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
274                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &
275                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
276                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &    !--- ice concentrations ---
277                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
278                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   & 
279                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
280                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &    !--- snow heat contents ---
281                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
282                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &
283                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
284                  DO jk = 1, nlay_i                                                                !--- ice heat contents ---
285                     CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
286                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
287                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
288                     CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
289                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
290                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
291                  END DO
292                  ! MV MP 2016
293                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &    !--- melt pond fraction --
294                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
295                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   & 
296                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
297                  CALL ice_adv_x( zusnit, u_ice, 1._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &    !--- melt pond volume   --
298                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
299                  CALL ice_adv_y( zusnit, v_ice, 0._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   & 
300                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
301                  ! END MV MP 2016
302               END DO
303            END DO
304         ELSE
305            DO jt = 1, initad
306               CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &             !--- ice open water area
307                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
308               CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &
309                  &                                         sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
310               DO jl = 1, jpl
311                  CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &    !--- ice volume  ---
312                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
313                  CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &
314                     &                                         sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
315                  CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &    !--- snow volume  ---
316                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
317                  CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &
318                     &                                         sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
319                  CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &    !--- ice salinity ---
320                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
321                  CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &
322                     &                                         sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
323                  CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &   !--- ice age      ---
324                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
325                  CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &
326                     &                                         sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
327                  CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &   !--- ice concentrations ---
328                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
329                  CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &
330                     &                                         sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
331                  CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &  !--- snow heat contents ---
332                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
333                  CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &
334                     &                                         sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
335                  DO jk = 1, nlay_i                                                           !--- ice heat contents ---
336                     CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
337                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
338                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
339                     CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
340                        &                                         sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
341                        &                                         syye(:,:,jk,jl), sxye(:,:,jk,jl) )
342                  END DO
343                  ! MV MP 2016
344                  IF ( nn_pnd_scheme > 0 ) THEN
345                     CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &   !--- melt pond fraction ---
346                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
347                     CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &
348                     &                                         sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
349                     CALL ice_adv_y( zusnit, v_ice, 1._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &   !--- melt pond volume   ---
350                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
351                     CALL ice_adv_x( zusnit, u_ice, 0._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &
352                     &                                         sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
353                  ENDIF
354                  ! END MV MP 2016
355               END DO
356            END DO
357         ENDIF
358
359         !-------------------------------------------
360         ! Recover the properties from their contents
361         !-------------------------------------------
362         ato_i(:,:) = z0opw(:,:,1) * r1_e1e2t(:,:)
363         DO jl = 1, jpl
364            v_i  (:,:,  jl) = z0ice(:,:,jl) * r1_e1e2t(:,:)
365            v_s  (:,:,  jl) = z0snw(:,:,jl) * r1_e1e2t(:,:)
366            smv_i(:,:,  jl) = z0smi(:,:,jl) * r1_e1e2t(:,:)
367            oa_i (:,:,  jl) = z0oi (:,:,jl) * r1_e1e2t(:,:)
368            a_i  (:,:,  jl) = z0ai (:,:,jl) * r1_e1e2t(:,:)
369            e_s  (:,:,1,jl) = z0es (:,:,jl) * r1_e1e2t(:,:)
370            DO jk = 1, nlay_i
371               e_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:)
372            END DO
373            ! MV MP 2016
374            IF ( nn_pnd_scheme > 0 ) THEN
375               a_ip  (:,:,jl)   = z0ap (:,:,jl) * r1_e1e2t(:,:)
376               v_ip  (:,:,jl)   = z0vp (:,:,jl) * r1_e1e2t(:,:)
377            ENDIF
378            ! END MV MP 2016
379         END DO
380         !
381         at_i(:,:) = a_i(:,:,1)      ! total ice fraction
382         DO jl = 2, jpl
383            at_i(:,:) = at_i(:,:) + a_i(:,:,jl)
384         END DO
385         !
386         DEALLOCATE( zarea , z0opw , z0ice, z0snw , z0ai , z0es , z0smi , z0oi , z0ap , z0vp , z0ei )
387         !
388      END SELECT
389     
390      ! --- diags ---
391      DO jj = 1, jpj
392         DO ji = 1, jpi
393            diag_trp_ei (ji,jj) = ( SUM( e_i  (ji,jj,1:nlay_i,:) ) -  zeiold(ji,jj) ) * r1_rdtice
394            diag_trp_es (ji,jj) = ( SUM( e_s  (ji,jj,1:nlay_s,:) ) -  zesold(ji,jj) ) * r1_rdtice
395            diag_trp_smv(ji,jj) = ( SUM( smv_i(ji,jj,:)          ) - zsmvold(ji,jj) ) * r1_rdtice
396            diag_trp_vi (ji,jj) =   SUM(   v_i(ji,jj,:)            -  zviold(ji,jj,:) ) * r1_rdtice
397            diag_trp_vs (ji,jj) =   SUM(   v_s(ji,jj,:)            -  zvsold(ji,jj,:) ) * r1_rdtice
398         END DO
399      END DO
400      IF( iom_use('icetrp') )   CALL iom_put( "icetrp" , diag_trp_vi * rday  )         ! ice volume transport
401      IF( iom_use('snwtrp') )   CALL iom_put( "snwtrp" , diag_trp_vs * rday  )         ! snw volume transport
402      IF( iom_use('saltrp') )   CALL iom_put( "saltrp" , diag_trp_smv * rday * rhoic ) ! salt content transport
403      IF( iom_use('deitrp') )   CALL iom_put( "deitrp" , diag_trp_ei         )         ! advected ice enthalpy (W/m2)
404      IF( iom_use('destrp') )   CALL iom_put( "destrp" , diag_trp_es         )         ! advected snw enthalpy (W/m2)
405     
406      IF( nn_limdyn == 2 ) THEN
407         !
408         CALL ice_var_zapsmall      !--- zap small areas ---!
409         !
410         DO jl = 1, jpl             !--- Thickness correction in case too high --- !
411            DO jj = 1, jpj
412               DO ji = 1, jpi
413                  IF ( v_i(ji,jj,jl) > 0._wp ) THEN
414                     !
415                     ht_i  (ji,jj,jl) = v_i (ji,jj,jl) / a_i(ji,jj,jl)
416                     ht_s  (ji,jj,jl) = v_s (ji,jj,jl) / a_i(ji,jj,jl)
417                     zdv = v_i(ji,jj,jl) + v_s(ji,jj,jl) - zviold(ji,jj,jl) - zvsold(ji,jj,jl) 
418                     !
419                     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. &
420                        & ( zdv <= 0.0 .AND. (ht_i(ji,jj,jl)+ht_s(ji,jj,jl)) > zhimax(ji,jj,jl) ) ) THEN
421                        a_i (ji,jj,jl) = ( v_i(ji,jj,jl) + v_s(ji,jj,jl) ) / zhimax(ji,jj,jl)
422                        ht_i(ji,jj,jl) =   v_i(ji,jj,jl) / a_i(ji,jj,jl)
423                     ENDIF
424                     !
425                  ENDIF
426               END DO
427            END DO
428         END DO
429                 
430         WHERE( ht_i(:,:,jpl) > hi_max(jpl) )             !--- bound ht_i to hi_max (99 m)
431            ht_i(:,:,jpl) = hi_max(jpl)
432            a_i (:,:,jpl) = v_i(:,:,jpl) / hi_max(jpl)
433         END WHERE
434
435         IF ( nn_pnd_scheme > 0 ) THEN                    !--- correct pond fraction to avoid a_ip > a_i
436            WHERE( a_ip(:,:,:) > a_i(:,:,:) )   a_ip(:,:,:) = a_i(:,:,:)
437         ENDIF
438         !
439      ENDIF
440         
441      !------------------------------------------------------------
442      ! Impose a_i < amax if no ridging/rafting or in mono-category
443      !------------------------------------------------------------
444      !
445      IF( l_piling ) THEN ! simple conservative piling, comparable with 1-cat models
446         at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
447         DO jl = 1, jpl
448            WHERE( at_i(:,:) > epsi20 )
449               a_i(:,:,jl) = a_i(:,:,jl) * (  1._wp + MIN( rn_amax_2d(:,:) - at_i(:,:) , 0._wp ) / at_i(:,:)  )
450            END WHERE
451         END DO
452      ENDIF
453     
454      ! --- agglomerate variables -----------------
455      vt_i(:,:) = SUM( v_i(:,:,:), dim=3 )
456      vt_s(:,:) = SUM( v_s(:,:,:), dim=3 )
457      at_i(:,:) = SUM( a_i(:,:,:), dim=3 )
458
459      ! MV MP 2016 (remove once we get rid of a_i_frac and ht_i)
460      IF ( nn_pnd_scheme > 0 ) THEN
461          at_ip(:,:) = SUM( a_ip(:,:,:), dim = 3 )
462          vt_ip(:,:) = SUM( v_ip(:,:,:), dim = 3 )
463      ENDIF
464      ! END MP 2016
465     
466      ! --- open water = 1 if at_i=0 --------------------------------
467      WHERE( at_i == 0._wp ) ato_i = 1._wp 
468     
469      ! conservation test
470      IF( ln_limdiachk )   CALL ice_cons_hsm(1, 'iceadv', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b)
471       
472      ! -------------------------------------------------
473      ! control prints
474      ! -------------------------------------------------
475      IF( ln_limctl )   CALL ice_prt( kt, iiceprt, jiceprt,-1, ' - ice dyn & trp - ' )
476      !
477      IF( nn_timing == 1 )  CALL timing_stop('iceadv')
478      !
479   END SUBROUTINE ice_adv
480
481#else
482   !!----------------------------------------------------------------------
483   !!   Default option         Empty Module                No sea-ice model
484   !!----------------------------------------------------------------------
485#endif
486
487   !!======================================================================
488END MODULE iceadv
489
Note: See TracBrowser for help on using the repository browser.