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.
limvar.F90 in trunk/NEMOGCM/NEMO/LIM_SRC_3 – NEMO

source: trunk/NEMOGCM/NEMO/LIM_SRC_3/limvar.F90 @ 2760

Last change on this file since 2760 was 2715, checked in by rblod, 13 years ago

First attempt to put dynamic allocation on the trunk

  • Property svn:keywords set to Id
File size: 22.3 KB
Line 
1MODULE limvar
2   !!======================================================================
3   !!                       ***  MODULE limvar ***
4   !!                 Different sets of ice model variables
5   !!                   how to switch from one to another
6   !!
7   !!                 There are three sets of variables
8   !!                 VGLO : global variables of the model
9   !!                        - v_i (jpi,jpj,jpl)
10   !!                        - v_s (jpi,jpj,jpl)
11   !!                        - a_i (jpi,jpj,jpl)
12   !!                        - t_s (jpi,jpj,jpl)
13   !!                        - e_i (jpi,jpj,nlay_i,jpl)
14   !!                        - smv_i(jpi,jpj,jpl)
15   !!                        - oa_i (jpi,jpj,jpl)
16   !!                 VEQV : equivalent variables sometimes used in the model
17   !!                        - ht_i(jpi,jpj,jpl)
18   !!                        - ht_s(jpi,jpj,jpl)
19   !!                        - t_i (jpi,jpj,nlay_i,jpl)
20   !!                        ...
21   !!                 VAGG : aggregate variables, averaged/summed over all
22   !!                        thickness categories
23   !!                        - vt_i(jpi,jpj)
24   !!                        - vt_s(jpi,jpj)
25   !!                        - at_i(jpi,jpj)
26   !!                        - et_s(jpi,jpj)  !total snow heat content
27   !!                        - et_i(jpi,jpj)  !total ice thermal content
28   !!                        - smt_i(jpi,jpj) !mean ice salinity
29   !!                        - ot_i(jpi,jpj)  !average ice age
30   !!======================================================================
31   !! History :   -   ! 2006-01 (M. Vancoppenolle) Original code
32   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation
33   !!----------------------------------------------------------------------
34#if defined key_lim3
35   !!----------------------------------------------------------------------
36   !!   'key_lim3'                                      LIM3 sea-ice model
37   !!----------------------------------------------------------------------
38   !!   lim_var_agg       :
39   !!   lim_var_glo2eqv   :
40   !!   lim_var_eqv2glo   :
41   !!   lim_var_salprof   :
42   !!   lim_var_salprof1d :
43   !!   lim_var_bv        :
44   !!----------------------------------------------------------------------
45   USE par_oce          ! ocean parameters
46   USE phycst           ! physical constants (ocean directory)
47   USE sbc_oce          ! Surface boundary condition: ocean fields
48   USE ice              ! LIM variables
49   USE par_ice          ! LIM parameters
50   USE dom_ice          ! LIM domain
51   USE thd_ice          ! LIM thermodynamics
52   USE wrk_nemo         ! workspace manager
53   USE in_out_manager   ! I/O manager
54   USE lib_mpp         ! MPP library
55
56   IMPLICIT NONE
57   PRIVATE
58
59   PUBLIC   lim_var_agg          !
60   PUBLIC   lim_var_glo2eqv      !
61   PUBLIC   lim_var_eqv2glo      !
62   PUBLIC   lim_var_salprof      !
63   PUBLIC   lim_var_bv           !
64   PUBLIC   lim_var_salprof1d    !
65
66   REAL(wp) ::   eps20 = 1.e-20_wp   ! module constants
67   REAL(wp) ::   eps16 = 1.e-16_wp   !    -       -
68   REAL(wp) ::   eps13 = 1.e-13_wp   !    -       -
69   REAL(wp) ::   eps10 = 1.e-10_wp   !    -       -
70   REAL(wp) ::   eps06 = 1.e-06_wp   !    -       -
71   REAL(wp) ::   zzero = 0.e0        !    -       -
72   REAL(wp) ::   zone  = 1.e0        !    -       -
73
74   !!----------------------------------------------------------------------
75   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011)
76   !! $Id$
77   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
78   !!----------------------------------------------------------------------
79CONTAINS
80
81   SUBROUTINE lim_var_agg( kn )
82      !!------------------------------------------------------------------
83      !!                ***  ROUTINE lim_var_agg  ***
84      !!
85      !! ** Purpose :   aggregates ice-thickness-category variables to all-ice variables
86      !!              i.e. it turns VGLO into VAGG
87      !! ** Method  :
88      !!
89      !! ** Arguments : n = 1, at_i vt_i only
90      !!                n = 2 everything
91      !!
92      !! note : you could add an argument when you need only at_i, vt_i
93      !!        and when you need everything
94      !!------------------------------------------------------------------
95      INTEGER, INTENT( in ) ::   kn     ! =1 at_i & vt only ; = what is needed
96      !
97      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
98      REAL(wp) ::   zinda
99      !!------------------------------------------------------------------
100
101      !--------------------
102      ! Compute variables
103      !--------------------
104      vt_i (:,:) = 0._wp
105      vt_s (:,:) = 0._wp
106      at_i (:,:) = 0._wp
107      ato_i(:,:) = 1._wp
108      !
109      DO jl = 1, jpl
110         DO jj = 1, jpj
111            DO ji = 1, jpi
112               !
113               vt_i(ji,jj) = vt_i(ji,jj) + v_i(ji,jj,jl) ! ice volume
114               vt_s(ji,jj) = vt_s(ji,jj) + v_s(ji,jj,jl) ! snow volume
115               at_i(ji,jj) = at_i(ji,jj) + a_i(ji,jj,jl) ! ice concentration
116               !
117               zinda = MAX( zzero , SIGN( zone , at_i(ji,jj) - 0.10 ) ) 
118               icethi(ji,jj) = vt_i(ji,jj) / MAX( at_i(ji,jj) , eps16 ) * zinda  ! ice thickness
119            END DO
120         END DO
121      END DO
122
123      DO jj = 1, jpj
124         DO ji = 1, jpi
125            ato_i(ji,jj) = MAX( 1._wp - at_i(ji,jj), 0._wp )   ! open water fraction
126         END DO
127      END DO
128
129      IF( kn > 1 ) THEN
130         et_s (:,:) = 0._wp
131         ot_i (:,:) = 0._wp
132         smt_i(:,:) = 0._wp
133         et_i (:,:) = 0._wp
134         !
135         DO jl = 1, jpl
136            DO jj = 1, jpj
137               DO ji = 1, jpi
138                  et_s(ji,jj)  = et_s(ji,jj)  + e_s(ji,jj,1,jl)                                       ! snow heat content
139                  zinda = MAX( zzero , SIGN( zone , vt_i(ji,jj) - 0.10 ) ) 
140                  smt_i(ji,jj) = smt_i(ji,jj) + smv_i(ji,jj,jl) / MAX( vt_i(ji,jj) , eps13 ) * zinda   ! ice salinity
141                  zinda = MAX( zzero , SIGN( zone , at_i(ji,jj) - 0.10 ) ) 
142                  ot_i(ji,jj)  = ot_i(ji,jj)  + oa_i(ji,jj,jl)  / MAX( at_i(ji,jj) , eps13 ) * zinda   ! ice age
143               END DO
144            END DO
145         END DO
146         !
147         DO jl = 1, jpl
148            DO jk = 1, nlay_i
149               et_i(:,:) = et_i(:,:) + e_i(:,:,jk,jl)       ! ice heat content
150            END DO
151         END DO
152         !
153      ENDIF
154      !
155   END SUBROUTINE lim_var_agg
156
157
158   SUBROUTINE lim_var_glo2eqv
159      !!------------------------------------------------------------------
160      !!                ***  ROUTINE lim_var_glo2eqv ***
161      !!
162      !! ** Purpose :   computes equivalent variables as function of global variables
163      !!              i.e. it turns VGLO into VEQV
164      !!------------------------------------------------------------------
165      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
166      REAL(wp) ::   zq_i, zaaa, zbbb, zccc, zdiscrim     ! local scalars
167      REAL(wp) ::   ztmelts, zindb, zq_s, zfac1, zfac2   !   -      -
168      !!------------------------------------------------------------------
169
170      !-------------------------------------------------------
171      ! Ice thickness, snow thickness, ice salinity, ice age
172      !-------------------------------------------------------
173      DO jl = 1, jpl
174         DO jj = 1, jpj
175            DO ji = 1, jpi
176               zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp,- a_i(ji,jj,jl) ) )   !0 if no ice and 1 if yes
177               ht_i(ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , eps10 ) * zindb
178               ht_s(ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , eps10 ) * zindb
179               o_i(ji,jj,jl)  = oa_i(ji,jj,jl) / MAX( a_i(ji,jj,jl) , eps10 ) * zindb
180            END DO
181         END DO
182      END DO
183
184      IF(  num_sal == 2  .OR.  num_sal == 4  )THEN
185         DO jl = 1, jpl
186            DO jj = 1, jpj
187               DO ji = 1, jpi
188                  zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp,- a_i(ji,jj,jl) ) )   !0 if no ice and 1 if yes
189                  sm_i(ji,jj,jl) = smv_i(ji,jj,jl) / MAX( v_i(ji,jj,jl) , eps10 ) * zindb
190               END DO
191            END DO
192         END DO
193      ENDIF
194
195      CALL lim_var_salprof      ! salinity profile
196
197      !-------------------
198      ! Ice temperatures
199      !-------------------
200!CDIR NOVERRCHK
201      DO jl = 1, jpl
202!CDIR NOVERRCHK
203         DO jk = 1, nlay_i
204!CDIR NOVERRCHK
205            DO jj = 1, jpj
206!CDIR NOVERRCHK
207               DO ji = 1, jpi
208                  !                                                              ! Energy of melting q(S,T) [J.m-3]
209                  zq_i    = e_i(ji,jj,jk,jl) / area(ji,jj) / MAX( v_i(ji,jj,jl) , eps06 ) * REAL(nlay_i,wp) 
210                  zindb   = 1.0 - MAX( 0.0 , SIGN( 1.0 , - v_i(ji,jj,jl) ) )     ! zindb = 0 if no ice and 1 if yes
211                  zq_i    = zq_i * unit_fac * zindb                              !convert units
212                  ztmelts = -tmut * s_i(ji,jj,jk,jl) + rtt                       ! Ice layer melt temperature
213                  !
214                  zaaa       =  cpic                  ! Conversion q(S,T) -> T (second order equation)
215                  zbbb       =  ( rcp - cpic ) * ( ztmelts - rtt ) + zq_i / rhoic - lfus
216                  zccc       =  lfus * (ztmelts-rtt)
217                  zdiscrim   =  SQRT( MAX(zbbb*zbbb - 4._wp*zaaa*zccc , 0._wp) )
218                  t_i(ji,jj,jk,jl) = rtt + zindb *( - zbbb - zdiscrim ) / ( 2.0 *zaaa )
219                  t_i(ji,jj,jk,jl) = MIN( rtt, MAX( 173.15_wp, t_i(ji,jj,jk,jl) ) )       ! 100-rtt < t_i < rtt
220               END DO
221            END DO
222         END DO
223      END DO
224
225      !--------------------
226      ! Snow temperatures
227      !--------------------
228      zfac1 = 1._wp / ( rhosn * cpic )
229      zfac2 = lfus / cpic 
230      DO jl = 1, jpl
231         DO jk = 1, nlay_s
232            DO jj = 1, jpj
233               DO ji = 1, jpi
234                  !Energy of melting q(S,T) [J.m-3]
235                  zq_s  = e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , eps06 ) ) * REAL(nlay_s,wp)
236                  zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - v_s(ji,jj,jl) ) )     ! zindb = 0 if no ice and 1 if yes
237                  zq_s  = zq_s * unit_fac * zindb                                    ! convert units
238                  !
239                  t_s(ji,jj,jk,jl) = rtt + zindb * ( - zfac1 * zq_s + zfac2 )
240                  t_s(ji,jj,jk,jl) = MIN( rtt, MAX( 173.15, t_s(ji,jj,jk,jl) ) )     ! 100-rtt < t_i < rtt
241               END DO
242            END DO
243         END DO
244      END DO
245
246      !-------------------
247      ! Mean temperature
248      !-------------------
249      tm_i(:,:) = 0._wp
250      DO jl = 1, jpl
251         DO jk = 1, nlay_i
252            DO jj = 1, jpj
253               DO ji = 1, jpi
254                  zindb = (  1._wp - MAX( 0._wp , SIGN( 1._wp , -a_i(ji,jj,jl) ) )  )   &
255                     &  * (  1._wp - MAX( 0._wp , SIGN( 1._wp , -v_i(ji,jj,jl) ) )  )
256                  tm_i(ji,jj) = tm_i(ji,jj) + t_i(ji,jj,jk,jl) * v_i(ji,jj,jl)   &
257                     &                      / (  REAL(nlay_i,wp) * MAX( vt_i(ji,jj) , eps10 )  )
258               END DO
259            END DO
260         END DO
261      END DO
262      !
263   END SUBROUTINE lim_var_glo2eqv
264
265
266   SUBROUTINE lim_var_eqv2glo
267      !!------------------------------------------------------------------
268      !!                ***  ROUTINE lim_var_eqv2glo ***
269      !!
270      !! ** Purpose :   computes global variables as function of equivalent variables
271      !!                i.e. it turns VEQV into VGLO
272      !! ** Method  :
273      !!
274      !! ** History :  (01-2006) Martin Vancoppenolle, UCL-ASTR
275      !!------------------------------------------------------------------
276      !
277      v_i(:,:,:)   = ht_i(:,:,:) * a_i(:,:,:)
278      v_s(:,:,:)   = ht_s(:,:,:) * a_i(:,:,:)
279      smv_i(:,:,:) = sm_i(:,:,:) * v_i(:,:,:)
280      oa_i (:,:,:) = o_i (:,:,:) * a_i(:,:,:)
281      !
282   END SUBROUTINE lim_var_eqv2glo
283
284
285   SUBROUTINE lim_var_salprof
286      !!------------------------------------------------------------------
287      !!                ***  ROUTINE lim_var_salprof ***
288      !!
289      !! ** Purpose :   computes salinity profile in function of bulk salinity     
290      !!
291      !! ** Method  : If bulk salinity greater than s_i_1,
292      !!              the profile is assumed to be constant (S_inf)
293      !!              If bulk salinity lower than s_i_0,
294      !!              the profile is linear with 0 at the surface (S_zero)
295      !!              If it is between s_i_0 and s_i_1, it is a
296      !!              alpha-weighted linear combination of s_inf and s_zero
297      !!
298      !! ** References : Vancoppenolle et al., 2007 (in preparation)
299      !!------------------------------------------------------------------
300      INTEGER  ::   ji, jj, jk, jl   ! dummy loop index
301      REAL(wp) ::   dummy_fac0, dummy_fac1, dummy_fac, zsal      ! local scalar
302      REAL(wp) ::   zind0, zind01, zindbal, zargtemp , zs_zero   !   -      -
303      !
304      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_slope_s, zalpha   ! 3D pointer
305      !!------------------------------------------------------------------
306
307      IF( wrk_in_use( 2, 1,2 ) ) THEN
308         CALL ctl_stop( 'lim_var_salprof: requested workspace arrays unavailable' )   ;   RETURN
309      END IF
310
311      z_slope_s => wrk_3d_1(:,:,1:jpl)   ! slope of the salinity profile
312      zalpha    => wrk_3d_2(:,:,1:jpl)   ! weight factor for s between s_i_0 and s_i_1
313
314      !---------------------------------------
315      ! Vertically constant, constant in time
316      !---------------------------------------
317      IF( num_sal == 1 )   s_i(:,:,:,:) = bulk_sal
318
319      !-----------------------------------
320      ! Salinity profile, varying in time
321      !-----------------------------------
322
323      IF(   num_sal == 2  .OR.   num_sal == 4   ) THEN
324         !
325         DO jk = 1, nlay_i
326            s_i(:,:,jk,:)  = sm_i(:,:,:)
327         END DO
328         !
329         DO jl = 1, jpl                               ! Slope of the linear profile
330            DO jj = 1, jpj
331               DO ji = 1, jpi
332                  z_slope_s(ji,jj,jl) = 2._wp * sm_i(ji,jj,jl) / MAX( 0.01 , ht_i(ji,jj,jl) )
333               END DO
334            END DO
335         END DO
336         !
337         dummy_fac0 = 1._wp / ( s_i_0 - s_i_1 )       ! Weighting factor between zs_zero and zs_inf
338         dummy_fac1 = s_i_1 / ( s_i_1 - s_i_0 )
339
340         zalpha(:,:,:) = 0._wp
341         DO jl = 1, jpl
342            DO jj = 1, jpj
343               DO ji = 1, jpi
344                  ! zind0 = 1 if sm_i le s_i_0 and 0 otherwise
345                  zind0  = MAX( 0.0   , SIGN( 1.0  , s_i_0 - sm_i(ji,jj,jl) ) ) 
346                  ! zind01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws
347                  zind01 = ( 1.0 - zind0 ) * MAX( 0.0   , SIGN( 1.0  , s_i_1 - sm_i(ji,jj,jl) ) ) 
348                  ! If 2.sm_i GE sss_m then zindbal = 1
349                  zindbal = MAX( 0.0 , SIGN( 1.0 , 2. * sm_i(ji,jj,jl) - sss_m(ji,jj) ) )
350                  zalpha(ji,jj,jl) = zind0  * 1.0 + zind01 * ( sm_i(ji,jj,jl) * dummy_fac0 + dummy_fac1 )
351                  zalpha(ji,jj,jl) = zalpha(ji,jj,jl) * ( 1.0 - zindbal )
352               END DO
353            END DO
354         END DO
355
356         dummy_fac = 1._wp / nlay_i                   ! Computation of the profile
357         DO jl = 1, jpl
358            DO jk = 1, nlay_i
359               DO jj = 1, jpj
360                  DO ji = 1, jpi
361                     !                                      ! linear profile with 0 at the surface
362                     zs_zero = z_slope_s(ji,jj,jl) * ( REAL(jk,wp) - 0.5_wp ) * ht_i(ji,jj,jl) * dummy_fac
363                     !                                      ! weighting the profile
364                     s_i(ji,jj,jk,jl) = zalpha(ji,jj,jl) * zs_zero + ( 1._wp - zalpha(ji,jj,jl) ) * sm_i(ji,jj,jl)
365                  END DO ! ji
366               END DO ! jj
367            END DO ! jk
368         END DO ! jl
369
370      ENDIF ! num_sal
371
372      !-------------------------------------------------------
373      ! Vertically varying salinity profile, constant in time
374      !-------------------------------------------------------
375
376      IF( num_sal == 3 ) THEN      ! Schwarzacher (1959) multiyear salinity profile (mean = 2.30)
377         !
378         sm_i(:,:,:) = 2.30_wp
379         !
380         DO jl = 1, jpl
381!CDIR NOVERRCHK
382            DO jk = 1, nlay_i
383               zargtemp  = ( REAL(jk,wp) - 0.5_wp ) / REAL(nlay_i,wp)
384               zsal =  1.6_wp * (  1._wp - COS( rpi * zargtemp**(0.407_wp/(0.573_wp+zargtemp)) )  )
385               s_i(:,:,jk,jl) =  zsal
386            END DO
387         END DO
388
389      ENDIF ! num_sal
390      !
391      IF( wrk_not_released(2, 1,2) )   CALL ctl_stop('lim_var_salprof: failed to release workspace arrays.')
392      !
393   END SUBROUTINE lim_var_salprof
394
395
396   SUBROUTINE lim_var_bv
397      !!------------------------------------------------------------------
398      !!                ***  ROUTINE lim_var_bv ***
399      !!
400      !! ** Purpose :   computes mean brine volume (%) in sea ice
401      !!
402      !! ** Method  : e = - 0.054 * S (ppt) / T (C)
403      !!
404      !! References : Vancoppenolle et al., JGR, 2007
405      !!------------------------------------------------------------------
406      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
407      REAL(wp) ::   zbvi, zindb      ! local scalars
408      !!------------------------------------------------------------------
409      !
410      bv_i(:,:) = 0._wp
411      DO jl = 1, jpl
412         DO jk = 1, nlay_i
413            DO jj = 1, jpj
414               DO ji = 1, jpi
415                  zindb = 1.0-MAX(0.0,SIGN(1.0,-a_i(ji,jj,jl))) !0 if no ice and 1 if yes
416                  zbvi  = - zindb * tmut * s_i(ji,jj,jk,jl) / MIN( t_i(ji,jj,jk,jl) - 273.15 , eps13 )   &
417                     &                   * v_i(ji,jj,jl)    / REAL(nlay_i,wp)
418                  bv_i(ji,jj) = bv_i(ji,jj) + zbvi  / MAX( vt_i(ji,jj) , eps13 )
419               END DO
420            END DO
421         END DO
422      END DO
423      !
424   END SUBROUTINE lim_var_bv
425
426
427   SUBROUTINE lim_var_salprof1d( kideb, kiut )
428      !!-------------------------------------------------------------------
429      !!                  ***  ROUTINE lim_thd_salprof1d  ***
430      !!
431      !! ** Purpose :   1d computation of the sea ice salinity profile
432      !!                Works with 1d vectors and is used by thermodynamic modules
433      !!-------------------------------------------------------------------
434      INTEGER, INTENT(in) ::   kideb, kiut   ! thickness category index
435      !
436      INTEGER  ::   ji, jk    ! dummy loop indices
437      INTEGER  ::   zji, zjj  ! local integers
438      REAL(wp) ::   dummy_fac0, dummy_fac1, dummy_fac2, zargtemp, zsal   ! local scalars
439      REAL(wp) ::   zalpha, zind0, zind01, zindbal, zs_zero              !   -      -
440      !
441      REAL(wp), POINTER, DIMENSION(:) ::   z_slope_s
442      !!---------------------------------------------------------------------
443
444      IF(  wrk_in_use(1, 1)  ) THEN
445         CALL ctl_stop('lim_var_salprof1d : requestead workspace arrays unavailable.')   ;   RETURN
446      END IF
447      ! Set-up pointers to sub-arrays of workspace arrays
448      z_slope_s  =>  wrk_1d_1 (1:jpij)
449
450      !---------------------------------------
451      ! Vertically constant, constant in time
452      !---------------------------------------
453      IF( num_sal == 1 )   s_i_b(:,:) = bulk_sal
454
455      !------------------------------------------------------
456      ! Vertically varying salinity profile, varying in time
457      !------------------------------------------------------
458
459      IF(  num_sal == 2  .OR.  num_sal == 4  ) THEN
460         !
461         DO ji = kideb, kiut          ! Slope of the linear profile zs_zero
462            z_slope_s(ji) = 2._wp * sm_i_b(ji) / MAX( 0.01 , ht_i_b(ji) )
463         END DO
464
465         ! Weighting factor between zs_zero and zs_inf
466         !---------------------------------------------
467         dummy_fac0 = 1._wp / ( s_i_0 - s_i_1 )
468         dummy_fac1 = s_i_1 / ( s_i_1 - s_i_0 )
469         dummy_fac2 = 1._wp / REAL(nlay_i,wp)
470
471!CDIR NOVERRCHK
472         DO jk = 1, nlay_i
473!CDIR NOVERRCHK
474            DO ji = kideb, kiut
475               zji =  MOD( npb(ji) - 1 , jpi ) + 1
476               zjj =     ( npb(ji) - 1 ) / jpi + 1
477               ! zind0 = 1 if sm_i le s_i_0 and 0 otherwise
478               zind0  = MAX( 0._wp , SIGN( 1._wp  , s_i_0 - sm_i_b(ji) ) ) 
479               ! zind01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws
480               zind01 = ( 1._wp - zind0 ) * MAX( 0._wp , SIGN( 1._wp , s_i_1 - sm_i_b(ji) ) ) 
481               ! if 2.sm_i GE sss_m then zindbal = 1
482               zindbal = MAX( 0._wp , SIGN( 1._wp , 2._wp * sm_i_b(ji) - sss_m(zji,zjj) ) )
483               !
484               zalpha = (  zind0 + zind01 * ( sm_i_b(ji) * dummy_fac0 + dummy_fac1 )  ) * ( 1.0 - zindbal )
485               !
486               zs_zero = z_slope_s(ji) * ( REAL(jk,wp) - 0.5_wp ) * ht_i_b(ji) * dummy_fac2
487               ! weighting the profile
488               s_i_b(ji,jk) = zalpha * zs_zero + ( 1._wp - zalpha ) * sm_i_b(ji)
489            END DO ! ji
490         END DO ! jk
491
492      ENDIF ! num_sal
493
494      !-------------------------------------------------------
495      ! Vertically varying salinity profile, constant in time
496      !-------------------------------------------------------
497
498      IF( num_sal == 3 ) THEN      ! Schwarzacher (1959) multiyear salinity profile (mean = 2.30)
499         !
500         sm_i_b(:) = 2.30_wp
501         !
502!CDIR NOVERRCHK
503         DO jk = 1, nlay_i
504            zargtemp  = ( REAL(jk,wp) - 0.5_wp ) / REAL(nlay_i,wp)
505            zsal =  1.6_wp * (  1._wp - COS( rpi * zargtemp**(0.407_wp/(0.573_wp+zargtemp)) )  )
506            DO ji = kideb, kiut
507               s_i_b(ji,jk) = zsal
508            END DO
509         END DO
510         !
511      ENDIF
512      !
513      IF( wrk_not_released(1, 1) )   CALL ctl_stop( 'lim_var_salprof1d : failed to release workspace arrays' )
514      !
515   END SUBROUTINE lim_var_salprof1d
516
517#else
518   !!----------------------------------------------------------------------
519   !!   Default option         Dummy module          NO  LIM3 sea-ice model
520   !!----------------------------------------------------------------------
521CONTAINS
522   SUBROUTINE lim_var_agg          ! Empty routines
523   END SUBROUTINE lim_var_agg
524   SUBROUTINE lim_var_glo2eqv      ! Empty routines
525   END SUBROUTINE lim_var_glo2eqv
526   SUBROUTINE lim_var_eqv2glo      ! Empty routines
527   END SUBROUTINE lim_var_eqv2glo
528   SUBROUTINE lim_var_salprof      ! Empty routines
529   END SUBROUTINE lim_var_salprof
530   SUBROUTINE lim_var_bv           ! Emtpy routines
531   END SUBROUTINE lim_var_bv
532   SUBROUTINE lim_var_salprof1d    ! Emtpy routines
533   END SUBROUTINE lim_var_salprof1d
534#endif
535
536   !!======================================================================
537END MODULE limvar
Note: See TracBrowser for help on using the repository browser.