SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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
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
58 USE modi_pgd_field
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(surf_atm_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)
subroutine pgd_field(DTCO, UG, U, USS, HPROGRAM, HFIELD, HAREA, HFILE, HFILETYPE, PUNIF, PFIELD, OPRESENT)
Definition: pgd_field.F90:6
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine pgd_chemistry(CHE, DTCO, UG, U, USS, HPROGRAM, OCH_EMIS)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)