SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
writesurf_isban.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 ! #########
6  SUBROUTINE writesurf_isba_n (DGU, U, &
7  chi, dst, i, &
8  hprogram,oland_use)
9 ! #####################################
10 !
11 !!**** *WRITESURF_ISBA_n* - writes ISBA prognostic fields
12 !!
13 !!
14 !! PURPOSE
15 !! -------
16 !!
17 !!** METHOD
18 !! ------
19 !!
20 !! EXTERNAL
21 !! --------
22 !!
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !!
31 !! AUTHOR
32 !! ------
33 !! V. Masson *Meteo France*
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !! Original 01/2003
38 !! P. LeMoigne 12/2004 : correct dimensionning if more than 10 layers in
39 !! the soil (diffusion version)
40 !! B. Decharme 2008 : Floodplains
41 !! B. Decharme 01/2009 : Optional Arpege deep soil temperature write
42 !! A.L. Gibelin 03/09 : modifications for CENTURY model
43 !! A.L. Gibelin 04/2009 : BIOMASS and RESP_BIOMASS arrays
44 !! A.L. Gibelin 06/2009 : Soil carbon variables for CNT option
45 !! B. Decharme 07/2011 : land_use semi-prognostic variables
46 !! B. Decharme 09/2012 : suppress NWG_LAYER (parallelization problems)
47 !! B. Decharme 09/2012 : write some key for prep_read_external
48 !! B. Decharme 04/2013 : Only 2 temperature layer in ISBA-FR
49 !! P. Samuelsson 10/2014: MEB
50 !!
51 !-------------------------------------------------------------------------------
52 !
53 !* 0. DECLARATIONS
54 ! ------------
55 !
56 !
57 !
58 !
60 USE modd_surf_atm_n, ONLY : surf_atm_t
61 !
62 USE modd_ch_isba_n, ONLY : ch_isba_t
63 USE modd_dst_n, ONLY : dst_t
64 USE modd_isba_n, ONLY : isba_t
65 !
66 USE modd_surf_par, ONLY : nundef
67 !
68 !
69 USE modd_assim, ONLY : lassim, cassim, cassim_isba, nie, nens, &
70  xaddtimecorr, lens_gen, nvar
71 !
72 USE modd_dst_surf
73 !
75 USE modi_writesurf_gr_snow
76 !
77 !
78 USE yomhook ,ONLY : lhook, dr_hook
79 USE parkind1 ,ONLY : jprb
80 !
81 IMPLICIT NONE
82 !
83 !* 0.1 Declarations of arguments
84 ! -------------------------
85 !
86 !
87 !
88 TYPE(diag_surf_atm_t), INTENT(INOUT) :: dgu
89 TYPE(surf_atm_t), INTENT(INOUT) :: u
90 !
91 TYPE(ch_isba_t), INTENT(INOUT) :: chi
92 TYPE(dst_t), INTENT(INOUT) :: dst
93 TYPE(isba_t), INTENT(INOUT) :: i
94 !
95  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling
96 LOGICAL, INTENT(IN) :: oland_use !
97 !
98 !* 0.2 Declarations of local variables
99 ! -------------------------------
100 !
101 INTEGER :: iresp ! IRESP : return-code if a problem appears
102  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be read
103  CHARACTER(LEN=4 ) :: ylvl
104  CHARACTER(LEN=3 ) :: yvar
105  CHARACTER(LEN=100):: ycomment ! Comment string
106  CHARACTER(LEN=25) :: yform ! Writing format
107 !
108 INTEGER :: jj, jlayer, jp, jnbiomass, jnlitter, jnsoilcarb, jnlittlevs ! loop counter on levels
109 INTEGER :: iwork ! Work integer
110 INTEGER :: jsv
111 INTEGER :: isize_lmeb_patch
112 INTEGER :: jvar
113 !
114 REAL(KIND=JPRB) :: zhook_handle
115 !
116 !------------------------------------------------------------------------------
117 !
118 !* 2. Prognostic fields:
119 ! -----------------
120 !
121 IF (lhook) CALL dr_hook('WRITESURF_ISBA_N',0,zhook_handle)
122 !* soil temperatures
123 !
124 IF(i%LTEMP_ARP)THEN
125  iwork=i%NTEMPLAYER_ARP
126 ELSEIF(i%CISBA=='DIF')THEN
127  iwork=i%NGROUND_LAYER
128 ELSE
129  iwork=2 !Only 2 temperature layer in ISBA-FR
130 ENDIF
131 !
132 DO jlayer=1,iwork
133  WRITE(ylvl,'(I4)') jlayer
134  yrecfm='TG'//adjustl(ylvl(:len_trim(ylvl)))
135  yform='(A6,I1.1,A4)'
136  IF (jlayer >= 10) yform='(A6,I2.2,A4)'
137  WRITE(ycomment,fmt=yform) 'X_Y_TG',jlayer,' (K)'
138  CALL write_surf(dgu, u, &
139  hprogram,yrecfm,i%XTG(:,jlayer,:),iresp,hcomment=ycomment)
140 END DO
141 !
142 !* soil liquid water contents
143 !
144 DO jlayer=1,i%NGROUND_LAYER
145  WRITE(ylvl,'(I4)') jlayer
146  yrecfm='WG'//adjustl(ylvl(:len_trim(ylvl)))
147  yform='(A6,I1.1,A8)'
148  IF (jlayer >= 10) yform='(A6,I2.2,A8)'
149  WRITE(ycomment,fmt=yform) 'X_Y_WG',jlayer,' (m3/m3)'
150  CALL write_surf(dgu, u, &
151  hprogram,yrecfm,i%XWG(:,jlayer,:),iresp,hcomment=ycomment)
152 END DO
153 !
154 !* soil ice water contents
155 !
156 IF(i%CISBA=='DIF')THEN
157  iwork=i%NGROUND_LAYER
158 ELSE
159  iwork=2 !Only 2 soil ice layer in ISBA-FR
160 ENDIF
161 !
162 DO jlayer=1,iwork
163  WRITE(ylvl,'(I4)') jlayer
164  yrecfm='WGI'//adjustl(ylvl(:len_trim(ylvl)))
165  yform='(A7,I1.1,A8)'
166  IF (jlayer >= 10) yform='(A7,I2.2,A8)'
167  WRITE(ycomment,yform) 'X_Y_WGI',jlayer,' (m3/m3)'
168  CALL write_surf(dgu, u, &
169  hprogram,yrecfm,i%XWGI(:,jlayer,:),iresp,hcomment=ycomment)
170 END DO
171 !
172 !* water intercepted on leaves
173 !
174 yrecfm='WR'
175 ycomment='X_Y_WR (kg/m2)'
176  CALL write_surf(dgu, u, &
177  hprogram,yrecfm,i%XWR(:,:),iresp,hcomment=ycomment)
178 !
179 !* Glacier ice storage
180 !
181 yrecfm = 'GLACIER'
182 ycomment='LGLACIER key for external prep'
183  CALL write_surf(dgu, u, &
184  hprogram,yrecfm,i%LGLACIER,iresp,hcomment=ycomment)
185 !
186 IF(i%LGLACIER)THEN
187  yrecfm='ICE_STO'
188  ycomment='X_Y_ICE_STO (kg/m2)'
189  CALL write_surf(dgu, u, &
190  hprogram,yrecfm,i%XICE_STO(:,:),iresp,hcomment=ycomment)
191 ENDIF
192 !
193 !* Leaf Area Index
194 !
195 IF (i%CPHOTO/='NON' .AND. i%CPHOTO/='AGS' .AND. i%CPHOTO/='AST') THEN
196  !
197  yrecfm='LAI'
198  !
199  ycomment='X_Y_LAI (m2/m2)'
200  CALL write_surf(dgu, u, &
201  hprogram,yrecfm,i%XLAI(:,:),iresp,hcomment=ycomment)
202  !
203 END IF
204 !
205 IF ( trim(cassim_isba)=="ENKF" .AND. (lassim .OR. nie/=0) ) THEN
206  DO jvar = 1,nvar
207  IF ( xaddtimecorr(jvar)>0. ) THEN
208  WRITE(yvar,'(I3)') jvar
209  ycomment = 'Red_Noise_Enkf'
210  yrecfm='RED_NOISE'//adjustl(yvar(:len_trim(yvar)))
211  CALL write_surf(dgu, u, &
212  hprogram,yrecfm,i%XRED_NOISE(:,:,jvar),iresp,hcomment=ycomment)
213  ENDIF
214  ENDDO
215 ENDIF
216 !
217 !* snow mantel
218 !
219  CALL writesurf_gr_snow(dgu, u, &
220  hprogram,'VEG',' ',i%TSNOW)
221 !
222 !
223 !* key and/or field usefull to make an external prep
224 !
225 IF(i%CISBA=='DIF')THEN
226 !
227  yrecfm = 'SOC'
228  ycomment='SOC key for external prep'
229  CALL write_surf(dgu, u, &
230  hprogram,yrecfm,i%LSOC,iresp,hcomment=ycomment)
231 !
232 ELSE
233 !
234  yrecfm = 'TEMPARP'
235  ycomment='LTEMP_ARP key for external prep'
236  CALL write_surf(dgu, u, &
237  hprogram,yrecfm,i%LTEMP_ARP,iresp,hcomment=ycomment)
238 !
239  IF(i%LTEMP_ARP)THEN
240  yrecfm = 'NTEMPLARP'
241  ycomment='NTEMPLAYER_ARP for external prep'
242  CALL write_surf(dgu, u, &
243  hprogram,yrecfm,i%NTEMPLAYER_ARP,iresp,hcomment=ycomment)
244  ENDIF
245 !
246 ENDIF
247 !
248 !-------------------------------------------------------------------------------
249 !
250 !* 3. MEB Prognostic or Semi-prognostic variables
251 ! -------------------------------------------
252 !
253 !
254 isize_lmeb_patch=count(i%LMEB_PATCH(:))
255 !
256 IF (isize_lmeb_patch>0) THEN
257 !
258 !* water intercepted on canopy vegetation leaves
259 !
260  yrecfm='WRL'
261  ycomment='X_Y_WRL (kg/m2)'
262  CALL write_surf(dgu, u, &
263  hprogram,yrecfm,i%XWRL(:,:),iresp,hcomment=ycomment)
264 !
265 !* ice on litter
266 !
267  yrecfm='WRLI'
268  ycomment='X_Y_WRLI (kg/m2)'
269  CALL write_surf(dgu, u, &
270  hprogram,yrecfm,i%XWRLI(:,:),iresp,hcomment=ycomment)
271 !
272 !* snow intercepted on canopy vegetation leaves
273 !
274  yrecfm='WRVN'
275  ycomment='X_Y_WRVN (kg/m2)'
276  CALL write_surf(dgu, u, &
277  hprogram,yrecfm,i%XWRVN(:,:),iresp,hcomment=ycomment)
278 !
279 !* canopy vegetation temperature
280 !
281  yrecfm='TV'
282  ycomment='X_Y_TV (K)'
283  CALL write_surf(dgu, u, &
284  hprogram,yrecfm,i%XTV(:,:),iresp,hcomment=ycomment)
285 !
286 !* litter temperature
287 !
288  yrecfm='TL'
289  ycomment='X_Y_TL (K)'
290  CALL write_surf(dgu, u, &
291  hprogram,yrecfm,i%XTL(:,:),iresp,hcomment=ycomment)
292 !
293 !* vegetation canopy air temperature
294 !
295  yrecfm='TC'
296  ycomment='X_Y_TC (K)'
297  CALL write_surf(dgu, u, &
298  hprogram,yrecfm,i%XTC(:,:),iresp,hcomment=ycomment)
299 !
300 !* vegetation canopy air specific humidity
301 !
302  yrecfm='QC'
303  ycomment='X_Y_QC (kg/kg)'
304  CALL write_surf(dgu, u, &
305  hprogram,yrecfm,i%XQC(:,:),iresp,hcomment=ycomment)
306 !
307 ENDIF
308 !
309 !-------------------------------------------------------------------------------
310 !
311 !* 4. Semi-prognostic variables
312 ! -------------------------
313 !
314 !
315 !* Fraction for each patch
316 !
317 yrecfm='PATCH'
318 ycomment='fraction for each patch (-)'
319  CALL write_surf(dgu, u, &
320  hprogram,yrecfm,i%XPATCH(:,:),iresp,hcomment=ycomment)
321 !
322 !* patch averaged radiative temperature (K)
323 !
324 yrecfm='TSRAD_NAT'
325 ycomment='X_TSRAD_NAT (K)'
326  CALL write_surf(dgu, u, &
327  hprogram,yrecfm,i%XTSRAD_NAT(:),iresp,hcomment=ycomment)
328 !
329 !* aerodynamical resistance
330 !
331 yrecfm='RESA'
332 ycomment='X_Y_RESA (s/m)'
333  CALL write_surf(dgu, u, &
334  hprogram,yrecfm,i%XRESA(:,:),iresp,hcomment=ycomment)
335 !
336 !* Land use variables
337 !
338 IF(oland_use)THEN
339 !
340  DO jlayer=1,i%NGROUND_LAYER
341  WRITE(ylvl,'(I4)') jlayer
342  yrecfm='OLD_DG'//adjustl(ylvl(:len_trim(ylvl)))
343  yform='(A6,I1.1,A8)'
344  IF (jlayer >= 10) yform='(A6,I2.2,A8)'
345  WRITE(ycomment,fmt=yform) 'X_Y_OLD_DG',jlayer,' (m)'
346  CALL write_surf(dgu, u, &
347  hprogram,yrecfm,i%XDG(:,jlayer,:),iresp,hcomment=ycomment)
348  END DO
349 !
350 ENDIF
351 !
352 !* ISBA-AGS variables
353 !
354 IF (i%CPHOTO/='NON') THEN
355  yrecfm='AN'
356  ycomment='X_Y_AN (kgCO2/kgair m/s)'
357  CALL write_surf(dgu, u, &
358  hprogram,yrecfm,i%XAN(:,:),iresp,hcomment=ycomment)
359 !
360  yrecfm='ANDAY'
361  ycomment='X_Y_ANDAY (kgCO2/m2/day)'
362  CALL write_surf(dgu, u, &
363  hprogram,yrecfm,i%XANDAY(:,:),iresp,hcomment=ycomment)
364 !
365  yrecfm='ANFM'
366  ycomment='X_Y_ANFM (kgCO2/kgair m/s)'
367  CALL write_surf(dgu, u, &
368  hprogram,yrecfm,i%XANFM(:,:),iresp,hcomment=ycomment)
369 !
370  yrecfm='LE_AGS'
371  ycomment='X_Y_LE_AGS (W/m2)'
372  CALL write_surf(dgu, u, &
373  hprogram,yrecfm,i%XLE(:,:),iresp,hcomment=ycomment)
374 END IF
375 !
376 !
377 IF (i%CPHOTO=='NIT' .OR. i%CPHOTO=='NCB') THEN
378  !
379  DO jnbiomass=1,i%NNBIOMASS
380  WRITE(ylvl,'(I1)') jnbiomass
381  yrecfm='BIOMA'//adjustl(ylvl(:len_trim(ylvl)))
382  yform='(A11,I1.1,A10)'
383  WRITE(ycomment,fmt=yform) 'X_Y_BIOMASS',jnbiomass,' (kgDM/m2)'
384  CALL write_surf(dgu, u, &
385  hprogram,yrecfm,i%XBIOMASS(:,jnbiomass,:),iresp,hcomment=ycomment)
386  END DO
387  !
388  !
389  DO jnbiomass=2,i%NNBIOMASS
390  WRITE(ylvl,'(I1)') jnbiomass
391  yrecfm='RESPI'//adjustl(ylvl(:len_trim(ylvl)))
392  yform='(A16,I1.1,A10)'
393  WRITE(ycomment,fmt=yform) 'X_Y_RESP_BIOMASS',jnbiomass,' (kg/m2/s)'
394  CALL write_surf(dgu, u, &
395  hprogram,yrecfm,i%XRESP_BIOMASS(:,jnbiomass,:),iresp,hcomment=ycomment)
396  END DO
397  !
398 END IF
399 !
400 !* Soil carbon
401 !
402 yrecfm = 'RESPSL'
403 ycomment=yrecfm
404  CALL write_surf(dgu, u, &
405  hprogram,yrecfm,i%CRESPSL,iresp,hcomment=ycomment)
406 !
407 yrecfm='NLITTER'
408 ycomment=yrecfm
409  CALL write_surf(dgu, u, &
410  hprogram,yrecfm,i%NNLITTER,iresp,hcomment=ycomment)
411 !
412 yrecfm='NLITTLEVS'
413 ycomment=yrecfm
414  CALL write_surf(dgu, u, &
415  hprogram,yrecfm,i%NNLITTLEVS,iresp,hcomment=ycomment)
416 !
417 yrecfm='NSOILCARB'
418 ycomment=yrecfm
419  CALL write_surf(dgu, u, &
420  hprogram,yrecfm,i%NNSOILCARB,iresp,hcomment=ycomment)
421 !
422 IF(i%LSPINUPCARBS.OR.i%LSPINUPCARBW)THEN
423  yrecfm='NBYEARSOLD'
424  ycomment='yrs'
425  CALL write_surf(dgu, u, &
426  hprogram,yrecfm,i%NNBYEARSOLD,iresp,hcomment=ycomment)
427 ENDIF
428 !
429 IF (i%CRESPSL=='CNT') THEN
430  !
431  DO jnlitter=1,i%NNLITTER
432  DO jnlittlevs=1,i%NNLITTLEVS
433  WRITE(ylvl,'(I1,A1,I1)') jnlitter,'_',jnlittlevs
434  yrecfm='LITTER'//adjustl(ylvl(:len_trim(ylvl)))
435  yform='(A10,I1.1,A1,I1.1,A8)'
436  WRITE(ycomment,fmt=yform) 'X_Y_LITTER',jnlitter,' ',jnlittlevs,' (gC/m2)'
437  CALL write_surf(dgu, u, &
438  hprogram,yrecfm,i%XLITTER(:,jnlitter,jnlittlevs,:),iresp,hcomment=ycomment)
439  END DO
440  END DO
441 
442  DO jnsoilcarb=1,i%NNSOILCARB
443  WRITE(ylvl,'(I4)') jnsoilcarb
444  yrecfm='SOILCARB'//adjustl(ylvl(:len_trim(ylvl)))
445  yform='(A8,I1.1,A8)'
446  WRITE(ycomment,fmt=yform) 'X_Y_SOILCARB',jnsoilcarb,' (gC/m2)'
447  CALL write_surf(dgu, u, &
448  hprogram,yrecfm,i%XSOILCARB(:,jnsoilcarb,:),iresp,hcomment=ycomment)
449  END DO
450 !
451  DO jnlittlevs=1,i%NNLITTLEVS
452  WRITE(ylvl,'(I4)') jnlittlevs
453  yrecfm='LIGNIN_STR'//adjustl(ylvl(:len_trim(ylvl)))
454  yform='(A12,I1.1,A8)'
455  WRITE(ycomment,fmt=yform) 'X_Y_LIGNIN_STRUC',jnlittlevs,' (-)'
456  CALL write_surf(dgu, u, &
457  hprogram,yrecfm,i%XLIGNIN_STRUC(:,jnlittlevs,:),iresp,hcomment=ycomment)
458  END DO
459 !
460 ENDIF
461 !
462 !
463 IF (chi%SVI%NDSTEQ > 0)THEN
464  DO jsv = 1,ndstmde ! for all dust modes
465  WRITE(yrecfm,'(A8,I3.3)')'FLX_DSTM',jsv
466  ycomment='X_Y_'//yrecfm//' (kg/m2)'
467  CALL write_surf(dgu, u, &
468  hprogram,yrecfm,dst%XSFDSTM(:,jsv,:),iresp,hcomment=ycomment)
469  END DO
470 ENDIF
471 !
472 !-------------------------------------------------------------------------------
473 !
474 !* 5. Time
475 ! ----
476 !
477 yrecfm='DTCUR'
478 ycomment='s'
479  CALL write_surf(dgu, u, &
480  hprogram,yrecfm,i%TTIME,iresp,hcomment=ycomment)
481 IF (lhook) CALL dr_hook('WRITESURF_ISBA_N',1,zhook_handle)
482 !
483 !-------------------------------------------------------------------------------
484 !
485 END SUBROUTINE writesurf_isba_n
subroutine writesurf_isba_n(DGU, U, CHI, DST, I, HPROGRAM, OLAND_USE)
subroutine writesurf_gr_snow(DGU, U, HPROGRAM, HSURFTYPE, HPREFIX, TPSNOW)