SURFEX v8.1
General documentation of Surfex
pgd_chemistry.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 (CHE, DTCO, UG, U, USS, &
7  HPROGRAM,OCH_EMIS)
8 ! ##############################################################
9 !
10 !!**** *PGD_CHEMISTRY* 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 !! V. Masson Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 10/12/97
37 !!
38 !----------------------------------------------------------------------------
39 !
40 !* 0. DECLARATION
41 ! -----------
42 !
43 !
44 !
45 !
49 USE modd_surf_atm_n, ONLY : surf_atm_t
50 USE modd_sso_n, ONLY : sso_t
51 !
52 USE modd_pgd_grid, ONLY : nl
53 USE modd_pgdwork, ONLY : catype
54 USE modd_surf_par, ONLY : xundef
55 USE modd_ch_surf, ONLY : jpemismax_f
56 !
57 USE modi_get_luout
59 USE modi_open_namelist
60 USE modi_close_namelist
61 USE modi_get_surf_size_n
63 !
64 USE mode_pos_surf
65 !
66 !
67 USE yomhook ,ONLY : lhook, dr_hook
68 USE parkind1 ,ONLY : jprb
69 !
70 USE modi_abor1_sfx
71 !
72 USE modi_get_surf_mask_n
73 !
74 IMPLICIT NONE
75 !
76 !* 0.1 Declaration of arguments
77 ! ------------------------
78 !
79 !
80 TYPE(ch_emis_field_t), INTENT(INOUT) :: CHE
81 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
82 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
83 TYPE(surf_atm_t), INTENT(INOUT) :: U
84 TYPE(sso_t), INTENT(INOUT) :: USS
85 !
86  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
87 LOGICAL, INTENT(OUT) :: OCH_EMIS ! emission flag
88 !
89 !
90 !* 0.2 Declaration of local variables
91 ! ------------------------------
92 !
93 INTEGER :: ILUOUT ! output listing logical unit
94 INTEGER :: ILUNAM ! namelist file logical unit
95 LOGICAL :: GFOUND ! flag when namelist is present
96 INTEGER :: JNBR ! loop counter on dummy fields
97 INTEGER :: ILU, IL_SEA, IL_LAND, IL
98 !
99 !* 0.3 Declaration of namelists
100 ! ------------------------
101 !
102 INTEGER :: NEMIS_PGD_NBR
103  CHARACTER(LEN=40), DIMENSION(JPEMISMAX_F):: CEMIS_PGD_NAME
104  CHARACTER(LEN=40), DIMENSION(JPEMISMAX_F):: CEMIS_PGD_COMMENT
105 INTEGER, DIMENSION(JPEMISMAX_F):: NEMIS_PGD_TIME
106  CHARACTER(LEN=3), DIMENSION(JPEMISMAX_F):: CEMIS_PGD_AREA
107  CHARACTER(LEN=3), DIMENSION(JPEMISMAX_F):: CEMIS_PGD_ATYPE
108  CHARACTER(LEN=28), DIMENSION(JPEMISMAX_F):: CEMIS_PGD_FILE
109  CHARACTER(LEN=6), DIMENSION(JPEMISMAX_F):: CEMIS_PGD_FILETYPE
110  CHARACTER(LEN=6) :: YMASK
111 REAL, DIMENSION(:), ALLOCATABLE :: ZEMIS_FIELD, ZEMIS_FIELDS
112 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK
113 REAL(KIND=JPRB) :: ZHOOK_HANDLE
114 
115 !
116 NAMELIST/nam_ch_emis_pgd/ nemis_pgd_nbr,cemis_pgd_name,nemis_pgd_time,&
117  cemis_pgd_comment,cemis_pgd_area,cemis_pgd_atype,cemis_pgd_file,&
118  cemis_pgd_filetype
119 !-------------------------------------------------------------------------------
120 !
121 !* 1. Initializations of defaults
122 ! ---------------------------
123 !
124 !
125 IF (lhook) CALL dr_hook('PGD_CHEMISTRY',0,zhook_handle)
126 nemis_pgd_nbr = 0
127 CEMIS_PGD_NAME(:) = ' '
128 nemis_pgd_time(:) = 0
129 CEMIS_PGD_COMMENT(:) = ''
130 CEMIS_PGD_AREA(:) = 'ALL'
131 CEMIS_PGD_FILETYPE(:)= 'DIRECT'
132 CEMIS_PGD_FILE(:) = ' '
133 CEMIS_PGD_ATYPE(:) = 'ARI'
134 !
135  CALL get_luout(hprogram,iluout)
136 !
137 !-------------------------------------------------------------------------------
138 !
139 !* 2. Reading of namelist
140 ! -------------------
141 !
142 !
143  CALL open_namelist(hprogram,ilunam)
144 !
145  CALL posnam(ilunam,'NAM_CH_EMIS_PGD',gfound,iluout)
146 IF (gfound) READ(unit=ilunam,nml=nam_ch_emis_pgd)
147 !
148  CALL close_namelist(hprogram,ilunam)
149 !
150 !-------------------------------------------------------------------------------
151 !
152 !* 3. Allocation
153 ! ----------
154 !
155 CHE%NEMIS_NBR = NEMIS_PGD_NBR
156 !
157  CALL get_surf_size_n(dtco, u, &
158  'LAND', il_land)
159  CALL get_surf_size_n(dtco, u, &
160  'SEA ',il_sea)
161 !
162 !
163 ALLOCATE(zemis_fields(nl))
164 !
165 ALLOCATE(che%XEMIS_FIELDS (nl,che%NEMIS_NBR))
166 ALLOCATE(che%CEMIS_AREA (che%NEMIS_NBR))
167 ALLOCATE(che%CEMIS_COMMENT(che%NEMIS_NBR))
168 ALLOCATE(che%CEMIS_NAME (che%NEMIS_NBR))
169 ALLOCATE(che%NEMIS_TIME (che%NEMIS_NBR))
170 !
171 CHE%CEMIS_AREA (:) = CEMIS_PGD_AREA (1:CHE%NEMIS_NBR)
172 CHE%CEMIS_NAME (:) = CEMIS_PGD_NAME (1:CHE%NEMIS_NBR)
173 CHE%NEMIS_TIME (:) = NEMIS_PGD_TIME (1:CHE%NEMIS_NBR)
174 CHE%CEMIS_COMMENT(:) = CEMIS_PGD_COMMENT(1:CHE%NEMIS_NBR)
175 !
176 CHE%NTIME_MAX = MAXVAL(CHE%NEMIS_TIME)
177 !
178 !-------------------------------------------------------------------------------
179 och_emis = che%NEMIS_NBR > 0
180 !-------------------------------------------------------------------------------
181 !
182 !* 4. Computations
183 ! ------------
184 !
185 DO jnbr=1,che%NEMIS_NBR
186  catype = cemis_pgd_atype(jnbr)
187  SELECT CASE (che%CEMIS_AREA(jnbr))
188  CASE ('LAN')
189  il = il_land
190  ymask='LAND '
191  CASE ('SEA')
192  il = il_sea
193  ymask='SEA '
194  CASE ('ALL')
195  il = nl
196  ymask='FULL '
197  CASE DEFAULT
198  CALL abor1_sfx('PGD_CHEMISTRY (1): EMISSION AREA NOT SUPPORTED')
199  END SELECT
200  ALLOCATE(zemis_field(il))
201  ALLOCATE(imask(il))
202  !* 4.1 Computes the field on the surface points where it is defined
203  CALL pgd_field(dtco, ug, u, uss, &
204  hprogram,che%CEMIS_NAME(jnbr),che%CEMIS_AREA(jnbr),cemis_pgd_file(jnbr), &
205  cemis_pgd_filetype(jnbr),xundef,zemis_field(:) )
206  catype = 'ARI'
207 
208 !* 4.2 Expends field on all surface points
209  ilu=0
210  CALL get_surf_mask_n(dtco, u, &
211  ymask,il,imask,ilu,iluout)
212  CALL unpack_same_rank(imask,zemis_field(:),zemis_fields(:))
213  DEALLOCATE(zemis_field)
214  DEALLOCATE(imask)
215 
216 
217 !* 4.3 Weights field on all surface points
218 ! (zero weight where field is not defined)
219  SELECT CASE (che%CEMIS_AREA(jnbr))
220  CASE ('LAN')
221  che%XEMIS_FIELDS(:,jnbr) = (u%XNATURE(:)+u%XTOWN(:))*zemis_fields(:)
222  CASE ('SEA')
223  che%XEMIS_FIELDS(:,jnbr) = u%XSEA*zemis_fields(:)
224  CASE ('ALL')
225  che%XEMIS_FIELDS(:,jnbr) = zemis_fields(:)
226  CASE DEFAULT
227  CALL abor1_sfx('PGD_CHEMISTRY (2): EMISSION AREA NOT SUPPORTED')
228  END SELECT
229 END DO
230 DEALLOCATE(zemis_fields)
231 IF (lhook) CALL dr_hook('PGD_CHEMISTRY',1,zhook_handle)
232 !
233 !-------------------------------------------------------------------------------
234 !
235 !* 5. Expends
236 ! ------------
237 !
238 
239 !-------------------------------------------------------------------------------
240 !
241 END SUBROUTINE pgd_chemistry
subroutine get_surf_size_n(DTCO, U, HTYPE, KL)
character(len=3) catype
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine pgd_chemistry(CHE, DTCO, UG, U, USS, HPROGRAM, OCH_EMIS)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
integer, parameter jpemismax_f
logical lhook
Definition: yomhook.F90:15
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)