SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
pgd_chemistry_snap.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 pgd_chemistry_snap (CHN, DTCO, UG, U, USS, &
7  hprogram,och_emis)
8 ! ##############################################################
9 !
10 !!**** *PGD_CHEMISTRY_SNAP* monitor for averaging and interpolations of physiographic fields
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! METHOD
16 !! ------
17 !!
18 !
19 !! EXTERNAL
20 !! --------
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! S; Queguiner Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 09/2011
37 !!
38 !! M.Leriche 04/2014 change length of CHARACTER for emission 6->12
39 !----------------------------------------------------------------------------
40 !
41 !* 0. DECLARATION
42 ! -----------
43 !
44 !
45 !
49 USE modd_surf_atm_n, ONLY : surf_atm_t
51 !
52 USE modd_pgdwork, ONLY : catype
53 USE modd_surf_par, ONLY : xundef
54 USE modd_pgd_grid, ONLY : nl
55 USE modd_ch_surf, ONLY : jpemismax_s, jpsnapmax
56 USE modi_get_luout
57 USE modi_open_namelist
58 USE modi_close_namelist
59 !
60 USE mode_pos_surf
61 USE modi_pgd_field
62 USE modi_pgd_snap_temp_profile
63 USE modi_get_luout
64 USE modi_abor1_sfx
65 !
66 !
67 USE yomhook ,ONLY : lhook, dr_hook
68 USE parkind1 ,ONLY : jprb
69 !
70 !
71 IMPLICIT NONE
72 !
73 !* 0.1 Declaration of arguments
74 ! ------------------------
75 !
76 !
77 TYPE(ch_emis_snap_t), INTENT(INOUT) :: chn
78 TYPE(data_cover_t), INTENT(INOUT) :: dtco
79 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
80 TYPE(surf_atm_t), INTENT(INOUT) :: u
81 TYPE(surf_atm_sso_t), INTENT(INOUT) :: uss
82 !
83  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! Type of program
84 LOGICAL, INTENT(OUT) :: och_emis ! emission flag
85 !
86 !
87 !* 0.2 Declaration of local variables
88 ! ------------------------------
89 !
90 INTEGER :: iluout ! output listing logical unit
91 INTEGER :: ilunam ! namelist file logical unit
92 LOGICAL :: gfound ! flag when namelist is present
93 INTEGER :: jspec ! loop counter on emission species
94 INTEGER :: jsnap ! loop counter on SNAP categories
95  CHARACTER(LEN=5) :: ysnap_time_ref ! to check if all snaps use
96 ! ! the same time reference
97 !
98 !* 0.3 Declaration of namelists
99 ! ------------------------
100 !
101 REAL(KIND=JPRB) :: zhook_handle
102  CHARACTER(LEN=12), DIMENSION(JPEMISMAX_S):: cemis_name
103  CHARACTER(LEN=40), DIMENSION(JPEMISMAX_S):: cemis_comment
104  CHARACTER(LEN=28), DIMENSION(JPEMISMAX_S):: csnap_monthly_file
105  CHARACTER(LEN=28), DIMENSION(JPEMISMAX_S):: csnap_daily_file
106  CHARACTER(LEN=28), DIMENSION(JPEMISMAX_S):: csnap_hourly_file
107  CHARACTER(LEN=50), DIMENSION(JPEMISMAX_S,JPSNAPMAX):: csnap_potential_file
108  CHARACTER(LEN=6), DIMENSION(JPEMISMAX_S) :: csnap_potential_filetype
109 REAL, DIMENSION(JPEMISMAX_S,JPSNAPMAX):: xunif_snap
110  CHARACTER(LEN=50) :: cdelta_legal_time_file
111  CHARACTER(LEN=6) :: cdelta_legal_time_filetype
112 REAL :: xunif_delta_legal_time
113 INTEGER :: nemis_nbr
114 INTEGER :: nemis_snap
115 !
116 !
117 namelist/nam_ch_snap_emis_pgd/ nemis_nbr, nemis_snap, cemis_name,&
118  cemis_comment, &
119  csnap_monthly_file, &
120  csnap_daily_file, &
121  csnap_hourly_file, &
122  csnap_potential_file, &
123  csnap_potential_filetype, &
124  xunif_snap, &
125  xunif_delta_legal_time, &
126  cdelta_legal_time_file, &
127  cdelta_legal_time_filetype
128  !-------------------------------------------------------------------------------
129 !
130 !* 1. Initializations of defaults
131 ! ---------------------------
132 !
133 !
134 IF (lhook) CALL dr_hook('PGD_CHEMISTRY_SNAP',0,zhook_handle)
135 nemis_nbr = 0
136  cemis_name(:) = ' '
137  cemis_comment(:) = ''
138 !
139 nemis_snap = 0
140  chn%NSNAP_M = 12
141  chn%NSNAP_D = 7
142  chn%NSNAP_H = 24
143 xunif_snap = xundef
144 xunif_delta_legal_time = xundef
145  csnap_monthly_file(:) = ' '
146  csnap_daily_file(:) = ' '
147  csnap_hourly_file(:) = ' '
148  csnap_potential_filetype(:)= ' '
149  csnap_potential_file(:,:) = ' '
150  cdelta_legal_time_filetype = ' '
151  cdelta_legal_time_file = ' '
152 !
153  CALL get_luout(hprogram,iluout)
154 !
155 !-------------------------------------------------------------------------------
156 !
157 !* 2. Reading of namelist
158 ! -------------------
159 !
160 !
161  CALL open_namelist(hprogram,ilunam)
162 !
163  CALL posnam(ilunam,'NAM_CH_SNAP_EMIS_PGD',gfound,iluout)
164 IF (gfound) READ(unit=ilunam,nml=nam_ch_snap_emis_pgd)
165 !
166  CALL close_namelist(hprogram,ilunam)
167 !
168 !-------------------------------------------------------------------------------
169 !
170 !* 3. Allocation
171 ! ----------
172 !
173  chn%NEMIS_NBR = nemis_nbr
174  chn%NEMIS_SNAP = nemis_snap
175 !
176 ALLOCATE(chn%CEMIS_NAME(nemis_nbr))
177 ALLOCATE(chn%CEMIS_COMMENT(nemis_nbr))
178 !
179 ALLOCATE(chn%XSNAP_MONTHLY (chn%NSNAP_M,nemis_snap,nemis_nbr))
180 ALLOCATE(chn%XSNAP_DAILY (chn%NSNAP_D,nemis_snap,nemis_nbr))
181 ALLOCATE(chn%XSNAP_HOURLY (chn%NSNAP_H,nemis_snap,nemis_nbr))
182 !
183  chn%CEMIS_NAME (:) = cemis_name(1:nemis_nbr)
184  chn%CEMIS_COMMENT (:) = cemis_comment(1:nemis_nbr)
185 !
186 ALLOCATE(chn%XEMIS_FIELDS_SNAP(nl,nemis_snap,nemis_nbr))
187 !
188 !-------------------------------------------------------------------------------
189 och_emis = nemis_nbr > 0
190 !-------------------------------------------------------------------------------
191 !
192 !* 4. Computes Potential maps for each snap and reads temporal profiles
193 ! -----------------------------------------------------------------
194 !
195 ysnap_time_ref = ' '
196 !
197 DO jspec=1,nemis_nbr
198 
199  CALL pgd_snap_temp_profile('ASCII ',csnap_monthly_file(jspec),chn%XSNAP_MONTHLY(:,:,jspec),nemis_snap,chn%NSNAP_M)
200  CALL pgd_snap_temp_profile('ASCII ',csnap_daily_file(jspec), chn%XSNAP_DAILY(:,:,jspec),nemis_snap,chn%NSNAP_D)
201  CALL pgd_snap_temp_profile('ASCII ',csnap_hourly_file(jspec), chn%XSNAP_HOURLY(:,:,jspec), &
202  nemis_snap,chn%NSNAP_H,chn%CSNAP_TIME_REF)
203 
204  IF (jspec==1) ysnap_time_ref = chn%CSNAP_TIME_REF
205  IF (ysnap_time_ref/=chn%CSNAP_TIME_REF) THEN
206  CALL abor1_sfx('ALL SNAP HOURLY PROFILES MUST HAVE THE SAME TIME REFERENCE')
207  END IF
208 
209  DO jsnap=1,nemis_snap
210  catype = 'ARI'
211  CALL pgd_field(dtco, ug, u, uss, &
212  hprogram,'SNAP','ALL',csnap_potential_file(jspec,jsnap), &
213  csnap_potential_filetype(jspec),xunif_snap(jspec,jsnap), &
214  chn%XEMIS_FIELDS_SNAP(:,jsnap,jspec) )
215  ENDDO
216 ENDDO
217 !
218 !-------------------------------------------------------------------------------
219 !
220 !* 5. Computes legal time map if legal time option is used
221 ! ----------------------------------------------------
222 !
223 IF (chn%CSNAP_TIME_REF=='LEGAL') THEN
224  ALLOCATE(chn%XDELTA_LEGAL_TIME(nl))
225  CALL pgd_field(dtco, ug, u, uss, &
226  hprogram,'LEGAL_TIME','ALL', cdelta_legal_time_file, &
227  cdelta_legal_time_filetype,xunif_delta_legal_time, &
228  chn%XDELTA_LEGAL_TIME(:) )
229  !* conversion from seconds to hours
230  ! Beware:
231  ! one uses the fact here that no legal hour increment is less more than 24h.
232  ! Legal hour is either zero (in which case division has no effect)
233  ! or specified unit is second
234  WHERE(abs(chn%XDELTA_LEGAL_TIME(:))>=24.) &
235  chn%XDELTA_LEGAL_TIME(:) = chn%XDELTA_LEGAL_TIME(:) / 3600.
236 END IF
237 !
238 !-------------------------------------------------------------------------------
239 !
240 IF (lhook) CALL dr_hook('PGD_CHEMISTRY_SNAP',1,zhook_handle)
241 !
242 END SUBROUTINE pgd_chemistry_snap
subroutine pgd_snap_temp_profile(HPROGRAM, HFILENAME, PSNAP_COEF, KSNAP, KTPS, HSNAP_TIME_REF)
subroutine pgd_field(DTCO, UG, U, USS, HPROGRAM, HFIELD, HAREA, HFILE, HFILETYPE, PUNIF, PFIELD, OPRESENT)
Definition: pgd_field.F90:6
subroutine pgd_chemistry_snap(CHN, DTCO, UG, U, USS, HPROGRAM, OCH_EMIS)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)