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 branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/TOP_SRC/PISCES – NEMO

source: branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/TOP_SRC/PISCES/trcsms_pisces.F90 @ 3318

Last change on this file since 3318 was 3318, checked in by gm, 12 years ago

Ediag branche: #927 split TRA/DYN trd computation

  • 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 trd_oce        ! trends: ocean 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   !!----------------------------------------------------------------------
45CONTAINS
46
47   SUBROUTINE trc_sms_pisces( kt )
48      !!---------------------------------------------------------------------
49      !!                     ***  ROUTINE trc_sms_pisces  ***
50      !!
51      !! ** Purpose :   Managment of the call to Biological sources and sinks
52      !!              routines of PISCES bio-model
53      !!
54      !! ** Method  : - at each new day ...
55      !!              - several calls of bio and sed ???
56      !!              - ...
57      !!---------------------------------------------------------------------
58      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index     
59      !
60      INTEGER ::   jnt, jn   ! dummy loop indices
61      CHARACTER (len=25) :: charout
62      !!---------------------------------------------------------------------
63      !
64      IF( nn_timing == 1 )   CALL timing_start('trc_sms_pisces')
65      !
66      IF( ln_pisdmp .AND. MOD( kt - nn_dttrc, nn_pisdmp ) == 0 )   CALL trc_sms_pisces_dmp( kt )  ! Relaxation of some tracers
67                                                                   CALL trc_sms_pisces_mass_conserv( kt ) ! Mass conservation checking
68
69      IF( ndayflxtr /= nday_year ) THEN      ! New days
70         !
71         ndayflxtr = nday_year
72
73         IF(lwp) write(numout,*)
74         IF(lwp) write(numout,*) ' New chemical constants and various rates for biogeochemistry at new day : ', nday_year
75         IF(lwp) write(numout,*) '~~~~~~'
76
77         CALL p4z_che              ! computation of chemical constants
78         CALL p4z_int              ! computation of various rates for biogeochemistry
79         !
80      ENDIF
81
82      DO jnt = 1, nrdttrc          ! Potential time splitting if requested
83         !
84         CALL p4z_bio (kt, jnt)    ! Compute soft tissue production (POC)
85         CALL p4z_sed (kt, jnt)    ! compute soft tissue remineralisation
86         !
87         trb(:,:,:,:) = trn(:,:,:,:)
88         !
89      END DO
90
91      CALL p4z_lys( kt )             ! Compute CaCO3 saturation
92      CALL p4z_flx( kt )             ! Compute surface fluxes
93
94      DO jn = jp_pcs0, jp_pcs1
95        CALL lbc_lnk( trn(:,:,:,jn), 'T', 1. )
96        CALL lbc_lnk( trb(:,:,:,jn), 'T', 1. )
97        CALL lbc_lnk( tra(:,:,:,jn), 'T', 1. )
98      END DO
99
100      IF( l_trdtrc ) THEN
101          DO jn = jp_pcs0, jp_pcs1
102            CALL trd_mod_trc( tra(:,:,:,jn), jn, jptra_sms, kt )   ! save trends
103          END DO
104      END IF
105
106      IF( lk_sed ) THEN 
107         !
108         CALL sed_model( kt )     !  Main program of Sediment model
109         !
110         DO jn = jp_pcs0, jp_pcs1
111           CALL lbc_lnk( trn(:,:,:,jn), 'T', 1. )
112         END DO
113         !
114      ENDIF
115      !
116      IF( nn_timing == 1 )  CALL timing_stop('trc_sms_pisces')
117      !
118   END SUBROUTINE trc_sms_pisces
119
120
121   SUBROUTINE trc_sms_pisces_dmp( kt )
122      !!----------------------------------------------------------------------
123      !!                    ***  trc_sms_pisces_dmp  ***
124      !!
125      !! ** purpose  : Relaxation of some tracers
126      !!----------------------------------------------------------------------
127      INTEGER, INTENT( in )  ::     kt ! time step
128      !
129      REAL(wp) ::   alkmean = 2426.   ! mean value of alkalinity ( Glodap ; for Goyet 2391. )
130      REAL(wp) ::   po4mean = 2.165   ! mean value of phosphates
131      REAL(wp) ::   no3mean = 30.90   ! mean value of nitrate
132      REAL(wp) ::   silmean = 91.51   ! mean value of silicate
133      !
134      REAL(wp) ::   zarea, zalksum, zpo4sum, zno3sum, zsilsum   ! local scalars
135      !!---------------------------------------------------------------------
136
137      IF(lwp)  WRITE(numout,*)
138      IF(lwp)  WRITE(numout,*) ' trc_sms_pisces_dmp : Relaxation of nutrients at time-step kt = ', kt
139      IF(lwp)  WRITE(numout,*)
140
141      IF( cp_cfg == "orca" .AND. .NOT. lk_c1d ) THEN      ! ORCA condiguration (not 1D) !
142         !                                                    ! --------------------------- !
143         ! set total alkalinity, phosphate, nitrate & silicate
144         zarea          = 1._wp / glob_sum( cvol(:,:,:) ) * 1e6             
145
146         zalksum = glob_sum( trn(:,:,:,jptal) * cvol(:,:,:)  ) * zarea
147         zpo4sum = glob_sum( trn(:,:,:,jppo4) * cvol(:,:,:)  ) * zarea / 122.
148         zno3sum = glob_sum( trn(:,:,:,jpno3) * cvol(:,:,:)  ) * zarea / 7.6
149         zsilsum = glob_sum( trn(:,:,:,jpsil) * cvol(:,:,:)  ) * zarea
150 
151         IF(lwp) WRITE(numout,*) '       TALK mean : ', zalksum
152         trn(:,:,:,jptal) = trn(:,:,:,jptal) * alkmean / zalksum
153
154         IF(lwp) WRITE(numout,*) '       PO4  mean : ', zpo4sum
155         trn(:,:,:,jppo4) = trn(:,:,:,jppo4) * po4mean / zpo4sum
156
157         IF(lwp) WRITE(numout,*) '       NO3  mean : ', zno3sum
158         trn(:,:,:,jpno3) = trn(:,:,:,jpno3) * no3mean / zno3sum
159
160         IF(lwp) WRITE(numout,*) '       SiO3 mean : ', zsilsum
161         trn(:,:,:,jpsil) = MIN( 400.e-6,trn(:,:,:,jpsil) * silmean / zsilsum )
162         !
163      ENDIF
164      !
165   END SUBROUTINE trc_sms_pisces_dmp
166
167
168   SUBROUTINE trc_sms_pisces_mass_conserv ( kt )
169      !!----------------------------------------------------------------------
170      !!                  ***  ROUTINE trc_sms_pisces_mass_conserv  ***
171      !!
172      !! ** Purpose :  Mass conservation check
173      !!---------------------------------------------------------------------
174      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
175      !
176      REAL(wp) :: zalkbudget, zno3budget, zsilbudget
177      !
178      NAMELIST/nampismass/ ln_check_mass
179      !!---------------------------------------------------------------------
180      !
181      IF( kt == nittrc000 ) THEN
182         REWIND( numnatp )       
183         READ  ( numnatp, nampismass )
184         IF(lwp) THEN                         ! control print
185            WRITE(numout,*) ' '
186            WRITE(numout,*) ' Namelist parameter for mass conservation checking'
187            WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
188            WRITE(numout,*) '    Flag to check mass conservation of NO3/Si/TALK ln_check_mass = ', ln_check_mass
189         ENDIF
190
191         IF( ln_check_mass .AND. lwp) THEN      !   Open budget file of NO3, ALK, Si
192            CALL ctl_opn( numno3, 'no3.budget' , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
193            CALL ctl_opn( numsil, 'sil.budget' , 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
194            CALL ctl_opn( numalk, 'talk.budget', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE., narea )
195         ENDIF
196      ENDIF
197      !
198      IF( ln_check_mass ) THEN      !   Compute the budget of NO3, ALK, Si
199         zno3budget = glob_sum( (   trn(:,:,:,jpno3) + trn(:,:,:,jpnh4)  &
200            &                     + trn(:,:,:,jpphy) + trn(:,:,:,jpdia)  &
201            &                     + trn(:,:,:,jpzoo) + trn(:,:,:,jpmes)  &
202            &                     + trn(:,:,:,jppoc) + trn(:,:,:,jpgoc)  &
203            &                     + trn(:,:,:,jpdoc)                     ) * cvol(:,:,:)  ) 
204            !
205         zsilbudget = glob_sum( (   trn(:,:,:,jpsil) + trn(:,:,:,jpgsi)  &
206            &                     + trn(:,:,:,jpdsi)                     ) * cvol(:,:,:)  )
207            !
208         zalkbudget = glob_sum( (   trn(:,:,:,jpno3) * rno3              &
209            &                     + trn(:,:,:,jptal)                     &
210            &                     + trn(:,:,:,jpcal) * 2.                ) * cvol(:,:,:)  )
211            !
212         IF( lwp ) THEN
213            WRITE(numno3,9500) kt,  zno3budget / areatot
214            WRITE(numsil,9500) kt,  zsilbudget / areatot
215            WRITE(numalk,9500) kt,  zalkbudget / areatot
216         ENDIF
217       ENDIF
218 9500  FORMAT(i10,e18.10)     
219       !
220   END SUBROUTINE trc_sms_pisces_mass_conserv
221
222#else
223   !!======================================================================
224   !!  Dummy module :                                   No PISCES bio-model
225   !!======================================================================
226CONTAINS
227   SUBROUTINE trc_sms_pisces( kt )                   ! Empty routine
228      INTEGER, INTENT( in ) ::   kt
229      WRITE(*,*) 'trc_sms_pisces: You should not have seen this print! error?', kt
230   END SUBROUTINE trc_sms_pisces
231#endif 
232
233   !!======================================================================
234END MODULE trcsms_pisces 
Note: See TracBrowser for help on using the repository browser.