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_prather.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_prather.F90 @ 8506

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

changes in style - part4 - clarify ice advection routines

File size: 37.3 KB
RevLine 
[8409]1MODULE iceadv_prather 
2   !!======================================================================
3   !!                       ***  MODULE iceadv_prather   ***
4   !! LIM sea-ice model : sea-ice advection => Prather scheme
5   !!======================================================================
6   !! History :  LIM  ! 2008-03 (M. Vancoppenolle)  LIM-3 from LIM-2 code
[8486]7   !!            3.2  ! 2009-06 (F. Dupont)  correct a error in the North fold b.c.
[8409]8   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
9   !!--------------------------------------------------------------------
10#if defined key_lim3
11   !!----------------------------------------------------------------------
[8486]12   !!   'key_lim3'                                       LIM3 sea-ice model
[8409]13   !!----------------------------------------------------------------------
[8504]14   !!   ice_adv_prather     : advection of sea ice using Prather scheme
[8409]15   !!----------------------------------------------------------------------
[8486]16   USE dom_oce        ! ocean domain
17   USE ice            ! sea-ice variables
[8504]18   USE sbc_oce , ONLY : nn_fsbc   ! frequency of sea-ice call
[8409]19   !
[8486]20   USE lbclnk         ! lateral boundary condition - MPP exchanges
21   USE in_out_manager ! I/O manager
22   USE prtctl         ! Print control
23   USE lib_mpp        ! MPP library
24   USE lib_fortran    ! to use key_nosignedzero
[8409]25
26   IMPLICIT NONE
27   PRIVATE
28
[8504]29   PUBLIC   ice_adv_prather   ! called by iceadv
[8409]30
31   !! * Substitutions
32#  include "vectopt_loop_substitute.h90"
33   !!----------------------------------------------------------------------
[8486]34   !! NEMO/ICE 4.0 , NEMO Consortium (2017)
[8409]35   !! $Id: iceadv.F90 6746 2016-06-27 17:20:57Z clem $
36   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
37   !!----------------------------------------------------------------------
38CONTAINS
39
[8504]40   SUBROUTINE ice_adv_prather( kt, pu_ice, pv_ice,  &
41      &                        pato_i, pv_i, pv_s, psmv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i )
[8486]42      !!----------------------------------------------------------------------
[8504]43      !!                **  routine ice_adv_prather  **
[8409]44      !! 
45      !! ** purpose :   Computes and adds the advection trend to sea-ice
46      !!
47      !! ** method  :   Uses Prather second order scheme that advects tracers
[8504]48      !!                but also their quadratic forms. The method preserves
49      !!                tracer structures by conserving second order moments.
[8409]50      !!
51      !! Reference:  Prather, 1986, JGR, 91, D6. 6671-6681.
[8486]52      !!----------------------------------------------------------------------
[8504]53      INTEGER                     , INTENT(in   ) ::   kt         ! time step
54      REAL(wp), DIMENSION(:,:)    , INTENT(in   ) ::   pu_ice     ! ice i-velocity
55      REAL(wp), DIMENSION(:,:)    , INTENT(in   ) ::   pv_ice     ! ice j-velocity
56      REAL(wp), DIMENSION(:,:)    , INTENT(inout) ::   pato_i     ! open water area
57      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i       ! ice volume
58      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_s       ! snw volume
59      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   psmv_i     ! salt content
60      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   poa_i      ! age content
61      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_i       ! ice concentration
62      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_ip      ! melt pond fraction
63      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_ip      ! melt pond volume
64      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s       ! snw heat content
65      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i       ! ice heat content
66      !
67      INTEGER  ::   jk, jl, jt              ! dummy loop indices
68      INTEGER  ::   initad                  ! number of sub-timestep for the advection
69      REAL(wp) ::   zcfl , zusnit           !   -      -
70      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zarea
71      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0opw
72      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0ice, z0snw, z0ai, z0es , z0smi , z0oi
73      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0ap , z0vp
74      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   z0ei
75      !!----------------------------------------------------------------------
76      !
77      IF( kt == nit000 .AND. lwp ) THEN
78         WRITE(numout,*)
79         WRITE(numout,*) 'ice_adv_prather: Prather advection scheme'
80         WRITE(numout,*) '~~~~~~~~~~~~~~~'
81      ENDIF
82      !
83      ALLOCATE( zarea(jpi,jpj)     , z0opw(jpi,jpj, 1 ) ,                                           &
84         &      z0ice(jpi,jpj,jpl) , z0snw(jpi,jpj,jpl) , z0ai(jpi,jpj,jpl) , z0es(jpi,jpj,jpl) ,   &
85         &      z0smi(jpi,jpj,jpl) , z0oi (jpi,jpj,jpl) , z0ap(jpi,jpj,jpl) , z0vp(jpi,jpj,jpl) ,   &
86         &      z0ei (jpi,jpj,nlay_i,jpl)                                                           )
87      !
88      ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- !       
89      zcfl  =            MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) )
90      zcfl  = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) )
91      IF( lk_mpp )   CALL mpp_max( zcfl )
92     
93      IF( zcfl > 0.5 ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp
94      ELSE                    ;   initad = 1   ;   zusnit = 1.0_wp
95      ENDIF
96     
97      zarea(:,:) = e1e2t(:,:)
98      !-------------------------
99      ! transported fields                                       
100      !-------------------------
101      z0opw(:,:,1) = pato_i(:,:) * e1e2t(:,:)              ! Open water area
102      DO jl = 1, jpl
103         z0snw(:,:,jl) = pv_s  (:,:,  jl) * e1e2t(:,:)     ! Snow volume
104         z0ice(:,:,jl) = pv_i  (:,:,  jl) * e1e2t(:,:)     ! Ice  volume
105         z0ai (:,:,jl) = pa_i  (:,:,  jl) * e1e2t(:,:)     ! Ice area
106         z0smi(:,:,jl) = psmv_i(:,:,  jl) * e1e2t(:,:)     ! Salt content
107         z0oi (:,:,jl) = poa_i (:,:,  jl) * e1e2t(:,:)     ! Age content
108         z0es (:,:,jl) = pe_s  (:,:,1,jl) * e1e2t(:,:)     ! Snow heat content
109         DO jk = 1, nlay_i
110            z0ei(:,:,jk,jl) = pe_i(:,:,jk,jl) * e1e2t(:,:) ! Ice  heat content
111         END DO
112         IF ( nn_pnd_scheme > 0 ) THEN
113            z0ap(:,:,jl)  = pa_ip(:,:,jl) * e1e2t(:,:)     ! Melt pond fraction
114            z0vp(:,:,jl)  = pv_ip(:,:,jl) * e1e2t(:,:)     ! Melt pond volume
115         ENDIF
116      END DO
117
118      !                                                    !--------------------------------------------!
119      IF( MOD( ( kt - 1) / nn_fsbc , 2 ) == 0 ) THEN       !==  odd ice time step:  adv_x then adv_y  ==!
120         !                                                 !--------------------------------------------!
121         DO jt = 1, initad
122            CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &             !--- ice open water area
123               &                                      sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
124            CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &
125               &                                      sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
126            DO jl = 1, jpl
127               CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &    !--- ice volume  ---
128                  &                                      sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
129               CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &
130                  &                                      sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
131               CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &    !--- snow volume  ---
132                  &                                      sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
133               CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &
134                  &                                      sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
135               CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &    !--- ice salinity ---
136                  &                                      sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
137               CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &
138                  &                                      sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
139               CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &    !--- ice age      ---     
140                  &                                      sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
141               CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &
142                  &                                      sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
143               CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &    !--- ice concentrations ---
144                  &                                      sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
145               CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   & 
146                  &                                      sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
147               CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &    !--- snow heat contents ---
148                  &                                      sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
149               CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &
150                  &                                      sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
151               DO jk = 1, nlay_i                                                               !--- ice heat contents ---
152                  CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
153                     &                                      sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
154                     &                                      syye(:,:,jk,jl), sxye(:,:,jk,jl) )
155                  CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
156                     &                                      sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
157                     &                                      syye(:,:,jk,jl), sxye(:,:,jk,jl) )
158               END DO
159               IF ( nn_pnd_scheme > 0 ) THEN
160                  CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &    !--- melt pond fraction --
161                     &                                      sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
162                  CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   & 
163                     &                                      sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
164                  CALL adv_x( zusnit, pu_ice, 1._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &    !--- melt pond volume   --
165                     &                                      sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
166                  CALL adv_y( zusnit, pv_ice, 0._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   & 
167                     &                                      sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
168               ENDIF
169            END DO
170         END DO
171      !                                                    !--------------------------------------------!
172      ELSE                                                 !== even ice time step:  adv_y then adv_x  ==!
173         !                                                 !--------------------------------------------!
174         DO jt = 1, initad
175            CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &             !--- ice open water area
176               &                                      sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
177            CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0opw (:,:,1), sxopw(:,:),   &
178               &                                      sxxopw(:,:)  , syopw(:,:), syyopw(:,:), sxyopw(:,:)  )
179            DO jl = 1, jpl
180               CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &    !--- ice volume  ---
181                  &                                      sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
182               CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0ice (:,:,jl), sxice(:,:,jl),   &
183                  &                                      sxxice(:,:,jl), syice(:,:,jl), syyice(:,:,jl), sxyice(:,:,jl)  )
184               CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &    !--- snow volume  ---
185                  &                                      sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
186               CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0snw (:,:,jl), sxsn (:,:,jl),   &
187                  &                                      sxxsn (:,:,jl), sysn (:,:,jl), syysn (:,:,jl), sxysn (:,:,jl)  )
188               CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &    !--- ice salinity ---
189                  &                                      sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
190               CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0smi (:,:,jl), sxsal(:,:,jl),   &
191                  &                                      sxxsal(:,:,jl), sysal(:,:,jl), syysal(:,:,jl), sxysal(:,:,jl)  )
192               CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &   !--- ice age      ---
193                  &                                      sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
194               CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0oi  (:,:,jl), sxage(:,:,jl),   &
195                  &                                      sxxage(:,:,jl), syage(:,:,jl), syyage(:,:,jl), sxyage(:,:,jl)  )
196               CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &   !--- ice concentrations ---
197                  &                                      sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
198               CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0ai  (:,:,jl), sxa  (:,:,jl),   &
199                  &                                      sxxa  (:,:,jl), sya  (:,:,jl), syya  (:,:,jl), sxya  (:,:,jl)  )
200               CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &  !--- snow heat contents ---
201                  &                                      sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
202               CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0es  (:,:,jl), sxc0 (:,:,jl),   &
203                  &                                      sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  )
204               DO jk = 1, nlay_i                                                             !--- ice heat contents ---
205                  CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
206                     &                                      sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
207                     &                                      syye(:,:,jk,jl), sxye(:,:,jk,jl) )
208                  CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0ei(:,:,jk,jl), sxe (:,:,jk,jl),   & 
209                     &                                      sxxe(:,:,jk,jl), sye (:,:,jk,jl),   &
210                     &                                      syye(:,:,jk,jl), sxye(:,:,jk,jl) )
211               END DO
212               IF ( nn_pnd_scheme > 0 ) THEN
213                  CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &   !--- melt pond fraction ---
214                     &                                      sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
215                  CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0ap  (:,:,jl), sxap (:,:,jl),   &
216                     &                                      sxxap (:,:,jl), syap (:,:,jl), syyap (:,:,jl), sxyap (:,:,jl)  )
217                  CALL adv_y( zusnit, pv_ice, 1._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &   !--- melt pond volume   ---
218                     &                                      sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
219                  CALL adv_x( zusnit, pu_ice, 0._wp, zarea, z0vp  (:,:,jl), sxvp (:,:,jl),   &
220                     &                                      sxxvp (:,:,jl), syvp (:,:,jl), syyvp (:,:,jl), sxyvp (:,:,jl)  )
221               ENDIF
222            END DO
223         END DO
224      ENDIF
225
226      !-------------------------------------------
227      ! Recover the properties from their contents
228      !-------------------------------------------
229      pato_i(:,:) = z0opw(:,:,1) * r1_e1e2t(:,:)
230      DO jl = 1, jpl
231         pv_i  (:,:,  jl) = z0ice(:,:,jl) * r1_e1e2t(:,:)
232         pv_s  (:,:,  jl) = z0snw(:,:,jl) * r1_e1e2t(:,:)
233         psmv_i(:,:,  jl) = z0smi(:,:,jl) * r1_e1e2t(:,:)
234         poa_i (:,:,  jl) = z0oi (:,:,jl) * r1_e1e2t(:,:)
235         pa_i  (:,:,  jl) = z0ai (:,:,jl) * r1_e1e2t(:,:)
236         pe_s  (:,:,1,jl) = z0es (:,:,jl) * r1_e1e2t(:,:)
237         DO jk = 1, nlay_i
238            pe_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:)
239         END DO
240         ! MV MP 2016
241         IF ( nn_pnd_scheme > 0 ) THEN
242            pa_ip  (:,:,jl)   = z0ap (:,:,jl) * r1_e1e2t(:,:)
243            pv_ip  (:,:,jl)   = z0vp (:,:,jl) * r1_e1e2t(:,:)
244         ENDIF
245         ! END MV MP 2016
246      END DO
247      !
248      DEALLOCATE( zarea , z0opw , z0ice, z0snw , z0ai , z0es , z0smi , z0oi , z0ap , z0vp , z0ei )
249      !
250   END SUBROUTINE ice_adv_prather
251   
252   SUBROUTINE adv_x( pdf, put , pcrh, psm , ps0 ,   &
253      &              psx, psxx, psy , psyy, psxy )
254      !!----------------------------------------------------------------------
255      !!                **  routine adv_x  **
256      !! 
257      !! ** purpose :   Computes and adds the advection trend to sea-ice
258      !!                variable on x axis
259      !!----------------------------------------------------------------------
[8409]260      REAL(wp)                    , INTENT(in   ) ::   pdf                ! reduction factor for the time step
[8504]261      REAL(wp)                    , INTENT(in   ) ::   pcrh               ! call adv_x then adv_y (=1) or the opposite (=0)
[8409]262      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   put                ! i-direction ice velocity at U-point [m/s]
263      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   psm                ! area
264      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   ps0                ! field to be advected
265      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   psx , psy          ! 1st moments
266      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   psxx, psyy, psxy   ! 2nd moments
267      !!
268      INTEGER  ::   ji, jj                               ! dummy loop indices
269      REAL(wp) ::   zs1max, zrdt, zslpmax, ztemp         ! local scalars
270      REAL(wp) ::   zs1new, zalf , zalfq , zbt           !   -      -
271      REAL(wp) ::   zs2new, zalf1, zalf1q, zbt1          !   -      -
272      REAL(wp), DIMENSION(jpi,jpj) ::   zf0 , zfx  , zfy   , zbet   ! 2D workspace
273      REAL(wp), DIMENSION(jpi,jpj) ::   zfm , zfxx , zfyy  , zfxy   !  -      -
274      REAL(wp), DIMENSION(jpi,jpj) ::   zalg, zalg1, zalg1q         !  -      -
[8486]275      !-----------------------------------------------------------------------
[8409]276
277      ! Limitation of moments.                                           
278
279      zrdt = rdt_ice * pdf      ! If ice drift field is too fast, use an appropriate time step for advection.
280
281      DO jj = 1, jpj
282         DO ji = 1, jpi
283            zslpmax = MAX( 0._wp, ps0(ji,jj) )
284            zs1max  = 1.5 * zslpmax
285            zs1new  = MIN( zs1max, MAX( -zs1max, psx(ji,jj) ) )
286            zs2new  = MIN(  2.0 * zslpmax - 0.3334 * ABS( zs1new ),      &
287               &            MAX( ABS( zs1new ) - zslpmax, psxx(ji,jj) )  )
288            rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1)   ! Case of empty boxes & Apply mask
289
290            ps0 (ji,jj) = zslpmax 
291            psx (ji,jj) = zs1new      * rswitch
292            psxx(ji,jj) = zs2new      * rswitch
293            psy (ji,jj) = psy (ji,jj) * rswitch
294            psyy(ji,jj) = psyy(ji,jj) * rswitch
295            psxy(ji,jj) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj) ) ) * rswitch
296         END DO
297      END DO
298
299      !  Initialize volumes of boxes  (=area if adv_x first called, =psm otherwise)                                     
300      psm (:,:)  = MAX( pcrh * e1e2t(:,:) + ( 1.0 - pcrh ) * psm(:,:) , epsi20 )
301
302      !  Calculate fluxes and moments between boxes i<-->i+1             
303      DO jj = 1, jpj                      !  Flux from i to i+1 WHEN u GT 0
304         DO ji = 1, jpi
305            zbet(ji,jj)  =  MAX( 0._wp, SIGN( 1._wp, put(ji,jj) ) )
306            zalf         =  MAX( 0._wp, put(ji,jj) ) * zrdt * e2u(ji,jj) / psm(ji,jj)
307            zalfq        =  zalf * zalf
308            zalf1        =  1.0 - zalf
309            zalf1q       =  zalf1 * zalf1
310            !
311            zfm (ji,jj)  =  zalf  *   psm (ji,jj)
312            zf0 (ji,jj)  =  zalf  * ( ps0 (ji,jj) + zalf1 * ( psx(ji,jj) + (zalf1 - zalf) * psxx(ji,jj) )  )
313            zfx (ji,jj)  =  zalfq * ( psx (ji,jj) + 3.0 * zalf1 * psxx(ji,jj) )
314            zfxx(ji,jj)  =  zalf  *   psxx(ji,jj) * zalfq
315            zfy (ji,jj)  =  zalf  * ( psy (ji,jj) + zalf1 * psxy(ji,jj) )
316            zfxy(ji,jj)  =  zalfq *   psxy(ji,jj)
317            zfyy(ji,jj)  =  zalf  *   psyy(ji,jj)
318
319            !  Readjust moments remaining in the box.
320            psm (ji,jj)  =  psm (ji,jj) - zfm(ji,jj)
321            ps0 (ji,jj)  =  ps0 (ji,jj) - zf0(ji,jj)
322            psx (ji,jj)  =  zalf1q * ( psx(ji,jj) - 3.0 * zalf * psxx(ji,jj) )
323            psxx(ji,jj)  =  zalf1  * zalf1q * psxx(ji,jj)
324            psy (ji,jj)  =  psy (ji,jj) - zfy(ji,jj)
325            psyy(ji,jj)  =  psyy(ji,jj) - zfyy(ji,jj)
326            psxy(ji,jj)  =  zalf1q * psxy(ji,jj)
327         END DO
328      END DO
329
330      DO jj = 1, jpjm1                      !  Flux from i+1 to i when u LT 0.
331         DO ji = 1, fs_jpim1
332            zalf          = MAX( 0._wp, -put(ji,jj) ) * zrdt * e2u(ji,jj) / psm(ji+1,jj) 
333            zalg  (ji,jj) = zalf
334            zalfq         = zalf * zalf
335            zalf1         = 1.0 - zalf
336            zalg1 (ji,jj) = zalf1
337            zalf1q        = zalf1 * zalf1
338            zalg1q(ji,jj) = zalf1q
339            !
340            zfm   (ji,jj) = zfm (ji,jj) + zalf  *   psm (ji+1,jj)
341            zf0   (ji,jj) = zf0 (ji,jj) + zalf  * ( ps0 (ji+1,jj) - zalf1 * ( psx(ji+1,jj) - (zalf1 - zalf ) * psxx(ji+1,jj) ) )
342            zfx   (ji,jj) = zfx (ji,jj) + zalfq * ( psx (ji+1,jj) - 3.0 * zalf1 * psxx(ji+1,jj) )
343            zfxx  (ji,jj) = zfxx(ji,jj) + zalf  *   psxx(ji+1,jj) * zalfq
344            zfy   (ji,jj) = zfy (ji,jj) + zalf  * ( psy (ji+1,jj) - zalf1 * psxy(ji+1,jj) )
345            zfxy  (ji,jj) = zfxy(ji,jj) + zalfq *   psxy(ji+1,jj)
346            zfyy  (ji,jj) = zfyy(ji,jj) + zalf  *   psyy(ji+1,jj)
347         END DO
348      END DO
349
350      DO jj = 2, jpjm1                     !  Readjust moments remaining in the box.
351         DO ji = fs_2, fs_jpim1
352            zbt  =       zbet(ji-1,jj)
353            zbt1 = 1.0 - zbet(ji-1,jj)
354            !
355            psm (ji,jj) = zbt * psm(ji,jj) + zbt1 * ( psm(ji,jj) - zfm(ji-1,jj) )
356            ps0 (ji,jj) = zbt * ps0(ji,jj) + zbt1 * ( ps0(ji,jj) - zf0(ji-1,jj) )
357            psx (ji,jj) = zalg1q(ji-1,jj) * ( psx(ji,jj) + 3.0 * zalg(ji-1,jj) * psxx(ji,jj) )
358            psxx(ji,jj) = zalg1 (ji-1,jj) * zalg1q(ji-1,jj) * psxx(ji,jj)
359            psy (ji,jj) = zbt * psy (ji,jj) + zbt1 * ( psy (ji,jj) - zfy (ji-1,jj) )
360            psyy(ji,jj) = zbt * psyy(ji,jj) + zbt1 * ( psyy(ji,jj) - zfyy(ji-1,jj) )
361            psxy(ji,jj) = zalg1q(ji-1,jj) * psxy(ji,jj)
362         END DO
363      END DO
364
365      !   Put the temporary moments into appropriate neighboring boxes.   
366      DO jj = 2, jpjm1                     !   Flux from i to i+1 IF u GT 0.
367         DO ji = fs_2, fs_jpim1
368            zbt  =       zbet(ji-1,jj)
369            zbt1 = 1.0 - zbet(ji-1,jj)
370            psm(ji,jj)  = zbt * ( psm(ji,jj) + zfm(ji-1,jj) ) + zbt1 * psm(ji,jj)
371            zalf        = zbt * zfm(ji-1,jj) / psm(ji,jj)
372            zalf1       = 1.0 - zalf
373            ztemp       = zalf * ps0(ji,jj) - zalf1 * zf0(ji-1,jj)
374            !
375            ps0 (ji,jj) = zbt * ( ps0(ji,jj) + zf0(ji-1,jj) ) + zbt1 * ps0(ji,jj)
376            psx (ji,jj) = zbt * ( zalf * zfx(ji-1,jj) + zalf1 * psx(ji,jj) + 3.0 * ztemp ) + zbt1 * psx(ji,jj)
377            psxx(ji,jj) = zbt * ( zalf * zalf * zfxx(ji-1,jj) + zalf1 * zalf1 * psxx(ji,jj)                               &
378               &                + 5.0 * ( zalf * zalf1 * ( psx (ji,jj) - zfx(ji-1,jj) ) - ( zalf1 - zalf ) * ztemp )  )   &
379               &                                                + zbt1 * psxx(ji,jj)
380            psxy(ji,jj) = zbt * ( zalf * zfxy(ji-1,jj) + zalf1 * psxy(ji,jj)             &
381               &                + 3.0 * (- zalf1*zfy(ji-1,jj)  + zalf * psy(ji,jj) ) )   &
382               &                                                + zbt1 * psxy(ji,jj)
383            psy (ji,jj) = zbt * ( psy (ji,jj) + zfy (ji-1,jj) ) + zbt1 * psy (ji,jj)
384            psyy(ji,jj) = zbt * ( psyy(ji,jj) + zfyy(ji-1,jj) ) + zbt1 * psyy(ji,jj)
385         END DO
386      END DO
387
388      DO jj = 2, jpjm1                     !  Flux from i+1 to i IF u LT 0.
389         DO ji = fs_2, fs_jpim1
390            zbt  =       zbet(ji,jj)
391            zbt1 = 1.0 - zbet(ji,jj)
392            psm(ji,jj)  = zbt * psm(ji,jj)  + zbt1 * ( psm(ji,jj) + zfm(ji,jj) )
393            zalf        = zbt1 * zfm(ji,jj) / psm(ji,jj)
394            zalf1       = 1.0 - zalf
395            ztemp       = - zalf * ps0(ji,jj) + zalf1 * zf0(ji,jj)
396            !
397            ps0(ji,jj)  = zbt * ps0 (ji,jj) + zbt1 * ( ps0(ji,jj) + zf0(ji,jj) )
398            psx(ji,jj)  = zbt * psx (ji,jj) + zbt1 * ( zalf * zfx(ji,jj) + zalf1 * psx(ji,jj) + 3.0 * ztemp )
399            psxx(ji,jj) = zbt * psxx(ji,jj) + zbt1 * ( zalf * zalf * zfxx(ji,jj)  + zalf1 * zalf1 * psxx(ji,jj)  &
400               &                                      + 5.0 *( zalf * zalf1 * ( - psx(ji,jj) + zfx(ji,jj) )      &
401               &                                      + ( zalf1 - zalf ) * ztemp ) )
402            psxy(ji,jj) = zbt * psxy(ji,jj) + zbt1 * (  zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj)  &
403               &                                      + 3.0 * ( zalf1 * zfy(ji,jj) - zalf * psy(ji,jj) )  )
404            psy(ji,jj)  = zbt * psy (ji,jj)  + zbt1 * ( psy (ji,jj) + zfy (ji,jj) )
405            psyy(ji,jj) = zbt * psyy(ji,jj)  + zbt1 * ( psyy(ji,jj) + zfyy(ji,jj) )
406         END DO
407      END DO
408
409      !-- Lateral boundary conditions
410      CALL lbc_lnk_multi( psm , 'T',  1., ps0 , 'T',  1.   &
411         &              , psx , 'T', -1., psy , 'T', -1.   &   ! caution gradient ==> the sign changes
412         &              , psxx, 'T',  1., psyy, 'T',  1.   &
413         &              , psxy, 'T',  1. )
414
415      IF(ln_ctl) THEN
[8504]416         CALL prt_ctl(tab2d_1=psm  , clinfo1=' adv_x: psm  :', tab2d_2=ps0 , clinfo2=' ps0  : ')
417         CALL prt_ctl(tab2d_1=psx  , clinfo1=' adv_x: psx  :', tab2d_2=psxx, clinfo2=' psxx : ')
418         CALL prt_ctl(tab2d_1=psy  , clinfo1=' adv_x: psy  :', tab2d_2=psyy, clinfo2=' psyy : ')
419         CALL prt_ctl(tab2d_1=psxy , clinfo1=' adv_x: psxy :')
[8409]420      ENDIF
421      !
[8504]422   END SUBROUTINE adv_x
[8409]423
424
[8504]425   SUBROUTINE adv_y( pdf, pvt , pcrh, psm , ps0 ,   &
426      &              psx, psxx, psy , psyy, psxy )
[8409]427      !!---------------------------------------------------------------------
[8504]428      !!                **  routine adv_y  **
[8409]429      !!           
430      !! ** purpose :   Computes and adds the advection trend to sea-ice
[8504]431      !!                variable on y axis
[8409]432      !!---------------------------------------------------------------------
433      REAL(wp)                    , INTENT(in   ) ::   pdf                ! reduction factor for the time step
[8504]434      REAL(wp)                    , INTENT(in   ) ::   pcrh               ! call adv_x then adv_y (=1) or the opposite (=0)
[8409]435      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pvt                ! j-direction ice velocity at V-point [m/s]
436      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   psm                ! area
437      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   ps0                ! field to be advected
438      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   psx , psy          ! 1st moments
439      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   psxx, psyy, psxy   ! 2nd moments
440      !!
441      INTEGER  ::   ji, jj                               ! dummy loop indices
442      REAL(wp) ::   zs1max, zrdt, zslpmax, ztemp         ! temporary scalars
443      REAL(wp) ::   zs1new, zalf , zalfq , zbt           !    -         -
444      REAL(wp) ::   zs2new, zalf1, zalf1q, zbt1          !    -         -
445      REAL(wp), DIMENSION(jpi,jpj) ::   zf0, zfx , zfy , zbet   ! 2D workspace
446      REAL(wp), DIMENSION(jpi,jpj) ::   zfm, zfxx, zfyy, zfxy   !  -      -
447      REAL(wp), DIMENSION(jpi,jpj) ::   zalg, zalg1, zalg1q     !  -      -
448      !---------------------------------------------------------------------
449
450      ! Limitation of moments.
451
452      zrdt = rdt_ice * pdf ! If ice drift field is too fast, use an appropriate time step for advection.
453
454      DO jj = 1, jpj
455         DO ji = 1, jpi
456            zslpmax = MAX( 0._wp, ps0(ji,jj) )
457            zs1max  = 1.5 * zslpmax
458            zs1new  = MIN( zs1max, MAX( -zs1max, psy(ji,jj) ) )
459            zs2new  = MIN(  ( 2.0 * zslpmax - 0.3334 * ABS( zs1new ) ),   &
460               &             MAX( ABS( zs1new )-zslpmax, psyy(ji,jj) )  )
461            rswitch = ( 1.0 - MAX( 0._wp, SIGN( 1._wp, -zslpmax) ) ) * tmask(ji,jj,1)   ! Case of empty boxes & Apply mask
462            !
463            ps0 (ji,jj) = zslpmax 
464            psx (ji,jj) = psx (ji,jj) * rswitch
465            psxx(ji,jj) = psxx(ji,jj) * rswitch
466            psy (ji,jj) = zs1new * rswitch
467            psyy(ji,jj) = zs2new * rswitch
468            psxy(ji,jj) = MIN( zslpmax, MAX( -zslpmax, psxy(ji,jj) ) ) * rswitch
469         END DO
470      END DO
471
472      !  Initialize volumes of boxes (=area if adv_x first called, =psm otherwise)
473      psm(:,:)  = MAX(  pcrh * e1e2t(:,:) + ( 1.0 - pcrh ) * psm(:,:) , epsi20  )
474
475      !  Calculate fluxes and moments between boxes j<-->j+1             
476      DO jj = 1, jpj                     !  Flux from j to j+1 WHEN v GT 0   
477         DO ji = 1, jpi
478            zbet(ji,jj)  =  MAX( 0._wp, SIGN( 1._wp, pvt(ji,jj) ) )
479            zalf         =  MAX( 0._wp, pvt(ji,jj) ) * zrdt * e1v(ji,jj) / psm(ji,jj)
480            zalfq        =  zalf * zalf
481            zalf1        =  1.0 - zalf
482            zalf1q       =  zalf1 * zalf1
483            !
484            zfm (ji,jj)  =  zalf  * psm(ji,jj)
485            zf0 (ji,jj)  =  zalf  * ( ps0(ji,jj) + zalf1 * ( psy(ji,jj)  + (zalf1-zalf) * psyy(ji,jj)  ) ) 
486            zfy (ji,jj)  =  zalfq *( psy(ji,jj) + 3.0*zalf1*psyy(ji,jj) )
487            zfyy(ji,jj)  =  zalf  * zalfq * psyy(ji,jj)
488            zfx (ji,jj)  =  zalf  * ( psx(ji,jj) + zalf1 * psxy(ji,jj) )
489            zfxy(ji,jj)  =  zalfq * psxy(ji,jj)
490            zfxx(ji,jj)  =  zalf  * psxx(ji,jj)
491            !
492            !  Readjust moments remaining in the box.
493            psm (ji,jj)  =  psm (ji,jj) - zfm(ji,jj)
494            ps0 (ji,jj)  =  ps0 (ji,jj) - zf0(ji,jj)
495            psy (ji,jj)  =  zalf1q * ( psy(ji,jj) -3.0 * zalf * psyy(ji,jj) )
496            psyy(ji,jj)  =  zalf1 * zalf1q * psyy(ji,jj)
497            psx (ji,jj)  =  psx (ji,jj) - zfx(ji,jj)
498            psxx(ji,jj)  =  psxx(ji,jj) - zfxx(ji,jj)
499            psxy(ji,jj)  =  zalf1q * psxy(ji,jj)
500         END DO
501      END DO
502      !
503      DO jj = 1, jpjm1                   !  Flux from j+1 to j when v LT 0.
504         DO ji = 1, jpi
505            zalf          = ( MAX(0._wp, -pvt(ji,jj) ) * zrdt * e1v(ji,jj) ) / psm(ji,jj+1) 
506            zalg  (ji,jj) = zalf
507            zalfq         = zalf * zalf
508            zalf1         = 1.0 - zalf
509            zalg1 (ji,jj) = zalf1
510            zalf1q        = zalf1 * zalf1
511            zalg1q(ji,jj) = zalf1q
512            !
513            zfm   (ji,jj) = zfm (ji,jj) + zalf  *   psm (ji,jj+1)
514            zf0   (ji,jj) = zf0 (ji,jj) + zalf  * ( ps0 (ji,jj+1) - zalf1 * (psy(ji,jj+1) - (zalf1 - zalf ) * psyy(ji,jj+1) ) )
515            zfy   (ji,jj) = zfy (ji,jj) + zalfq * ( psy (ji,jj+1) - 3.0 * zalf1 * psyy(ji,jj+1) )
516            zfyy  (ji,jj) = zfyy(ji,jj) + zalf  *   psyy(ji,jj+1) * zalfq
517            zfx   (ji,jj) = zfx (ji,jj) + zalf  * ( psx (ji,jj+1) - zalf1 * psxy(ji,jj+1) )
518            zfxy  (ji,jj) = zfxy(ji,jj) + zalfq *   psxy(ji,jj+1)
519            zfxx  (ji,jj) = zfxx(ji,jj) + zalf  *   psxx(ji,jj+1)
520         END DO
521      END DO
522
523      !  Readjust moments remaining in the box.
524      DO jj = 2, jpj
525         DO ji = 1, jpi
526            zbt  =         zbet(ji,jj-1)
527            zbt1 = ( 1.0 - zbet(ji,jj-1) )
528            !
529            psm (ji,jj) = zbt * psm(ji,jj) + zbt1 * ( psm(ji,jj) - zfm(ji,jj-1) )
530            ps0 (ji,jj) = zbt * ps0(ji,jj) + zbt1 * ( ps0(ji,jj) - zf0(ji,jj-1) )
531            psy (ji,jj) = zalg1q(ji,jj-1) * ( psy(ji,jj) + 3.0 * zalg(ji,jj-1) * psyy(ji,jj) )
532            psyy(ji,jj) = zalg1 (ji,jj-1) * zalg1q(ji,jj-1) * psyy(ji,jj)
533            psx (ji,jj) = zbt * psx (ji,jj) + zbt1 * ( psx (ji,jj) - zfx (ji,jj-1) )
534            psxx(ji,jj) = zbt * psxx(ji,jj) + zbt1 * ( psxx(ji,jj) - zfxx(ji,jj-1) )
535            psxy(ji,jj) = zalg1q(ji,jj-1) * psxy(ji,jj)
536         END DO
537      END DO
538
539      !   Put the temporary moments into appropriate neighboring boxes.   
540      DO jj = 2, jpjm1                    !   Flux from j to j+1 IF v GT 0.
541         DO ji = 1, jpi
542            zbt  =         zbet(ji,jj-1)
543            zbt1 = ( 1.0 - zbet(ji,jj-1) )
544            psm(ji,jj)  = zbt * ( psm(ji,jj) + zfm(ji,jj-1) ) + zbt1 * psm(ji,jj) 
545            zalf        = zbt * zfm(ji,jj-1) / psm(ji,jj) 
546            zalf1       = 1.0 - zalf
547            ztemp       = zalf * ps0(ji,jj) - zalf1 * zf0(ji,jj-1)
548            !
549            ps0(ji,jj)  = zbt  * ( ps0(ji,jj) + zf0(ji,jj-1) ) + zbt1 * ps0(ji,jj)
550            psy(ji,jj)  = zbt  * ( zalf * zfy(ji,jj-1) + zalf1 * psy(ji,jj) + 3.0 * ztemp )   &
551               &                                               + zbt1 * psy(ji,jj) 
552            psyy(ji,jj) = zbt  * ( zalf * zalf * zfyy(ji,jj-1) + zalf1 * zalf1 * psyy(ji,jj)                             &
553               &                 + 5.0 * ( zalf * zalf1 * ( psy(ji,jj) - zfy(ji,jj-1) ) - ( zalf1 - zalf ) * ztemp ) )   & 
554               &                                               + zbt1 * psyy(ji,jj)
555            psxy(ji,jj) = zbt  * (  zalf * zfxy(ji,jj-1) + zalf1 * psxy(ji,jj)               &
556               &                  + 3.0 * (- zalf1 * zfx(ji,jj-1) + zalf * psx(ji,jj) )  )   &
557               &                                                + zbt1 * psxy(ji,jj)
558            psx (ji,jj) = zbt * ( psx (ji,jj) + zfx (ji,jj-1) ) + zbt1 * psx (ji,jj)
559            psxx(ji,jj) = zbt * ( psxx(ji,jj) + zfxx(ji,jj-1) ) + zbt1 * psxx(ji,jj)
560         END DO
561      END DO
562
563      DO jj = 2, jpjm1                   !  Flux from j+1 to j IF v LT 0.
564         DO ji = 1, jpi
565            zbt  =         zbet(ji,jj)
566            zbt1 = ( 1.0 - zbet(ji,jj) )
567            psm(ji,jj)  = zbt * psm(ji,jj) + zbt1 * ( psm(ji,jj) + zfm(ji,jj) )
568            zalf        = zbt1 * zfm(ji,jj) / psm(ji,jj)
569            zalf1       = 1.0 - zalf
570            ztemp       = - zalf * ps0 (ji,jj) + zalf1 * zf0(ji,jj)
571            ps0 (ji,jj) =   zbt  * ps0 (ji,jj) + zbt1  * ( ps0(ji,jj) + zf0(ji,jj) )
572            psy (ji,jj) =   zbt  * psy (ji,jj) + zbt1  * ( zalf * zfy(ji,jj) + zalf1 * psy(ji,jj) + 3.0 * ztemp )
573            psyy(ji,jj) =   zbt  * psyy(ji,jj) + zbt1 * (  zalf * zalf * zfyy(ji,jj) + zalf1 * zalf1 * psyy(ji,jj)   &
574               &                                         + 5.0 *( zalf *zalf1 *( -psy(ji,jj) + zfy(ji,jj) )          &
575               &                                         + ( zalf1 - zalf ) * ztemp )                                )
576            psxy(ji,jj) =   zbt  * psxy(ji,jj) + zbt1 * (  zalf * zfxy(ji,jj) + zalf1 * psxy(ji,jj)       &
577               &                                         + 3.0 * ( zalf1 * zfx(ji,jj) - zalf * psx(ji,jj) )  )
578            psx (ji,jj) =   zbt  * psx (ji,jj) + zbt1 * ( psx (ji,jj) + zfx (ji,jj) )
579            psxx(ji,jj) =   zbt  * psxx(ji,jj) + zbt1 * ( psxx(ji,jj) + zfxx(ji,jj) )
580         END DO
581      END DO
582
583      !-- Lateral boundary conditions
584      CALL lbc_lnk_multi( psm , 'T',  1.,  ps0 , 'T',  1.   &
585         &              , psx , 'T', -1.,  psy , 'T', -1.   &   ! caution gradient ==> the sign changes
586         &              , psxx, 'T',  1.,  psyy, 'T',  1.   &
587         &              , psxy, 'T',  1. )
588
589      IF(ln_ctl) THEN
[8504]590         CALL prt_ctl(tab2d_1=psm  , clinfo1=' adv_y: psm  :', tab2d_2=ps0 , clinfo2=' ps0  : ')
591         CALL prt_ctl(tab2d_1=psx  , clinfo1=' adv_y: psx  :', tab2d_2=psxx, clinfo2=' psxx : ')
592         CALL prt_ctl(tab2d_1=psy  , clinfo1=' adv_y: psy  :', tab2d_2=psyy, clinfo2=' psyy : ')
593         CALL prt_ctl(tab2d_1=psxy , clinfo1=' adv_y: psxy :')
[8409]594      ENDIF
595      !
[8504]596   END SUBROUTINE adv_y
[8409]597
598#else
599   !!----------------------------------------------------------------------
600   !!   Default option            Dummy module         NO LIM sea-ice model
601   !!----------------------------------------------------------------------
602#endif
603
604   !!======================================================================
605END MODULE iceadv_prather
Note: See TracBrowser for help on using the repository browser.