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