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.
p4zflx.F90 in trunk/NEMO/TOP_SRC/PISCES – NEMO

source: trunk/NEMO/TOP_SRC/PISCES/p4zflx.F90 @ 1329

Last change on this file since 1329 was 1329, checked in by cetlod, 15 years ago

update modules to take into account the mask land points in NetCDF outputs, see ticket:322

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 9.0 KB
Line 
1MODULE p4zflx
2   !!======================================================================
3   !!                         ***  MODULE p4zflx  ***
4   !! TOP :   PISCES CALCULATES GAS EXCHANGE AND CHEMISTRY AT SEA SURFACE
5   !!======================================================================
6   !! History :    -   !  1988-07  (E. MAIER-REIMER) Original code
7   !!              -   !  1998     (O. Aumont) additions
8   !!              -   !  1999     (C. Le Quere) modifications
9   !!             1.0  !  2004     (O. Aumont) modifications
10   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
11   !!----------------------------------------------------------------------
12#if defined key_pisces
13   !!----------------------------------------------------------------------
14   !!   'key_pisces'                                       PISCES bio-model
15   !!----------------------------------------------------------------------
16   !!   p4z_flx       :   CALCULATES GAS EXCHANGE AND CHEMISTRY AT SEA SURFACE
17   !!   p4z_flx_init  :   Read the namelist
18   !!----------------------------------------------------------------------
19   USE trc
20   USE oce_trc         !
21   USE trc
22   USE sms_pisces
23   USE prtctl_trc
24   USE p4zche
25
26   USE lib_mpp
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   p4z_flx 
32
33   REAL(wp) :: &  ! pre-industrial atmospheric [co2] (ppm) 
34     atcox  = 0.20946 ,   &  !:
35     atcco2 = 278.           !:
36
37   REAL(wp) :: &
38     tco2flx                 !: Total flux of carbon per year
39
40   !!* Substitution
41#  include "domzgr_substitute.h90"
42   !!----------------------------------------------------------------------
43   !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007)
44   !! $Id$
45   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
46   !!----------------------------------------------------------------------
47
48CONTAINS
49
50   SUBROUTINE p4z_flx ( kt )
51      !!---------------------------------------------------------------------
52      !!                     ***  ROUTINE p4z_flx  ***
53      !!
54      !! ** Purpose :   CALCULATES GAS EXCHANGE AND CHEMISTRY AT SEA SURFACE
55      !!
56      !! ** Method  : - ???
57      !!---------------------------------------------------------------------
58      INTEGER, INTENT(in) :: kt
59      INTEGER  ::   ji, jj, jrorr, nspyr
60      REAL(wp) ::   zttc, zws, zkgwan
61      REAL(wp) ::   zfld, zflu, zfld16, zflu16, zfact
62      REAL(wp) ::   zph, zah2, zbot, zdic, zalk, zschmitto2, zalka, zschmittco2
63      REAL(wp), DIMENSION(jpi,jpj) ::   zkgco2, zkgo2, zh2co3, ztco2flx
64      CHARACTER (len=25) :: charout
65
66      !!---------------------------------------------------------------------
67
68
69      IF( kt == nittrc000  )   CALL p4z_flx_init      ! Initialization (first time-step only)
70
71
72      ! -----------------------------------------------------
73      !     ASSIGNATION TO EXPONENTS IN THE LISS AND MERLIVAT
74      !     FORMULATION OF THE GAS EXCHANGE RATE
75      ! -----------------------------------------------------
76
77      nspyr = INT( raass / rdt )
78
79      ! SURFACE CHEMISTRY (PCO2 AND [H+] IN
80      !     SURFACE LAYER); THE RESULT OF THIS CALCULATION
81      !     IS USED TO COMPUTE AIR-SEA FLUX OF CO2
82
83      DO jrorr = 1, 10
84
85!CDIR NOVERRCHK
86         DO jj = 1, jpj
87!CDIR NOVERRCHK
88            DO ji = 1, jpi
89
90               ! DUMMY VARIABLES FOR DIC, H+, AND BORATE
91               zbot  = borat(ji,jj,1)
92               zfact = rhop(ji,jj,1) / 1000. + rtrn
93               zdic  = trn(ji,jj,1,jpdic) / zfact
94               zph   = MAX( hi(ji,jj,1), 1.e-10 ) / zfact
95               zalka = trn(ji,jj,1,jptal) / zfact
96
97               ! CALCULATE [ALK]([CO3--], [HCO3-])
98               zalk  = zalka - (  akw3(ji,jj,1) / zph - zph + zbot / ( 1.+ zph / akb3(ji,jj,1) )  )
99
100               ! CALCULATE [H+] AND [H2CO3]
101               zah2   = SQRT(  (zdic-zalk)**2 + 4.* ( zalk * ak23(ji,jj,1)   &
102                  &                                        / ak13(ji,jj,1) ) * ( 2.* zdic - zalk )  )
103               zah2   = 0.5 * ak13(ji,jj,1) / zalk * ( ( zdic - zalk ) + zah2 )
104               zh2co3(ji,jj) = ( 2.* zdic - zalk ) / ( 2.+ ak13(ji,jj,1) / zah2 ) * zfact
105               hi(ji,jj,1)   = zah2 * zfact
106            END DO
107         END DO
108      END DO
109
110
111      ! --------------
112      ! COMPUTE FLUXES
113      ! --------------
114
115      ! FIRST COMPUTE GAS EXCHANGE COEFFICIENTS
116      ! -------------------------------------------
117
118!CDIR NOVERRCHK
119      DO jj = 1, jpj
120!CDIR NOVERRCHK
121         DO ji = 1, jpi
122
123            zttc = MIN( 35., tn(ji,jj,1) )
124
125      ! Compute the schmidt Number both O2 and CO2
126      ! ------------------------------------------
127
128            zschmittco2 = 2073.1 - 125.62 * zttc + 3.6276 * zttc**2 - 0.043126 * zttc**3
129            zschmitto2  = 1953.4 - 128.0 * zttc + 3.9918 * zttc**2 - 0.050091 * zttc**3
130
131            !  wind speed
132            zws  = wndm(ji,jj)
133
134      ! Compute the piston velocity for O2 and CO2
135      ! ------------------------------------------
136
137            zkgwan = (  0.3 * zws * zws    &
138               &   + 2.5 * ( 0.5246 + zttc * ( 0.016256+zttc*0.00049946 ) ) ) &
139# if defined key_off_degrad
140               &         * facvol(ji,jj,1)      &
141# endif
142               &   / (100. * 3600.)* ( 1.- fr_i(ji,jj) ) * tmask(ji,jj,1) 
143
144            ! COMPUTE GAS EXCHANGE FOR CO2
145            zkgco2(ji,jj) = zkgwan * SQRT( 660./ zschmittco2 )
146            zkgo2(ji,jj)  = zkgwan * SQRT( 660./ zschmitto2 )
147
148         END DO
149      END DO
150
151      ztco2flx(:,:) = 0.
152      DO jj = 1, jpj
153         DO ji = 1, jpi
154
155            ! Compute CO2 flux for the sea and air
156            zfld = atcco2 * tmask(ji,jj,1) * chemc(ji,jj,1) * zkgco2(ji,jj)
157            zflu = zh2co3(ji,jj) * tmask(ji,jj,1) * zkgco2(ji,jj)
158            tra(ji,jj,1,jpdic) = tra(ji,jj,1,jpdic) + ( zfld - zflu ) / fse3t(ji,jj,1)
159
160            ! compute flux of carbon
161            ztco2flx(ji,jj) = ( zfld - zflu ) * rfact &
162               &             * e1t(ji,jj) * e2t(ji,jj) * tmask(ji,jj,1) * 1000.
163
164            ! Compute O2 flux
165            zfld16 = atcox * chemc(ji,jj,2) *tmask(ji,jj,1) * zkgo2(ji,jj)
166            zflu16 = trn(ji,jj,1,jpoxy) * tmask(ji,jj,1) * zkgo2(ji,jj)
167            tra(ji,jj,1,jpoxy) = tra(ji,jj,1,jpoxy) + ( zfld16 - zflu16 ) / fse3t(ji,jj,1)
168
169# if defined key_trc_diaadd
170            ! Save diagnostics
171            trc2d(ji,jj,jp_pcs0_2d    ) = ( zfld - zflu ) * 1000.  * tmask(ji,jj,1)
172            trc2d(ji,jj,jp_pcs0_2d + 1) = ( zfld16 - zflu16 ) * 1000. * tmask(ji,jj,1)
173            trc2d(ji,jj,jp_pcs0_2d + 2) = zkgco2(ji,jj) * tmask(ji,jj,1)
174            trc2d(ji,jj,jp_pcs0_2d + 3) = atcco2 - zh2co3(ji,jj) / ( chemc(ji,jj,1) + rtrn ) * tmask(ji,jj,1)
175# endif
176         END DO
177      END DO
178      !
179
180      ! Total Flux of Carbon
181      DO jj = 1, jpj
182        DO ji = 1, jpi
183           tco2flx = tco2flx + ztco2flx(ji,jj) * tmask_i(ji,jj)
184        END DO
185      END DO
186
187      IF( MOD( kt, nspyr ) == 0 ) THEN
188        IF( lk_mpp ) CALL mpp_sum( tco2flx )   ! sum over the global domain
189
190        WRITE(numout,*) ' Atmospheric pCO2    :'
191        WRITE(numout,*) '-------------------- : ',kt,'  ',atcco2
192        WRITE(numout,*) '(ppm)'
193        WRITE(numout,*) 'Total Flux of Carbon :'
194        WRITE(numout,*) '-------------------- : ',tco2flx * 12. / 1e15
195        WRITE(numout,*) '(GtC/an)'
196        tco2flx = 0.
197      ENDIF
198
199      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
200         WRITE(charout, FMT="('flx ')")
201         CALL prt_ctl_trc_info(charout)
202         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
203      ENDIF
204
205
206   END SUBROUTINE p4z_flx
207
208   SUBROUTINE p4z_flx_init
209
210      !!----------------------------------------------------------------------
211      !!                  ***  ROUTINE p4z_flx_init  ***
212      !!
213      !! ** Purpose :   Initialization of atmospheric conditions
214      !!
215      !! ** Method  :   Read the nampisext namelist and check the parameters
216      !!      called at the first timestep (nittrc000)
217      !! ** input   :   Namelist nampisext
218      !!
219      !!----------------------------------------------------------------------
220
221      NAMELIST/nampisext/ atcco2
222
223      REWIND( numnat )                     ! read numnat
224      READ  ( numnat, nampisext )
225
226      IF(lwp) THEN                         ! control print
227         WRITE(numout,*) ' '
228         WRITE(numout,*) ' Namelist parameters for air-sea exchange, nampisext'
229         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
230         WRITE(numout,*) '    Atmospheric pCO2      atcco2      =', atcco2
231      ENDIF
232
233      ! Initialization of total Flux of Carbon
234      tco2flx = 0.
235
236   END SUBROUTINE p4z_flx_init
237
238#else
239   !!======================================================================
240   !!  Dummy module :                                   No PISCES bio-model
241   !!======================================================================
242CONTAINS
243   SUBROUTINE p4z_flx( kt )                   ! Empty routine
244      INTEGER, INTENT( in ) ::   kt
245      WRITE(*,*) 'p4z_flx: You should not have seen this print! error?', kt
246   END SUBROUTINE p4z_flx
247#endif 
248
249   !!======================================================================
250END MODULE  p4zflx
Note: See TracBrowser for help on using the repository browser.