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/dev_001_GM/NEMO/OPA_SRC/TRA – NEMO

source: branches/dev_001_GM/NEMO/OPA_SRC/TRA/traqsr.F90 @ 786

Last change on this file since 786 was 786, checked in by gm, 16 years ago

dev_001_GM - merge TRC-TRA on OPA only, trabbl & zpshde not done and trdmld not OK - compilation OK

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.7 KB
Line 
1MODULE traqsr
2   !!======================================================================
3   !!                       ***  MODULE  traqsr  ***
4   !! Ocean physics: solar radiation penetration in the top ocean levels
5   !!======================================================================
6   !! History :  OPA  !  90-10  (B. Blanke)  Original code
7   !!            7.0  !  91-11  (G. Madec)
8   !!                 !  96-01  (G. Madec)  s-coordinates
9   !!  NEMO      1.0  !  02-06  (G. Madec)  F90: Free form and module
10   !!             -   !  05-11  (G. Madec) zco, zps, sco coordinate
11   !!            2.4  !  08-01  (G. Madec) Merge TRA-TRC
12   !!----------------------------------------------------------------------
13
14   !!----------------------------------------------------------------------
15   !!   tra_qsr      : trend due to the solar radiation penetration
16   !!   tra_qsr_init : solar radiation penetration initialization
17   !!----------------------------------------------------------------------
18   USE oce             ! ocean dynamics and active tracers
19   USE dom_oce         ! ocean space and time domain
20   USE trdmod          ! ocean active tracers trends
21   USE trdmod_oce      ! ocean variables trends
22   USE in_out_manager  ! I/O manager
23   USE trc_oce         ! share SMS/Ocean variables
24   USE ocesbc          ! thermohaline fluxes
25   USE phycst          ! physical constants
26   USE prtctl          ! Print control
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   tra_qsr      ! routine called by step.F90 (ln_traqsr=T)
32   PUBLIC   tra_qsr_init ! routine called by opa.F90
33
34   !!* Namelist namqsr: penetrative solar radiation
35   LOGICAL , PUBLIC ::   ln_traqsr = .TRUE.   !: qsr flag (Default=T)
36   REAL(wp), PUBLIC ::   rabs = 0.58_wp       ! fraction associated with xsi1
37   REAL(wp), PUBLIC ::   xsi1 = 0.35_wp       ! first depth of extinction
38   REAL(wp), PUBLIC ::   xsi2 = 23.0_wp       ! second depth of extinction (default values: water type Ib)
39   LOGICAL , PUBLIC ::   ln_qsr_sms = .false. ! flag to use or not the biological fluxes for light
40   
41   INTEGER ::   nksr   ! number of levels
42   REAL(wp), DIMENSION(jpk) ::   gdsr   ! profile of the solar flux penetration
43
44   !! * Substitutions
45#  include "domzgr_substitute.h90"
46#  include "vectopt_loop_substitute.h90"
47   !!----------------------------------------------------------------------
48   !! NEMO/OPA 2.4 , LOCEAN-IPSL (2008)
49   !! $Id:$
50   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
51   !!----------------------------------------------------------------------
52
53CONTAINS
54
55   SUBROUTINE tra_qsr( kt )
56      !!----------------------------------------------------------------------
57      !!                  ***  ROUTINE tra_qsr  ***
58      !!
59      !! ** Purpose :   Compute the temperature trend due to the solar radiation
60      !!      penetration and add it to the general temperature trend.
61      !!
62      !! ** Method  : The profile of the solar radiation within the ocean is
63      !!      defined through two penetration length scale (xsr1,xsr2) and a
64      !!      ratio (rabs) as :
65      !!         I(k) = Qsr*( rabs*EXP(z(k)/xsr1) + (1.-rabs)*EXP(z(k)/xsr2) )
66      !!         The temperature trend associated with the solar radiation
67      !!      penetration is given by :
68      !!            zta = 1/e3t dk[ I ] / (rau0*Cp)
69      !!         At the bottom, boudary condition for the radiation is no flux :
70      !!      all heat which has not been absorbed in the above levels is put
71      !!      in the last ocean level.
72      !!         In z-coordinate case, the computation is only done down to the
73      !!      level where I(k) < 1.e-15 W/m2. In addition, the coefficients
74      !!      used for the computation are calculated one for once as they
75      !!      depends on k only.
76      !!
77      !! ** Action  : - update ta with the penetrative solar radiation trend
78      !!              - save the trend in ttrd ('key_trdtra')
79      !!----------------------------------------------------------------------
80      INTEGER, INTENT(in) ::   kt     ! ocean time-step
81      !!
82      INTEGER  ::   ji, jj, jk       ! dummy loop indexes
83      REAL(wp) ::   zc0 , zta         ! temporary scalars
84      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztrdt   ! 3D workspace
85      !!----------------------------------------------------------------------
86
87      IF( kt == nit000 ) THEN
88         IF(lwp) WRITE(numout,*)
89         IF(lwp) WRITE(numout,*) 'tra_qsr : penetration of the surface solar radiation'
90         IF(lwp) WRITE(numout,*) '~~~~~~~'
91         CALL tra_qsr_init
92      ENDIF
93
94      IF( l_trdtra ) ztrdt(:,:,:) = ta(:,:,:)      ! Save ta and sa trends
95
96      ! ---------------------------------------------- !
97      !  Biological fluxes  : all vertical coordinate  !
98      ! ---------------------------------------------- !
99      IF( lk_qsr_sms .AND. ln_qsr_sms ) THEN     
100         !                                                   ! ===============
101         DO jk = 1, jpkm1                                    ! Horizontal slab
102            !                                                ! ===============
103            DO jj = 2, jpjm1
104               DO ji = fs_2, fs_jpim1   ! vector opt.
105                  zc0 = ro0cpr  / fse3t(ji,jj,jk)         ! compute the qsr trend
106                  zta = zc0 * ( etot3(ji,jj,jk  ) * tmask(ji,jj,jk)     &
107                     &        - etot3(ji,jj,jk+1) * tmask(ji,jj,jk+1) )
108                  ta(ji,jj,jk) = ta(ji,jj,jk) + zta       ! add qsr trend to the temperature trend
109               END DO
110            END DO
111            !                                                ! ===============
112         END DO                                              !   End of slab
113         !                                                   ! ===============
114
115      ! ---------------------------------------------- !
116      !  Ocean alone :
117      ! ---------------------------------------------- !
118      ELSE
119         !                                                ! =================== !
120         IF( ln_sco ) THEN                                !    s-coordinate     !
121            !                                             ! =================== !
122            DO jk = 1, jpkm1
123               ta(:,:,jk) = ta(:,:,jk) + etot3(:,:,jk) * qsr(:,:)
124            END DO
125         ENDIF
126         !                                                ! =================== !
127         IF( ln_zps ) THEN                                !    partial steps    !
128            !                                             ! =================== !
129            DO jk = 1, nksr
130               DO jj = 2, jpjm1
131                  DO ji = fs_2, fs_jpim1   ! vector opt.
132                     ! qsr trend from gdsr
133                     zc0 = qsr(ji,jj) / fse3t(ji,jj,jk)
134                     zta = zc0 * ( gdsr(jk) * tmask(ji,jj,jk) - gdsr(jk+1) * tmask(ji,jj,jk+1) )
135                     ! add qsr trend to the temperature trend
136                     ta(ji,jj,jk) = ta(ji,jj,jk) + zta
137                  END DO
138               END DO
139            END DO
140         ENDIF
141         !                                                ! =================== !
142         IF( ln_zco ) THEN                                !     z-coordinate    !
143            !                                             ! =================== !
144            DO jk = 1, nksr
145               zc0 = 1. / e3t_0(jk)
146               DO jj = 2, jpjm1
147                  DO ji = fs_2, fs_jpim1   ! vector opt.
148                     ! qsr trend
149                     zta = qsr(ji,jj) * zc0 * ( gdsr(jk)*tmask(ji,jj,jk) - gdsr(jk+1)*tmask(ji,jj,jk+1) )
150                     ! add qsr trend to the temperature trend
151                     ta(ji,jj,jk) = ta(ji,jj,jk) + zta     
152                  END DO
153               END DO
154            END DO
155         ENDIF
156         !
157      ENDIF
158
159      IF( l_trdtra )   THEN                      ! qsr tracer trend saved for diagnostics
160         ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:)
161         CALL trd_tra( kt, jp_tem, jpt_trd_qsr, 'TRA', ptrd3d=ztrdt)
162      ENDIF
163      !                       ! print mean trends (used for debugging)
164      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' )
165      !
166   END SUBROUTINE tra_qsr
167
168
169   SUBROUTINE tra_qsr_init
170      !!----------------------------------------------------------------------
171      !!                  ***  ROUTINE tra_qsr_init  ***
172      !!
173      !! ** Purpose :   Initialization for the penetrative solar radiation
174      !!
175      !! ** Method  :   The profile of solar radiation within the ocean is set
176      !!      from two length scale of penetration (xsr1,xsr2) and a ratio
177      !!      (rabs). These parameters are read in the namqsr namelist. The
178      !!      default values correspond to clear water (type I in Jerlov'
179      !!      (1968) classification.
180      !!         called by tra_qsr at the first timestep (nit000)
181      !!
182      !! ** Action  : - initialize xsr1, xsr2 and rabs
183      !!
184      !! Reference : Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp.
185      !!----------------------------------------------------------------------
186      INTEGER  ::   ji, jj, jk   ! dummy loop index
187      INTEGER  ::   indic        ! temporary integer
188      REAL(wp) ::   zc0 , zc1 , zc2    ! temporary scalars
189      REAL(wp) ::   zcst, zdp1, zdp2   !    "         "
190
191      NAMELIST/namqsr/ ln_traqsr, rabs, xsi1, xsi2, ln_qsr_sms
192      !!----------------------------------------------------------------------
193
194      REWIND ( numnam )           ! Read Namelist namqsr : ratio and length of penetration
195      READ   ( numnam, namqsr )
196
197      IF( ln_traqsr  ) THEN       ! Parameter control and print
198         IF(lwp) THEN
199            WRITE(numout,*)
200            WRITE(numout,*) 'tra_qsr_init : penetration of the surface solar radiation'
201            WRITE(numout,*) '~~~~~~~~~~~~'
202            WRITE(numout,*) '    Namelist namqsr : set the parameter of penetration'
203            WRITE(numout,*) '        fraction associated with xsi     rabs        = ',rabs
204            WRITE(numout,*) '        first depth of extinction        xsi1        = ',xsi1
205            WRITE(numout,*) '        second depth of extinction       xsi2        = ',xsi2
206            IF( lk_qsr_sms ) THEN
207               WRITE(numout,*) '     Biological fluxes for light(Y/N) ln_qsr_sms  = ',ln_qsr_sms
208            ENDIF
209         ENDIF
210      ELSE
211         IF(lwp) THEN
212            WRITE(numout,*)
213            WRITE(numout,*) 'tra_qsr_init : NO solar flux penetration'
214            WRITE(numout,*) '~~~~~~~~~~~~'
215         ENDIF
216      ENDIF
217
218      IF( rabs > 1.e0 .OR. rabs < 0.e0 .OR. xsi1 < 0.e0 .OR. xsi2 < 0.e0 ) &
219         CALL ctl_stop( '             0<rabs<1, 0<xsi1, or 0<xsi2 not satisfied' )
220
221      !                           ! Initialization of gdsr
222      IF( ln_zco .OR. ln_zps ) THEN
223         !
224         ! z-coordinate with or without partial step : same w-level everywhere inside the ocean
225         gdsr(:) = 0.e0
226         DO jk = 1, jpk
227            zdp1 = -gdepw_0(jk)
228            gdsr(jk) = ro0cpr * (  rabs  * EXP( zdp1/xsi1 ) + (1.-rabs) * EXP( zdp1/xsi2 )  )
229            IF ( gdsr(jk) <= 1.e-10 ) EXIT
230         END DO
231         indic = 0
232         DO jk = 1, jpk
233            IF( gdsr(jk) <= 1.e-15 .AND. indic == 0 ) THEN
234               gdsr(jk) = 0.e0
235               nksr = jk
236               indic = 1
237            ENDIF
238         END DO
239         nksr = MIN( nksr, jpkm1 )
240         IF(lwp) THEN
241            WRITE(numout,*)
242            WRITE(numout,*) '        - z-coordinate, level max of computation =', nksr
243            WRITE(numout,*) '             profile of coef. of penetration:'
244            WRITE(numout,"('              ',7e11.2)") ( gdsr(jk), jk = 1, nksr )
245            WRITE(numout,*)
246         ENDIF
247         ! Initialisation of Biological fluxes for light here because
248         ! the optical biological model is call after the dynamical one
249         IF( lk_qsr_sms .AND. ln_qsr_sms ) THEN
250            DO jk = 1, jpkm1
251               zcst = gdsr(jk) / ro0cpr
252               etot3(:,:,jk) = qsr(:,:) * zcst * tmask(:,:,jk) 
253            END DO
254         ENDIF
255         !
256      ENDIF
257
258      ! Initialisation of etot3 (s-coordinate)
259      ! -----------------------
260      IF( ln_sco ) THEN
261         etot3(:,:,jpk) = 0.e0
262         DO jk = 1, jpkm1
263            DO jj = 1, jpj
264               DO ji = 1, jpi
265                  zdp1 = -fsdepw(ji,jj,jk  )
266                  zdp2 = -fsdepw(ji,jj,jk+1)
267                  zc0  = ro0cpr / fse3t(ji,jj,jk)
268                  zc1  =   (  rabs * EXP(zdp1/xsi1) + (1.-rabs) * EXP(zdp1/xsi2)  )
269                  zc2  = - (  rabs * EXP(zdp2/xsi1) + (1.-rabs) * EXP(zdp2/xsi2)  )
270                  etot3(ji,jj,jk)  = zc0 * (  zc1 * tmask(ji,jj,jk) + zc2 * tmask(ji,jj,jk+1)  )
271               END DO
272            END DO
273         END DO
274      ENDIF
275      !
276   END SUBROUTINE tra_qsr_init
277
278   !!======================================================================
279END MODULE traqsr
Note: See TracBrowser for help on using the repository browser.