source: branches/2012/dev_r3438_LOCEAN15_PISLOB/NEMOGCM/NEMO/TOP_SRC/PISCES/SED/seddta.F90 @ 3443

Last change on this file since 3443 was 3443, checked in by cetlod, 8 years ago

branch:2012/dev_r3438_LOCEAN15_PISLOB : 1st step of the merge, see ticket #972

File size: 11.6 KB
Line 
1MODULE seddta
2   !!======================================================================
3   !!                     ***  MODULE  seddta  ***
4   !! Sediment data  :  read sediment input data from a file
5   !!=====================================================================
6#if defined key_sed
7   !! * Modules used
8   USE sed
9   USE sedarr
10   USE iom
11
12   IMPLICIT NONE
13   PRIVATE
14
15   !! * Routine accessibility
16   PUBLIC sed_dta   !
17
18   !! *  Module variables
19   REAL(wp), DIMENSION(:), ALLOCATABLE ::  smask       ! mask for sediments points
20   REAL(wp) ::  rsecday  ! number of second per a day
21   REAL(wp) ::  conv1    ! [m/day]--->[cm/s] 
22   REAL(wp) ::  conv2    ! [kg/m2/month]-->[g/cm2/s] ( 1 month has 30 days )
23
24   INTEGER ::  numbio
25
26#if defined key_sed_off
27   INTEGER ::  numoce
28#endif
29
30CONTAINS
31
32   !!---------------------------------------------------------------------------
33   !!   sed_dta  : read the NetCDF data file in online version using module iom
34   !!---------------------------------------------------------------------------
35
36   SUBROUTINE sed_dta( kt )
37      !!----------------------------------------------------------------------
38      !!                   ***  ROUTINE sed_dta  ***
39      !!                   
40      !! ** Purpose :   Reads data from a netcdf file and
41      !!                initialization of rain and pore water (k=1) components
42      !!
43      !!
44      !!   History :
45      !!        !  04-10  (N. Emprin, M. Gehlen )  Original code
46      !!        !  06-04  (C. Ethe)  Re-organization ; Use of iom
47      !!----------------------------------------------------------------------
48
49      !! Arguments
50      INTEGER, INTENT(in) ::  kt    ! time-step
51
52      !! * Local declarations
53      INTEGER  ::  ji, jj, js, jw, ikt
54
55      REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zdta
56#if ! defined key_kriest
57      REAL(wp), DIMENSION(:)  , ALLOCATABLE :: zdtap, zdtag
58#endif 
59
60
61      !----------------------------------------------------------------------
62
63      ! Initialization of sediment variable
64      ! Spatial dimension is merged, and unity converted if needed
65      !-------------------------------------------------------------
66
67      WRITE(numsed,*)
68      WRITE(numsed,*) ' sed_dta : Bottom layer fields'
69      WRITE(numsed,*) ' ~~~~~~'
70      WRITE(numsed,*) ' Data from SMS model'
71      WRITE(numsed,*)
72
73
74      ! open file
75      IF( kt == nitsed000 ) THEN
76         WRITE(numsed,*) ' sed_dta : Sediment fields'
77         CALL iom_open ( 'data_bio_bot'     , numbio )
78#if defined key_sed_off
79         CALL iom_open( 'data_oce_bot', numoce)
80#endif
81         rsecday = 60.* 60. * 24.
82         conv1   = 1.0e+2 / rsecday 
83         conv2   = 1.0e+3 / ( 1.0e+4 * rsecday * 30. ) 
84
85         ! Compute sediment mask
86         ALLOCATE( zdta(jpi,jpj) ) 
87         DO jj = 1, jpj
88            DO ji = 1, jpi
89               ikt = MAX( INT( sbathy(ji,jj) ) - 1, 1 )
90               zdta(ji,jj) = tmask(ji,jj,ikt) 
91            ENDDO
92         ENDDO
93         ALLOCATE( smask(jpoce) )
94         smask(:) = 0.
95         CALL pack_arr( jpoce, smask(1:jpoce), zdta(1:jpi,1:jpj), iarroce(1:jpoce) )
96      ENDIF
97
98
99#if ! defined key_kriest   
100      ! Initialization of temporaries arrays 
101      ALLOCATE( zdtap(jpoce) )    ;   zdtap(:)    = 0. 
102      ALLOCATE( zdtag(jpoce) )    ;   zdtag(:)    = 0. 
103#endif
104
105
106      IF( MOD( kt - 1, nfreq ) == 0 ) THEN
107         ! reading variables
108         WRITE(numsed,*)
109         WRITE(numsed,*) ' sed_dta : Bottom layer fields at time  kt = ', kt
110         ! reading variables
111         trc_data(:,:,:) = 0.
112#if ! defined key_sed_off
113         DO jj = 1,jpj
114            DO ji = 1, jpi
115               ikt = mbkt(ji,jj)
116               IF ( tmask(ji,jj,ikt) == 1 ) THEN
117                  trc_data(ji,jj,1)  = trn  (ji,jj,ikt,jptal)
118                  trc_data(ji,jj,2)  = trn  (ji,jj,ikt,jpdic)
119                  trc_data(ji,jj,3)  = trn  (ji,jj,ikt,jpno3) / 7.6
120                  trc_data(ji,jj,4)  = trn  (ji,jj,ikt,jppo4) / 122.
121                  trc_data(ji,jj,5)  = trn  (ji,jj,ikt,jpoxy)
122                  trc_data(ji,jj,6)  = trn  (ji,jj,ikt,jpsil)
123#   if ! defined key_kriest
124                  trc_data(ji,jj,7 ) = sinksil (ji,jj,ikt)
125                  trc_data(ji,jj,8 ) = sinking (ji,jj,ikt)
126                  trc_data(ji,jj,9 ) = sinking2(ji,jj,ikt)
127                  trc_data(ji,jj,10) = sinkcal (ji,jj,ikt)
128                  trc_data(ji,jj,11) = tsn     (ji,jj,ikt,jp_tem)
129                  trc_data(ji,jj,12) = tsn     (ji,jj,ikt,jp_sal)
130#   else
131                  trc_data(ji,jj,7 ) = sinksil (ji,jj,ikt)
132                  trc_data(ji,jj,8 ) = sinking (ji,jj,ikt)
133                  trc_data(ji,jj,9 ) = sinkcal (ji,jj,ikt)
134                  trc_data(ji,jj,10) = tsn     (ji,jj,ikt,jp_tem)
135                  trc_data(ji,jj,11) = tsn     (ji,jj,ikt,jp_sal)       
136#   endif
137               ENDIF
138            ENDDO
139         ENDDO
140
141#else
142         CALL iom_get( numbio, jpdom_data, 'ALKBOT'     , trc_data(:,:,1 ) )
143         CALL iom_get( numbio, jpdom_data, 'DICBOT'     , trc_data(:,:,2 ) )
144         CALL iom_get( numbio, jpdom_data, 'NO3BOT'     , trc_data(:,:,3 ) )
145         CALL iom_get( numbio, jpdom_data, 'PO4BOT'     , trc_data(:,:,4 ) )
146         CALL iom_get( numbio, jpdom_data, 'O2BOT'      , trc_data(:,:,5 ) )
147         CALL iom_get( numbio, jpdom_data, 'SIBOT'      , trc_data(:,:,6 ) )
148#   if ! defined key_kriest
149         CALL iom_get( numbio, jpdom_data, 'OPALFLXBOT' , trc_data(:,:,7 ) ) 
150         CALL iom_get( numbio, jpdom_data, 'POCFLXBOT'  , trc_data(:,:,8 ) ) 
151         CALL iom_get( numbio, jpdom_data, 'GOCFLXBOT'  , trc_data(:,:,9 ) ) 
152         CALL iom_get( numbio, jpdom_data, 'CACO3FLXBOT', trc_data(:,:,10) ) 
153         CALL iom_get( numoce, jpdom_data, 'TBOT'       , trc_data(:,:,11) ) 
154         CALL iom_get( numoce, jpdom_data, 'SBOT'       , trc_data(:,:,12) ) 
155#   else
156         CALL iom_get( numbio, jpdom_data, 'OPALFLXBOT' , trc_data(:,:,7 ) ) 
157         CALL iom_get( numbio, jpdom_data, 'POCFLXBOT'  , trc_data(:,:,8 ) ) 
158         CALL iom_get( numbio, jpdom_data, 'CACO3FLXBOT', trc_data(:,:,9 ) ) 
159         CALL iom_get( numoce, jpdom_data, 'TBOT'       , trc_data(:,:,10) ) 
160         CALL iom_get( numoce, jpdom_data, 'SBOT'       , trc_data(:,:,11) ) 
161#   endif
162#endif
163
164         ! Pore water initial concentration [mol/l] in  k=1
165         !-------------------------------------------------
166
167          ! Alkalinity ( 1 umol = 10-6equivalent )
168         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwalk), trc_data(1:jpi,1:jpj,1), iarroce(1:jpoce) )
169         ! DIC
170         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwdic), trc_data(1:jpi,1:jpj,2), iarroce(1:jpoce) )
171         ! Nitrates (1 umol/l = 10-6 mol/l)
172         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwno3), trc_data(1:jpi,1:jpj,3), iarroce(1:jpoce) )
173         ! Phosphates (1 umol/l = 10-6 mol/l)
174         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwpo4), trc_data(1:jpi,1:jpj,4), iarroce(1:jpoce) )
175         ! Oxygen (1 umol/l = 10-6 mol/l)
176         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwoxy), trc_data(1:jpi,1:jpj,5), iarroce(1:jpoce) )       
177         ! Silicic Acid [mol.l-1]
178         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwsil), trc_data(1:jpi,1:jpj,6), iarroce(1:jpoce) )                 
179         ! DIC13 (mol/l)obtained from dc13 and DIC (12) and PDB
180         CALL iom_get ( numbio,jpdom_data,'DC13',zdta(:,:) )
181         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jwc13), zdta(1:jpi,1:jpj), iarroce(1:jpoce) )
182         pwcp_dta(1:jpoce,jwc13) = pdb * ( pwcp_dta(1:jpoce,jwc13) * 1.0e-3 + 1.0 )  &
183            &                          *   pwcp_dta(1:jpoce,jwdic)         
184         
185         !  Solid components :
186         !-----------------------
187#if ! defined key_kriest
188         !  Sinking fluxes for OPAL in mol.m-2.s-1 ; conversion in mol.cm-2.s-1
189         CALL pack_arr ( jpoce, rainrm_dta(1:jpoce,jsopal), trc_data(1:jpi,1:jpj,7), iarroce(1:jpoce) ) 
190         rainrm_dta(1:jpoce,jsopal) = rainrm_dta(1:jpoce,jsopal) * 1e-4
191         !  Sinking fluxes for POC in mol.m-2.s-1 ; conversion in mol.cm-2.s-1
192         CALL pack_arr ( jpoce, zdtap(1:jpoce), trc_data(1:jpi,1:jpj,8) , iarroce(1:jpoce) )     
193         CALL pack_arr ( jpoce, zdtag(1:jpoce), trc_data(1:jpi,1:jpj,9) , iarroce(1:jpoce) )
194         rainrm_dta(1:jpoce,jspoc) =   ( zdtap(1:jpoce) +  zdtag(1:jpoce) ) * 1e-4
195         !  Sinking fluxes for Calcite in mol.m-2.s-1 ; conversion in mol.cm-2.s-1
196         CALL pack_arr ( jpoce,  rainrm_dta(1:jpoce,jscal), trc_data(1:jpi,1:jpj,10), iarroce(1:jpoce) )
197         rainrm_dta(1:jpoce,jscal) = rainrm_dta(1:jpoce,jscal) * 1e-4
198         ! vector temperature [°C] and salinity
199         CALL pack_arr ( jpoce,  temp(1:jpoce), trc_data(1:jpi,1:jpj,11), iarroce(1:jpoce) )
200         CALL pack_arr ( jpoce,  salt(1:jpoce), trc_data(1:jpi,1:jpj,12), iarroce(1:jpoce) )
201#else
202         !  Sinking fluxes for OPAL in mol.m-2.s-1 ; conversion in mol.cm-2.s-1
203         CALL pack_arr ( jpoce, rainrm_dta(1:jpoce,jsopal), trc_data(1:jpi,1:jpj,7), iarroce(1:jpoce) ) 
204         rainrm_dta(1:jpoce,jsopal) = rainrm_dta(1:jpoce,jsopal) * 1e-4
205         !  Sinking fluxes for POC in mol.m-2.s-1 ; conversion in mol.cm-2.s-1
206         CALL pack_arr ( jpoce, rainrm_dta(1:jpoce,jspoc), trc_data(1:jpi,1:jpj,8) , iarroce(1:jpoce) )     
207         rainrm_dta(1:jpoce,jspoc) = rainrm_dta(1:jpoce,jspoc) * 1e-4
208         !  Sinking fluxes for Calcite in mol.m-2.s-1 ; conversion in mol.cm-2.s-1
209         CALL pack_arr ( jpoce,  rainrm_dta(1:jpoce,jscal), trc_data(1:jpi,1:jpj,9), iarroce(1:jpoce) )
210         rainrm_dta(1:jpoce,jscal) = rainrm_dta(1:jpoce,jscal) * 1e-4
211         ! vector temperature [°C] and salinity
212         CALL pack_arr ( jpoce,  temp(1:jpoce), trc_data(1:jpi,1:jpj,10), iarroce(1:jpoce) )
213         CALL pack_arr ( jpoce,  salt(1:jpoce), trc_data(1:jpi,1:jpj,11), iarroce(1:jpoce) )
214
215#endif
216       
217         ! Clay rain rate in [mol/(cm**2.s)]
218         ! inputs data in [kg.m-2.mois-1] ---> 1e+3/(1e+4*60*24*60*60) [g.cm-2.s-1]   
219         ! divided after by molecular weight g.mol-1     
220         zdta(:,:)   = 0.
221         CALL iom_get( numbio, jpdom_data, 'CLAY', zdta(:,:) ) 
222         CALL pack_arr ( jpoce, rainrm_dta(1:jpoce,jsclay) , zdta(1:jpi,1:jpj), iarroce(1:jpoce) )     
223         rainrm_dta(1:jpoce,jsclay) = rainrm_dta(1:jpoce,jsclay) * conv2 / mol_wgt(jsclay)
224
225      ENDIF
226
227      ! sediment pore water at 1st layer (k=1)
228      DO jw = 1, jpwat
229         pwcp(1:jpoce,1,jw) = pwcp_dta(1:jpoce,jw) * smask(1:jpoce)
230      ENDDO
231
232      !  rain
233      DO js = 1, jpsol
234         rainrm(1:jpoce,js) = rainrm_dta(1:jpoce,js) * smask(1:jpoce)
235      ENDDO
236
237      ! Calculation of raintg of each sol. comp.: rainrm in [g/(cm**2.s)]
238      DO js = 1, jpsol
239         rainrg(1:jpoce,js) = rainrm(1:jpoce,js) *  mol_wgt(js)
240      ENDDO
241
242      ! Calculation of raintg = total massic flux rained in each cell (sum of sol. comp.)
243      raintg(:) = 0.
244      DO js = 1, jpsol
245         raintg(1:jpoce) = raintg(1:jpoce) + rainrg(1:jpoce,js)
246      ENDDO
247
248      ! computation of dzdep = total thickness of solid material rained [cm] in each cell
249      dzdep(1:jpoce) = raintg(1:jpoce) * rdtsed(2) 
250
251
252      DEALLOCATE( zdta ) 
253#if ! defined key_kriest
254      DEALLOCATE( zdtap    ) ;  DEALLOCATE( zdtag    ) 
255#endif     
256
257      IF( kt == nitsedend )   THEN
258         CALL iom_close ( numbio )
259#if defined key_sed_off
260         CALL iom_close ( numoce )
261#endif
262      ENDIF
263     
264   END SUBROUTINE sed_dta
265
266#else
267   !!======================================================================
268   !! MODULE seddta  :   Dummy module
269   !!======================================================================
270CONTAINS
271   SUBROUTINE sed_dta ( kt )
272     INTEGER, INTENT(in) :: kt
273     WRITE(*,*) 'sed_stp: You should not have seen this print! error?', kt 
274  END SUBROUTINE sed_dta
275#endif
276
277END MODULE seddta
Note: See TracBrowser for help on using the repository browser.