SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
modi_glt_thermo.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_thermo ========================
41 ! =======================================================================
42 !
43 !
44 ! Goal:
45 ! -----
46 ! Computation of the thermodynamic forcing over open water, sea ice
47 ! and snow-covered sea ice. Version with thickness within each box
48 ! which is constant, compensated with variable fractional ice
49 ! covers.
50 ! This part of the code runs on a reduced grid, the work grid only includes
51 ! ocean points where SST is less than a certain threshold or where there
52 ! is sea ice. We consider that:
53 ! - if there is a lot of sea ice, there is a possibility for warm
54 ! water advection in this area, hence any place where there is sea ice
55 ! should be treated to avoid losing sea ice
56 ! - a reasonable temperature threshold is 1°, to include areas
57 ! where salinity is zero (freezing point = 0°C)
58 !
59 ! Created : 2009/06 - Reduced grid option introduced - full grid still
60 ! available (D. Salas y Melia)
61 ! Modified: 2009/11 - Full grid is no longer treated (D. Salas y Melia)
62 ! Modified: 2010/05 - mpi Multi-processing introduced (S.Senesi)
63 ! Modified: 2011/04 - (Re)-ensure portability on both NEC and PC
64 ! Modified: 2011/05 - Solve issue occurring when less ice points than
65 ! processors (S.Senesi)
66 ! Modified: 2011/12 - Introduce new diagnostics (A. Voldoire)
67 ! Modified: 2012/07 (D. Salas y Melia)
68 ! Input now consists of fields defined on subdomains
69 ! Modified: 2012/11 (D. Salas y Melia)
70 ! Sea ice damping
71 ! Modified: 2015/07 (D. Salas y Melia)
72 ! Sea ice damping has been externalized from thermo_r routine
73 !
74 ! -------------------- BEGIN MODULE modi_glt_thermo -------------------------
75 
76 !THXS_SFX!MODULE modi_glt_thermo
77 !THXS_SFX!INTERFACE
78 !THXS_SFX!
79 !THXS_SFX!SUBROUTINE glt_thermo &
80 !THXS_SFX! ( tpdom,pustar,tpmxl,tpatm, &
81 !THXS_SFX! tpblkw,tpblki,tpbud,tpdia,tptfl,tpsit,tpsil,tpsit_d )
82 !THXS_SFX! USE modd_types_glt
83 !THXS_SFX! USE modd_glt_param
84 !THXS_SFX! TYPE(t_dom), DIMENSION(nx,ny), INTENT(in) :: &
85 !THXS_SFX! tpdom
86 !THXS_SFX! REAL, DIMENSION(nx,ny), INTENT(in) :: &
87 !THXS_SFX! pustar
88 !THXS_SFX! TYPE(t_mxl), DIMENSION(nx,ny), INTENT(in) :: &
89 !THXS_SFX! tpmxl
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(inout) :: &
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_bud), DIMENSION(nx,ny), INTENT(inout) :: &
97 !THXS_SFX! tpbud
98 !THXS_SFX! TYPE(t_dia), DIMENSION(nx,ny), INTENT(inout) :: &
99 !THXS_SFX! tpdia
100 !THXS_SFX! TYPE(t_tfl), DIMENSION(nx,ny), INTENT(inout) :: &
101 !THXS_SFX! tptfl
102 !THXS_SFX! TYPE(t_sit), DIMENSION(nt,nx,ny), INTENT(inout) :: &
103 !THXS_SFX! tpsit
104 !THXS_SFX! TYPE(t_vtp), DIMENSION(nl,nt,nx,ny), INTENT(inout) :: &
105 !THXS_SFX! tpsil
106 !THXS_SFX! TYPE(t_sit), DIMENSION(ntd,nx,ny), OPTIONAL, INTENT(in) :: &
107 !THXS_SFX! tpsit_d
108 !THXS_SFX!END SUBROUTINE glt_thermo
109 !THXS_SFX!
110 !THXS_SFX!END INTERFACE
111 !THXS_SFX!END MODULE modi_glt_thermo
112 
113 ! ---------------------- END MODULE modi_glt_thermo -------------------------
114 !
115 !
116 ! -----------------------------------------------------------------------
117 ! ----------------------- SUBROUTINE glt_thermo -----------------------------
118 !
119 SUBROUTINE glt_thermo &
120  ( tpdom,pustar,tpmxl,tpatm, &
121  tpblkw,tpblki,tpbud,tpdia,tptfl,tpsit,tpsil,tpsit_d )
122 !
123 !
124 ! 1. DECLARATIONS
125 ! ===============
126 !
127 ! 1.1. Module declarations
128 ! ------------------------
129 !
131  USE modd_types_glt
132  USE modd_glt_param
133  USE mode_glt_stats
134  USE mode_glt_stats_r
135  USE modi_glt_thermo_r
136  USE modi_glt_constrain_r
137 !
138  IMPLICIT NONE
139 !
140 !
141 ! 1.2. Dummy arguments declarations
142 ! ---------------------------------
143 !
144  TYPE(t_dom), DIMENSION(nx,ny), INTENT(in) :: &
145  tpdom
146  REAL, DIMENSION(nx,ny), INTENT(in) :: &
147  pustar
148  TYPE(t_mxl), DIMENSION(nx,ny), INTENT(in) :: &
149  tpmxl
150  TYPE(t_atm), DIMENSION(nx,ny), INTENT(in) :: &
151  tpatm
152  TYPE(t_blk), DIMENSION(nx,ny), INTENT(inout) :: &
153  tpblkw
154  TYPE(t_blk), DIMENSION(nt,nx,ny), INTENT(in) :: &
155  tpblki
156  TYPE(t_bud), DIMENSION(nx,ny), INTENT(inout) :: &
157  tpbud
158  TYPE(t_dia), DIMENSION(nx,ny), INTENT(inout) :: &
159  tpdia
160  TYPE(t_tfl), DIMENSION(nx,ny), INTENT(inout) :: &
161  tptfl
162  TYPE(t_sit), DIMENSION(nt,nx,ny), INTENT(inout) :: &
163  tpsit
164  TYPE(t_vtp), DIMENSION(nl,nt,nx,ny), INTENT(inout) :: &
165  tpsil
166  TYPE(t_sit), DIMENSION(ntd,nx,ny), OPTIONAL, INTENT(in) :: &
167  tpsit_d
168 !
169 !
170 ! 1.3. Local variables declarations
171 ! ---------------------------------
172 !
173  INTEGER :: &
174  jk,jl
175  LOGICAL, DIMENSION(nx,ny) :: &
176  gsel
177  INTEGER, DIMENSION(nx,ny) :: &
178  isel
179  REAL, DIMENSION(nx,ny) :: &
180  zfsit,zsnflx
181  TYPE(t_dia), DIMENSION(nx,ny) :: &
182  tzdia0
183  TYPE(t_tfl), DIMENSION(nx,ny) :: &
184  tztfl0
185  TYPE(t_sit), DIMENSION(nt,nx,ny) :: &
186  tzsit0
187  TYPE(t_vtp), DIMENSION(nl,nt,nx,ny) :: &
188  tzsil0
189 ! INTEGER :: &
190 ! ji,jj
191 ! INTEGER, DIMENSION(2,nx,ny) :: &
192 ! ind
193 ! INTEGER, DIMENSION(:,:), ALLOCATABLE :: &
194 ! ind_r
195  TYPE(t_dom), DIMENSION(:), ALLOCATABLE :: &
196  tzdom_r
197  REAL, DIMENSION(:), ALLOCATABLE :: &
198  zustar_r
199  TYPE(t_mxl), DIMENSION(:), ALLOCATABLE :: &
200  tzmxl_r
201  TYPE(t_atm), DIMENSION(:), ALLOCATABLE :: &
202  tzatm_r
203  TYPE(t_blk), DIMENSION(:), ALLOCATABLE :: &
204  tzblkw_r
205  TYPE(t_blk), DIMENSION(:,:), ALLOCATABLE :: &
206  tzblki_r
207  TYPE(t_bud), DIMENSION(:), ALLOCATABLE :: &
208  tzbud_r
209  TYPE(t_dia), DIMENSION(:), ALLOCATABLE :: &
210  tzdia_r
211  TYPE(t_tfl), DIMENSION(:), ALLOCATABLE :: &
212  tztfl_r
213  TYPE(t_sit), DIMENSION(:,:), ALLOCATABLE :: &
214  tzsit_d_r
215  TYPE(t_sit), DIMENSION(:,:), ALLOCATABLE :: &
216  tzsit_r
217  TYPE(t_vtp), DIMENSION(:,:,:), ALLOCATABLE :: &
218  tzsil_r
219 !
220 !
221 ! 1.4. Welcome message
222 ! --------------------
223 !
224  IF (lp1) THEN
225  WRITE(noutlu,*) ' '
226  WRITE(noutlu,*) ' *** LEVEL 3 - SUBROUTINE THERMO'
227  WRITE(noutlu,*) ' '
228  ENDIF
229 !
230 !
231 !
232 ! 2. THERMODYNAMICS ON REDUCED GRID
233 ! ==================================
234 !
235 ! 2.1. Define grid point selection criterion
236 ! -------------------------------------------
237 !
238  zfsit(:,:) = glt_iceconcm(tpdom,tpsit)
239  isel(:,:) = 0
240 !
241 ! In principe, calculations on tpdom%imk==1 would suffice. But it
242 ! would require bounding in the end (thermodynamics would not be
243 ! purely 1d...)
244 !
245  WHERE( tpdom(:,:)%tmk==1 .AND. &
246  (tpmxl(:,:)%tml <= 1. .OR. zfsit(:,:)>epsil1) )
247  isel(:,:) = 1
248  ENDWHERE
249 !
250  gsel(:,:) = ( isel(:,:)==1 )
251 !
252 !
253 ! 2.2. Pack all fields and allocate reduced grid arrays
254 ! ------------------------------------------------------
255 !
256 ! .. Reduced grid dimension
257 !
258  np = sum(isel)
259 !
260  IF (lp3) THEN
261  WRITE(noutlu,*) &
262  '**********************************************************'
263  WRITE(noutlu,*) 'REDUCED GRID:'
264  WRITE(noutlu,1000) gelato_myrank, np, nx*ny, nx, ny
265  WRITE(noutlu,*) &
266  '**********************************************************'
267  ENDIF
268 !
269 ! .. Note that on some platforms, every locally-allocated array needs to be
270 ! deallocated explicitly (this is done at the end of this subroutine).
271 ! More over, the deallocations need be done in reverse order.
272 !
273  IF ( np /= 0 ) THEN
274 ! ALLOCATE( ind_r(2,np) )
275  ALLOCATE( tzdom_r(np) )
276  ALLOCATE( zustar_r(np) )
277  ALLOCATE( tzmxl_r(np) )
278  ALLOCATE( tzatm_r(np) )
279  ALLOCATE( tzblkw_r(np) )
280  ALLOCATE( tzblki_r(nt,np) )
281  ALLOCATE( tzbud_r(np) )
282  ALLOCATE( tzdia_r(np) )
283  ALLOCATE( tztfl_r(np) )
284 ! Note that the error check on ntd dimension will be done in glt_constrain_r
285  IF ( present(tpsit_d) ) ALLOCATE( tzsit_d_r(ntd,np) )
286  ALLOCATE( tzsit_r(nt,np) )
287  ALLOCATE( tzsil_r(nl,nt,np) )
288 !
289 !
290 ! 2.3. From global to reduced grid arrays
291 ! ----------------------------------------
292 !
293 ! Ces tableaux devraient passer en variable globale, pour des recherches
294 ! d'indices...
295 !ind_r(1,:) = PACK( ind(1,:,:),gsel )
296 !ind_r(2,:) = PACK( ind(2,:,:),gsel )
297 !if (np>=6832) write(noutlu,*)'index 6832 =',ind_r(1,6832),ind_r(2,6832)
298 ! .. Domain
299 !
300  tzdom_r%tmk = pack( tpdom%tmk ,gsel )
301  tzdom_r%umk = pack( tpdom%umk ,gsel )
302  tzdom_r%vmk = pack( tpdom%vmk ,gsel )
303  tzdom_r%imk = pack( tpdom%imk ,gsel )
304  tzdom_r%indi = pack( tpdom%indi ,gsel )
305  tzdom_r%indj = pack( tpdom%indj ,gsel )
306  tzdom_r%lon = pack( tpdom%lon ,gsel )
307  tzdom_r%lat = pack( tpdom%lat ,gsel )
308  tzdom_r%dxc = pack( tpdom%dxc ,gsel )
309  tzdom_r%dyc = pack( tpdom%dyc ,gsel )
310  tzdom_r%srf = pack( tpdom%srf ,gsel )
311 !
312 ! .. Friction velocity
313 !
314  zustar_r = pack( pustar, gsel )
315 !
316 ! .. Mixed layer conditions
317 !
318  tzmxl_r%hco = pack( tpmxl%hco ,gsel )
319  tzmxl_r%qoc = pack( tpmxl%qoc ,gsel )
320  tzmxl_r%sml = pack( tpmxl%sml ,gsel )
321  tzmxl_r%ssh = pack( tpmxl%ssh ,gsel )
322  tzmxl_r%tml = pack( tpmxl%tml ,gsel )
323  tzmxl_r%mlf = pack( tpmxl%mlf ,gsel )
324  tzmxl_r%uml = pack( tpmxl%uml ,gsel )
325  tzmxl_r%vml = pack( tpmxl%vml ,gsel )
326  tzmxl_r%qml = pack( tpmxl%qml ,gsel )
327 !
328 ! .. Atmospheric conditions
329 !
330  tzatm_r%lip = pack( tpatm%lip ,gsel )
331  tzatm_r%sop = pack( tpatm%sop ,gsel )
332  tzatm_r%ztx = pack( tpatm%ztx ,gsel )
333  tzatm_r%mty = pack( tpatm%mty ,gsel )
334 !
335 ! .. Surface fluxes (over ocean)
336 !
337  tzblkw_r%swa = pack( tpblkw%swa ,gsel )
338  tzblkw_r%nsf = pack( tpblkw%nsf ,gsel )
339  tzblkw_r%dfl = pack( tpblkw%dfl ,gsel )
340  tzblkw_r%eva = pack( tpblkw%eva ,gsel )
341 !
342 ! .. Surface fluxes (over ice)
343 !
344  DO jk=1,nt
345  tzblki_r(jk,:)%swa = pack( tpblki(jk,:,:)%swa ,gsel )
346  tzblki_r(jk,:)%nsf = pack( tpblki(jk,:,:)%nsf ,gsel )
347  tzblki_r(jk,:)%dfl = pack( tpblki(jk,:,:)%dfl ,gsel )
348  tzblki_r(jk,:)%eva = pack( tpblki(jk,:,:)%eva ,gsel )
349  END DO
350 !
351 ! .. Energy budget
352 !
353  tzbud_r%eni = pack( tpbud%eni ,gsel )
354  tzbud_r%enn = pack( tpbud%enn ,gsel )
355  tzbud_r%bii = pack( tpbud%bii ,gsel )
356  tzbud_r%nii = pack( tpbud%nii ,gsel )
357  tzbud_r%nli = pack( tpbud%nli ,gsel )
358  tzbud_r%hii = pack( tpbud%hii ,gsel )
359  tzbud_r%hli = pack( tpbud%hli ,gsel )
360  tzbud_r%hio = pack( tpbud%hio ,gsel )
361  tzbud_r%hlo = pack( tpbud%hlo ,gsel )
362  tzbud_r%wii = pack( tpbud%wii ,gsel )
363  tzbud_r%wli = pack( tpbud%wli ,gsel )
364  tzbud_r%fwi = pack( tpbud%fwi ,gsel )
365  tzbud_r%fwn = pack( tpbud%fwn ,gsel )
366  tzbud_r%isi = pack( tpbud%isi ,gsel )
367  tzbud_r%isn = pack( tpbud%isn ,gsel )
368 !
369 ! .. Diagnostics
370 !
371  tzdia_r%uvl = pack( tpdia%uvl ,gsel )
372  tzdia_r%vvl = pack( tpdia%vvl ,gsel )
373  tzdia_r%aiw = pack( tpdia%aiw ,gsel )
374  tzdia_r%asi = pack( tpdia%asi ,gsel )
375  tzdia_r%amp = pack( tpdia%amp ,gsel )
376  tzdia_r%asn = pack( tpdia%asn ,gsel )
377  tzdia_r%cgl = pack( tpdia%cgl ,gsel )
378  tzdia_r%dsa = pack( tpdia%dsa ,gsel )
379  tzdia_r%dsn = pack( tpdia%dsn ,gsel )
380  tzdia_r%dsi = pack( tpdia%dsi ,gsel )
381  tzdia_r%dwi = pack( tpdia%dwi ,gsel )
382  tzdia_r%lip = pack( tpdia%lip ,gsel )
383  tzdia_r%lsi = pack( tpdia%lsi ,gsel )
384  tzdia_r%mrb = pack( tpdia%mrb ,gsel )
385  tzdia_r%mrt = pack( tpdia%mrt ,gsel )
386  tzdia_r%mrl = pack( tpdia%mrl ,gsel )
387  tzdia_r%sie = pack( tpdia%sie ,gsel )
388  tzdia_r%sne = pack( tpdia%sne ,gsel )
389  tzdia_r%sni = pack( tpdia%sni ,gsel )
390  tzdia_r%snm = pack( tpdia%snm ,gsel )
391  tzdia_r%snml = pack( tpdia%snml ,gsel )
392  tzdia_r%sop = pack( tpdia%sop ,gsel )
393  tzdia_r%the = pack( tpdia%the ,gsel )
394  tzdia_r%tin = pack( tpdia%tin ,gsel )
395  tzdia_r%tiw = pack( tpdia%tiw ,gsel )
396  tzdia_r%qoi = pack( tpdia%qoi ,gsel )
397  tzdia_r%xtr = pack( tpdia%xtr ,gsel )
398  tzdia_r%ytr = pack( tpdia%ytr ,gsel )
399  tzdia_r%sp1 = pack( tpdia%sp1 ,gsel )
400  tzdia_r%sp2 = pack( tpdia%sp2 ,gsel )
401  tzdia_r%sui = pack( tpdia%sui ,gsel )
402  tzdia_r%sut = pack( tpdia%sut ,gsel )
403  tzdia_r%sus = pack( tpdia%sus ,gsel )
404  tzdia_r%suw = pack( tpdia%suw ,gsel )
405  tzdia_r%s_pr = pack( tpdia%s_pr ,gsel )
406  tzdia_r%s_prsn = pack( tpdia%s_prsn ,gsel )
407  tzdia_r%o_pr = pack( tpdia%o_pr ,gsel )
408  tzdia_r%o_prsn = pack( tpdia%o_prsn ,gsel )
409  tzdia_r%subcio = pack( tpdia%subcio ,gsel )
410  tzdia_r%snicio = pack( tpdia%snicio ,gsel )
411  tzdia_r%hsicio = pack( tpdia%hsicio ,gsel )
412  tzdia_r%lmlcio = pack( tpdia%lmlcio ,gsel )
413  tzdia_r%salcio = pack( tpdia%salcio ,gsel )
414  tzdia_r%l_pr = pack( tpdia%l_pr ,gsel )
415  tzdia_r%l_prsn = pack( tpdia%l_prsn ,gsel )
416  tzdia_r%sul = pack( tpdia%sul ,gsel )
417 ! These ones should not be packed: unused in thermodynamics, and contain
418 ! data outside the ice domain (the data will be lost if packing):
419 ! - tzdia_r%ifw
420 ! - tzdia_r%sic
421 ! - tzdia_r%sit
422 ! - tzdia_r%atx,%aty
423 ! - tzdia_r%otx,%oty
424 !
425 ! .. Fluxes transmitted to the mixed layer
426 !
427  tztfl_r%lio = pack( tptfl%lio ,gsel )
428  tztfl_r%llo = pack( tptfl%llo ,gsel )
429  tztfl_r%tio = pack( tptfl%tio ,gsel )
430  tztfl_r%tlo = pack( tptfl%tlo ,gsel )
431  tztfl_r%sio = pack( tptfl%sio ,gsel )
432  tztfl_r%cio = pack( tptfl%cio ,gsel )
433  tztfl_r%wio = pack( tptfl%wio ,gsel )
434  tztfl_r%wlo = pack( tptfl%wlo ,gsel )
435  tztfl_r%xio = pack( tptfl%xio ,gsel )
436  tztfl_r%yio = pack( tptfl%yio ,gsel )
437 !
438 ! .. Damping / restoring data
439 !
440  IF ( present(tpsit_d) ) THEN
441  DO jk=1,ntd
442  tzsit_d_r(jk,:)%esi = pack( tpsit_d(jk,:,:)%esi, gsel )
443  tzsit_d_r(jk,:)%asn = pack( tpsit_d(jk,:,:)%asn, gsel )
444  tzsit_d_r(jk,:)%fsi = pack( tpsit_d(jk,:,:)%fsi, gsel )
445  tzsit_d_r(jk,:)%hsi = pack( tpsit_d(jk,:,:)%hsi, gsel )
446  tzsit_d_r(jk,:)%hsn = pack( tpsit_d(jk,:,:)%hsn, gsel )
447  tzsit_d_r(jk,:)%rsn = pack( tpsit_d(jk,:,:)%rsn, gsel )
448  tzsit_d_r(jk,:)%tsf = pack( tpsit_d(jk,:,:)%tsf, gsel )
449  tzsit_d_r(jk,:)%ssi = pack( tpsit_d(jk,:,:)%ssi, gsel )
450  tzsit_d_r(jk,:)%age = pack( tpsit_d(jk,:,:)%age, gsel )
451  tzsit_d_r(jk,:)%vmp = pack( tpsit_d(jk,:,:)%vmp ,gsel )
452  END DO
453  ENDIF
454 !
455 ! .. Sea ice 2D
456 !
457  DO jk=1,nt
458  tzsit_r(jk,:)%esi = pack( tpsit(jk,:,:)%esi ,gsel )
459  tzsit_r(jk,:)%asn = pack( tpsit(jk,:,:)%asn ,gsel )
460  tzsit_r(jk,:)%fsi = pack( tpsit(jk,:,:)%fsi ,gsel )
461  tzsit_r(jk,:)%hsi = pack( tpsit(jk,:,:)%hsi ,gsel )
462  tzsit_r(jk,:)%hsn = pack( tpsit(jk,:,:)%hsn ,gsel )
463  tzsit_r(jk,:)%rsn = pack( tpsit(jk,:,:)%rsn ,gsel )
464  tzsit_r(jk,:)%tsf = pack( tpsit(jk,:,:)%tsf ,gsel )
465  tzsit_r(jk,:)%ssi = pack( tpsit(jk,:,:)%ssi ,gsel )
466  tzsit_r(jk,:)%age = pack( tpsit(jk,:,:)%age ,gsel )
467  tzsit_r(jk,:)%vmp = pack( tpsit(jk,:,:)%vmp ,gsel )
468  END DO
469 !
470 ! .. Sea ice 3D
471 !
472  DO jl=1,nl
473  DO jk=1,nt
474  tzsil_r(jl,jk,:)%ent = pack( tpsil(jl,jk,:,:)%ent ,gsel )
475  END DO
476  END DO
477 !
478 !
479 ! 2.4. Update domain surface
480 ! ---------------------------
481 !
482  xdomsrf_r = sum( tzdom_r(:)%dxc*tzdom_r(:)%dyc )
483 !
484 !
485 ! 2.5. Thermodynamics on the reduced grid
486 ! ----------------------------------------
487 !
488  IF ( nthermo==1 ) THEN
489  CALL glt_thermo_r &
490  ( tzdom_r,zustar_r,tzmxl_r,tzatm_r,tzblkw_r,tzblki_r,tzbud_r,tzdia_r, &
491  tztfl_r,tzsit_r,tzsil_r )
492  ENDIF
493 !
494 !
495 ! 2.6. Apply the constraint
496 ! --------------------------
497 !
498  IF ( ntd==1 ) THEN
499  CALL glt_constrain_r( tzdom_r,tzmxl_r,tzsit_r,tzsil_r,tzdia_r,tzsit_d_r )
500  ENDIF
501 !
502 !
503 ! 2.7. From reduced to global grid arrays
504 ! ----------------------------------------
505 !
506 ! .. Energy budget
507 ! Nothing to do : this is a non-cumulative diagnostic (initialized at
508 ! every glt_updtfl CALL)
509 !
510 ! .. Diagnostics
511 ! Note that only INTENT(inout) arguments must be unpacked
512 !
513  tzdia0(:,:)%uvl = 0.
514  tzdia0(:,:)%vvl = 0.
515  tzdia0(:,:)%aiw = 0.
516  tzdia0(:,:)%asi = 0.
517  tzdia0(:,:)%amp = 0.
518  tzdia0(:,:)%asn = 0.
519  tzdia0(:,:)%cgl = 0.
520  tzdia0(:,:)%dsa = 0.
521  tzdia0(:,:)%dsn = 0.
522  tzdia0(:,:)%dsi = 0.
523  tzdia0(:,:)%dci = 0.
524  tzdia0(:,:)%cst = 0.
525  tzdia0(:,:)%dwi = 0.
526  tzdia0(:,:)%lip = 0.
527  tzdia0(:,:)%lsi = 0.
528  tzdia0(:,:)%mrb = 0.
529  tzdia0(:,:)%mrt = 0.
530  tzdia0(:,:)%mrl = 0.
531  tzdia0(:,:)%sie = 0.
532  tzdia0(:,:)%sne = 0.
533  tzdia0(:,:)%sni = 0.
534  tzdia0(:,:)%snm = 0.
535  tzdia0(:,:)%snml = 0.
536  tzdia0(:,:)%sop = 0.
537  tzdia0(:,:)%the = 0.
538  tzdia0(:,:)%tin = 0.
539  tzdia0(:,:)%tiw = 0.
540  tzdia0(:,:)%qoi = 0.
541  tzdia0(:,:)%xtr = 0.
542  tzdia0(:,:)%ytr = 0.
543  tzdia0(:,:)%sp1 = 0.
544  tzdia0(:,:)%sp2 = 0.
545  tzdia0(:,:)%sui = 0.
546  tzdia0(:,:)%sut = 0.
547  tzdia0(:,:)%sus = 0.
548  tzdia0(:,:)%suw = 0.
549  tzdia0(:,:)%sul = 0.
550  tzdia0(:,:)%s_pr = 0.
551  tzdia0(:,:)%s_prsn = 0.
552  tzdia0(:,:)%o_pr = 0.
553  tzdia0(:,:)%o_prsn = 0.
554  tzdia0(:,:)%l_pr = 0.
555  tzdia0(:,:)%l_prsn = 0.
556  tzdia0(:,:)%subcio = 0.
557  tzdia0(:,:)%snicio = 0.
558  tzdia0(:,:)%hsicio = 0.
559  tzdia0(:,:)%lmlcio = 0.
560  tzdia0(:,:)%salcio = 0.
561 !
562  tpdia%uvl = unpack( tzdia_r%uvl,gsel,tzdia0%uvl )
563  tpdia%vvl = unpack( tzdia_r%vvl,gsel,tzdia0%vvl )
564  tpdia%aiw = unpack( tzdia_r%aiw,gsel,tzdia0%aiw )
565  tpdia%asi = unpack( tzdia_r%asi,gsel,tzdia0%asi )
566  tpdia%amp = unpack( tzdia_r%amp,gsel,tzdia0%amp )
567  tpdia%asn = unpack( tzdia_r%asn,gsel,tzdia0%asn )
568  tpdia%cgl = unpack( tzdia_r%cgl,gsel,tzdia0%cgl )
569  tpdia%dsa = unpack( tzdia_r%dsa,gsel,tzdia0%dsa )
570  tpdia%dsn = unpack( tzdia_r%dsn,gsel,tzdia0%dsn )
571  tpdia%dsi = unpack( tzdia_r%dsi,gsel,tzdia0%dsi )
572  tpdia%dci = unpack( tzdia_r%dci,gsel,tzdia0%dci )
573  tpdia%cst = unpack( tzdia_r%cst,gsel,tzdia0%cst )
574  tpdia%dwi = unpack( tzdia_r%dwi,gsel,tzdia0%dwi )
575  tpdia%lip = unpack( tzdia_r%lip,gsel,tzdia0%lip )
576  tpdia%lsi = unpack( tzdia_r%lsi,gsel,tzdia0%lsi )
577  tpdia%mrb = unpack( tzdia_r%mrb,gsel,tzdia0%mrb )
578  tpdia%mrt = unpack( tzdia_r%mrt,gsel,tzdia0%mrt )
579  tpdia%mrl = unpack( tzdia_r%mrl,gsel,tzdia0%mrl )
580  tpdia%sie = unpack( tzdia_r%sie,gsel,tzdia0%sie )
581  tpdia%sne = unpack( tzdia_r%sne,gsel,tzdia0%sne )
582  tpdia%sni = unpack( tzdia_r%sni,gsel,tzdia0%sni )
583  tpdia%snm = unpack( tzdia_r%snm,gsel,tzdia0%snm )
584  tpdia%snml = unpack( tzdia_r%snml,gsel,tzdia0%snml )
585  tpdia%sop = unpack( tzdia_r%sop,gsel,tzdia0%sop )
586  tpdia%the = unpack( tzdia_r%the,gsel,tzdia0%the )
587  tpdia%tin = unpack( tzdia_r%tin,gsel,tzdia0%tin )
588  tpdia%tiw = unpack( tzdia_r%tiw,gsel,tzdia0%tiw )
589  tpdia%qoi = unpack( tzdia_r%qoi,gsel,tzdia0%qoi )
590  tpdia%xtr = unpack( tzdia_r%xtr,gsel,tzdia0%xtr )
591  tpdia%ytr = unpack( tzdia_r%ytr,gsel,tzdia0%ytr )
592  tpdia%sp1 = unpack( tzdia_r%sp1,gsel,tzdia0%sp1 )
593  tpdia%sp2 = unpack( tzdia_r%sp2,gsel,tzdia0%sp2 )
594  tpdia%sus = unpack( tzdia_r%sus,gsel,tzdia0%sus )
595  tpdia%sut = unpack( tzdia_r%sut,gsel,tzdia0%sut )
596  tpdia%sui = unpack( tzdia_r%sui,gsel,tzdia0%sui )
597  tpdia%suw = unpack( tzdia_r%suw,gsel,tzdia0%suw )
598  tpdia%s_pr = unpack( tzdia_r%s_pr,gsel,tzdia0%s_pr )
599  tpdia%s_prsn = unpack( tzdia_r%s_prsn,gsel,tzdia0%s_prsn )
600  tpdia%o_pr = unpack( tzdia_r%o_pr,gsel,tzdia0%o_pr )
601  tpdia%o_prsn = unpack( tzdia_r%o_prsn,gsel,tzdia0%o_prsn )
602  tpdia%subcio = unpack( tzdia_r%subcio,gsel,tzdia0%subcio )
603  tpdia%snicio = unpack( tzdia_r%snicio,gsel,tzdia0%snicio )
604  tpdia%hsicio = unpack( tzdia_r%hsicio,gsel,tzdia0%hsicio )
605  tpdia%lmlcio = unpack( tzdia_r%lmlcio,gsel,tzdia0%lmlcio )
606  tpdia%salcio = unpack( tzdia_r%salcio,gsel,tzdia0%salcio )
607  tpdia%l_pr = unpack( tzdia_r%l_pr,gsel,tzdia0%l_pr )
608  tpdia%l_prsn = unpack( tzdia_r%l_prsn,gsel,tzdia0%l_prsn )
609  tpdia%sul = unpack( tzdia_r%sul,gsel,tzdia0%sul )
610 !
611 ! .. Fluxes transmitted to the mixed layer
612 !
613 ! Components of tptfl to be updated out of the reduced grid:
614 ! - llo : short wave on leads : only thermo_lead
615 ! - tlo : non solar on leads : only in thermo_lead
616 ! - wlo : fresh water mass flux through leads : only in thermo_lead
617 ! (Redundant with what is in imod_thermo_lead... Caution !)
618 !
619 ! Short wave on leads
620  tztfl0(:,:)%llo = tptfl(:,:)%llo + tpblkw(:,:)%swa
621  tptfl%llo = unpack( tztfl_r%llo,gsel,tztfl0%llo )
622 !
623 ! Non solar flux on leads
624  IF ( nsnwrad==1 ) THEN
625  zsnflx(:,:) = -xmhofusn0*tpatm(:,:)%sop
626  ELSE
627  zsnflx(:,:) = 0.
628  ENDIF
629  tztfl0(:,:)%tlo = tptfl(:,:)%tlo + &
630  tpmxl(:,:)%qml + tpblkw(:,:)%nsf + zsnflx(:,:)
631  tptfl%tlo = unpack( tztfl_r%tlo,gsel,tztfl0%tlo )
632 !
633 ! Water flux on leads
634  tztfl0(:,:)%wlo = tptfl(:,:)%wlo + &
635  tpatm(:,:)%lip + tpatm(:,:)%sop + tpblkw(:,:)%eva
636  tptfl%wlo = unpack( tztfl_r%wlo,gsel,tztfl0%wlo )
637 !
638 ! Short wave flux on leads
639  tztfl0(:,:)%lio = 0.
640  tptfl%lio = unpack( tztfl_r%lio,gsel,tztfl0%lio )
641 !
642 ! Non solar flux under sea ice
643  tztfl0(:,:)%tio = 0.
644  tptfl%tio = unpack( tztfl_r%tio,gsel,tztfl0%tio )
645 !
646 ! Salinity flux under sea ice
647  tztfl0(:,:)%sio = 0.
648  tptfl%sio = unpack( tztfl_r%sio,gsel,tztfl0%sio )
649 !
650 ! Concentration/dilution flux under sea ice
651  tztfl0(:,:)%cio = 0.
652  tptfl%cio = unpack( tztfl_r%cio,gsel,tztfl0%cio )
653 !
654 ! Water flux mass flux under sea ice
655  tztfl0(:,:)%wio = 0.
656  tptfl%wio = unpack( tztfl_r%wio,gsel,tztfl0%wio )
657 !
658 ! Sea ice-ocean stress X-component
659  tztfl0(:,:)%xio = 0.
660  tptfl%xio = unpack( tztfl_r%xio,gsel,tztfl0%xio )
661 !
662 ! Sea ice-ocean stress Y-component
663  tztfl0(:,:)%yio = 0.
664  tptfl%yio = unpack( tztfl_r%yio,gsel,tztfl0%yio )
665 !
666 ! .. Sea ice 2D
667 !
668  tzsit0(:,:,:)%esi = .false.
669  tzsit0(:,:,:)%asn = albw
670  tzsit0(:,:,:)%fsi = 0.
671  tzsit0(:,:,:)%hsi = 0.
672  tzsit0(:,:,:)%hsn = 0.
673  tzsit0(:,:,:)%rsn = rhosnwmin
674  tzsit0(:,:,:)%tsf = spread( tpmxl(:,:)%mlf,1,nt )
675  tzsit0(:,:,:)%ssi = 0.
676  tzsit0(:,:,:)%age = 0.
677  tzsit0(:,:,:)%vmp = 0.
678 !
679  DO jk=1,nt
680  tpsit(jk,:,:)%esi = unpack( tzsit_r(jk,:)%esi,gsel,tzsit0(jk,:,:)%esi )
681  tpsit(jk,:,:)%asn = unpack( tzsit_r(jk,:)%asn,gsel,tzsit0(jk,:,:)%asn )
682  tpsit(jk,:,:)%fsi = unpack( tzsit_r(jk,:)%fsi,gsel,tzsit0(jk,:,:)%fsi )
683  tpsit(jk,:,:)%hsi = unpack( tzsit_r(jk,:)%hsi,gsel,tzsit0(jk,:,:)%hsi )
684  tpsit(jk,:,:)%hsn = unpack( tzsit_r(jk,:)%hsn,gsel,tzsit0(jk,:,:)%hsn )
685  tpsit(jk,:,:)%rsn = unpack( tzsit_r(jk,:)%rsn,gsel,tzsit0(jk,:,:)%rsn )
686  tpsit(jk,:,:)%tsf = unpack( tzsit_r(jk,:)%tsf,gsel,tzsit0(jk,:,:)%tsf )
687  tpsit(jk,:,:)%ssi = unpack( tzsit_r(jk,:)%ssi,gsel,tzsit0(jk,:,:)%ssi )
688  tpsit(jk,:,:)%age = unpack( tzsit_r(jk,:)%age,gsel,tzsit0(jk,:,:)%age )
689  tpsit(jk,:,:)%vmp = unpack( tzsit_r(jk,:)%vmp,gsel,tzsit0(jk,:,:)%vmp )
690  END DO
691 !
692 ! .. Sea ice 3D
693 !
694  tzsil0(:,:,:,:)%ent = 0.
695 !
696  DO jl=1,nl
697  DO jk=1,nt
698  tpsil(jl,jk,:,:)%ent = unpack( tzsil_r(jl,jk,:)%ent,gsel, &
699  tzsil0(jl,jk,:,:)%ent )
700  END DO
701  END DO
702 !
703 !
704 !
705 ! 3. Deallocations
706 ! =================
707 !
708 ! .. Note that on some platforms, in contradiction with the Fortran 95 norm,
709 ! locally-allocated arrays are not released automatically. More over, some
710 ! platforms require that the last allocated array in deallocated first.
711 ! These rules have to be respected if more arrays are allocated/deallocated
712 ! here.
713 !
714 ! DEALLOCATE( ind_r )
715  DEALLOCATE( tzsil_r )
716  DEALLOCATE( tzsit_r )
717  DEALLOCATE( tztfl_r )
718  DEALLOCATE( tzdia_r )
719  DEALLOCATE( tzbud_r )
720  DEALLOCATE( tzblki_r )
721  DEALLOCATE( tzblkw_r )
722  DEALLOCATE( tzatm_r )
723  DEALLOCATE( tzmxl_r )
724  DEALLOCATE( zustar_r )
725  DEALLOCATE( tzdom_r )
726  ENDIF
727 !
728 !
729 !
730 ! 4. Formats + Farewell message
731 ! ==============================
732 !
733 1000 FORMAT( " Processor ", i5," ==> Running on ", i5, &
734  " points instead of ", i6, "(" i5, " times " , i5, ")" )
735 !
736  IF (lp1) THEN
737  WRITE(noutlu,*) ' '
738  WRITE(noutlu,*) ' *** LEVEL 3 - END SUBROUTINE THERMO'
739  WRITE(noutlu,*) ' '
740  ENDIF
741 !
742 END SUBROUTINE glt_thermo
743 
744 ! ----------------------- END SUBROUTINE glt_thermo -------------------------
745 ! -----------------------------------------------------------------------
subroutine glt_constrain_r(tpdom, tpmxl, tpsit, tpsil, tpdia, tpsit_d)
subroutine glt_thermo(tpdom, pustar, tpmxl, tpatm, tpblkw, tpblki, tpbud, tpdia, tptfl, tpsit, tpsil, tpsit_d)
subroutine glt_thermo_r(tpdom, pustar, tpmxl, tpatm, tpblkw, tpblki, tpbud, tpdia, tptfl, tpsit, tpsil)