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

source: trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/trcsms_pisces.F90 @ 3295

Last change on this file since 3295 was 3295, checked in by cetlod, 12 years ago

trunk:A few additional diagnostics added in PISCES

  • Property svn:keywords set to Id
File size: 10.2 KB
Line 
1MODULE trcsms_pisces
2   !!======================================================================
3   !!                         ***  MODULE trcsms_pisces  ***
4   !! TOP :   PISCES Source Minus Sink manager
5   !!======================================================================
6   !! History :   1.0  !  2004-03 (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!----------------------------------------------------------------------
9#if defined key_pisces
10   !!----------------------------------------------------------------------
11   !!   'key_pisces'                                       PISCES bio-model
12   !!----------------------------------------------------------------------
13   !!   trcsms_pisces        :  Time loop of passive tracers sms
14   !!----------------------------------------------------------------------
15   USE oce_trc         !  shared variables between ocean and passive tracers
16   USE trc             !  passive tracers common variables
17   USE sms_pisces      !  PISCES Source Minus Sink variables
18   USE p4zbio          !  Biological model
19   USE p4zche          !  Chemical model
20   USE p4zlys          !  Calcite saturation
21   USE p4zflx          !  Gas exchange
22   USE p4zsed          !  Sedimentation
23   USE p4zint          !  time interpolation
24   USE trdmod_oce      !  Ocean trends variables
25   USE trdmod_trc      !  TOP trends variables
26   USE sedmodel        !  Sediment model
27   USE prtctl_trc      !  print control for debugging
28
29   IMPLICIT NONE
30   PRIVATE
31
32   PUBLIC   trc_sms_pisces    ! called in trcsms.F90
33
34   LOGICAL ::  ln_check_mass = .false.       !: Flag to check mass conservation
35
36   INTEGER ::  numno3  !: logical unit for NO3 budget
37   INTEGER ::  numalk  !: logical unit for talk budget
38   INTEGER ::  numsil  !: logical unit for Si budget
39
40   !!----------------------------------------------------------------------
41   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
42   !! $Id$
43   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
44   !!----------------------------------------------------------------------
45
46CONTAINS
47
48   SUBROUTINE trc_sms_pisces( kt )
49      !!---------------------------------------------------------------------
50      !!                     ***  ROUTINE trc_sms_pisces  ***
51      !!
52      !! ** Purpose :   Managment of the call to Biological sources and sinks
53      !!              routines of PISCES bio-model
54      !!
55      !! ** Method  : - at each new day ...
56      !!              - several calls of bio and sed ???
57      !!              - ...
58      !!---------------------------------------------------------------------
59      !
60      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
61      !!
62      INTEGER ::   jnt, jn
63      CHARACTER (len=25) :: charout
64      !!---------------------------------------------------------------------
65      !
66      IF( nn_timing == 1 )  CALL timing_start('trc_sms_pisces')
67      !
68      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL trc_sms_pisces_dmp( kt )  ! Relaxation of some tracers
69                                                                   CALL trc_sms_pisces_mass_conserv( kt ) ! Mass conservation checking
70
71      IF( ndayflxtr /= nday_year ) THEN      ! New days
72         !
73         ndayflxtr = nday_year
74
75         IF(lwp) write(numout,*)
76         IF(lwp) write(numout,*) ' New chemical constants and various rates for biogeochemistry at new day : ', nday_year
77         IF(lwp) write(numout,*) '~~~~~~'
78
79         CALL p4z_che              ! computation of chemical constants
80         CALL p4z_int              ! computation of various rates for biogeochemistry
81         !
82      ENDIF
83
84      DO jnt = 1, nrdttrc          ! Potential time splitting if requested
85         !
86         CALL p4z_bio (kt, jnt)    ! Compute soft tissue production (POC)
87         CALL p4z_sed (kt, jnt)    ! compute soft tissue remineralisation
88         !
89         trb(:,:,:,:) = trn(:,:,:,:)
90         !
91      END DO
92
93      CALL p4z_lys( kt )             ! Compute CaCO3 saturation
94      CALL p4z_flx( kt )             ! Compute surface fluxes
95
96      DO jn = jp_pcs0, jp_pcs1
97        CALL lbc_lnk( trn(:,:,:,jn), 'T', 1. )
98        CALL lbc_lnk( trb(:,:,:,jn), 'T', 1. )
99        CALL lbc_lnk( tra(:,:,:,jn), 'T', 1. )
100      END DO
101
102      IF( l_trdtrc ) THEN
103          DO jn = jp_pcs0, jp_pcs1
104            CALL trd_mod_trc( tra(:,:,:,jn), jn, jptra_trd_sms, kt )   ! save trends
105          END DO
106      END IF
107
108      IF( lk_sed ) THEN 
109         !
110         CALL sed_model( kt )     !  Main program of Sediment model
111         !
112         DO jn = jp_pcs0, jp_pcs1
113           CALL lbc_lnk( trn(:,:,:,jn), 'T', 1. )
114         END DO
115         !
116      ENDIF
117      !
118      IF( nn_timing == 1 )  CALL timing_stop('trc_sms_pisces')
119      !
120   END SUBROUTINE trc_sms_pisces
121
122   SUBROUTINE trc_sms_pisces_dmp( kt )
123      !!----------------------------------------------------------------------
124      !!                    ***  trc_sms_pisces_dmp  ***
125      !!
126      !! ** purpose  : Relaxation of some tracers
127      !!----------------------------------------------------------------------
128      !
129      INTEGER, INTENT( in )  ::     kt ! time step
130      !
131      REAL(wp) ::  alkmean = 2426.     ! mean value of alkalinity ( Glodap ; for Goyet 2391. )
132      REAL(wp) ::  po4mean = 2.165     ! mean value of phosphates
133      REAL(wp) ::  no3mean = 30.90     ! mean value of nitrate
134      REAL(wp) ::  silmean = 91.51     ! mean value of silicate
135      !
136      REAL(wp) :: zarea, zalksum, zpo4sum, zno3sum, zsilsum
137      !!---------------------------------------------------------------------
138
139
140      IF(lwp)  WRITE(numout,*)
141      IF(lwp)  WRITE(numout,*) ' trc_sms_pisces_dmp : Relaxation of nutrients at time-step kt = ', kt
142      IF(lwp)  WRITE(numout,*)
143
144      IF( cp_cfg == "orca" .AND. .NOT. lk_c1d ) THEN      ! ORCA condiguration (not 1D) !
145         !                                                    ! --------------------------- !
146         ! set total alkalinity, phosphate, nitrate & silicate
147         zarea          = 1._wp / glob_sum( cvol(:,:,:) ) * 1e6             
148
149         zalksum = glob_sum( trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea
150         zpo4sum = glob_sum( trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea / 122.
151         zno3sum = glob_sum( trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea / 7.6
152         zsilsum = glob_sum( trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea
153 
154         IF(lwp) WRITE(numout,*) '       TALK mean : ', zalksum
155         trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksum
156
157         IF(lwp) WRITE(numout,*) '       PO4  mean : ', zpo4sum
158         trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sum
159
160         IF(lwp) WRITE(numout,*) '       NO3  mean : ', zno3sum
161         trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sum
162
163         IF(lwp) WRITE(numout,*) '       SiO3 mean : ', zsilsum
164         trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsum )
165         !
166      ENDIF
167
168   END SUBROUTINE trc_sms_pisces_dmp
169
170   SUBROUTINE trc_sms_pisces_mass_conserv ( kt )
171      !!----------------------------------------------------------------------
172      !!                  ***  ROUTINE trc_sms_pisces_mass_conserv  ***
173      !!
174      !! ** Purpose :  Mass conservation check
175      !!
176      !!---------------------------------------------------------------------
177      !
178      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
179      !!
180      REAL(wp) :: zalkbudget, zno3budget, zsilbudget
181      !
182      NAMELIST/nampismass/ ln_check_mass
183      !!---------------------------------------------------------------------
184
185      IF( kt == nittrc000 ) THEN
186         REWIND( numnatp )       
187         READ  ( numnatp, nampismass )
188         IF(lwp) THEN                         ! control print
189            WRITE(numout,*) ' '
190            WRITE(numout,*) ' Namelist parameter for mass conservation checking'
191            WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
192            WRITE(numout,*) '    Flag to check mass conservation of NO3/Si/TALK ln_check_mass = ', ln_check_mass
193         ENDIF
194
195         IF( ln_check_mass .AND. lwp) THEN      !   Open budget file of NO3, ALK, Si
196            CALL ctl_opn( numno3, 'no3.budget' , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
197            CALL ctl_opn( numsil, 'sil.budget' , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
198            CALL ctl_opn( numalk, 'talk.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
199         ENDIF
200      ENDIF
201
202      IF( ln_check_mass ) THEN      !   Compute the budget of NO3, ALK, Si
203         zno3budget = glob_sum( (   trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)  &
204            &                     + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  &
205            &                     + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  &
206            &                     + trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  &
207            &                     + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  ) 
208         !
209         zsilbudget = glob_sum( (   trn(:,:,:,jpsil) + trn(:,:,:,jpgsi)  &
210            &                     + trn(:,:,:,jpdsi)                     ) * cvol(:,:,:)  )
211         !
212         zalkbudget = glob_sum( (   trn(:,:,:,jpno3) * rno3              &
213            &                     + trn(:,:,:,jptal)                     &
214            &                     + trn(:,:,:,jpcal) * 2.                ) * cvol(:,:,:)  )
215
216         IF( lwp ) THEN
217            WRITE(numno3,9500) kt,  zno3budget / areatot
218            WRITE(numsil,9500) kt,  zsilbudget / areatot
219            WRITE(numalk,9500) kt,  zalkbudget / areatot
220         ENDIF
221       ENDIF
222 9500  FORMAT(i10,e18.10)     
223       !
224   END SUBROUTINE trc_sms_pisces_mass_conserv
225
226#else
227   !!======================================================================
228   !!  Dummy module :                                   No PISCES bio-model
229   !!======================================================================
230CONTAINS
231   SUBROUTINE trc_sms_pisces( kt )                   ! Empty routine
232      INTEGER, INTENT( in ) ::   kt
233      WRITE(*,*) 'trc_sms_pisces: You should not have seen this print! error?', kt
234   END SUBROUTINE trc_sms_pisces
235#endif 
236
237   !!======================================================================
238END MODULE trcsms_pisces 
Note: See TracBrowser for help on using the repository browser.