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
RevLine 
[3]1MODULE traqsr
2   !!======================================================================
3   !!                       ***  MODULE  traqsr  ***
4   !! Ocean physics: solar radiation penetration in the top ocean levels
5   !!======================================================================
[786]6   !! History :  OPA  !  90-10  (B. Blanke)  Original code
[503]7   !!            7.0  !  91-11  (G. Madec)
8   !!                 !  96-01  (G. Madec)  s-coordinates
[786]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
[3]12   !!----------------------------------------------------------------------
[503]13
14   !!----------------------------------------------------------------------
[3]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
[719]20   USE trdmod          ! ocean active tracers trends
[708]21   USE trdmod_oce      ! ocean variables trends
[3]22   USE in_out_manager  ! I/O manager
[719]23   USE trc_oce         ! share SMS/Ocean variables
24   USE ocesbc          ! thermohaline fluxes
[3]25   USE phycst          ! physical constants
[258]26   USE prtctl          ! Print control
[3]27
28   IMPLICIT NONE
29   PRIVATE
30
[503]31   PUBLIC   tra_qsr      ! routine called by step.F90 (ln_traqsr=T)
32   PUBLIC   tra_qsr_init ! routine called by opa.F90
[3]33
[503]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
[187]40   
[503]41   INTEGER ::   nksr   ! number of levels
42   REAL(wp), DIMENSION(jpk) ::   gdsr   ! profile of the solar flux penetration
[3]43
44   !! * Substitutions
45#  include "domzgr_substitute.h90"
46#  include "vectopt_loop_substitute.h90"
47   !!----------------------------------------------------------------------
[786]48   !! NEMO/OPA 2.4 , LOCEAN-IPSL (2008)
49   !! $Id:$
[503]50   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
[3]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')
[503]79      !!----------------------------------------------------------------------
80      INTEGER, INTENT(in) ::   kt     ! ocean time-step
81      !!
[786]82      INTEGER  ::   ji, jj, jk       ! dummy loop indexes
[503]83      REAL(wp) ::   zc0 , zta         ! temporary scalars
[786]84      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztrdt   ! 3D workspace
[3]85      !!----------------------------------------------------------------------
[216]86
[3]87      IF( kt == nit000 ) THEN
[503]88         IF(lwp) WRITE(numout,*)
89         IF(lwp) WRITE(numout,*) 'tra_qsr : penetration of the surface solar radiation'
90         IF(lwp) WRITE(numout,*) '~~~~~~~'
[457]91         CALL tra_qsr_init
[3]92      ENDIF
93
[786]94      IF( l_trdtra ) ztrdt(:,:,:) = ta(:,:,:)      ! Save ta and sa trends
[216]95
[457]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            !                                                ! ===============
[3]103            DO jj = 2, jpjm1
104               DO ji = fs_2, fs_jpim1   ! vector opt.
[457]105                  zc0 = ro0cpr  / fse3t(ji,jj,jk)         ! compute the qsr trend
[187]106                  zta = zc0 * ( etot3(ji,jj,jk  ) * tmask(ji,jj,jk)     &
107                     &        - etot3(ji,jj,jk+1) * tmask(ji,jj,jk+1) )
[3]108                  ta(ji,jj,jk) = ta(ji,jj,jk) + zta       ! add qsr trend to the temperature trend
109               END DO
110            END DO
[457]111            !                                                ! ===============
112         END DO                                              !   End of slab
113         !                                                   ! ===============
[216]114
[457]115      ! ---------------------------------------------- !
116      !  Ocean alone :
117      ! ---------------------------------------------- !
[187]118      ELSE
[216]119         !                                                ! =================== !
[457]120         IF( ln_sco ) THEN                                !    s-coordinate     !
121            !                                             ! =================== !
122            DO jk = 1, jpkm1
123               ta(:,:,jk) = ta(:,:,jk) + etot3(:,:,jk) * qsr(:,:)
124            END DO
[187]125         ENDIF
126         !                                                ! =================== !
[457]127         IF( ln_zps ) THEN                                !    partial steps    !
[187]128            !                                             ! =================== !
[457]129            DO jk = 1, nksr
[187]130               DO jj = 2, jpjm1
131                  DO ji = fs_2, fs_jpim1   ! vector opt.
[457]132                     ! qsr trend from gdsr
133                     zc0 = qsr(ji,jj) / fse3t(ji,jj,jk)
[187]134                     zta = zc0 * ( gdsr(jk) * tmask(ji,jj,jk) - gdsr(jk+1) * tmask(ji,jj,jk+1) )
[457]135                     ! add qsr trend to the temperature trend
136                     ta(ji,jj,jk) = ta(ji,jj,jk) + zta
[187]137                  END DO
138               END DO
[457]139            END DO
[187]140         ENDIF
141         !                                                ! =================== !
[457]142         IF( ln_zco ) THEN                                !     z-coordinate    !
[187]143            !                                             ! =================== !
[457]144            DO jk = 1, nksr
145               zc0 = 1. / e3t_0(jk)
[187]146               DO jj = 2, jpjm1
147                  DO ji = fs_2, fs_jpim1   ! vector opt.
[457]148                     ! qsr trend
[187]149                     zta = qsr(ji,jj) * zc0 * ( gdsr(jk)*tmask(ji,jj,jk) - gdsr(jk+1)*tmask(ji,jj,jk+1) )
[457]150                     ! add qsr trend to the temperature trend
151                     ta(ji,jj,jk) = ta(ji,jj,jk) + zta     
[187]152                  END DO
153               END DO
[457]154            END DO
[187]155         ENDIF
156         !
[3]157      ENDIF
158
[786]159      IF( l_trdtra )   THEN                      ! qsr tracer trend saved for diagnostics
[457]160         ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:)
[786]161         CALL trd_tra( kt, jp_tem, jpt_trd_qsr, 'TRA', ptrd3d=ztrdt)
[3]162      ENDIF
[457]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' )
[503]165      !
[3]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      !!
[503]184      !! Reference : Jerlov, N. G., 1968 Optical Oceanography, Elsevier, 194pp.
[3]185      !!----------------------------------------------------------------------
[503]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   !    "         "
[541]190
191      NAMELIST/namqsr/ ln_traqsr, rabs, xsi1, xsi2, ln_qsr_sms
[3]192      !!----------------------------------------------------------------------
193
[503]194      REWIND ( numnam )           ! Read Namelist namqsr : ratio and length of penetration
[3]195      READ   ( numnam, namqsr )
196
[503]197      IF( ln_traqsr  ) THEN       ! Parameter control and print
[457]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
[187]209         ENDIF
[3]210      ELSE
[457]211         IF(lwp) THEN
212            WRITE(numout,*)
213            WRITE(numout,*) 'tra_qsr_init : NO solar flux penetration'
214            WRITE(numout,*) '~~~~~~~~~~~~'
215         ENDIF
[3]216      ENDIF
217
[474]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' )
[3]220
[503]221      !                           ! Initialization of gdsr
[457]222      IF( ln_zco .OR. ln_zps ) THEN
[503]223         !
[457]224         ! z-coordinate with or without partial step : same w-level everywhere inside the ocean
[230]225         gdsr(:) = 0.e0
[3]226         DO jk = 1, jpk
[457]227            zdp1 = -gdepw_0(jk)
[3]228            gdsr(jk) = ro0cpr * (  rabs  * EXP( zdp1/xsi1 ) + (1.-rabs) * EXP( zdp1/xsi2 )  )
[230]229            IF ( gdsr(jk) <= 1.e-10 ) EXIT
[3]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
[187]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
[457]251               zcst = gdsr(jk) / ro0cpr
252               etot3(:,:,jk) = qsr(:,:) * zcst * tmask(:,:,jk) 
[187]253            END DO
254         ENDIF
[503]255         !
[3]256      ENDIF
257
[457]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
[503]274      ENDIF
275      !
[3]276   END SUBROUTINE tra_qsr_init
277
278   !!======================================================================
279END MODULE traqsr
Note: See TracBrowser for help on using the repository browser.