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.
trcdms_medusa.F90 in branches/UKMO/dev_r5518_GO6_under_ice_relax_dr_hook/NEMOGCM/NEMO/TOP_SRC/MEDUSA – NEMO

source: branches/UKMO/dev_r5518_GO6_under_ice_relax_dr_hook/NEMOGCM/NEMO/TOP_SRC/MEDUSA/trcdms_medusa.F90 @ 11738

Last change on this file since 11738 was 11738, checked in by marc, 4 years ago

The Dr Hook changes from my perl code.

File size: 14.6 KB
Line 
1MODULE trcdms_medusa
2   !!======================================================================
3   !!                         ***  MODULE trcdms_medusa  ***
4   !! TOP :   MEDUSA
5   !!======================================================================
6   !! History :
7   !!  -   !  2014-08  (J. Palmieri - A. Yool)    added for UKESM1 project
8   !!  -   !  2017-05  (A. Yool)                  add extra Anderson scheme
9   !!  -   !  2018-10 (A. Yool)                   Add air-sea DMS flux
10   !!----------------------------------------------------------------------
11#if defined key_medusa && defined key_roam
12   !!----------------------------------------------------------------------
13   !!                                        MEDUSA DMS surface concentration
14   !!----------------------------------------------------------------------
15   !!   trc_dms_medusa        : 
16   !!----------------------------------------------------------------------
17      USE oce_trc
18      USE trc
19      USE sms_medusa
20      USE lbclnk
21      USE prtctl_trc      ! Print control for debugging
22      USE in_out_manager  ! I/O manager
23
24      USE yomhook, ONLY: lhook, dr_hook
25      USE parkind1, ONLY: jprb, jpim
26
27      IMPLICIT NONE
28      PRIVATE
29
30      PUBLIC   trc_dms_medusa    ! called in trc_bio_medusa
31      PUBLIC   dms_flux_ocn      ! called in air_sea
32
33   !!* Substitution
34#  include "domzgr_substitute.h90"
35   !!----------------------------------------------------------------------
36   !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007)
37   !! $Id$
38   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
39   !!----------------------------------------------------------------------
40
41
42CONTAINS
43
44!=======================================================================
45!
46   SUBROUTINE trc_dms_medusa( chn, chd, mld, xqsr, xdin, xlim,  &  !! inputs
47     &  dms_andr, dms_simo, dms_aran, dms_hall, dms_andm)           !! outputs
48!     
49!=======================================================================
50      !!
51      !! Title  : Calculates DMS ocean surface concentration
52      !! Author : Julien Palmieri and Andrew Yool
53      !! Date   : 08/08/14
54      !!
55      !! DMS module is called in trc_bio's huge jk,jj,ji loop
56      !! --> DMS concentration is calculated in a specific cell
57      !! (no need of ji,jj,jk)
58      !!
59      !! AXY (13/03/15): amend to include all four schemes tested
60      !!                 during winter/spring 2015; these are:
61      !!
62      !!                 1. Anderson et al. (2001); this uses fields
63      !!                    of surface chl, irradiance and nutrients
64      !!                    to empirically estimate DMS via a broken
65      !!                    stick approach
66      !!
67      !!                 2. Simo & Dachs (2002); this uses fields of
68      !!                    surface chl and mixed layer depth
69      !!
70      !!                 3. Aranami & Tsunogai (2004); this is an
71      !!                    embellishment of Simo & Dachs
72      !!
73      !!                 4. Halloran et al. (2010); this is an
74      !!                    alternative embellishment of Sim & Dachs
75      !!                    and is included because it is formally
76      !!                    published (and different from the above)
77      !!
78      !! AXY (25/05/17): add extra "corrected" Anderson scheme
79      !!
80      !!                 5. As Anderson et al. (2001) but modified to
81      !!                    more accurately reflect nutrient limitation
82      !!                    status of phytoplankton community
83      !!
84      !! AXY (08/07/15): amend to remove Julien's original calculation
85      !!                 as this is now superfluous; the four schemes
86      !!                 are calculated and one is chosen to be passed
87      !!                 to the atmosphere in trc_bio_medusa
88      !!
89!=======================================================================
90
91      USE yomhook, ONLY: lhook, dr_hook
92      USE parkind1, ONLY: jprb, jpim
93
94      IMPLICIT NONE
95!
96      REAL(wp), INTENT( in )    :: chn                  !! non-diatom chlorophyll    (mg/m3)
97      REAL(wp), INTENT( in )    :: chd                  !! diatom chlorophyll        (mg/m3)
98      REAL(wp), INTENT( in )    :: mld                  !! mix layer depth           (m)
99      REAL(wp), INTENT( in )    :: xqsr                 !! surface irradiance        (W/m2)
100      REAL(wp), INTENT( in )    :: xdin                 !! surface DIN               (mmol N/m3)
101      REAL(wp), INTENT( in )    :: xlim                 !! surface DIN limitation    (mmol N/m3)
102      REAL(wp), INTENT( inout ) :: dms_andr             !! DMS surface concentration (nmol/L)
103      REAL(wp), INTENT( inout ) :: dms_simo             !! DMS surface concentration (nmol/L)
104      REAL(wp), INTENT( inout ) :: dms_aran             !! DMS surface concentration (nmol/L)
105      REAL(wp), INTENT( inout ) :: dms_hall             !! DMS surface concentration (nmol/L)
106      REAL(wp), INTENT( inout ) :: dms_andm             !! DMS surface concentration (nmol/L)
107!
108      REAL(wp) :: CHL, cmr, sw_dms
109      REAL(wp) :: Jterm, Qterm
110      !! temporary variables
111      REAL(wp) ::    fq1,fq2,fq3
112      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
113      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
114      REAL(KIND=jprb)               :: zhook_handle
115
116      CHARACTER(LEN=*), PARAMETER :: RoutineName='TRC_DMS_MEDUSA'
117
118      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
119
120!
121!=======================================================================
122!
123! AXY (13/03/15): per remarks above, the following calculations estimate
124!                 DMS using all of the schemes examined for UKESM1
125!
126      CHL = 0.0
127      CHL = chn+chd                                 !! mg/m3
128      cmr = CHL / mld
129!
130! AXY (13/03/15): Anderson et al. (2001)
131!! JPALM --19-12-2017-- Tunable through the namelist
132!!                      within dmsmin - dmscut - dmsslp
133        Jterm = xqsr + 1.0e-6
134        !! this next line makes a hard-coded assumption about the
135        !! half-saturation constant of MEDUSA (which should be
136        !! done properly; perhaps even scaled with the proportion
137        !! of diatoms and non-diatoms)
138        Qterm = xdin / (xdin + 0.5)
139        fq1 = log10(CHL * Jterm * Qterm)
140        if (fq1 > dmscut) then
141           dms_andr = (dmsslp * (fq1 - dmscut)) + dmsmin
142        else
143           dms_andr = dmsmin
144        endif
145!
146! AXY (13/03/15): Simo & Dachs (2002)
147        fq1 = (-1.0 * log(mld)) + 5.7
148        fq2 = (55.8 * cmr) + 0.6
149        if (cmr < 0.02) then
150           dms_simo = fq1
151        else
152           dms_simo = fq2
153        endif
154!           
155! AXY (13/03/15): Aranami & Tsunogai (2004)
156        fq1 = 60.0 / mld
157        fq2 = (55.8 * cmr) + 0.6
158        if (cmr < 0.02) then
159           dms_aran = fq1
160        else
161           dms_aran = fq2
162        endif
163!       
164! AXY (13/03/15): Halloran et al. (2010)
165        fq1 = (-1.0 * log(mld)) + 5.7
166        fq2 = (55.8 * cmr) + 0.6
167        fq3 = (90.0 / mld)
168        if (cmr < 0.02) then
169           dms_hall = fq1
170        else
171           dms_hall = fq2
172        endif
173        if (mld > 182.5) then
174           dms_hall = fq3
175        endif
176!
177! AXY (25/05/17): modified Anderson et al. (2001)
178        Jterm = xqsr + 1.0e-6
179        !! this version fixes the hard-coded assumption above
180        Qterm = xlim
181        fq1 = log10(CHL * Jterm * Qterm)
182        if (fq1 > 1.72) then
183           dms_andm = (8.24 * (fq1 - 1.72)) + 2.29
184        else
185           dms_andm = 2.29
186        endif
187
188      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
189   END SUBROUTINE trc_dms_medusa
190
191
192!=======================================================================
193!=======================================================================
194!=======================================================================
195
196
197!=======================================================================
198!
199   SUBROUTINE dms_flux_ocn( wind_10m, tstar, dms_conc, i_dms_flux,  &  !! inputs
200     &                      f_dms )                                    !! outputs
201!     
202!=======================================================================
203      !!
204      !! Title  : Calculates DMS air-sea exchange
205      !! Author : Andrew Yool, based on UKMO original code
206      !! Date   : 11/10/18
207      !!
208      !! Air-sea DMS flux is normally calculated by the UM atmosphere,
209      !! as part of its aerosols; however, the OMIP simulation for CMIP6
210      !! is ocean-only and does not include the UM; consequently, this
211      !! code has been added to permit ocean-only UKESM1 to produce an
212      !! air-sea DMS flux in addition to surface DMS which, hitherto,
213      !! was all it would produce; code is largely copy-pasted from the
214      !! UKMO original (UM code block is dms_flux_4A.F90); the code
215      !! here is hard-wired to use single input values (i.e. not a 2D
216      !! area) and make use of the Liss & Merlivat (1986) function
217      !!
218      !! This DMS function is called from air_sea.F90
219
220!---------------------------------------------------------------------
221! Purpose: To calculate the flux of DMS (as kg m-2 s-1 of sulphur)
222!          from the ocean surface as a function of its concentration
223!          in seawater and of windspeed. The sea-air exchange can
224!          be determined according to one of three commonly-used
225!          parametrization schemes, those of Liss & Merlivat (1986),
226!          Wanninkhof (1992) or Nightingale et al. (2000). The routine
227!          is called by Aero_Ctl.
228!
229! Method:  The Schmidt number
230!          for DMS is calculated as in Saltzman et al. (1993), and
231!          used with the windspeed to determine the mass transfer (or
232!          "piston") velocity according to the desired parametrization.
233!          This is then used to determine the sea-air mass flux of DMS
234!          as a function of sea-water DMS concentration. High surface
235!          temperatures (caused by the land portion of a gridbox when
236!          coastal tiling is not active) cause negative Sc values which
237!          would give a floating-point error in the k_DMS calculation,
238!          so the Tstar values are capped. This shouldn't be a problem
239!          when coastal tiling is on as then the Tstar values passed in
240!          are those for sea only.
241!
242! Code Owner: Please refer to the UM file CodeOwners.txt
243! This file belongs in section: Aerosols
244!
245! Code Description:
246!  Language: Fortran 90
247!  This code is written to UMDP3 v8 programming standards
248!
249!---------------------------------------------------------------------
250
251      USE yomhook, ONLY: lhook, dr_hook
252      USE parkind1, ONLY: jprb, jpim
253
254      IMPLICIT NONE
255!
256      REAL(wp), INTENT( in )    :: wind_10m      !! 10m wind (m/s)
257      REAL(wp), INTENT( in )    :: tstar         !! SST (degrees C)
258      REAL(wp), INTENT( in )    :: dms_conc      !! surface DMS (nmol / l)
259      INTEGER,  INTENT(in)      :: i_dms_flux    !! gas transfer choice
260!
261      REAL(wp), INTENT( inout ) :: f_dms         !! DMS flux (kg S m-2 s-1)
262
263! Local variables:
264      REAL     :: sc     ! Schmidt number
265      REAL     :: k_dms  ! Piston velocity of DMS (cm h-1)
266      REAL     :: t_c    ! Surface temperature in degrees Celsius
267! Piston velocities for gases with Schmidt numbers of 600 & 660 resp. (cm h-1)
268      REAL     :: k_600
269      REAL     :: k_660
270      REAL     :: n      ! Schmidt number exponent
271      REAL, PARAMETER :: t_max = 47.0  !! Max T to avoid breaking the Sc fit (C)
272      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
273      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
274      REAL(KIND=jprb)               :: zhook_handle
275
276      CHARACTER(LEN=*), PARAMETER :: RoutineName='DMS_FLUX_OCN'
277
278      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
279
280
281! Calculate the Schmidt number (Sc):
282      t_c = MIN(tstar, t_max)
283      sc  = 2674.0 - (147.12*t_c) + (3.726*t_c**2)  &
284            - (0.038*t_c**3)
285
286! Determine the mass transfer (or "piston") velocity (k_DMS) over sea
287! according to the specified parametrization scheme:
288
289      if (i_dms_flux .eq. 1) then
290! ----------------------------------------------------------------------
291!        Liss & Merlivat (1986)
292         IF (wind_10m .le. 3.6) THEN
293            k_600 = 0.17 * wind_10m
294            n = -2.0/3.0
295         ELSEIF ( wind_10m .gt. 3.6 .AND. wind_10m .le. 13.0 ) THEN
296            k_600 = (2.85 * wind_10m) - 9.65
297            n = -0.5
298         ELSE
299            k_600 = (5.90 * wind_10m) - 49.3
300            n = -0.5
301         END IF
302         k_dms = k_600 * (sc / 600.0)**n
303      elseif (i_dms_flux .eq. 2) then
304! ----------------------------------------------------------------------
305!        Wanninkhof (1992)
306         k_660 = 0.31 * wind_10m**2
307         n = -0.5
308         k_dms = k_660 * (sc / 660.0)**n
309      elseif (i_dms_flux .eq. 3) then
310! ----------------------------------------------------------------------
311!        Nightingale et al. (2000)
312         k_600 = (0.222 * wind_10m**2) + (0.333 * wind_10m)
313         n = -0.5
314         k_dms = k_600 * (sc / 600.0)**n
315      else
316! ----------------------------------------------------------------------
317!        You shouldn't be here
318         k_dms = 0.0
319      endif
320
321! Finally, calculate the sea-air flux of DMS as a function of k_DMS
322! and dissolved DMS concentration. The former requires a conversion
323! from cm hour-1 to ms-1, and the latter from nanomoles per litre to
324! kg[S] m-3, to return the flux in kg[S] m-2 sec-1.
325
326      f_dms = (k_dms / 3.6e5) * (dms_conc * 32.0e-9)
327
328      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
329   END SUBROUTINE dms_flux_ocn
330
331
332!=======================================================================
333!=======================================================================
334!=======================================================================
335
336#else
337   !!======================================================================
338   !!  Dummy module :                                   No MEDUSA bio-model
339   !!======================================================================
340
341CONTAINS
342
343!=======================================================================
344!
345   SUBROUTINE trc_dms_medusa( kt )                                        !! EMPTY Routine
346!     
347!
348      INTEGER, INTENT( in ) ::   kt
349      INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0
350      INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1
351      REAL(KIND=jprb)               :: zhook_handle
352
353      CHARACTER(LEN=*), PARAMETER :: RoutineName='TRC_DMS_MEDUSA'
354
355      IF (lhook) CALL dr_hook(RoutineName,zhook_in,zhook_handle)
356
357!
358
359      WRITE(*,*) 'trc_dms_medusa: You should not have seen this print! error?'
360
361      IF (lhook) CALL dr_hook(RoutineName,zhook_out,zhook_handle)
362   END SUBROUTINE trc_dms_medusa
363#endif
364
365   !!======================================================================
366END MODULE  trcdms_medusa
367
368
369
Note: See TracBrowser for help on using the repository browser.