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.
trcsms_c14.F90 in branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/TOP_SRC/C14 – NEMO

source: branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/TOP_SRC/C14/trcsms_c14.F90 @ 7953

Last change on this file since 7953 was 7068, checked in by cetlod, 7 years ago

ROBUST5_CNRS : implementation of part I of new TOP interface - 1st step -, see ticket #1782

File size: 7.3 KB
Line 
1MODULE trcsms_c14
2   !!======================================================================
3   !!                      ***  MODULE trcsms_c14  ***
4   !! TOP : Bomb C14 main module
5   !!======================================================================
6   !! History     -   ! 1994-05 ( J. Orr ) original code
7   !!            1.0  ! 2006-02 ( J.M. Molines )  Free form + modularity
8   !!            2.0  ! 2008-12 ( C. Ethe ) reorganisation
9   !!            4.0  ! 2011-02 ( A.R. Porter, STFC Daresbury ) Dynamic memory
10   !!                 ! 2015    (A. Mouchet) general C14 + update formulas
11   !!----------------------------------------------------------------------
12   !!   trc_sms_c14 :  compute and add C14 suface forcing to C14 trends
13   !!----------------------------------------------------------------------
14   USE oce_trc       ! Ocean variables
15   USE par_trc       ! TOP parameters
16   USE trc           ! TOP variables
17   USE trd_oce    ! trends
18   USE trdtrc    ! trends
19   USE sms_c14    ! atmospheric forcing
20   USE trcatm_c14    ! atmospheric forcing
21   USE iom
22
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC   trc_sms_c14       ! called in trcsms.F90
27
28   !!----------------------------------------------------------------------
29   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
30   !! $                                                                    $
31   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
32   !!----------------------------------------------------------------------
33CONTAINS
34
35   SUBROUTINE trc_sms_c14( kt )
36      !!----------------------------------------------------------------------
37      !!                  ***  ROUTINE trc_sms_c14  ***
38      !!
39      !! ** Purpose :   Compute the surface boundary contition on C14
40      !!      passive tracer associated with air-sea fluxes and add it to
41      !!      the general trend of tracers equations.
42      !
43      !    Method:
44      !          - transport the ratio C14/C as in Toggweiler et al. (JGR,1989)
45      !          - if on-line a passive tracer (jpcref; NO sms) allows compensating for
46      !            freshwater fluxes which should not impact the C14/C ratio
47      !
48      !        =>   Delta-C14= ( trn(...jp_c14) -1)*1000.
49      !!
50      !!----------------------------------------------------------------------
51      !
52      INTEGER, INTENT(in) ::   kt    ! ocean time-step index
53      !
54      INTEGER  :: ji, jj, jk         ! dummy loop indices
55      REAL(wp) :: zt, ztp, zsk      ! dummy variables
56      REAL(wp) :: zsol              ! solubility
57      REAL(wp) :: zsch              ! schmidt number
58      REAL(wp) :: zv2               ! wind speed ( square)
59      REAL(wp) :: zpv               ! piston velocity
60      !!----------------------------------------------------------------------
61      !
62      IF( nn_timing == 1 )  CALL timing_start('trc_sms_c14')
63      !
64      IF( kt ==  nittrc000 ) THEN
65         IF(lwp) WRITE(numout,*)
66         IF(lwp) WRITE(numout,*) ' trc_sms_c14:  C14 model'
67         IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~'
68      ENDIF
69      !
70 
71      ! Get co2sbc & c14sbc(ji,jj): at 1st iter for all, at each time step for transient
72      IF( kc14typ >= 1 .OR.  kt ==  nittrc000 )   CALL trc_atm_c14( kt, co2sbc, c14sbc ) 
73
74      ! -------------------------------------------------------------------
75      !  Gas exchange coefficient (Wanninkhof, 1992, JGR, 97,7373-7382)
76      !  Schmidt number of CO2 in seawater (Wanninkhof, 1992 & 2014)
77      !  CO2 solubility (Weiss, 1974; Wanninkhof, 2014)
78      ! -------------------------------------------------------------------
79
80      DO jj = 1, jpj
81         DO ji = 1, jpi 
82            IF( tmask(ji,jj,1) >  0.) THEN
83
84               zt   = MIN( 40., tsn(ji,jj,1,jp_tem))
85
86               !  Computation of solubility zsol in [mol/(L * atm)]
87               !   after Wanninkhof (2014) referencing Weiss (1974)
88               ztp  = ( zt + 273.16 ) * 0.01
89               zsk  = 0.027766 + ztp * ( -0.025888 + 0.0050578 * ztp )   ! [mol/(L * atm)]
90               zsol = EXP( -58.0931 + 90.5069 / ztp  + 22.2940 * LOG( ztp ) + zsk * tsn(ji,jj,1,jp_sal) )
91               ! convert solubilities [mol/(L * atm)] -> [mol/(m^3 * ppm)]
92               zsol = zsol * 1.e-03
93
94               ! Computes the Schmidt number of CO2 in seawater
95               !               Wanninkhof-2014
96               zsch = 2116.8 + zt * ( -136.25 + zt * (4.7353 + zt * (-0.092307 + 0.0007555 * zt ) ) )
97
98               ! Wanninkhof Piston velocity: zpv in units [m/s]
99               zv2 = xkwind * (wndm(ji,jj) * wndm(ji,jj))              ! wind speed module at T points
100               ! chemical enhancement (Wanninkhof & Knox, 1996)
101               IF( ln_chemh ) zv2 = zv2 + 2.5 * ( 0.5246 + zt * (0.016256 + 0.00049946  * zt ) )
102               zv2 = zv2/360000._wp                                    ! conversion cm/h -> m/s
103               !
104               zpv  = ( zv2 * SQRT( 660./ zsch ) ) * ( 1. - fr_i(ji,jj) ) * tmask(ji,jj,1)
105
106               ! CO2 piston velocity (m/s)
107               exch_co2(ji,jj)= zpv
108               ! CO2 invasion rate (mol/ppm/m2/s) = 1st part of 14C/C exchange velocity
109               exch_c14(ji,jj)= zpv * zsol
110            ELSE
111               exch_co2(ji,jj) = 0._wp
112               exch_c14(ji,jj) = 0._wp
113            ENDIF
114         END DO
115      END DO
116
117      ! Exchange velocity for 14C/C ratio (m/s)
118      zt = co2sbc / xdicsur
119      exch_c14(:,:) = zt * exch_c14(:,:)
120      !
121      ! Flux of C-14 from air-to-sea; units: (C14/C ratio) x m/s
122      !                               already masked
123      qtr_c14(:,:) = exch_c14(:,:) * ( c14sbc(:,:) - trb(:,:,1,jp_c14) )
124           
125      ! cumulation of air-to-sea flux at each time step
126      qint_c14(:,:) = qint_c14(:,:) + qtr_c14(:,:) * rdttrc
127      !
128      ! Add the surface flux to the trend of jp_c14
129      DO jj = 1, jpj
130         DO ji = 1, jpi
131            tra(ji,jj,1,jp_c14) = tra(ji,jj,1,jp_c14) + qtr_c14(ji,jj) / e3t_n(ji,jj,1) 
132         END DO
133      END DO
134      !
135      ! Computation of decay effects on jp_c14
136      DO jk = 1, jpk
137         DO jj = 1, jpj
138            DO ji = 1, jpi
139               !
140               tra(ji,jj,jk,jp_c14) = tra(ji,jj,jk,jp_c14) - rlam14 * trb(ji,jj,jk,jp_c14) * tmask(ji,jj,jk) 
141               !
142            END DO
143         END DO
144      END DO
145
146      !
147      IF( lrst_trc ) THEN
148         IF(lwp) WRITE(numout,*)
149         IF(lwp) WRITE(numout,*) ' trc_rst_wri_c14 : Write specific variables from c14 model '
150         IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~'
151      !
152         CALL iom_rstput( kt, nitrst, numrtw, 'co2sbc', co2sbc )       ! These five need      &
153         CALL iom_rstput( kt, nitrst, numrtw, 'c14sbc', c14sbc )     ! &    to be written   &
154         CALL iom_rstput( kt, nitrst, numrtw, 'exch_co2', exch_co2 ) ! &    for temporal    &
155         CALL iom_rstput( kt, nitrst, numrtw, 'exch_c14', exch_c14 ) ! &    averages        &
156         CALL iom_rstput( kt, nitrst, numrtw, 'qtr_c14', qtr_c14 )   ! &    to be coherent.
157         CALL iom_rstput( kt, nitrst, numrtw, 'qint_c14', qint_c14 ) ! Cumulative
158      !
159      ENDIF
160
161      IF( l_trdtrc )  CALL trd_trc( tra(:,:,:,jp_c14), 1, jptra_sms, kt )   ! save trends
162      !
163      IF( nn_timing == 1 )  CALL timing_stop('trc_sms_c14')
164      !
165   END SUBROUTINE trc_sms_c14
166
167
168  !!======================================================================
169END MODULE trcsms_c14
Note: See TracBrowser for help on using the repository browser.