SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
modi_glt_updbud.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !GLT_LIC The GELATO model is a seaice model used in stand-alone or embedded mode.
6 !GLT_LIC It has been developed by Meteo-France. The holder of GELATO is Meteo-France.
7 !GLT_LIC
8 !GLT_LIC This software is governed by the CeCILL-C license under French law and biding
9 !GLT_LIC by the rules of distribution of free software. See the CeCILL-C_V1-en.txt
10 !GLT_LIC (English) and CeCILL-C_V1-fr.txt (French) for details. The CeCILL is a free
11 !GLT_LIC software license, explicitly compatible with the GNU GPL
12 !GLT_LIC (see http://www.gnu.org/licenses/license-list.en.html#CeCILL)
13 !GLT_LIC
14 !GLT_LIC The CeCILL-C licence agreement grants users the right to modify and re-use the
15 !GLT_LIC software governed by this free software license. The exercising of this right
16 !GLT_LIC is conditional upon the obligation to make available to the community the
17 !GLT_LIC modifications made to the source code of the software so as to contribute to
18 !GLT_LIC its evolution.
19 !GLT_LIC
20 !GLT_LIC In consideration of access to the source code and the rights to copy, modify
21 !GLT_LIC and redistribute granted by the license, users are provided only with a limited
22 !GLT_LIC warranty and the software's author, the holder of the economic rights, and the
23 !GLT_LIC successive licensors only have limited liability. In this respect, the risks
24 !GLT_LIC associated with loading, using, modifying and/or developing or reproducing the
25 !GLT_LIC software by the user are brought to the user's attention, given its Free
26 !GLT_LIC Software status, which may make it complicated to use, with the result that its
27 !GLT_LIC use is reserved for developers and experienced professionals having in-depth
28 !GLT_LIC computer knowledge. Users are therefore encouraged to load and test the
29 !GLT_LIC suitability of the software as regards their requirements in conditions enabling
30 !GLT_LIC the security of their systems and/or data to be ensured and, more generally, to
31 !GLT_LIC use and operate it in the same conditions of security.
32 !GLT_LIC
33 !GLT_LIC The GELATO sofware is cureently distibuted with the SURFEX software, available at
34 !GLT_LIC http://www.cnrm.meteo.fr/surfex. The fact that you download the software deemed that
35 !GLT_LIC you had knowledge of the CeCILL-C license and that you accept its terms.
36 !GLT_LIC Attempts to use this software in a way not complying with CeCILL-C license
37 !GLT_LIC may lead to prosecution.
38 !GLT_LIC
39 ! =======================================================================
40 ! ======================== MODULE modi_glt_updbud =======================
41 ! =======================================================================
42 !
43 ! Goal:
44 ! -----
45 ! This module contains a subroutine that manages the energy budget
46 ! variable on the whole grid:
47 ! - total sea ice gltools_enthalpy (reference temperature is the melting
48 ! temperature of snow and ice)
49 ! - total sea ice latent heat (i.e. the latent heat needed to
50 ! melt sea ice and snow covers on the whole ocean domain). Note
51 ! sea ice stored heat is included in that.
52 ! - total stored heat in sea ice.
53 ! - input and glt_output heat concerning leads and sea ice.
54 ! All these quantities are given in J. The energy budget is also
55 ! printed (total values on the whole mesh).
56 ! Note that this routine tends to mix pure prints (can be disabled), but
57 ! that part of the calculations are also used by the physics of Gelato.
58 ! Before clean splitting of these functionalities is done, be cautious if
59 ! you wish to modify the code !
60 ! Note also that some calculations are global, i.e. when glt_avg routine
61 ! is used, the information from all processors must be gathered. Hence
62 ! these instructions should not be conditional to lp1 = .TRUE., but
63 ! rather to nprinto = 1 !
64 !
65 ! Created : 2001/08 (D. Salas y Melia)
66 ! Modified: 2009/12 (D. Salas y Melia) Enthalpy replaces temperature
67 ! as a state variable
68 ! Modified: 2010/01 (D. Salas y Melia) Introduce fresh water budget
69 ! Modified: 2010/03 (D. Salas y Melia) Introduce salinity budget
70 !
71 ! --------------------- BEGIN MODULE modi_glt_updbud ------------------------
72 !
73 !THXS_SFX!MODULE modi_glt_updbud
74 !THXS_SFX!INTERFACE
75 !THXS_SFX!!
76 !THXS_SFX!SUBROUTINE glt_updbud &
77 !THXS_SFX! ( kinit,omsg,tpdom,tpmxl,tptfl,tpatm,tpblkw,tpblki,tpsit,tpsil,tpbud )
78 !THXS_SFX! USE modd_types_glt
79 !THXS_SFX! USE modd_glt_param
80 !THXS_SFX! INTEGER, INTENT(in) :: &
81 !THXS_SFX! kinit
82 !THXS_SFX! CHARACTER(*), INTENT(in) :: &
83 !THXS_SFX! omsg
84 !THXS_SFX! TYPE(t_dom), DIMENSION(nx,ny), INTENT(in) :: &
85 !THXS_SFX! tpdom
86 !THXS_SFX! TYPE(t_mxl), DIMENSION(nx,ny), INTENT(in) :: &
87 !THXS_SFX! tpmxl
88 !THXS_SFX! TYPE(t_tfl), DIMENSION(nx,ny), INTENT(in) :: &
89 !THXS_SFX! tptfl
90 !THXS_SFX! TYPE(t_atm), DIMENSION(nx,ny), INTENT(in) :: &
91 !THXS_SFX! tpatm
92 !THXS_SFX! TYPE(t_blk), DIMENSION(nx,ny), INTENT(in) :: &
93 !THXS_SFX! tpblkw
94 !THXS_SFX! TYPE(t_blk), DIMENSION(nt,nx,ny), INTENT(in) :: &
95 !THXS_SFX! tpblki
96 !THXS_SFX! TYPE(t_sit), DIMENSION(nt,nx,ny), INTENT(in) :: &
97 !THXS_SFX! tpsit
98 !THXS_SFX! TYPE(t_vtp), DIMENSION(nl,nt,nx,ny), INTENT(in) :: &
99 !THXS_SFX! tpsil
100 !THXS_SFX! TYPE(t_bud), DIMENSION(nx,ny), INTENT(inout) :: &
101 !THXS_SFX! tpbud
102 !THXS_SFX!END SUBROUTINE glt_updbud
103 !THXS_SFX!!
104 !THXS_SFX!END INTERFACE
105 !THXS_SFX!END MODULE modi_glt_updbud
106 !
107 ! ----------------------- END MODULE modi_glt_updbud ------------------------
108 !
109 !
110 !
111 ! -----------------------------------------------------------------------
112 ! ------------------------- SUBROUTINE glt_updbud ---------------------------
113 !
114 ! .. Subroutine used to check global heat budget.
115 !
116 SUBROUTINE glt_updbud &
117  ( kinit,omsg,tpdom,tpmxl,tptfl,tpatm,tpblkw,tpblki,tpsit,tpsil,tpbud )
118 !
119  USE modd_types_glt
120  USE modd_glt_param
122  USE mode_glt_stats
123  USE mode_glt_info
124 !
125  IMPLICIT NONE
126 !
127  INTEGER, INTENT(in) :: &
128  kinit
129  CHARACTER(*), INTENT(in) :: &
130  omsg
131  TYPE(t_dom), DIMENSION(nx,ny), INTENT(in) :: &
132  tpdom
133  TYPE(t_mxl), DIMENSION(nx,ny), INTENT(in) :: &
134  tpmxl
135  TYPE(t_tfl), DIMENSION(nx,ny), INTENT(in) :: &
136  tptfl
137  TYPE(t_atm), DIMENSION(nx,ny), INTENT(in) :: &
138  tpatm
139  TYPE(t_blk), DIMENSION(nx,ny), INTENT(in) :: &
140  tpblkw
141  TYPE(t_blk), DIMENSION(nt,nx,ny), INTENT(in) :: &
142  tpblki
143  TYPE(t_sit), DIMENSION(nt,nx,ny), INTENT(in) :: &
144  tpsit
145  TYPE(t_vtp), DIMENSION(nl,nt,nx,ny), INTENT(in) :: &
146  tpsil
147  TYPE(t_bud), DIMENSION(nx,ny), INTENT(inout) :: &
148  tpbud
149 !
150  INTEGER :: &
151  jl
152  REAL :: &
153  zenthalpy0,zhiit0,zbiit0,zhii0,zhio0, &
154  zhli0,zhlo0,zwio0,zwlo0,zwii0,zwli0,zcio0,zclo0, &
155  zwater0,zsalt0
156  REAL, DIMENSION(nx,ny) :: &
157  zfsit
158  REAL, DIMENSION(nx,ny) :: &
159  zenthalpy2,zhiit2,zbiit2, &
160  znli2,zniit2,zhli2,zhlo2,zwii2,zwli2,zwater2,zsalt2
161  REAL, DIMENSION(nt,nx,ny) :: &
162  zenthalpys,zenthalpyi,zmsi,zmsn
163 !
164 !
165 !
166 ! 1. Initializations
167 ! ==================
168 !
169  IF (lp1) THEN
170  WRITE(noutlu,*) ' '
171  WRITE(noutlu,*) ' **** glt_updbud ****'
172  WRITE(noutlu,*) omsg, ' (energy fluxes in W.m-2)'
173  WRITE(noutlu,*) omsg, ' (water and salt fluxes in kg.m-2.day-1)'
174  ENDIF
175 !
176 !
177 ! 1.1. Initialize arrays
178 ! -----------------------
179 !
180  zfsit(:,:) = sum( tpsit(:,:,:)%fsi,dim=1 )
181  zmsi(:,:,:) = rhoice * tpsit(:,:,:)%fsi * tpsit(:,:,:)%hsi
182  zmsn(:,:,:) = tpsit(:,:,:)%rsn * tpsit(:,:,:)%fsi * tpsit(:,:,:)%hsn
183 !
184 !
185 ! 1.2. Print information
186 ! -----------------------
187 !
188  CALL glt_info_si( omsg,tpdom,tpsit=tpsit )
189 !
190 !
191 !
192 ! 2. Incoming fluxes
193 ! ===================
194 !
195 ! 2.1. Incoming fluxes on sea ice (top+bottom of the slab)
196 ! ---------------------------------------------------------
197 !
198 ! .. Note that the incoming energy at the top represents on the one
199 ! hand the sum of solar and non solar fluxes, the snow layer latent
200 ! heat change due to new snowfalls, and the related snow layer gltools_enthalpy
201 ! variation.
202 ! (note that tpatm%sop is in kg.m-2.s-1)
203 !
204  IF ( kinit==1 ) THEN
205 !
206 ! Energy
207  zniit2(:,:) = tpatm(:,:)%sop * &
208  sum( tpsit(:,:,:)%fsi*tpsil(nl,:,:,:)%ent, dim=1 )
209 ! ( -xmhofusn0*zfsit(:,:) + &
210 ! SUM( tpsit(:,:,:)%fsi * &
211 ! ( cpice0*tpsit(:,:,:)%tsf ),DIM=1 ) ) ! + &
212 ! tpatm(:,:)%lip* &
213 ! xmhofusn0*zfsit(:,:)
214 ! atm -> ice energy
215  zhiit2(:,:) = &
216  sum( tpsit(:,:,:)%fsi* &
217  ( tpblki(:,:,:)%nsf+tpblki(:,:,:)%swa ), dim=1 )
218 ! oce -> ice energy ( qoc can only be determined a posteriori, in glt_updhsi_r )
219  zbiit2(:,:) = &
220  tpmxl(:,:)%qml*zfsit(:,:) ! + tpmxl(:,:)%qoc
221 !
222  tpbud(:,:)%nii = zniit2(:,:)
223  tpbud(:,:)%hii = zhiit2(:,:)+zniit2(:,:)
224  tpbud(:,:)%bii = zbiit2(:,:)
225 !
226 ! Water
227  zwii2(:,:) = zfsit(:,:)* ( tpatm(:,:)%sop + tpatm(:,:)%lip ) + &
228  sum( tpsit(:,:,:)%fsi*tpblki(:,:,:)%eva, dim=1 )
229  tpbud(:,:)%wii = zwii2(:,:)*xday2sec
230  ENDIF
231 !
232  IF ( nprinto>=1 ) THEN
233 !
234 ! Energy
235  zhiit0 = glt_avg( tpdom,tpbud(:,:)%hii,0 )
236  zbiit0 = glt_avg( tpdom,tpbud(:,:)%bii,0 )
237  zhii0 = zhiit0 + zbiit0
238 !
239 ! Water
240  zwii0 = glt_avg( tpdom,tpbud(:,:)%wii,0 )
241 !
242  IF (lwg) THEN
243  WRITE(noutlu,*) &
244  '--------------------------------------------------------------------'
245  WRITE(noutlu,*) ' Incoming ENERGY under sea ice :', &
246  zbiit0
247  WRITE(noutlu,*) ' Incoming ENERGY top of sea ice :', &
248  zhiit0
249  WRITE(noutlu,*) ' Total incoming ENERGY on sea ice :', &
250  zhii0
251  WRITE(noutlu,*) &
252  '--------------------------------------------------------------------'
253  WRITE(noutlu,*) ' Total incoming WATER on sea ice :', &
254  zwii0
255  WRITE(noutlu,*) &
256  '--------------------------------------------------------------------'
257  ENDIF
258  ENDIF
259 !
260 !
261 ! 2.2. Incoming fluxes on leads
262 ! ------------------------------
263 !
264  IF ( kinit==1 ) THEN
265 !
266 ! Energy
267  zhli2(:,:) = &
268  ( 1.-zfsit(:,:) )* &
269  ( tpmxl(:,:)%qml+tpblkw(:,:)%nsf+tpblkw(:,:)%swa )
270  IF ( nsnwrad==1 ) THEN
271  znli2(:,:) = ( 1.-zfsit(:,:) )* &
272 ! ( cpice0*tpmxl(:,:)%mlf-xmhofusn0 )*tpatm(:,:)%sop
273  ( -xmhofusn0 )*tpatm(:,:)%sop
274  ELSE
275  znli2(:,:) = 0.
276  ENDIF
277  tpbud(:,:)%nli = znli2(:,:)
278  tpbud(:,:)%hli = zhli2(:,:)+znli2(:,:)
279 !
280 ! Water
281  zwli2(:,:) = ( 1.-zfsit(:,:) )* &
282  ( tpatm(:,:)%sop + tpatm(:,:)%lip + tpblkw(:,:)%eva )*xday2sec
283  tpbud(:,:)%wli = zwli2(:,:)
284  ENDIF
285 !
286  IF ( nprinto>=1 ) THEN
287 !
288 ! Energy
289  zhli0 = glt_avg( tpdom,tpbud(:,:)%hli,0 )
290  IF (lwg) THEN
291  WRITE(noutlu,*) ' Total incoming ENERGY (on leads) :', &
292  zhli0
293  WRITE(noutlu,*) &
294  '--------------------------------------------------------------------'
295  ENDIF
296 !
297 ! Water
298  zwli0 = glt_avg( tpdom,tpbud(:,:)%wli,0 )
299  IF (lwg) THEN
300  WRITE(noutlu,*) ' Total incoming WATER (on leads) :', &
301  zwli0
302  WRITE(noutlu,*) &
303  '--------------------------------------------------------------------'
304  ENDIF
305  ENDIF
306 !
307 !
308 !
309 ! 3. Outgoing fluxes
310 ! ===================
311 !
312 ! 3.1. Outgoing fluxes at the bottom of the sea ice slab
313 ! -------------------------------------------------------
314 !
315 ! Energy
316  tpbud(:,:)%hio = tptfl(:,:)%lio+tptfl(:,:)%tio
317 !
318  IF ( nprinto>=1 ) THEN
319  zhio0 = glt_avg( tpdom,tpbud(:,:)%hio,0 )
320  IF (lwg) THEN
321  WRITE(noutlu,*) ' Total outgoing ENERGY (under sea ice) :', &
322  zhio0
323  WRITE(noutlu,*) &
324  '--------------------------------------------------------------------'
325  ENDIF
326 !
327 ! Water
328 ! This flux is just described by tptfl%wio
329 !
330  zwio0 = glt_avg( tpdom,tptfl(:,:)%wio,0 )*xday2sec
331  IF (lwg) THEN
332  WRITE(noutlu,*) ' Total outgoing WATER (under sea ice) :', &
333  zwio0
334  WRITE(noutlu,*) &
335  '--------------------------------------------------------------------'
336  ENDIF
337 !
338 ! Salt
339 ! A conversion is necessary to convert the concentration/dilution flux to
340 ! salt mass changes ( in kg.m-2 ):
341 ! D S = sml * cio
342 !
343  zsalt2(:,:) = tptfl(:,:)%sio
344  zcio0 = glt_avg( tpdom,zsalt2,0 )*xday2sec
345  IF (lwg) THEN
346  WRITE(noutlu,*) ' Total outgoing SALT (under sea ice) :', &
347  zcio0
348  WRITE(noutlu,*) &
349  '--------------------------------------------------------------------'
350  ENDIF
351  ENDIF
352 !
353 !
354 ! 3.2. Outgoing fluxes through the water surface
355 ! -----------------------------------------------
356 !
357 ! Energy
358  zhlo2(:,:) = tptfl(:,:)%llo+tptfl(:,:)%tlo
359 !
360  tpbud(:,:)%hlo = zhlo2(:,:)
361 !
362  IF ( nprinto>=1 ) THEN
363  zhlo0 = glt_avg( tpdom,tpbud(:,:)%hlo,0 )
364  IF (lwg) THEN
365  WRITE(noutlu,*) ' Total outgoing ENERGY (under leads) :', &
366  zhlo0
367  WRITE(noutlu,*) &
368  '--------------------------------------------------------------------'
369  ENDIF
370 !
371 ! Water
372  zwlo0 = glt_avg( tpdom,tptfl%wlo,0 )*xday2sec
373  IF (lwg) THEN
374  WRITE(noutlu,*) ' Total outgoing WATER (under leads) :', &
375  zwlo0
376  WRITE(noutlu,*) &
377  '--------------------------------------------------------------------'
378  ENDIF
379 !
380 ! Salt
381 ! A conversion is necessary to convert the concentration/dilution flux to
382 ! salt mass changes ( in kg.m-2 ):
383 ! D S = sml * wlo
384 !
385 ! zsalt2(:,:) = 1.e-3 * tpmxl(:,:)%sml * tptfl(:,:)%wlo
386 ! zclo0 = glt_avg( tpdom,zsalt2,0 )*xday2sec
387 ! WRITE(noutlu,*) ' Total outgoing SALT (under leads) :', &
388 ! zclo0
389 ! WRITE(noutlu,*) &
390 ! '--------------------------------------------------------------------'
391  ENDIF
392 !
393 !
394 !
395 ! 4. Energy/water/salt retained by sea ice/snow per square meter
396 ! ===============================================================
397 !
398 ! 4.1. Enthalpy in sea ice/snow per square meter
399 ! ----------------------------------------------
400 !
401  zenthalpyi(:,:,:) = 0.
402  DO jl=1,nilay
403  zenthalpyi(:,:,:) = zenthalpyi(:,:,:) + &
404  sf3tinv(jl) * zmsi(:,:,:) * tpsil(jl,:,:,:)%ent
405  END DO
406 !
407  zenthalpys(:,:,:) = &
408  zmsn(:,:,:) * sum( tpsil(nilay+1:nl,:,:,:)%ent,dim=1 )/float(nslay)
409 !
410  zenthalpy2(:,:) = sum( zenthalpys(:,:,:)+zenthalpyi(:,:,:), dim=1 )
411 !
412 ! .. Initial gltools_enthalpy is set to computed gltools_enthalpy if kinit flag is on.
413 ! Else initial gltools_enthalpy is kept as such.
414 !
415  IF ( kinit==1 ) THEN
416  tpbud(:,:)%eni = zenthalpy2(:,:)
417  tpbud(:,:)%enn = zenthalpy2(:,:)
418  ELSE
419  tpbud(:,:)%enn = zenthalpy2(:,:)
420  ENDIF
421 !
422  IF ( nprinto>=1 ) THEN
423  zenthalpy0 = glt_avg( tpdom, tpbud(:,:)%enn-tpbud(:,:)%eni,0 ) / dtt
424  IF (lwg) THEN
425  WRITE(noutlu,*) &
426  ' D(enthalpy) from beg. of time step :', &
427  zenthalpy0
428  WRITE(noutlu,*) &
429  '--------------------------------------------------------------------'
430  ENDIF
431  ENDIF
432 !
433 !
434 ! 4.2. Water stored by sea ice and snow
435 ! --------------------------------------
436 !
437 ! .. Note that we exclude salt (only fresh water is taken into account)
438 !
439 ! Sea ice + snow fresh water content
440  zwater2(:,:) = xday2sec*( &
441  sum( zmsi(:,:,:)*( 1.-1.e-3*tpsit(:,:,:)%ssi ), dim=1 ) + &
442  sum( zmsn(:,:,:), dim=1 ) )
443 !
444 ! .. Initial fresh water content of sea ice + snow cover is initialised if
445 ! kinit flag is on.
446 !
447  IF ( kinit==1 ) THEN
448  tpbud(:,:)%fwi = zwater2(:,:)
449  ENDIF
450  tpbud(:,:)%fwn = zwater2(:,:)
451 !
452  IF ( nprinto>=1 ) THEN
453  zwater0 = glt_avg( tpdom,tpbud(:,:)%fwn-tpbud(:,:)%fwi,0 ) / dtt
454  IF (lwg) THEN
455  WRITE(noutlu,*) ' D(water) from beg. of time step :', &
456  zwater0
457  WRITE(noutlu,*) &
458  '--------------------------------------------------------------------'
459  ENDIF
460  ENDIF
461 !
462 !
463 ! 4.3. Salt stored by sea ice
464 ! ----------------------------
465 !
466 ! Sea ice salt content
467  zsalt2(:,:) = xday2sec* &
468  sum( zmsi(:,:,:)*1.e-3*tpsit(:,:,:)%ssi, dim=1 )
469 !
470 ! .. Initial salt content of sea ice is initialised if kinit flag is on.
471 !
472  IF ( kinit==1 ) THEN
473  tpbud(:,:)%isi = zsalt2(:,:)
474  ENDIF
475  tpbud(:,:)%isn = zsalt2(:,:)
476 !
477  IF ( nprinto>=1 ) THEN
478  zsalt0 = glt_avg( tpdom,tpbud(:,:)%isn-tpbud(:,:)%isi,0 ) / dtt
479  IF (lwg) THEN
480  WRITE(noutlu,*) ' D(salt) from beg. of time step :', &
481  zsalt0
482  WRITE(noutlu,*) &
483  '--------------------------------------------------------------------'
484  ENDIF
485  ENDIF
486 !
487 !
488 ! 5. Final prints: general budget
489 ! ===============================
490 !
491 ! .. At the end of the time step, the sum of incoming energy on leads
492 ! and on sea ice should be equal to the sum of the total variation of
493 ! gltools_enthalpy in sea ice+snow and of the total outgoing energy.
494 ! A print of these two quantities is done here.
495 !
496  IF (lp1) THEN
497  WRITE(noutlu,*) ' Total incoming energy (leads+ice) :', &
498  zhii0+zhli0
499  WRITE(noutlu,*) ' D(enthalpy) + outg. ENERGY :', &
500  zenthalpy0+zhio0+zhlo0
501  WRITE(noutlu,*) ' ENERGY BALANCE :', &
502  zenthalpy0+zhio0+zhlo0-(zhii0+zhli0)
503  WRITE(noutlu,*) &
504  '--------------------------------------------------------------------'
505  WRITE(noutlu,*) ' Total incoming + outgoing water (leads+ice) :', &
506  zwii0+zwli0-zwio0-zwlo0
507  WRITE(noutlu,*) ' WATER BALANCE :', &
508  zwii0+zwli0-zwio0-zwlo0-zwater0
509  WRITE(noutlu,*) &
510  '--------------------------------------------------------------------'
511  WRITE(noutlu,*) ' SALT BALANCE :', &
512  -zcio0-zsalt0
513  WRITE(noutlu,*) &
514  '--------------------------------------------------------------------'
515  ENDIF
516 !
517 END SUBROUTINE glt_updbud
518 
519 ! ----------------------- END SUBROUTINE glt_updbud -------------------------
520 ! -----------------------------------------------------------------------
subroutine glt_updbud(kinit, omsg, tpdom, tpmxl, tptfl, tpatm, tpblkw, tpblki, tpsit, tpsil, tpbud)