SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
build_emisstabn.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 build_emisstab_n (CHU, &
7  hprogram,kch,hemis_gr_name, knbtimes,&
8  kemis_gr_time,koffndx,tpemiss,ksize,kluout, kverb,prhodref)
9 !! #####################################################################
10 !!
11 !!*** *BUILD_EMISSTAB*
12 !!
13 !! PURPOSE
14 !! -------
15 !!
16 !!** METHOD
17 !! ------
18 !!
19 !! AUTHOR
20 !! ------
21 !! D. Gazen
22 !!
23 !! MODIFICATIONS
24 !! -------------
25 !! Original 01/02/00
26 !! C. Mari 30/10/00 call of MODD_TYPE_EFUTIL and MODD_CST
27 !! D.Gazen 01/12/03 change emissions handling for surf. externalization!!
28 !! P.Tulet 01/01/04 change conversion for externalization (flux unit is
29 !! molec./m2/s)
30 !! M.Leriche 04/14 apply conversion factor if lead = f
31 !! change emissions name EMIS_ -> E_ name for coherence with PGD
32 !!
33 !! EXTERNAL
34 !! --------
35 !
36 !
37 !
38 USE modd_ch_surf_n, ONLY : ch_surf_t
39 !
40 USE modi_ch_open_inputb
42 !!
43 !! IMPLICIT ARGUMENTS
44 !! ------------------
45 USE modd_type_efutil, ONLY : emissvar_t
46 USE modd_csts, ONLY : ndaysec, xmd, xavogadro
47 !------------------------------------------------------------------------------
48 !
49 !* 0. DECLARATIONS
50 ! -----------------
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 !
55 USE modi_abor1_sfx
56 !
57 IMPLICIT NONE
58 !
59 !* 0.1 declaration of arguments
60 !
61 !
62 !
63 TYPE(ch_surf_t), INTENT(INOUT) :: chu
64 !
65  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! Program name
66 INTEGER, INTENT(IN) :: kch
67  CHARACTER(LEN=*),DIMENSION(:), INTENT(IN) :: hemis_gr_name ! Offline species name
68 INTEGER, DIMENSION(:), INTENT(IN) :: knbtimes ! nb of emis times array
69 INTEGER, DIMENSION(:), INTENT(IN) :: kemis_gr_time
70 INTEGER, DIMENSION(:), INTENT(IN) :: koffndx ! index of offline species
71 TYPE(emissvar_t),DIMENSION(:), INTENT(OUT):: tpemiss ! emission struct array to fill
72 INTEGER, INTENT(IN) :: ksize ! size X*Y (1D) of physical domain
73 INTEGER, INTENT(IN) :: kluout ! output listing channel
74 INTEGER, INTENT(IN) :: kverb ! verbose level
75 REAL, DIMENSION(:), INTENT(IN) :: prhodref ! dry density for ref. state
76 !
77 !
78 !* 0.2 declaration of local variables
79 !
80  CHARACTER(LEN=3):: yunit ! unit of the flux
81 INTEGER :: inbts ! Number of emis times for a species
82 INTEGER :: iresp ! I/O return value
83 INTEGER :: iind1, iind2
84 INTEGER :: jspec ! loop index
85 INTEGER :: itime ! loop index
86 INTEGER :: iws_default ! Default Memory window size for emission reading
87  CHARACTER (LEN=16):: yrecfm ! LFI article name
88 REAL(KIND=JPRB) :: zhook_handle
89 
90 !
91 !------------------------------------------------------------------------------
92 !
93 !* EXECUTABLE STATEMENTS
94 ! ---------------------
95 !
96 
97 IF (lhook) CALL dr_hook('BUILD_EMISSTAB_N',0,zhook_handle)
98 IF (kverb >= 5) THEN
99  WRITE(kluout,*) '******** SUBROUTINE (CHIMIE): BUILD_EMISSTAB_n ********'
100 END IF
101 !
102 !* 1. READ DATA
103 ! --------------
104 !
105 !$OMP SINGLE
106  CALL ch_open_inputb("EMISUNIT", kch, kluout)
107 !
108 ! read unit identifier
109 READ(kch,'(A3)') yunit
110 !$OMP END SINGLE COPYPRIVATE(YUNIT)
111 !
112 !* 2. MAP DATA ONTO PROGNOSTIC VARIABLES
113 ! ---------------------------------------
114 !
115 ALLOCATE (chu%XCONVERSION(SIZE(prhodref,1)))
116 ! determine the conversion factor
117  chu%XCONVERSION(:) = 1.
118 SELECT CASE (yunit)
119  CASE ('MIX') ! flux given ppp*m/s, conversion to molec/m2/s
120 ! where 1 molecule/cm2/s = (224.14/6.022136E23) ppp*m/s
121  chu%XCONVERSION(:) = xavogadro * prhodref(:) / xmd
122  CASE ('CON') ! flux given in molecules/cm2/s, conversion to molec/m2/s
123  chu%XCONVERSION(:) = 1e4
124  CASE ('MOL') ! flux given in microMol/m2/day, conversion to molec/m2/s
125 ! where 1 microMol/m2/day = (22.414/86.400)*1E-12 ppp*m/s
126  !XCONVERSION(:) = (22.414/86.400)*1E-12 * XAVOGADRO * PRHODREF(:) / XMD
127  chu%XCONVERSION(:) = 1e-6 * xavogadro / 86400.
128 
129  CASE default
130  CALL abor1_sfx('CH_BUILDEMISSN: UNKNOWN CONVERSION FACTOR')
131 END SELECT
132 !
133 ! Read Window size default value >= 2
134 iws_default = 5 ! Should be set by namelist
135 IF (iws_default < 2) iws_default = 2
136 !
137 iind1 = 0
138 iind2 = 0
139 DO jspec=1,SIZE(tpemiss) ! loop on offline emission species
140 !
141  inbts = knbtimes(jspec)
142 !
143 ! Fill %CNAME
144  tpemiss(jspec)%CNAME = hemis_gr_name(koffndx(jspec))
145 ! Allocate and Fill %NETIMES
146  ALLOCATE(tpemiss(jspec)%NETIMES(inbts))
147  iind1 = iind2+1
148  iind2 = iind2+inbts
149  tpemiss(jspec)%NETIMES(:) = kemis_gr_time(iind1:iind2)
150 !
151 ! Update %NWS, %NDX, %NTX, %LREAD, %XEMISDATA
152  IF (inbts <= iws_default) THEN
153 ! Number of times smaller than read window size allowed
154 ! Read emis data once and for all
155  tpemiss(jspec)%NWS = inbts
156  tpemiss(jspec)%NDX = 1
157  tpemiss(jspec)%NTX = 1
158  tpemiss(jspec)%LREAD = .false. ! to prevent future reading
159  ALLOCATE(tpemiss(jspec)%XEMISDATA(ksize,inbts))
160 ! Read file for emission data
161  yrecfm='E_'//trim(tpemiss(jspec)%CNAME)
162  CALL read_surf(hprogram,yrecfm,tpemiss(jspec)%XEMISDATA(:,:),iresp)
163 !
164 ! Correction : Replace 999. with 0. value in the Emission FLUX
165 ! and apply conversion
166  WHERE(tpemiss(jspec)%XEMISDATA(:,:) == 999.)
167  tpemiss(jspec)%XEMISDATA(:,:) = 0.
168  END WHERE
169  WHERE(tpemiss(jspec)%XEMISDATA(:,:) == 1.e20)
170  tpemiss(jspec)%XEMISDATA(:,:) = 0.
171  END WHERE
172  DO itime=1,inbts
173  ! XCONVERSION HAS BEEN ALREADY APPLY IN CH_EMISSION_FLUXN ONLY FOR LREAD = T
174  tpemiss(jspec)%XEMISDATA(:,itime) = tpemiss(jspec)%XEMISDATA(:,itime) * chu%XCONVERSION(:)
175  !TPEMISS(JSPEC)%XEMISDATA(:,ITIME) = TPEMISS(JSPEC)%XEMISDATA(:,ITIME)
176  END DO
177  ELSE
178 ! Read window size is smaller than number of emission times
179  tpemiss(jspec)%NWS = iws_default
180  tpemiss(jspec)%NDX = iws_default
181  tpemiss(jspec)%NTX = 0
182  tpemiss(jspec)%LREAD = .true.
183  ALLOCATE(tpemiss(jspec)%XEMISDATA(ksize,iws_default))
184  END IF
185 
186  IF (inbts == 1) THEN
187  tpemiss(jspec)%XFWORK=>tpemiss(jspec)%XEMISDATA(:,1)
188  ELSE
189  ALLOCATE(tpemiss(jspec)%XFWORK(ksize))
190  END IF
191 ! Compute index for periodic case
192  tpemiss(jspec)%NPX = maxval(minloc(tpemiss(jspec)%NETIMES(:)+&
193  (1+(tpemiss(jspec)%NETIMES(inbts)-&
194  tpemiss(jspec)%NETIMES(:))/ndaysec)*ndaysec))
195 !
196 ! Some di###ay
197  IF (kverb >= 6) THEN
198  WRITE(kluout,*) '====== Species ',trim(tpemiss(jspec)%CNAME), ' ======'
199  WRITE(kluout,*) ' Emission Times :' ,tpemiss(jspec)%NETIMES
200  WRITE(kluout,*) ' Current time index :' ,tpemiss(jspec)%NTX
201  WRITE(kluout,*) ' Current data index :' ,tpemiss(jspec)%NDX
202  WRITE(kluout,*) ' Periodic index = ',tpemiss(jspec)%NPX,&
203  ' at time :',tpemiss(jspec)%NETIMES(tpemiss(jspec)%NPX)
204  WRITE(kluout,*) ' Read window size :', tpemiss(jspec)%NWS
205  IF (tpemiss(jspec)%LREAD) THEN
206  WRITE(kluout,*) ' -> Data must be read during simulation.'
207  ELSE
208  WRITE(kluout,*) ' -> Data already in memory.'
209  END IF
210  END IF
211 END DO
212 
213 IF (kverb >= 5) THEN
214  WRITE(kluout,*) '******** END SUBROUTINE (CHIMIE) : BUILD_EMISSTAB_n ********'
215 END IF
216 IF (lhook) CALL dr_hook('BUILD_EMISSTAB_N',1,zhook_handle)
217 
218 END SUBROUTINE build_emisstab_n
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine build_emisstab_n(CHU, HPROGRAM, KCH, HEMIS_GR_NAME, KNBTIMES, KEMIS_GR_TIME, KOFFNDX, TPEMISS, KSIZE, KLUOUT, KVERB, PRHODREF)