SURFEX v8.1
General documentation of Surfex
ch_emission_snapn.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 ch_emission_snap_n (CHN, &
7  HPROGRAM,KSIZE,PSIMTIME,PSUNTIME, &
8  KYEAR,KMONTH,KDAY,PRHOA,PLON )
9 ! ######################################################################
10 !!
11 !!*** *CH_EMISSION_SNAP_n* -
12 !!
13 !! PURPOSE
14 !! -------
15 !! Return a time-dependent emission flux based on tabulated values
16 !!
17 !!** METHOD
18 !! ------
19 !!
20 !! AUTHOR
21 !! ------
22 !! S. Queguiner
23 !!
24 !! MODIFICATIONS
25 !! -------------
26 !! Original 10/2011
27 !!
28 !! A. Alias 07/2016 gmkpack problem : name of the internal subroutine modified
29 !! because exist already (view SURFEX/day_of_week.F90 )
30 !!
31 !! EXTERNAL
32 !! --------
33 !!
34 !!
35 !! IMPLICIT ARGUMENTS
36 !! ------------------
37 !
39 !
40 USE modd_csts, ONLY: xday
41 !
42 USE modi_add_forecast_to_date_surf
43 USE modi_substract_to_date_surf
44 USE modi_ch_conversion_factor
45 !------------------------------------------------------------------------------
46 !
47 !* 0. DECLARATIONS
48 ! -----------------
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 !
54 IMPLICIT NONE
55 !
56 !* 0.1 declaration of arguments
57 !
58 !
59 TYPE(ch_emis_snap_t), INTENT(INOUT) :: CHN
60 !
61  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM! program calling surf. schemes
62 INTEGER, INTENT(IN) :: KSIZE ! number of points
63 REAL, INTENT(IN) :: PSIMTIME! time of simulation in sec UTC
64  ! (counting from midnight of
65  ! the current day)
66 REAL, DIMENSION(KSIZE), INTENT(IN) :: PSUNTIME! Solar time (s since midnight)
67 INTEGER, INTENT(IN) :: KYEAR,KMONTH,KDAY ! UTC year, month, day
68 REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHOA ! Air density
69 REAL, DIMENSION(KSIZE), INTENT(IN) :: PLON ! Longitude (deg, from Greenwich)
70 ! ! (must be between -180deg and 180deg)
71 !
72 !* 0.2 declaration of local variables
73 !
74 REAL, DIMENSION(KSIZE) :: ZLON ! Longitude centered in Greenwich meridian
75 REAL, DIMENSION(KSIZE) :: ZTIME0
76 INTEGER,DIMENSION(KSIZE,2) :: IYEAR ! Year at the begining of current hour
77 INTEGER,DIMENSION(KSIZE,2) :: IMONTH! Month at the begining of current hour
78 INTEGER,DIMENSION(KSIZE,2) :: IDAY ! Day at the begining of current hour
79 INTEGER,DIMENSION(KSIZE,2) :: IDOW ! Day of Week at the begining of current hour
80 INTEGER,DIMENSION(KSIZE,2) :: IHOUR ! Entire hour at the begining of current hour
81 REAL, DIMENSION(KSIZE,2) :: ZTIME ! time (s) at the begining of current hour
82 INTEGER :: JSPEC ! Loop counter on chemical species
83 INTEGER :: JSNAP ! Loop counter on snap categories
84 INTEGER :: JI, JT ! Loop counter on points
85 REAL,DIMENSION(KSIZE,2) :: ZE ! Emissions at beginning and end of the hour
86 !
87 REAL(KIND=JPRB) :: ZHOOK_HANDLE
88 !
89 !------------------------------------------------------------------------------
90 !
91 !* EXECUTABLE STATEMENTS
92 ! ---------------------
93 !
94 IF (lhook) CALL dr_hook('CH_EMISSION_SNAP_N',0,zhook_handle)
95 !
96 !------------------------------------------------------------------------------
97 !
98 !* 1. Updates Conversion Factor (may depends on air density)
99 ! ------------------------------------------------------
100 !
101  CALL ch_conversion_factor(chn%XCONVERSION, chn%CCONVERSION, prhoa(:))
102 !
103 !------------------------------------------------------------------------------
104 !
105 !* 2. time and date for each point depending on Time reference
106 ! --------------------------------------------------------
107 !
108 !* 2.1 time at the beginning of current hour
109 !
110 iday(:,1)=kday
111 imonth(:,1)=kmonth
112 iyear(:,1)=kyear
113 !
114 SELECT CASE (chn%CSNAP_TIME_REF)
115  CASE ('UTC ')
116  ztime0(:)=psimtime
117  CASE ('SOLAR')
118  zlon(:)=plon(:)
119  WHERE(plon(:)> 180.) zlon(:)=plon(:)-360.
120  WHERE(plon(:)<=-180.) zlon(:)=plon(:)+360.
121  !* retrieves solar date and time
122  ztime0(:)=psimtime + zlon(:)*240. ! first guess is approximated solar time.
123  ! The suntime should be close to this.
124  DO ji=1,ksize
125  IF (ztime0(ji)>psuntime(ji)+xday/2.) THEN
126  ztime0(ji) = psuntime(ji) + xday
127  ELSEIF (ztime0(ji)<psuntime(ji)-xday/2.) THEN
128  ztime0(ji) = psuntime(ji) - xday
129  ELSE
130  ztime0(ji) = psuntime(ji)
131  END IF
132  CALL add_forecast_to_date_surf(iyear(ji,1),imonth(ji,1),iday(ji,1),ztime0(ji))
133  CALL substract_to_date_surf (iyear(ji,1),imonth(ji,1),iday(ji,1),ztime0(ji))
134  ENDDO
135 
136  CASE ('LEGAL')
137  ztime0(:)=psimtime + chn%XDELTA_LEGAL_TIME(:) * 3600.
138  DO ji=1,ksize
139  CALL add_forecast_to_date_surf(iyear(ji,1),imonth(ji,1),iday(ji,1),ztime0(ji))
140  CALL substract_to_date_surf (iyear(ji,1),imonth(ji,1),iday(ji,1),ztime0(ji))
141  ENDDO
142 
143 END SELECT
144 !
145  CALL day_of_week_ch(iday(:,1), imonth(:,1), iyear(:,1), idow(:,1))
146 !
147 ihour(:,1) = int((ztime0(:)+1.e-10)/3600.)! 1.E-10 and the where condition after are
148 WHERE (ihour(:,1)==24) ihour(:,1)=23 ! set to avoid computer precision problems
149 ztime(:,1) = ihour(:,1) * 3600.
150 !
151 !* 2.2 time at the end of current hour
152 !
153 iday(:,2)=iday(:,1)
154 imonth(:,2)=imonth(:,1)
155 iyear(:,2)=iyear(:,1)
156 !
157 ztime(:,2) = (ihour(:,1)+1) * 3600.
158 !
159 DO ji=1,ksize
160  CALL add_forecast_to_date_surf(iyear(ji,2),imonth(ji,2),iday(ji,2),ztime(ji,2))
161 ENDDO
162 !
163  CALL day_of_week_ch(iday(:,2), imonth(:,2), iyear(:,2), idow(:,2))
164 !
165 ihour(:,2)=nint(ztime(:,2))/3600
166 !
167 !------------------------------------------------------------------------------
168 !
169 !* 3. Emission at the begining of the current hour
170 ! --------------------------------------------
171 !
172  chn%XEMIS_FIELDS(:,:)=0.
173 !
174 DO jspec=1,chn%NEMIS_NBR
175  !
176  ze(:,:) = 0.
177  !
178  DO jsnap=1,chn%NEMIS_SNAP
179  !
180  DO jt=1,2
181  !
182  DO ji=1,ksize
183  !
184  ze(ji,jt) = ze(ji,jt) + chn%XEMIS_FIELDS_SNAP(ji,jsnap,jspec) &
185  *chn%XSNAP_MONTHLY(imonth(ji,jt) ,jsnap,jspec) &
186  *chn%XSNAP_DAILY (idow(ji,jt) ,jsnap,jspec) &
187  *chn%XSNAP_HOURLY (ihour(ji,jt)+1,jsnap,jspec) &
188  *chn%XCONVERSION(ji)
189  ENDDO
190  !
191  ENDDO
192  !
193  ENDDO
194 !
195 !* 5. Temporal interpolation within the current hour
196 ! ----------------------------------------------
197 !
198  chn%XEMIS_FIELDS(:,jspec) = ze(:,1) + (ze(:,2)-ze(:,1))/3600.*(ztime0(:)-ihour(:,1)*3600.)
199 
200 END DO
201 !
202 IF (lhook) CALL dr_hook('CH_EMISSION_SNAP_N',1,zhook_handle)
203 !
204 !-------------------------------------------------------------------------------
205 CONTAINS
206 !
207 SUBROUTINE day_of_week_ch(DATE, MONTH, YEAR, DOW)
208 !! AUTHOR
209 !! ------
210 !! J.Arteta
211 !! Original August 2010
212 !!
213 !!
214 !! MODifICATIONS
215 !! -------------
216 !! S. Queguiner 10/2011 DAY:Monday->Sunday => DOW:1->7
217 !! A. Alias 07/2016 gmkpack problem : name of the internal subroutine modified
218 !! because exist already (view SURFEX/day_of_week.F90 )
219 !!
220 !
221 IMPLICIT NONE
222 INTEGER, DIMENSION(:), INTENT(IN) :: DATE, MONTH, YEAR
223 INTEGER, DIMENSION(:), INTENT(OUT):: DOW
224 INTEGER, DIMENSION(SIZE(DOW)) :: DAY, YR, MN, N1, N2
225 REAL(KIND=JPRB) :: ZHOOK_HANDLE
226 !
227 IF (lhook) CALL dr_hook('CH_EMISSION_SNAP_N:DAY_OF_WEEK_CH',0,zhook_handle)
228 !
229 yr = year
230 mn = month
231 !
232 WHERE (mn.LE.2)
233  mn = mn + 12
234  yr = yr -1
235 END WHERE
236 !
237 n1 = (26 * (mn + 1)) /10
238 n2 = (125 * yr) / 100
239 day = (date + n1 + n2 - (yr / 100) + (yr / 400) - 1)
240 !
241 dow = mod(day,7) + 7
242 WHERE (dow.GT.7) dow = dow - 7
243 !
244 IF (lhook) CALL dr_hook('CH_EMISSION_SNAP_N:DAY_OF_WEEK_CH',1,zhook_handle)
245 END SUBROUTINE day_of_week_ch
246 !
247 END SUBROUTINE ch_emission_snap_n
subroutine ch_conversion_factor(PCONVERSION, HCONVERSION, PRHOA)
subroutine day_of_week_ch(DATE, MONTH, YEAR, DOW)
integer, parameter jprb
Definition: parkind1.F90:32
real, save xday
Definition: modd_csts.F90:45
logical lhook
Definition: yomhook.F90:15
subroutine add_forecast_to_date_surf(KYEAR, KMONTH, KDAY, PSEC)
subroutine substract_to_date_surf(KYEAR, KMONTH, KDAY, PSEC)
subroutine ch_emission_snap_n(CHN, HPROGRAM, KSIZE, PSIMTIME, PSUNTIME, KYEAR, KMONTH, KDAY, PRHOA, PLON)