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/UKMO/NEMO_4.0_mirror_text_diagnostics/src/OCE/TRA – NEMO

source: NEMO/branches/UKMO/NEMO_4.0_mirror_text_diagnostics/src/OCE/TRA/traqsr.F90 @ 14565

Last change on this file since 14565 was 10986, checked in by andmirek, 5 years ago

GMED 462 add flush

File size: 22.1 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 license (see ./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 ] / (rau0*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, ztrdt
115      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zetot, zchl3d
116      !!----------------------------------------------------------------------
117      !
118      IF( ln_timing )   CALL timing_start('tra_qsr')
119      !
120      IF( kt == nit000 .AND. lwp) THEN
121         WRITE(numout,*)
122         WRITE(numout,*) 'tra_qsr : penetration of the surface solar radiation'
123         WRITE(numout,*) '~~~~~~~'
124         IF(lflush) CALL FLUSH(numout)
125      ENDIF
126      !
127      IF( l_trdtra ) THEN      ! trends diagnostic: save the input temperature trend
128         ALLOCATE( ztrdt(jpi,jpj,jpk) ) 
129         ztrdt(:,:,:) = tsa(:,:,:,jp_tem)
130      ENDIF
131      !
132      !                         !-----------------------------------!
133      !                         !  before qsr induced heat content  !
134      !                         !-----------------------------------!
135      IF( kt == nit000 ) THEN          !==  1st time step  ==!
136!!gm case neuler  not taken into account....
137         IF( ln_rstart .AND. iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0 ) THEN    ! read in restart
138            IF(lwp .AND. nprint >0) THEN
139               WRITE(numout,*) '          nit000-1 qsr tracer content forcing field read in the restart file'
140               IF(lflush) CALL FLUSH(numout)
141            ENDIF
142            z1_2 = 0.5_wp
143            CALL iom_get( numror, jpdom_autoglo, 'qsr_hc_b', qsr_hc_b, ldxios = lrxios )   ! before heat content trend due to Qsr flux
144         ELSE                                           ! No restart or restart not found: Euler forward time stepping
145            z1_2 = 1._wp
146            qsr_hc_b(:,:,:) = 0._wp
147         ENDIF
148      ELSE                             !==  Swap of qsr heat content  ==!
149         z1_2 = 0.5_wp
150         qsr_hc_b(:,:,:) = qsr_hc(:,:,:)
151      ENDIF
152      !
153      !                         !--------------------------------!
154      SELECT CASE( nqsr )       !  now qsr induced heat content  !
155      !                         !--------------------------------!
156      !
157      CASE( np_BIO )                   !==  bio-model fluxes  ==!
158         !
159         DO jk = 1, nksr
160            qsr_hc(:,:,jk) = r1_rau0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) )
161         END DO
162         !
163      CASE( np_RGB , np_RGBc )         !==  R-G-B fluxes  ==!
164         !
165         ALLOCATE( zekb(jpi,jpj)     , zekg(jpi,jpj)     , zekr  (jpi,jpj)     , &
166            &      ze0 (jpi,jpj,jpk) , ze1 (jpi,jpj,jpk) , ze2   (jpi,jpj,jpk) , &
167            &      ze3 (jpi,jpj,jpk) , zea (jpi,jpj,jpk) , zchl3d(jpi,jpj,jpk)   ) 
168         !
169         IF( nqsr == np_RGBc ) THEN          !*  Variable Chlorophyll
170            CALL fld_read( kt, 1, sf_chl )         ! Read Chl data and provides it at the current time step
171            DO jk = 1, nksr + 1
172               DO jj = 2, jpjm1                       ! Separation in R-G-B depending of the surface Chl
173                  DO ji = fs_2, fs_jpim1
174                     zchl    = sf_chl(1)%fnow(ji,jj,1)
175                     zCtot   = 40.6  * zchl**0.459
176                     zze     = 568.2 * zCtot**(-0.746)
177                     IF( zze > 102. ) zze = 200.0 * zCtot**(-0.293)
178                     zpsi    = gdepw_n(ji,jj,jk) / zze
179                     !
180                     zlogc   = LOG( zchl )
181                     zlogc2  = zlogc * zlogc
182                     zlogc3  = zlogc * zlogc * zlogc
183                     zCb     = 0.768 + 0.087 * zlogc - 0.179 * zlogc2 - 0.025 * zlogc3
184                     zCmax   = 0.299 - 0.289 * zlogc + 0.579 * zlogc2
185                     zpsimax = 0.6   - 0.640 * zlogc + 0.021 * zlogc2 + 0.115 * zlogc3
186                     zdelpsi = 0.710 + 0.159 * zlogc + 0.021 * zlogc2
187                     zCze    = 1.12  * (zchl)**0.803 
188                     !
189                     zchl3d(ji,jj,jk) = zCze * ( zCb + zCmax * EXP( -( (zpsi - zpsimax) / zdelpsi )**2 ) )
190                  END DO
191                  !
192               END DO
193            END DO
194         ELSE                                !* constant chrlorophyll
195           DO jk = 1, nksr + 1
196              zchl3d(:,:,jk) = 0.05 
197            ENDDO
198         ENDIF
199         !
200         zcoef  = ( 1. - rn_abs ) / 3._wp    !* surface equi-partition in R-G-B
201         DO jj = 2, jpjm1
202            DO ji = fs_2, fs_jpim1
203               ze0(ji,jj,1) = rn_abs * qsr(ji,jj)
204               ze1(ji,jj,1) = zcoef  * qsr(ji,jj)
205               ze2(ji,jj,1) = zcoef  * qsr(ji,jj)
206               ze3(ji,jj,1) = zcoef  * qsr(ji,jj)
207               zea(ji,jj,1) =          qsr(ji,jj)
208            END DO
209         END DO
210         !
211         DO jk = 2, nksr+1                   !* interior equi-partition in R-G-B depending of vertical profile of Chl
212            DO jj = 2, jpjm1
213               DO ji = fs_2, fs_jpim1
214                  zchl = MIN( 10. , MAX( 0.03, zchl3d(ji,jj,jk) ) )
215                  irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 )
216                  zekb(ji,jj) = rkrgb(1,irgb)
217                  zekg(ji,jj) = rkrgb(2,irgb)
218                  zekr(ji,jj) = rkrgb(3,irgb)
219               END DO
220            END DO
221
222            DO jj = 2, jpjm1
223               DO ji = fs_2, fs_jpim1
224                  zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * xsi0r       )
225                  zc1 = ze1(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekb(ji,jj) )
226                  zc2 = ze2(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekg(ji,jj) )
227                  zc3 = ze3(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekr(ji,jj) )
228                  ze0(ji,jj,jk) = zc0
229                  ze1(ji,jj,jk) = zc1
230                  ze2(ji,jj,jk) = zc2
231                  ze3(ji,jj,jk) = zc3
232                  zea(ji,jj,jk) = ( zc0 + zc1 + zc2 + zc3 ) * wmask(ji,jj,jk)
233               END DO
234            END DO
235         END DO
236         !
237         DO jk = 1, nksr                     !* now qsr induced heat content
238            DO jj = 2, jpjm1
239               DO ji = fs_2, fs_jpim1
240                  qsr_hc(ji,jj,jk) = r1_rau0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) )
241               END DO
242            END DO
243         END DO
244         !
245         DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d ) 
246         !
247      CASE( np_2BD  )            !==  2-bands fluxes  ==!
248         !
249         zz0 =        rn_abs   * r1_rau0_rcp      ! surface equi-partition in 2-bands
250         zz1 = ( 1. - rn_abs ) * r1_rau0_rcp
251         DO jk = 1, nksr                          ! solar heat absorbed at T-point in the top 400m
252            DO jj = 2, jpjm1
253               DO ji = fs_2, fs_jpim1
254                  zc0 = zz0 * EXP( -gdepw_n(ji,jj,jk  )*xsi0r ) + zz1 * EXP( -gdepw_n(ji,jj,jk  )*xsi1r )
255                  zc1 = zz0 * EXP( -gdepw_n(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -gdepw_n(ji,jj,jk+1)*xsi1r )
256                  qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0 * wmask(ji,jj,jk) - zc1 * wmask(ji,jj,jk+1) ) 
257               END DO
258            END DO
259         END DO
260         !
261      END SELECT
262      !
263      !                          !-----------------------------!
264      DO jk = 1, nksr            !  update to the temp. trend  !
265         DO jj = 2, jpjm1        !-----------------------------!
266            DO ji = fs_2, fs_jpim1   ! vector opt.
267               tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)   &
268                  &                 + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) / e3t_n(ji,jj,jk)
269            END DO
270         END DO
271      END DO
272      !
273      ! sea-ice: store the 1st ocean level attenuation coefficient
274      DO jj = 2, jpjm1 
275         DO ji = fs_2, fs_jpim1   ! vector opt.
276            IF( qsr(ji,jj) /= 0._wp ) THEN   ;   fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rau0_rcp * qsr(ji,jj) )
277            ELSE                             ;   fraqsr_1lev(ji,jj) = 1._wp
278            ENDIF
279         END DO
280      END DO
281      CALL lbc_lnk( 'traqsr', fraqsr_1lev(:,:), 'T', 1._wp )
282      !
283      IF( iom_use('qsr3d') ) THEN      ! output the shortwave Radiation distribution
284         ALLOCATE( zetot(jpi,jpj,jpk) )
285         zetot(:,:,nksr+1:jpk) = 0._wp     ! below ~400m set to zero
286         DO jk = nksr, 1, -1
287            zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rau0_rcp
288         END DO         
289         CALL iom_put( 'qsr3d', zetot )   ! 3D distribution of shortwave Radiation
290         DEALLOCATE( zetot ) 
291      ENDIF
292      !
293      IF( lrst_oce ) THEN     ! write in the ocean restart file
294         IF( lwxios ) CALL iom_swap(      cwxios_context          )
295         CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b'   , qsr_hc     , ldxios = lwxios )
296         CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev, ldxios = lwxios ) 
297         IF( lwxios ) CALL iom_swap(      cxios_context          )
298      ENDIF
299      !
300      IF( l_trdtra ) THEN     ! qsr tracers trends saved for diagnostics
301         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:)
302         CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt )
303         DEALLOCATE( ztrdt ) 
304      ENDIF
305      !                       ! print mean trends (used for debugging)
306      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' )
307      !
308      IF( ln_timing )   CALL timing_stop('tra_qsr')
309      !
310   END SUBROUTINE tra_qsr
311
312
313   SUBROUTINE tra_qsr_init
314      !!----------------------------------------------------------------------
315      !!                  ***  ROUTINE tra_qsr_init  ***
316      !!
317      !! ** Purpose :   Initialization for the penetrative solar radiation
318      !!
319      !! ** Method  :   The profile of solar radiation within the ocean is set
320      !!      from two length scale of penetration (rn_si0,rn_si1) and a ratio
321      !!      (rn_abs). These parameters are read in the namtra_qsr namelist. The
322      !!      default values correspond to clear water (type I in Jerlov'
323      !!      (1968) classification.
324      !!         called by tra_qsr at the first timestep (nit000)
325      !!
326      !! ** Action  : - initialize rn_si0, rn_si1 and rn_abs
327      !!
328      !! Reference : Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp.
329      !!----------------------------------------------------------------------
330      INTEGER  ::   ji, jj, jk                  ! dummy loop indices
331      INTEGER  ::   ios, irgb, ierror, ioptio   ! local integer
332      REAL(wp) ::   zz0, zc0 , zc1, zcoef      ! local scalars
333      REAL(wp) ::   zz1, zc2 , zc3, zchl       !   -      -
334      !
335      CHARACTER(len=100) ::   cn_dir   ! Root directory for location of ssr files
336      TYPE(FLD_N)        ::   sn_chl   ! informations about the chlorofyl field to be read
337      !!
338      NAMELIST/namtra_qsr/  sn_chl, cn_dir, ln_qsr_rgb, ln_qsr_2bd, ln_qsr_bio,  &
339         &                  nn_chldta, rn_abs, rn_si0, rn_si1
340      !!----------------------------------------------------------------------
341      !
342      REWIND( numnam_ref )              ! Namelist namtra_qsr in reference     namelist
343      READ  ( numnam_ref, namtra_qsr, IOSTAT = ios, ERR = 901)
344901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtra_qsr in reference namelist', lwp )
345      !
346      REWIND( numnam_cfg )              ! Namelist namtra_qsr in configuration namelist
347      READ  ( numnam_cfg, namtra_qsr, IOSTAT = ios, ERR = 902 )
348902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtra_qsr in configuration namelist', lwp )
349      IF(lwm .AND. nprint > 2) WRITE ( numond, namtra_qsr )
350      !
351      IF(lwp) THEN                ! control print
352         WRITE(numout,*)
353         WRITE(numout,*) 'tra_qsr_init : penetration of the surface solar radiation'
354         WRITE(numout,*) '~~~~~~~~~~~~'
355         WRITE(numout,*) '   Namelist namtra_qsr : set the parameter of penetration'
356         WRITE(numout,*) '      RGB (Red-Green-Blue) light penetration       ln_qsr_rgb = ', ln_qsr_rgb
357         WRITE(numout,*) '      2 band               light penetration       ln_qsr_2bd = ', ln_qsr_2bd
358         WRITE(numout,*) '      bio-model            light penetration       ln_qsr_bio = ', ln_qsr_bio
359         WRITE(numout,*) '      RGB : Chl data (=1) or cst value (=0)        nn_chldta  = ', nn_chldta
360         WRITE(numout,*) '      RGB & 2 bands: fraction of light (rn_si1)    rn_abs     = ', rn_abs
361         WRITE(numout,*) '      RGB & 2 bands: shortess depth of extinction  rn_si0     = ', rn_si0
362         WRITE(numout,*) '      2 bands: longest depth of extinction         rn_si1     = ', rn_si1
363         WRITE(numout,*)
364         IF(lflush) CALL FLUSH(numout)
365      ENDIF
366      !
367      ioptio = 0                    ! Parameter control
368      IF( ln_qsr_rgb  )   ioptio = ioptio + 1
369      IF( ln_qsr_2bd  )   ioptio = ioptio + 1
370      IF( ln_qsr_bio  )   ioptio = ioptio + 1
371      !
372      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE type of light penetration in namelist namtra_qsr',  &
373         &                               ' 2 bands, 3 RGB bands or bio-model light penetration' )
374      !
375      IF( ln_qsr_rgb .AND. nn_chldta == 0 )   nqsr = np_RGB 
376      IF( ln_qsr_rgb .AND. nn_chldta == 1 )   nqsr = np_RGBc
377      IF( ln_qsr_2bd                      )   nqsr = np_2BD
378      IF( ln_qsr_bio                      )   nqsr = np_BIO
379      !
380      !                             ! Initialisation
381      xsi0r = 1._wp / rn_si0
382      xsi1r = 1._wp / rn_si1
383      !
384      SELECT CASE( nqsr )
385      !                               
386      CASE( np_RGB , np_RGBc )         !==  Red-Green-Blue light penetration  ==!
387         !                             
388         IF(lwp)   WRITE(numout,*) '   ==>>>   R-G-B   light penetration '
389         !
390         CALL trc_oce_rgb( rkrgb )                 ! tabulated attenuation coef.
391         !                                   
392         nksr = trc_oce_ext_lev( r_si2, 33._wp )   ! level of light extinction
393         !
394         IF(lwp) WRITE(numout,*) '        level of light extinction = ', nksr, ' ref depth = ', gdepw_1d(nksr+1), ' m'
395         !
396         IF( nqsr == np_RGBc ) THEN                ! Chl data : set sf_chl structure
397            IF(lwp) WRITE(numout,*) '   ==>>>   Chlorophyll read in a file'
398            ALLOCATE( sf_chl(1), STAT=ierror )
399            IF( ierror > 0 ) THEN
400               CALL ctl_stop( 'tra_qsr_init: unable to allocate sf_chl structure' )   ;   RETURN
401            ENDIF
402            ALLOCATE( sf_chl(1)%fnow(jpi,jpj,1)   )
403            IF( sn_chl%ln_tint )   ALLOCATE( sf_chl(1)%fdta(jpi,jpj,1,2) )
404            !                                        ! fill sf_chl with sn_chl and control print
405            CALL fld_fill( sf_chl, (/ sn_chl /), cn_dir, 'tra_qsr_init',   &
406               &           'Solar penetration function of read chlorophyll', 'namtra_qsr' , no_print )
407         ENDIF
408         IF( nqsr == np_RGB ) THEN                 ! constant Chl
409            IF(lwp) WRITE(numout,*) '   ==>>>   Constant Chlorophyll concentration = 0.05'
410         ENDIF
411         !
412      CASE( np_2BD )                   !==  2 bands light penetration  ==!
413         !
414         IF(lwp)  WRITE(numout,*) '   ==>>>   2 bands light penetration'
415         !
416         nksr = trc_oce_ext_lev( rn_si1, 100._wp )    ! level of light extinction
417         IF(lwp) WRITE(numout,*) '        level of light extinction = ', nksr, ' ref depth = ', gdepw_1d(nksr+1), ' m'
418         !
419      CASE( np_BIO )                   !==  BIO light penetration  ==!
420         !
421         IF(lwp) WRITE(numout,*) '   ==>>>   bio-model light penetration'
422         IF( .NOT.lk_top )   CALL ctl_stop( 'No bio model : ln_qsr_bio = true impossible ' )
423         !
424      END SELECT
425      IF(lwp .AND. lflush) CALL FLUSH(numout)
426      !
427      qsr_hc(:,:,:) = 0._wp     ! now qsr heat content set to zero where it will not be computed
428      !
429      ! 1st ocean level attenuation coefficient (used in sbcssm)
430      IF( iom_varid( numror, 'fraqsr_1lev', ldstop = .FALSE. ) > 0 ) THEN
431         CALL iom_get( numror, jpdom_autoglo, 'fraqsr_1lev'  , fraqsr_1lev, ldxios = lrxios  )
432      ELSE
433         fraqsr_1lev(:,:) = 1._wp   ! default : no penetration
434      ENDIF
435      !
436      IF( lwxios ) THEN
437         CALL iom_set_rstw_var_active('qsr_hc_b')
438         CALL iom_set_rstw_var_active('fraqsr_1lev')
439      ENDIF
440      !
441   END SUBROUTINE tra_qsr_init
442
443   !!======================================================================
444END MODULE traqsr
Note: See TracBrowser for help on using the repository browser.