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/NEMO/LIM_SRC_3 – NEMO

source: trunk/NEMO/LIM_SRC_3/limvar.F90 @ 1146

Last change on this file since 1146 was 1146, checked in by rblod, 16 years ago

Add svn Id (first try), see ticket #210

  • Property svn:keywords set to Id
File size: 26.5 KB
RevLine 
[825]1MODULE limvar
[834]2   !!----------------------------------------------------------------------
3   !!   'key_lim3'                                      LIM3 sea-ice model
4   !!----------------------------------------------------------------------
[825]5   !!======================================================================
6   !!                       ***  MODULE limvar ***
7   !!                 Different sets of ice model variables
8   !!                   how to switch from one to another
9   !!
10   !!                 There are three sets of variables
11   !!                 VGLO : global variables of the model
12   !!                        - v_i (jpi,jpj,jpl)
13   !!                        - v_s (jpi,jpj,jpl)
14   !!                        - a_i (jpi,jpj,jpl)
15   !!                        - t_s (jpi,jpj,jpl)
16   !!                        - e_i (jpi,jpj,nlay_i,jpl)
17   !!                        - smv_i(jpi,jpj,jpl)
18   !!                        - oa_i (jpi,jpj,jpl)
19   !!                 VEQV : equivalent variables sometimes used in the model
20   !!                        - ht_i(jpi,jpj,jpl)
21   !!                        - ht_s(jpi,jpj,jpl)
22   !!                        - t_i (jpi,jpj,nlay_i,jpl)
23   !!                        ...
24   !!                 VAGG : aggregate variables, averaged/summed over all
25   !!                        thickness categories
26   !!                        - vt_i(jpi,jpj)
27   !!                        - vt_s(jpi,jpj)
28   !!                        - at_i(jpi,jpj)
29   !!                        - et_s(jpi,jpj)  !total snow heat content
30   !!                        - et_i(jpi,jpj)  !total ice thermal content
31   !!                        - smt_i(jpi,jpj) !mean ice salinity
32   !!                        - ot_i(jpi,jpj)  !average ice age
33   !!======================================================================
[888]34#if defined key_lim3
[825]35   !!----------------------------------------------------------------------
36   !! * Modules used
37   USE dom_ice
38   USE par_oce          ! ocean parameters
39   USE phycst           ! physical constants (ocean directory)
40   USE ice_oce          ! ice variables
[888]41   USE sbc_oce          ! Surface boundary condition: ocean fields
[825]42   USE thd_ice
43   USE in_out_manager
44   USE ice
45   USE par_ice
[921]46
[825]47   IMPLICIT NONE
48   PRIVATE
49
50   !! * Routine accessibility
51   PUBLIC lim_var_agg
52   PUBLIC lim_var_glo2eqv
53   PUBLIC lim_var_eqv2glo
54   PUBLIC lim_var_salprof
55   PUBLIC lim_var_bv
56   PUBLIC lim_var_salprof1d
57
58   !! * Module variables
59   REAL(wp)  ::           &  ! constant values
60      epsi20 = 1e-20   ,  &
61      epsi13 = 1e-13   ,  &
62      zzero  = 0.e0    ,  &
63      zone   = 1.e0
64
65   !!----------------------------------------------------------------------
[834]66   !!   LIM3.0,  UCL-ASTR-LOCEAN-IPSL (2008)
[825]67   !!   (c) UCL-ASTR and Martin Vancoppenolle
68   !!----------------------------------------------------------------------
69
70CONTAINS
71
72   SUBROUTINE lim_var_agg(n)
[921]73      !!------------------------------------------------------------------
74      !!                ***  ROUTINE lim_var_agg  ***
75      !! ** Purpose :
76      !!        This routine aggregates ice-thickness-category variables to 
77      !!                                all-ice variables
78      !!        i.e. it turns VGLO into VAGG
79      !! ** Method  :
80      !!
81      !! ** Arguments :
82      !!           kideb , kiut : Starting and ending points on which the
83      !!                         the computation is applied
84      !!
85      !! ** Inputs / Ouputs : (global commons)
86      !! ** Arguments : n = 1, at_i vt_i only
87      !!                n = 2 everything
88      !!
89      !! ** External :
90      !!
91      !! ** References :
92      !!
93      !! ** History :
94      !!           (01-2006) Martin Vancoppenolle, UCL-ASTR
95      !!
96      !! note : you could add an argument when you need only at_i, vt_i
97      !!        and when you need everything
98      !!------------------------------------------------------------------
99      !! * Arguments
[825]100
[921]101      !! * Local variables
102      INTEGER ::   ji,       &   ! spatial dummy loop index
103         jj,       &   ! spatial dummy loop index
104         jk,       &   ! vertical layering dummy loop index
105         jl            ! ice category dummy loop index
[825]106
[921]107      REAL ::      zeps, epsi16, zinda, epsi06
[825]108
[921]109      INTEGER, INTENT( in ) ::   n     ! describes what is needed
[825]110
[921]111      !!-- End of declarations
112      !!----------------------------------------------------------------------------------------------
113      zeps = 1.0e-13
114      epsi16 = 1.0e-16
115      epsi06 = 1.0e-6
[825]116
[921]117      !------------------
118      ! Zero everything
119      !------------------
[825]120
[921]121      vt_i(:,:)  = 0.0
122      vt_s(:,:)  = 0.0
123      at_i(:,:)  = 0.0 
124      ato_i(:,:) = 1.0 
[825]125
[921]126      IF ( n .GT. 1 ) THEN
127         et_s(:,:)  = 0.0
128         ot_i(:,:)  = 0.0
129         smt_i(:,:) = 0.0
130         et_i(:,:)  = 0.0
131      ENDIF
[825]132
[921]133      !--------------------
134      ! Compute variables
135      !--------------------
[825]136
[921]137      DO jl = 1, jpl
138         DO jj = 1, jpj
139            DO ji = 1, jpi
[825]140
[921]141               vt_i(ji,jj) = vt_i(ji,jj) + v_i(ji,jj,jl) ! ice volume
142               vt_s(ji,jj) = vt_s(ji,jj) + v_s(ji,jj,jl) ! snow volume
143               at_i(ji,jj) = at_i(ji,jj) + a_i(ji,jj,jl) ! ice concentration
[825]144
[921]145               zinda = MAX( zzero , SIGN( zone , at_i(ji,jj) - 0.10 ) ) 
146               icethi(ji,jj) = vt_i(ji,jj) / MAX(at_i(ji,jj),epsi16)*zinda 
147               ! ice thickness
148            END DO
149         END DO
150      END DO
[825]151
[921]152      DO jj = 1, jpj
153         DO ji = 1, jpi
154            ato_i(ji,jj) = MAX(1.0 - at_i(ji,jj), 0.0)   ! open water fraction
155         END DO
156      END DO
[825]157
[921]158      IF ( n .GT. 1 ) THEN
[825]159
[921]160         DO jl = 1, jpl
161            DO jj = 1, jpj
162               DO ji = 1, jpi
163                  et_s(ji,jj)  = et_s(ji,jj)  +     &       ! snow heat content
164                     e_s(ji,jj,1,jl)
165                  zinda = MAX( zzero , SIGN( zone , vt_i(ji,jj) - 0.10 ) ) 
166                  smt_i(ji,jj) = smt_i(ji,jj) +     &       ! ice salinity
167                     smv_i(ji,jj,jl) / MAX( vt_i(ji,jj) , zeps ) * &
168                     zinda
169                  zinda = MAX( zzero , SIGN( zone , at_i(ji,jj) - 0.10 ) ) 
170                  ot_i(ji,jj)  = ot_i(ji,jj)  +     &       ! ice age
171                     oa_i(ji,jj,jl)  / MAX( at_i(ji,jj) , zeps ) * &
172                     zinda
173               END DO
174            END DO
175         END DO
[825]176
[921]177         DO jl = 1, jpl
178            DO jk = 1, nlay_i
179               DO jj = 1, jpj
180                  DO ji = 1, jpi
181                     et_i(ji,jj) = et_i(ji,jj) + e_i(ji,jj,jk,jl) ! ice heat
182                     ! content
183                  END DO
184               END DO
185            END DO
186         END DO
[825]187
[921]188      ENDIF ! n .GT. 1
[825]189
[921]190   END SUBROUTINE lim_var_agg
[825]191
[921]192   !==============================================================================
[825]193
[921]194   SUBROUTINE lim_var_glo2eqv
195      !!------------------------------------------------------------------
196      !!                ***  ROUTINE lim_var_glo2eqv ***'
197      !! ** Purpose :
198      !!        This routine computes equivalent variables as function of   
199      !!                              global variables
200      !!        i.e. it turns VGLO into VEQV
201      !! ** Method  :
202      !!
203      !! ** Arguments :
204      !!           kideb , kiut : Starting and ending points on which the
205      !!                         the computation is applied
206      !!
207      !! ** Inputs / Ouputs :
208      !!
209      !! ** External :
210      !!
211      !! ** References :
212      !!
213      !! ** History :
214      !!           (01-2006) Martin Vancoppenolle, UCL-ASTR
215      !!
216      !!------------------------------------------------------------------
[825]217
[921]218      !! * Local variables
219      INTEGER ::   ji,       &   ! spatial dummy loop index
220         jj,       &   ! spatial dummy loop index
221         jk,       &   ! vertical layering dummy loop index
222         jl            ! ice category dummy loop index
223
224      REAL :: zq_i, zaaa, zbbb, zccc, zdiscrim, &
225         ztmelts, zindb, zq_s, zfac1, zfac2
226
227      REAL :: zeps, epsi06
228
229      zeps    = 1.0e-10
230      epsi06  = 1.0e-06
231
232      !!-- End of declarations
233      !!------------------------------------------------------------------------------
234
[825]235      !-------------------------------------------------------
236      ! Ice thickness, snow thickness, ice salinity, ice age
237      !-------------------------------------------------------
[868]238!CDIR NOVERRCHK
[825]239      DO jl = 1, jpl
[868]240!CDIR NOVERRCHK
[825]241         DO jj = 1, jpj
[868]242!CDIR NOVERRCHK
[825]243            DO ji = 1, jpi
244               zindb          = 1.0-MAX(0.0,SIGN(1.0,- a_i(ji,jj,jl))) !0 if no ice and 1 if yes
245               ht_i(ji,jj,jl) = v_i(ji,jj,jl)   / MAX( a_i(ji,jj,jl) , zeps ) * zindb
246               ht_s(ji,jj,jl) = v_s(ji,jj,jl)   / MAX( a_i(ji,jj,jl) , zeps ) * zindb
247               o_i(ji,jj,jl)  = oa_i(ji,jj,jl)  / MAX( a_i(ji,jj,jl) , zeps ) * zindb
248            END DO
249         END DO
250      END DO
251
252      IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) )THEN
253
[868]254!CDIR NOVERRCHK
[921]255         DO jl = 1, jpl
[868]256!CDIR NOVERRCHK
[921]257            DO jj = 1, jpj
[868]258!CDIR NOVERRCHK
[921]259               DO ji = 1, jpi
260                  zindb          = 1.0-MAX(0.0,SIGN(1.0,-a_i(ji,jj,jl))) !0 if no ice and 1 if yes
261                  sm_i(ji,jj,jl) = smv_i(ji,jj,jl) / MAX(v_i(ji,jj,jl),zeps) * zindb
262               END DO
[825]263            END DO
264         END DO
265
266      ENDIF
267
268      ! salinity profile
269      CALL lim_var_salprof
270
271      !-------------------
272      ! Ice temperatures
273      !-------------------
[868]274!CDIR NOVERRCHK
[825]275      DO jl = 1, jpl
[868]276!CDIR NOVERRCHK
[921]277         DO jk = 1, nlay_i
[868]278!CDIR NOVERRCHK
[921]279            DO jj = 1, jpj
[868]280!CDIR NOVERRCHK
[921]281               DO ji = 1, jpi
282                  !Energy of melting q(S,T) [J.m-3]
283                  zq_i       = e_i(ji,jj,jk,jl) / area(ji,jj) / &
284                     MAX( v_i(ji,jj,jl) , epsi06 ) * nlay_i 
285                  ! zindb = 0 if no ice and 1 if yes
286                  zindb      = 1.0 - MAX( 0.0 , SIGN( 1.0 , - v_i(ji,jj,jl) ) )
287                  !convert units ! very important that this line is here
288                  zq_i       = zq_i * unit_fac * zindb
289                  !Ice layer melt temperature
290                  ztmelts    =  -tmut*s_i(ji,jj,jk,jl) + rtt
291                  !Conversion q(S,T) -> T (second order equation)
292                  zaaa       =  cpic
293                  zbbb       =  ( rcp - cpic ) * ( ztmelts - rtt ) + &
294                     zq_i / rhoic - lfus
295                  zccc       =  lfus * (ztmelts-rtt)
296                  zdiscrim   =  SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) )
297                  t_i(ji,jj,jk,jl) = rtt + zindb *( - zbbb - zdiscrim ) / & 
298                     ( 2.0 *zaaa )
299                  t_i(ji,jj,jk,jl) = MIN( rtt, MAX(173.15, t_i(ji,jj,jk,jl) ) )
300               END DO
[825]301            END DO
[921]302         END DO
[825]303      END DO
304
305      !--------------------
306      ! Snow temperatures
307      !--------------------
308      zfac1 = 1. / ( rhosn * cpic )
309      zfac2 = lfus / cpic 
[868]310!CDIR NOVERRCHK
[825]311      DO jl = 1, jpl
[868]312!CDIR NOVERRCHK
[921]313         DO jk = 1, nlay_s
[868]314!CDIR NOVERRCHK
[921]315            DO jj = 1, jpj
[868]316!CDIR NOVERRCHK
[921]317               DO ji = 1, jpi
318                  !Energy of melting q(S,T) [J.m-3]
319                  zq_s       = e_s(ji,jj,jk,jl) / area(ji,jj) / &
320                     MAX( v_s(ji,jj,jl) , epsi06 ) * nlay_s 
321                  ! zindb = 0 if no ice and 1 if yes
322                  zindb      = 1.0 - MAX( 0.0 , SIGN( 1.0 , - v_s(ji,jj,jl) ) )
323                  !convert units ! very important that this line is here
324                  zq_s       = zq_s * unit_fac * zindb
325                  t_s(ji,jj,jk,jl) = rtt + zindb * ( - zfac1 * zq_s + zfac2 )
326                  t_s(ji,jj,jk,jl) = MIN( rtt, MAX(173.15, t_s(ji,jj,jk,jl) ) )
[825]327
[921]328               END DO
[825]329            END DO
[921]330         END DO
[825]331      END DO
332
333      !-------------------
334      ! Mean temperature
335      !-------------------
336      tm_i(:,:) = 0.0
[868]337!CDIR NOVERRCHK
[825]338      DO jl = 1, jpl
[868]339!CDIR NOVERRCHK
[825]340         DO jk = 1, nlay_i
[868]341!CDIR NOVERRCHK
[825]342            DO jj = 1, jpj
[868]343!CDIR NOVERRCHK
[825]344               DO ji = 1, jpi
345                  zindb          = 1.0-MAX(0.0,SIGN(1.0,-a_i(ji,jj,jl)))
346                  zindb          = zindb*1.0-MAX(0.0,SIGN(1.0,-v_i(ji,jj,jl)))
347                  tm_i(ji,jj) = tm_i(ji,jj) + t_i(ji,jj,jk,jl)*v_i(ji,jj,jl) / &
[921]348                     REAL(nlay_i) / MAX( vt_i(ji,jj) , zeps )
[825]349               END DO
350            END DO
351         END DO
352      END DO
353
354   END SUBROUTINE lim_var_glo2eqv
355
[921]356   !===============================================================================
[825]357
358   SUBROUTINE lim_var_eqv2glo
[921]359      !!------------------------------------------------------------------
360      !!                ***  ROUTINE lim_var_eqv2glo ***'
361      !! ** Purpose :
362      !!        This routine computes global     variables as function of   
363      !!                              equivalent variables
364      !!        i.e. it turns VEQV into VGLO
365      !! ** Method  :
366      !!
367      !! ** Arguments :
368      !!
369      !! ** Inputs / Ouputs : (global commons)
370      !!
371      !! ** External :
372      !!
373      !! ** References :
374      !!
375      !! ** History :
376      !!           (01-2006) Martin Vancoppenolle, UCL-ASTR
377      !!                     Take it easy man
378      !!                     Life is just a simple game, between
379      !!                     ups / and downs \ :@)
380      !!
381      !!------------------------------------------------------------------
[825]382
[921]383      v_i(:,:,:)   = ht_i(:,:,:) * a_i(:,:,:)
384      v_s(:,:,:)   = ht_s(:,:,:) * a_i(:,:,:)
385      smv_i(:,:,:) = sm_i(:,:,:) * v_i(:,:,:)
386      oa_i (:,:,:) = o_i (:,:,:) * a_i(:,:,:)
[825]387
[921]388   END SUBROUTINE lim_var_eqv2glo
[825]389
[921]390   !===============================================================================
[825]391
[921]392   SUBROUTINE lim_var_salprof
393      !!------------------------------------------------------------------
394      !!                ***  ROUTINE lim_var_salprof ***'
395      !! ** Purpose :
396      !!        This routine computes salinity profile in function of
397      !!        bulk salinity     
398      !!
399      !! ** Method  : If bulk salinity greater than s_i_1,
400      !!              the profile is assumed to be constant (S_inf)
401      !!              If bulk salinity lower than s_i_0,
402      !!              the profile is linear with 0 at the surface (S_zero)
403      !!              If it is between s_i_0 and s_i_1, it is a
404      !!              alpha-weighted linear combination of s_inf and s_zero
405      !!
406      !! ** References : Vancoppenolle et al., 2007 (in preparation)
407      !!
408      !! ** History :
409      !!           (08-2006) Martin Vancoppenolle, UCL-ASTR
410      !!                     Take it easy man
411      !!                     Life is just a simple game, between ups
412      !!                     / and downs \ :@)
413      !!
414      !!------------------------------------------------------------------
415      !! * Arguments
[825]416
[921]417      !! * Local variables
418      INTEGER ::             &
419         ji            ,     & !: spatial dummy loop index
420         jj            ,     & !: spatial dummy loop index
421         jk            ,     & !: vertical layering dummy loop index
422         jl                    !: ice category dummy loop index
[825]423
[921]424      REAL(wp) ::            &
425         dummy_fac0    ,     & !: dummy factor used in computations
426         dummy_fac1    ,     & !: dummy factor used in computations
427         dummy_fac     ,     & !: dummy factor used in computations
428         zind0         ,     & !: switch, = 1 if sm_i lt s_i_0
429         zind01        ,     & !: switch, = 1 if sm_i between s_i_0 and s_i_1
430         zindbal       ,     & !: switch, = 1, if 2*sm_i gt sss_m
431         zargtemp              !: dummy factor
[825]432
[921]433      REAL(wp), DIMENSION(nlay_i) ::      &
434         zs_zero               !: linear salinity profile for salinities under
435      !: s_i_0
[825]436
[921]437      REAL(wp), DIMENSION(jpi,jpj,jpl) :: &
438         z_slope_s     ,     & !: slope of the salinity profile
439         zalpha                !: weight factor for s between s_i_0 and s_i_1
[825]440
[921]441      !!-- End of declarations
442      !!------------------------------------------------------------------------------
[825]443
444      !---------------------------------------
445      ! Vertically constant, constant in time
446      !---------------------------------------
447
448      IF ( num_sal .EQ. 1 ) THEN
449
450         s_i(:,:,:,:) = bulk_sal
451
452      ENDIF
453
454      !-----------------------------------
455      ! Salinity profile, varying in time
456      !-----------------------------------
457
458      IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) )THEN
459
460         DO jk = 1, nlay_i
461            s_i(:,:,jk,:)  = sm_i(:,:,:)
462         END DO ! jk
463
464         ! Slope of the linear profile zs_zero
465         !-------------------------------------
466         DO jl = 1, jpl
467            DO jj = 1, jpj
468               DO ji = 1, jpi
469                  z_slope_s(ji,jj,jl) = 2.0 * sm_i(ji,jj,jl) / MAX( 0.01      &
[921]470                     , ht_i(ji,jj,jl) )
[825]471               END DO ! ji
472            END DO ! jj
473         END DO ! jl
474
475         ! Weighting factor between zs_zero and zs_inf
476         !---------------------------------------------
477         dummy_fac0 = 1. / ( ( s_i_0 - s_i_1 ) )
478         dummy_fac1 = s_i_1 / ( s_i_1 - s_i_0 )
479
480         zalpha(:,:,:) = 0.0
481
[868]482!CDIR NOVERRCHK
[825]483         DO jl = 1, jpl
[868]484!CDIR NOVERRCHK
[825]485            DO jj = 1, jpj
[868]486!CDIR NOVERRCHK
[825]487               DO ji = 1, jpi
488                  ! zind0 = 1 if sm_i le s_i_0 and 0 otherwise
489                  zind0  = MAX( 0.0   , SIGN( 1.0  , s_i_0 - sm_i(ji,jj,jl) ) ) 
490                  ! zind01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws
491                  zind01 = ( 1.0 - zind0 ) *                                  &
[921]492                     MAX( 0.0   , SIGN( 1.0  , s_i_1 - sm_i(ji,jj,jl) ) ) 
[888]493                  ! If 2.sm_i GE sss_m then zindbal = 1
[825]494                  zindbal = MAX( 0.0 , SIGN( 1.0 , 2. * sm_i(ji,jj,jl) -      &
[921]495                     sss_m(ji,jj) ) )
[825]496                  zalpha(ji,jj,jl) = zind0  * 1.0                             &
[921]497                     + zind01 * ( sm_i(ji,jj,jl) * dummy_fac0 + &
498                     dummy_fac1 )
[825]499                  zalpha(ji,jj,jl) = zalpha(ji,jj,jl) * ( 1.0 - zindbal )
500               END DO
501            END DO
502         END DO
503
504         ! Computation of the profile
505         !----------------------------
506         dummy_fac = 1. / nlay_i
507
508         DO jl = 1, jpl
509            DO jk = 1, nlay_i
510               DO jj = 1, jpj
511                  DO ji = 1, jpi
512                     ! linear profile with 0 at the surface
513                     zs_zero(jk)      = z_slope_s(ji,jj,jl) * ( jk - 1./2. ) * &
[921]514                        ht_i(ji,jj,jl) * dummy_fac
[825]515                     ! weighting the profile
516                     s_i(ji,jj,jk,jl) = zalpha(ji,jj,jl) * zs_zero(jk) +       &
[921]517                        ( 1.0 - zalpha(ji,jj,jl) ) * sm_i(ji,jj,jl)
[825]518                  END DO ! ji
519               END DO ! jj
520            END DO ! jk
521         END DO ! jl
522
523      ENDIF ! num_sal
524
525      !-------------------------------------------------------
526      ! Vertically varying salinity profile, constant in time
527      !-------------------------------------------------------
528      ! Schwarzacher (1959) multiyear salinity profile (mean = 2.30)
[921]529
[825]530      IF ( num_sal .EQ. 3 ) THEN
531
532         sm_i(:,:,:) = 2.30
533
[868]534!CDIR NOVERRCHK
[825]535         DO jl = 1, jpl
[868]536!CDIR NOVERRCHK
[825]537            DO jk = 1, nlay_i
[868]538!CDIR NOVERRCHK
[825]539               DO jj = 1, jpj
[868]540!CDIR NOVERRCHK
[825]541                  DO ji = 1, jpi
542                     zargtemp  = ( jk - 0.5 ) / nlay_i
543                     s_i(ji,jj,jk,jl) =  1.6 - 1.6 * COS( 3.14169265 * &
[921]544                        ( zargtemp**(0.407/           &
545                        ( 0.573 + zargtemp ) ) ) )
[825]546                  END DO ! ji
547               END DO ! jj
548            END DO ! jk
549         END DO ! jl
550
551      ENDIF ! num_sal
552
553   END SUBROUTINE lim_var_salprof
554
[921]555   !===============================================================================
[825]556
557   SUBROUTINE lim_var_bv
[921]558      !!------------------------------------------------------------------
559      !!                ***  ROUTINE lim_var_bv ***'
560      !! ** Purpose :
561      !!        This routine computes mean brine volume (%) in sea ice
562      !!
563      !! ** Method  : e = - 0.054 * S (ppt) / T (C)
564      !!
565      !! ** Arguments :
566      !!
567      !! ** Inputs / Ouputs : (global commons)
568      !!
569      !! ** External :
570      !!
571      !! ** References : Vancoppenolle et al., JGR, 2007
572      !!
573      !! ** History :
574      !!           (08-2006) Martin Vancoppenolle, UCL-ASTR
575      !!
576      !!------------------------------------------------------------------
577      !! * Arguments
[825]578
[921]579      !! * Local variables
580      INTEGER ::   ji,       &   ! spatial dummy loop index
581         jj,       &   ! spatial dummy loop index
582         jk,       &   ! vertical layering dummy loop index
583         jl            ! ice category dummy loop index
[825]584
[921]585      REAL :: zbvi,          &   ! brine volume for a single ice category
586         zeps,          &   ! very small value
587         zindb              ! is there ice or not
[825]588
[921]589      !!-- End of declarations
590      !!------------------------------------------------------------------------------
[825]591
[921]592      zeps = 1.0e-13
593      bv_i(:,:) = 0.0
[868]594!CDIR NOVERRCHK
[921]595      DO jl = 1, jpl
[868]596!CDIR NOVERRCHK
[921]597         DO jk = 1, nlay_i
[868]598!CDIR NOVERRCHK
[921]599            DO jj = 1, jpj
[868]600!CDIR NOVERRCHK
[921]601               DO ji = 1, jpi
602                  zindb          = 1.0-MAX(0.0,SIGN(1.0,-a_i(ji,jj,jl))) !0 if no ice and 1 if yes
603                  zbvi = - zindb * tmut *s_i(ji,jj,jk,jl) /             & 
604                     MIN( t_i(ji,jj,jk,jl) - 273.15 , zeps )         &
605                     * v_i(ji,jj,jl) / REAL(nlay_i)
606                  bv_i(ji,jj) = bv_i(ji,jj) + zbvi  &
607                     / MAX( vt_i(ji,jj) , zeps )
608               END DO
609            END DO
610         END DO
611      END DO
[825]612
[921]613   END SUBROUTINE lim_var_bv
[825]614
[921]615   !===============================================================================
[825]616
617   SUBROUTINE lim_var_salprof1d(kideb,kiut)
618      !!-------------------------------------------------------------------
619      !!                  ***  ROUTINE lim_thd_salprof1d  ***
620      !!
621      !! ** Purpose :   1d computation of the sea ice salinity profile
622      !!                Works with 1d vectors and is used by thermodynamic
623      !!                modules
624      !!
625      !! history :
626      !!   3.0  !  May  2007 M. Vancoppenolle  Original code
627      !!-------------------------------------------------------------------
628      INTEGER, INTENT(in) :: &
629         kideb, kiut             ! thickness category index
630
631      INTEGER ::             &
632         ji, jk,             &   ! geographic and layer index
633         zji, zjj
634
635      REAL(wp) ::            &
636         dummy_fac0,         &   ! dummy factors
637         dummy_fac1,         &
638         dummy_fac2,         &
639         zalpha    ,         &   ! weighting factor
640         zind0     ,         &   ! switches as in limvar
641         zind01    ,         &   ! switch
642         zindbal   ,         &   ! switch if in freshwater area
643         zargtemp
[921]644
[825]645      REAL(wp), DIMENSION(jpij) ::            &
646         z_slope_s
647
648      REAL(wp), DIMENSION(jpij,jkmax) ::      &
649         zs_zero
650      !!-------------------------------------------------------------------
[921]651
[825]652      !---------------------------------------
653      ! Vertically constant, constant in time
654      !---------------------------------------
655
656      IF ( num_sal .EQ. 1 ) THEN
657
658         s_i_b(:,:) = bulk_sal
659
660      ENDIF
661
662      !------------------------------------------------------
663      ! Vertically varying salinity profile, varying in time
664      !------------------------------------------------------
665
666      IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN
667
668         ! Slope of the linear profile zs_zero
669         !-------------------------------------
[868]670!CDIR NOVERRCHK
[825]671         DO ji = kideb, kiut 
[921]672            z_slope_s(ji) = 2.0 * sm_i_b(ji) / MAX( 0.01      &
673               , ht_i_b(ji) )
[825]674         END DO ! ji
675
676         ! Weighting factor between zs_zero and zs_inf
677         !---------------------------------------------
678         dummy_fac0 = 1. / ( ( s_i_0 - s_i_1 ) )
679         dummy_fac1 = s_i_1 / ( s_i_1 - s_i_0 )
680         dummy_fac2 = 1. / nlay_i
681
[868]682!CDIR NOVERRCHK
[825]683         DO jk = 1, nlay_i
[868]684!CDIR NOVERRCHK
[825]685            DO ji = kideb, kiut
686               zji    =  MOD( npb(ji) - 1, jpi ) + 1
687               zjj    =  ( npb(ji) - 1 ) / jpi + 1
688               zalpha = 0.0
689               ! zind0 = 1 if sm_i le s_i_0 and 0 otherwise
690               zind0  = MAX( 0.0   , SIGN( 1.0  , s_i_0 - sm_i_b(ji) ) ) 
691               ! zind01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws
692               zind01 = ( 1.0 - zind0 ) *                                  &
[921]693                  MAX( 0.0   , SIGN( 1.0  , s_i_1 - sm_i_b(ji) ) ) 
[888]694               ! if 2.sm_i GE sss_m then zindbal = 1
[825]695               zindbal = MAX( 0.0 , SIGN( 1.0 , 2. * sm_i_b(ji) -      &
[921]696                  sss_m(zji,zjj) ) )
[825]697
698               zalpha = zind0  * 1.0                                       &
[921]699                  + zind01 * ( sm_i_b(ji) * dummy_fac0 +           &
700                  dummy_fac1 )
[825]701               zalpha = zalpha * ( 1.0 - zindbal )
702
703               zs_zero(ji,jk) = z_slope_s(ji) * ( jk - 1./2. ) * &
[921]704                  ht_i_b(ji) * dummy_fac2
[825]705               ! weighting the profile
706               s_i_b(ji,jk) = zalpha * zs_zero(ji,jk) +       &
[921]707                  ( 1.0 - zalpha ) * sm_i_b(ji)
[825]708            END DO ! ji
709         END DO ! jk
710
711      ENDIF ! num_sal
712
713      !-------------------------------------------------------
714      ! Vertically varying salinity profile, constant in time
715      !-------------------------------------------------------
716      ! Schwarzacher (1959) multiyear salinity profile (mean = 2.30)
717
718      IF ( num_sal .EQ. 3 ) THEN
719
720         sm_i_b(:) = 2.30
721
[868]722!CDIR NOVERRCHK
[825]723         DO ji = kideb, kiut
[868]724!CDIR NOVERRCHK
[825]725            DO jk = 1, nlay_i
726               zargtemp  = ( jk - 0.5 ) / nlay_i
727               s_i_b(ji,jk)  =  1.6 - 1.6*cos(3.14169265*(zargtemp**(0.407/ &
[921]728                  (0.573+zargtemp))))
[825]729            END DO ! jk
730         END DO ! ji
731
732      ENDIF ! num_sal
733
734   END SUBROUTINE lim_var_salprof1d
735
[921]736   !===============================================================================
[825]737
738#else
739   !!======================================================================
740   !!                       ***  MODULE limvar  ***
741   !!                          no sea ice model
742   !!======================================================================
743CONTAINS
744   SUBROUTINE lim_var_agg          ! Empty routines
745   END SUBROUTINE lim_var_agg
746   SUBROUTINE lim_var_glo2eqv      ! Empty routines
747   END SUBROUTINE lim_var_glo2eqv
748   SUBROUTINE lim_var_eqv2glo      ! Empty routines
749   END SUBROUTINE lim_var_eqv2glo
750   SUBROUTINE lim_var_salprof      ! Empty routines
751   END SUBROUTINE lim_var_salprof
752   SUBROUTINE lim_var_bv           ! Emtpy routines
[921]753   END SUBROUTINE lim_var_bv
[825]754   SUBROUTINE lim_var_salprof1d    ! Emtpy routines
755   END SUBROUTINE lim_var_salprof1d
756
757#endif
[834]758END MODULE limvar
Note: See TracBrowser for help on using the repository browser.