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.
traqsr.F90 in branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

source: branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90 @ 7910

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

All wrk_alloc removed

  • Property svn:keywords set to Id
File size: 21.6 KB
Line 
1MODULE traqsr
2   !!======================================================================
3   !!                       ***  MODULE  traqsr  ***
4   !! Ocean physics:   solar radiation penetration in the top ocean levels
5   !!======================================================================
6   !! History :  OPA  !  1990-10  (B. Blanke)  Original code
7   !!            7.0  !  1991-11  (G. Madec)
8   !!                 !  1996-01  (G. Madec)  s-coordinates
9   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module
10   !!             -   !  2005-11  (G. Madec) zco, zps, sco coordinate
11   !!            3.2  !  2009-04  (G. Madec & NEMO team)
12   !!            3.6  !  2012-05  (C. Rousset) store attenuation coef for use in ice model
13   !!            3.6  !  2015-12  (O. Aumont, J. Jouanno, C. Ethe) use vertical profile of chlorophyll
14   !!            3.7  !  2015-11  (G. Madec, A. Coward)  remove optimisation for fix volume
15   !!----------------------------------------------------------------------
16
17   !!----------------------------------------------------------------------
18   !!   tra_qsr       : temperature trend due to the penetration of solar radiation
19   !!   tra_qsr_init  : initialization of the qsr penetration
20   !!----------------------------------------------------------------------
21   USE oce            ! ocean dynamics and active tracers
22   USE phycst         ! physical constants
23   USE dom_oce        ! ocean space and time domain
24   USE sbc_oce        ! surface boundary condition: ocean
25   USE trc_oce        ! share SMS/Ocean variables
26   USE trd_oce        ! trends: ocean variables
27   USE trdtra         ! trends manager: tracers
28   !
29   USE in_out_manager ! I/O manager
30   USE prtctl         ! Print control
31   USE iom            ! I/O manager
32   USE fldread        ! read input fields
33   USE restart        ! ocean restart
34   USE lib_mpp        ! MPP library
35   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
36   USE timing         ! Timing
37
38   IMPLICIT NONE
39   PRIVATE
40
41   PUBLIC   tra_qsr       ! routine called by step.F90 (ln_traqsr=T)
42   PUBLIC   tra_qsr_init  ! routine called by nemogcm.F90
43
44   !                                 !!* Namelist namtra_qsr: penetrative solar radiation
45   LOGICAL , PUBLIC ::   ln_traqsr    !: light absorption (qsr) flag
46   LOGICAL , PUBLIC ::   ln_qsr_rgb   !: Red-Green-Blue light absorption flag 
47   LOGICAL , PUBLIC ::   ln_qsr_2bd   !: 2 band         light absorption flag
48   LOGICAL , PUBLIC ::   ln_qsr_bio   !: bio-model      light absorption flag
49   LOGICAL , PUBLIC ::   ln_qsr_ice   !: light penetration for ice-model LIM3 (clem)
50   INTEGER , PUBLIC ::   nn_chldta    !: use Chlorophyll data (=1) or not (=0)
51   REAL(wp), PUBLIC ::   rn_abs       !: fraction absorbed in the very near surface (RGB & 2 bands)
52   REAL(wp), PUBLIC ::   rn_si0       !: very near surface depth of extinction      (RGB & 2 bands)
53   REAL(wp), PUBLIC ::   rn_si1       !: deepest depth of extinction (water type I)       (2 bands)
54   !
55   INTEGER , PUBLIC ::   nksr         !: levels below which the light cannot penetrate (depth larger than 391 m)
56 
57   INTEGER, PARAMETER ::   np_RGB  = 1   ! R-G-B     light penetration with constant Chlorophyll
58   INTEGER, PARAMETER ::   np_RGBc = 2   ! R-G-B     light penetration with Chlorophyll data
59   INTEGER, PARAMETER ::   np_2BD  = 3   ! 2 bands   light penetration
60   INTEGER, PARAMETER ::   np_BIO  = 4   ! bio-model light penetration
61   !
62   INTEGER  ::   nqsr    ! user choice of the type of light penetration
63   REAL(wp) ::   xsi0r   ! inverse of rn_si0
64   REAL(wp) ::   xsi1r   ! inverse of rn_si1
65   !
66   REAL(wp) , DIMENSION(3,61)           ::   rkrgb    ! tabulated attenuation coefficients for RGB absorption
67   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_chl   ! structure of input Chl (file informations, fields read)
68
69   !! * Substitutions
70#  include "vectopt_loop_substitute.h90"
71   !!----------------------------------------------------------------------
72   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
73   !! $Id$
74   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
75   !!----------------------------------------------------------------------
76CONTAINS
77
78   SUBROUTINE tra_qsr( kt )
79      !!----------------------------------------------------------------------
80      !!                  ***  ROUTINE tra_qsr  ***
81      !!
82      !! ** Purpose :   Compute the temperature trend due to the solar radiation
83      !!              penetration and add it to the general temperature trend.
84      !!
85      !! ** Method  : The profile of the solar radiation within the ocean is defined
86      !!      through 2 wavebands (rn_si0,rn_si1) or 3 wavebands (RGB) and a ratio rn_abs
87      !!      Considering the 2 wavebands case:
88      !!         I(k) = Qsr*( rn_abs*EXP(z(k)/rn_si0) + (1.-rn_abs)*EXP(z(k)/rn_si1) )
89      !!         The temperature trend associated with the solar radiation penetration
90      !!         is given by : zta = 1/e3t dk[ I ] / (rau0*Cp)
91      !!         At the bottom, boudary condition for the radiation is no flux :
92      !!      all heat which has not been absorbed in the above levels is put
93      !!      in the last ocean level.
94      !!         The computation is only done down to the level where
95      !!      I(k) < 1.e-15 W/m2 (i.e. over the top nksr levels) .
96      !!
97      !! ** Action  : - update ta with the penetrative solar radiation trend
98      !!              - send  trend for further diagnostics (l_trdtra=T)
99      !!
100      !! Reference  : Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp.
101      !!              Lengaigne et al. 2007, Clim. Dyn., V28, 5, 503-516.
102      !!              Morel, A. et Berthon, JF, 1989, Limnol Oceanogr 34(8), 1545-1562
103      !!----------------------------------------------------------------------
104      INTEGER, INTENT(in) ::   kt     ! ocean time-step
105      !
106      INTEGER  ::   ji, jj, jk               ! dummy loop indices
107      INTEGER  ::   irgb                     ! local integers
108      REAL(wp) ::   zchl, zcoef, z1_2        ! local scalars
109      REAL(wp) ::   zc0 , zc1 , zc2 , zc3    !    -         -
110      REAL(wp) ::   zzc0, zzc1, zzc2, zzc3   !    -         -
111      REAL(wp) ::   zz0 , zz1                !    -         -
112      REAL(wp) ::   zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze
113      REAL(wp) ::   zlogc, zlogc2, zlogc3 
114      REAL(wp), DIMENSION(jpi,jpj)   :: zekb, zekg, zekr
115      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze0, ze1, ze2, ze3, zea, ztrdt
116      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zetot, zchl3d
117      !!----------------------------------------------------------------------
118      !
119      IF( nn_timing == 1 )  CALL timing_start('tra_qsr')
120      !
121      IF( kt == nit000 ) THEN
122         IF(lwp) WRITE(numout,*)
123         IF(lwp) WRITE(numout,*) 'tra_qsr : penetration of the surface solar radiation'
124         IF(lwp) WRITE(numout,*) '~~~~~~~'
125      ENDIF
126      !
127      IF( l_trdtra ) THEN      ! trends diagnostic: save the input temperature trend
128         ztrdt(:,:,:) = tsa(:,:,:,jp_tem)
129      ENDIF
130      !
131      !                         !-----------------------------------!
132      !                         !  before qsr induced heat content  !
133      !                         !-----------------------------------!
134      IF( kt == nit000 ) THEN          !==  1st time step  ==!
135!!gm case neuler  not taken into account....
136         IF( ln_rstart .AND. iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0 ) THEN    ! read in restart
137            IF(lwp) WRITE(numout,*) '          nit000-1 qsr tracer content forcing field read in the restart file'
138            z1_2 = 0.5_wp
139            CALL iom_get( numror, jpdom_autoglo, 'qsr_hc_b', qsr_hc_b )   ! before heat content trend due to Qsr flux
140         ELSE                                           ! No restart or restart not found: Euler forward time stepping
141            z1_2 = 1._wp
142            qsr_hc_b(:,:,:) = 0._wp
143         ENDIF
144      ELSE                             !==  Swap of qsr heat content  ==!
145         z1_2 = 0.5_wp
146         qsr_hc_b(:,:,:) = qsr_hc(:,:,:)
147      ENDIF
148      !
149      !                         !--------------------------------!
150      SELECT CASE( nqsr )       !  now qsr induced heat content  !
151      !                         !--------------------------------!
152      !
153      CASE( np_BIO )                   !==  bio-model fluxes  ==!
154         !
155         DO jk = 1, nksr
156            qsr_hc(:,:,jk) = r1_rau0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) )
157         END DO
158         !
159      CASE( np_RGB , np_RGBc )         !==  R-G-B fluxes  ==!
160         !
161         !
162         IF( nqsr == np_RGBc ) THEN          !*  Variable Chlorophyll
163            CALL fld_read( kt, 1, sf_chl )         ! Read Chl data and provides it at the current time step
164            DO jk = 1, nksr + 1
165               DO jj = 2, jpjm1                       ! Separation in R-G-B depending of the surface Chl
166                  DO ji = fs_2, fs_jpim1
167                     zchl    = sf_chl(1)%fnow(ji,jj,1)
168                     zCtot   = 40.6  * zchl**0.459
169                     zze     = 568.2 * zCtot**(-0.746)
170                     IF( zze > 102. ) zze = 200.0 * zCtot**(-0.293)
171                     zpsi    = gdepw_n(ji,jj,jk) / zze
172                     !
173                     zlogc   = LOG( zchl )
174                     zlogc2  = zlogc * zlogc
175                     zlogc3  = zlogc * zlogc * zlogc
176                     zCb     = 0.768 + 0.087 * zlogc - 0.179 * zlogc2 - 0.025 * zlogc3
177                     zCmax   = 0.299 - 0.289 * zlogc + 0.579 * zlogc2
178                     zpsimax = 0.6   - 0.640 * zlogc + 0.021 * zlogc2 + 0.115 * zlogc3
179                     zdelpsi = 0.710 + 0.159 * zlogc + 0.021 * zlogc2
180                     zCze    = 1.12  * (zchl)**0.803 
181                     !
182                     zchl3d(ji,jj,jk) = zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) / zdelpsi )**2 ) )
183                  END DO
184                  !
185               END DO
186            END DO
187         ELSE                                !* constant chrlorophyll
188           DO jk = 1, nksr + 1
189              zchl3d(:,:,jk) = 0.05 
190            ENDDO
191         ENDIF
192         !
193         zcoef  = ( 1. - rn_abs ) / 3._wp    !* surface equi-partition in R-G-B
194         DO jj = 2, jpjm1
195            DO ji = fs_2, fs_jpim1
196               ze0(ji,jj,1) = rn_abs * qsr(ji,jj)
197               ze1(ji,jj,1) = zcoef  * qsr(ji,jj)
198               ze2(ji,jj,1) = zcoef  * qsr(ji,jj)
199               ze3(ji,jj,1) = zcoef  * qsr(ji,jj)
200               zea(ji,jj,1) =          qsr(ji,jj)
201            END DO
202         END DO
203         !
204         DO jk = 2, nksr+1                   !* interior equi-partition in R-G-B depending of vertical profile of Chl
205            DO jj = 2, jpjm1
206               DO ji = fs_2, fs_jpim1
207                  zchl = MIN( 10. , MAX( 0.03, zchl3d(ji,jj,jk) ) )
208                  irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 )
209                  zekb(ji,jj) = rkrgb(1,irgb)
210                  zekg(ji,jj) = rkrgb(2,irgb)
211                  zekr(ji,jj) = rkrgb(3,irgb)
212               END DO
213            END DO
214
215            DO jj = 2, jpjm1
216               DO ji = fs_2, fs_jpim1
217                  zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * xsi0r       )
218                  zc1 = ze1(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekb(ji,jj) )
219                  zc2 = ze2(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekg(ji,jj) )
220                  zc3 = ze3(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekr(ji,jj) )
221                  ze0(ji,jj,jk) = zc0
222                  ze1(ji,jj,jk) = zc1
223                  ze2(ji,jj,jk) = zc2
224                  ze3(ji,jj,jk) = zc3
225                  zea(ji,jj,jk) = ( zc0 + zc1 + zc2 + zc3 ) * wmask(ji,jj,jk)
226               END DO
227            END DO
228         END DO
229         !
230         DO jk = 1, nksr                     !* now qsr induced heat content
231            DO jj = 2, jpjm1
232               DO ji = fs_2, fs_jpim1
233                  qsr_hc(ji,jj,jk) = r1_rau0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) )
234               END DO
235            END DO
236         END DO
237         !
238         !
239      CASE( np_2BD  )            !==  2-bands fluxes  ==!
240         !
241         zz0 =        rn_abs   * r1_rau0_rcp      ! surface equi-partition in 2-bands
242         zz1 = ( 1. - rn_abs ) * r1_rau0_rcp
243         DO jk = 1, nksr                          ! solar heat absorbed at T-point in the top 400m
244            DO jj = 2, jpjm1
245               DO ji = fs_2, fs_jpim1
246                  zc0 = zz0 * EXP( -gdepw_n(ji,jj,jk  )*xsi0r ) + zz1 * EXP( -gdepw_n(ji,jj,jk  )*xsi1r )
247                  zc1 = zz0 * EXP( -gdepw_n(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -gdepw_n(ji,jj,jk+1)*xsi1r )
248                  qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0 * wmask(ji,jj,jk) - zc1 * wmask(ji,jj,jk+1) ) 
249               END DO
250            END DO
251         END DO
252         !
253      END SELECT
254      !
255      !                          !-----------------------------!
256      DO jk = 1, nksr            !  update to the temp. trend  !
257         DO jj = 2, jpjm1        !-----------------------------!
258            DO ji = fs_2, fs_jpim1   ! vector opt.
259               tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)   &
260                  &                 + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) / e3t_n(ji,jj,jk)
261            END DO
262         END DO
263      END DO
264      !
265      IF( ln_qsr_ice ) THEN      ! sea-ice: store the 1st ocean level attenuation coefficient
266         DO jj = 2, jpjm1 
267            DO ji = fs_2, fs_jpim1   ! vector opt.
268               IF( qsr(ji,jj) /= 0._wp ) THEN   ;   fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rau0_rcp * qsr(ji,jj) )
269               ELSE                             ;   fraqsr_1lev(ji,jj) = 1._wp
270               ENDIF
271            END DO
272         END DO
273         ! Update haloes since lim_thd needs fraqsr_1lev to be defined everywhere
274         CALL lbc_lnk( fraqsr_1lev(:,:), 'T', 1._wp )
275      ENDIF
276      !
277      IF( iom_use('qsr3d') ) THEN      ! output the shortwave Radiation distribution
278         !
279         zetot(:,:,nksr+1:jpk) = 0._wp     ! below ~400m set to zero
280         DO jk = nksr, 1, -1
281            zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) / r1_rau0_rcp
282         END DO         
283         CALL iom_put( 'qsr3d', zetot )   ! 3D distribution of shortwave Radiation
284         !
285      ENDIF
286      !
287      IF( lrst_oce ) THEN     ! write in the ocean restart file
288         CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b'   , qsr_hc      )
289         CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev ) 
290      ENDIF
291      !
292      IF( l_trdtra ) THEN     ! qsr tracers trends saved for diagnostics
293         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:)
294         CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt )
295      ENDIF
296      !                       ! print mean trends (used for debugging)
297      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' )
298      !
299      IF( nn_timing == 1 )  CALL timing_stop('tra_qsr')
300      !
301   END SUBROUTINE tra_qsr
302
303
304   SUBROUTINE tra_qsr_init
305      !!----------------------------------------------------------------------
306      !!                  ***  ROUTINE tra_qsr_init  ***
307      !!
308      !! ** Purpose :   Initialization for the penetrative solar radiation
309      !!
310      !! ** Method  :   The profile of solar radiation within the ocean is set
311      !!      from two length scale of penetration (rn_si0,rn_si1) and a ratio
312      !!      (rn_abs). These parameters are read in the namtra_qsr namelist. The
313      !!      default values correspond to clear water (type I in Jerlov'
314      !!      (1968) classification.
315      !!         called by tra_qsr at the first timestep (nit000)
316      !!
317      !! ** Action  : - initialize rn_si0, rn_si1 and rn_abs
318      !!
319      !! Reference : Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp.
320      !!----------------------------------------------------------------------
321      INTEGER  ::   ji, jj, jk                  ! dummy loop indices
322      INTEGER  ::   ios, irgb, ierror, ioptio   ! local integer
323      REAL(wp) ::   zz0, zc0 , zc1, zcoef      ! local scalars
324      REAL(wp) ::   zz1, zc2 , zc3, zchl       !   -      -
325      !
326      CHARACTER(len=100) ::   cn_dir   ! Root directory for location of ssr files
327      TYPE(FLD_N)        ::   sn_chl   ! informations about the chlorofyl field to be read
328      !!
329      NAMELIST/namtra_qsr/  sn_chl, cn_dir, ln_qsr_rgb, ln_qsr_2bd, ln_qsr_bio, ln_qsr_ice,  &
330         &                  nn_chldta, rn_abs, rn_si0, rn_si1
331      !!----------------------------------------------------------------------
332      !
333      IF( nn_timing == 1 )   CALL timing_start('tra_qsr_init')
334      !
335      REWIND( numnam_ref )              ! Namelist namtra_qsr in reference     namelist
336      READ  ( numnam_ref, namtra_qsr, IOSTAT = ios, ERR = 901)
337901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtra_qsr in reference namelist', lwp )
338      !
339      REWIND( numnam_cfg )              ! Namelist namtra_qsr in configuration namelist
340      READ  ( numnam_cfg, namtra_qsr, IOSTAT = ios, ERR = 902 )
341902   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtra_qsr in configuration namelist', lwp )
342      IF(lwm) WRITE ( numond, namtra_qsr )
343      !
344      IF(lwp) THEN                ! control print
345         WRITE(numout,*)
346         WRITE(numout,*) 'tra_qsr_init : penetration of the surface solar radiation'
347         WRITE(numout,*) '~~~~~~~~~~~~'
348         WRITE(numout,*) '   Namelist namtra_qsr : set the parameter of penetration'
349         WRITE(numout,*) '      RGB (Red-Green-Blue) light penetration       ln_qsr_rgb = ', ln_qsr_rgb
350         WRITE(numout,*) '      2 band               light penetration       ln_qsr_2bd = ', ln_qsr_2bd
351         WRITE(numout,*) '      bio-model            light penetration       ln_qsr_bio = ', ln_qsr_bio
352         WRITE(numout,*) '      light penetration for ice-model (LIM3)       ln_qsr_ice = ', ln_qsr_ice
353         WRITE(numout,*) '      RGB : Chl data (=1) or cst value (=0)        nn_chldta  = ', nn_chldta
354         WRITE(numout,*) '      RGB & 2 bands: fraction of light (rn_si1)    rn_abs     = ', rn_abs
355         WRITE(numout,*) '      RGB & 2 bands: shortess depth of extinction  rn_si0     = ', rn_si0
356         WRITE(numout,*) '      2 bands: longest depth of extinction         rn_si1     = ', rn_si1
357         WRITE(numout,*)
358      ENDIF
359      !
360      ioptio = 0                    ! Parameter control
361      IF( ln_qsr_rgb  )   ioptio = ioptio + 1
362      IF( ln_qsr_2bd  )   ioptio = ioptio + 1
363      IF( ln_qsr_bio  )   ioptio = ioptio + 1
364      !
365      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE type of light penetration in namelist namtra_qsr',  &
366         &                               ' 2 bands, 3 RGB bands or bio-model light penetration' )
367      !
368      IF( ln_qsr_rgb .AND. nn_chldta == 0 )   nqsr = np_RGB 
369      IF( ln_qsr_rgb .AND. nn_chldta == 1 )   nqsr = np_RGBc
370      IF( ln_qsr_2bd                      )   nqsr = np_2BD
371      IF( ln_qsr_bio                      )   nqsr = np_BIO
372      !
373      !                             ! Initialisation
374      xsi0r = 1._wp / rn_si0
375      xsi1r = 1._wp / rn_si1
376      !
377      SELECT CASE( nqsr )
378      !                               
379      CASE( np_RGB , np_RGBc )         !==  Red-Green-Blue light penetration  ==!
380         !                             
381         IF(lwp)   WRITE(numout,*) '   R-G-B   light penetration '
382         !
383         CALL trc_oce_rgb( rkrgb )                 ! tabulated attenuation coef.
384         !                                   
385         nksr = trc_oce_ext_lev( r_si2, 33._wp )   ! level of light extinction
386         !
387         IF(lwp) WRITE(numout,*) '        level of light extinction = ', nksr, ' ref depth = ', gdepw_1d(nksr+1), ' m'
388         !
389         IF( nqsr == np_RGBc ) THEN                ! Chl data : set sf_chl structure
390            IF(lwp) WRITE(numout,*) '        Chlorophyll read in a file'
391            ALLOCATE( sf_chl(1), STAT=ierror )
392            IF( ierror > 0 ) THEN
393               CALL ctl_stop( 'tra_qsr_init: unable to allocate sf_chl structure' )   ;   RETURN
394            ENDIF
395            ALLOCATE( sf_chl(1)%fnow(jpi,jpj,1)   )
396            IF( sn_chl%ln_tint )   ALLOCATE( sf_chl(1)%fdta(jpi,jpj,1,2) )
397            !                                        ! fill sf_chl with sn_chl and control print
398            CALL fld_fill( sf_chl, (/ sn_chl /), cn_dir, 'tra_qsr_init',   &
399               &           'Solar penetration function of read chlorophyll', 'namtra_qsr' , no_print )
400         ENDIF
401         IF( nqsr == np_RGB ) THEN                 ! constant Chl
402            IF(lwp) WRITE(numout,*) '        Constant Chlorophyll concentration = 0.05'
403         ENDIF
404         !
405      CASE( np_2BD )                   !==  2 bands light penetration  ==!
406         !
407         IF(lwp)  WRITE(numout,*) '   2 bands light penetration'
408         !
409         nksr = trc_oce_ext_lev( rn_si1, 100._wp )    ! level of light extinction
410         IF(lwp) WRITE(numout,*) '        level of light extinction = ', nksr, ' ref depth = ', gdepw_1d(nksr+1), ' m'
411         !
412      CASE( np_BIO )                   !==  BIO light penetration  ==!
413         !
414         IF(lwp) WRITE(numout,*) '   bio-model light penetration'
415         IF( .NOT.lk_top )   CALL ctl_stop( 'No bio model : ln_qsr_bio = true impossible ' )
416         !
417      END SELECT
418      !
419      qsr_hc(:,:,:) = 0._wp     ! now qsr heat content set to zero where it will not be computed
420      !
421      ! 1st ocean level attenuation coefficient (used in sbcssm)
422      IF( iom_varid( numror, 'fraqsr_1lev', ldstop = .FALSE. ) > 0 ) THEN
423         CALL iom_get( numror, jpdom_autoglo, 'fraqsr_1lev'  , fraqsr_1lev  )
424      ELSE
425         fraqsr_1lev(:,:) = 1._wp   ! default : no penetration
426      ENDIF
427      !
428      IF( nn_timing == 1 )   CALL timing_stop('tra_qsr_init')
429      !
430   END SUBROUTINE tra_qsr_init
431
432   !!======================================================================
433END MODULE traqsr
Note: See TracBrowser for help on using the repository browser.