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 NEMO/branches/2018/dev_r9838_ENHANCE04_RK3/src/OCE/TRA – NEMO

source: NEMO/branches/2018/dev_r9838_ENHANCE04_RK3/src/OCE/TRA/traqsr.F90 @ 9939

Last change on this file since 9939 was 9939, checked in by gm, 6 years ago

#1911 (ENHANCE-04): RK3 branche phased with MLF@9937 branche

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