7 hprogram,psimtime,psfsv, prhoa, ptstep, knbts_max)
45 USE modi_init_io_surf_n
46 USE modi_end_io_surf_n
50 USE modi_ch_aer_emission
58 USE yomhook
,ONLY : lhook, dr_hook
59 USE parkind1
,ONLY : jprb
69 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
70 REAL,
INTENT(IN) :: psimtime
73 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: psfsv
74 REAL,
DIMENSION(:),
INTENT(IN) :: prhoa
75 REAL,
INTENT(IN) :: ptstep
76 INTEGER,
INTENT(IN) :: knbts_max
87 INTEGER :: itim1,itim2
88 INTEGER :: indx1,indx2
89 INTEGER :: isimtime, itperiod
90 CHARACTER (LEN=16) :: yrecfm
95 CHARACTER(LEN=6),
DIMENSION(:),
POINTER :: cnames
96 REAL,
DIMENSION(SIZE(PSFSV,1),KNBTS_MAX) :: zwork
97 REAL,
DIMENSION(SIZE(PSFSV,1),SIZE(PSFSV,2)) :: zemis
98 REAL,
DIMENSION(SIZE(PSFSV,1),SIZE(PSFSV,2)) :: zdepot
99 REAL,
DIMENSION(SIZE(PSFSV,1)) :: zfco
108 LOGICAL :: gco = .false.
109 REAL(KIND=JPRB) :: zhook_handle
116 IF (lhook) CALL dr_hook(
'CH_EMISSION_FLUX_N',0,zhook_handle)
120 ksize1d =
SIZE(psfsv,1)
128 IF (ysc%CHE%XTIME_SIMUL == 0.)
THEN
129 ysc%CHE%XTIME_SIMUL = psimtime
131 ysc%CHE%XTIME_SIMUL = ysc%CHE%XTIME_SIMUL + ptstep
134 IF (iverb >= 5)
WRITE(iluout,*)
'******** CH_EMISSION_FLUX ********'
135 DO ji=1,
SIZE(ysc%CHE%TSEMISS)
137 isimtime = ysc%CHE%XTIME_SIMUL
139 inbts =
SIZE(ysc%CHE%TSEMISS(ji)%NETIMES)
140 iws = ysc%CHE%TSEMISS(ji)%NWS
141 indx1 = ysc%CHE%TSEMISS(ji)%NDX
147 WRITE(iluout,*)
'NO interpolation for ',trim(ysc%CHE%TSEMISS(ji)%CNAME)
148 IF (iverb >= 10 )
WRITE(iluout,*) ysc%CHE%TSEMISS(ji)%XFWORK
152 WRITE(iluout,*)
'Interpolation (T =',isimtime,
') : ',ysc%CHE%TSEMISS(ji)%CNAME
154 IF (isimtime < ysc%CHE%TSEMISS(ji)%NETIMES(1))
THEN
156 ysc%CHE%TSEMISS(ji)%NTX = 1
160 IF (isimtime > ysc%CHE%TSEMISS(ji)%NETIMES(inbts))
THEN
162 itperiod = (1+(ysc%CHE%TSEMISS(ji)%NETIMES(inbts)-&
163 ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NPX))/ndaysec)*ndaysec
164 isimtime = modulo(isimtime-ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NPX),itperiod)+&
165 ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NPX)
167 WRITE(iluout,*)
' ITPERIOD = ', itperiod
168 WRITE(iluout,*)
' ISIMTIME modifie = ', isimtime
170 IF (ysc%CHE%TSEMISS(ji)%NTX == inbts .AND. isimtime<ysc%CHE%TSEMISS(ji)%NETIMES(inbts))
THEN
172 ysc%CHE%TSEMISS(ji)%NTX = ysc%CHE%TSEMISS(ji)%NPX
182 DO WHILE (ysc%CHE%TSEMISS(ji)%NTX < inbts)
183 IF (isimtime >= ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NTX+1))
THEN
184 ysc%CHE%TSEMISS(ji)%NTX = ysc%CHE%TSEMISS(ji)%NTX + 1
194 IF (indx1 >= iws)
THEN
198 IF (ysc%CHE%TSEMISS(ji)%LREAD)
THEN
202 IF (.NOT. lioinit)
THEN
205 hprogram,
'FULL ',
'SURF ',
'READ ')
206 IF (iverb >= 6)
WRITE(iluout,*)
'INIT des I/O DONE.'
209 yrecfm=
'E_'//trim(ysc%CHE%TSEMISS(ji)%CNAME)
211 WRITE (iluout,*)
'READ emission :',trim(yrecfm),&
212 ', SIZE(ZWORK)=',
SIZE(zwork,1),inbts
213 CALL
read_surf(hprogram,yrecfm,zwork(:,1:inbts),iresp)
216 WHERE(zwork(:,1:inbts) == 999.)
217 zwork(:,1:inbts) = 0.
219 WHERE(zwork(:,1:inbts) == 1.e20)
220 zwork(:,1:inbts) = 0.
223 zwork(:,itime) = zwork(:,itime)*ysc%CHU%XCONVERSION(:)
227 IF ((ysc%CHE%TSEMISS(ji)%NTX+iws-1) > inbts)
THEN
232 WRITE (iluout,*)
'Periodic CASE : NPX =',ysc%CHE%TSEMISS(ji)%NPX
233 IF (iws < (inbts-ysc%CHE%TSEMISS(ji)%NPX+1))
THEN
245 ysc%CHE%TSEMISS(ji)%XEMISDATA(:,1:inbts-ysc%CHE%TSEMISS(ji)%NTX+1) = &
246 zwork(:,ysc%CHE%TSEMISS(ji)%NTX:inbts)
249 WRITE(iluout,*)
'Window SIZE smaller than INBTS !'
250 WRITE(iluout,*)
'Window index, Time index'
251 DO jw=1,inbts-ysc%CHE%TSEMISS(ji)%NTX+1
252 WRITE(iluout,*) jw,ysc%CHE%TSEMISS(ji)%NTX+jw-1
256 ysc%CHE%TSEMISS(ji)%XEMISDATA(:,inbts-ysc%CHE%TSEMISS(ji)%NTX+2:iws) = &
257 zwork(:,ysc%CHE%TSEMISS(ji)%NPX:ysc%CHE%TSEMISS(ji)%NPX+iws-inbts+ysc%CHE%TSEMISS(ji)%NTX-2)
260 DO jw=inbts-ysc%CHE%TSEMISS(ji)%NTX+2,iws
261 WRITE(iluout,*) jw,ysc%CHE%TSEMISS(ji)%NPX+jw-(inbts-ysc%CHE%TSEMISS(ji)%NTX+2)
279 iws = inbts-ysc%CHE%TSEMISS(ji)%NPX+1
280 ysc%CHE%TSEMISS(ji)%NWS = iws
281 ysc%CHE%TSEMISS(ji)%XEMISDATA(:,1:iws) = zwork(:,ysc%CHE%TSEMISS(ji)%NPX:inbts)
283 WRITE(iluout,*)
'Window SIZE equal or greater than INBTS !'
284 WRITE(iluout,*)
'Window index, Time index'
286 WRITE(iluout,*) jw,ysc%CHE%TSEMISS(ji)%NPX+jw-1
289 indx1 = ysc%CHE%TSEMISS(ji)%NTX-ysc%CHE%TSEMISS(ji)%NPX+1
290 indx2 = mod((indx1+1),iws)
291 ysc%CHE%TSEMISS(ji)%LREAD = .false.
306 ysc%CHE%TSEMISS(ji)%XEMISDATA(:,1:iws) = zwork(:,ysc%CHE%TSEMISS(ji)%NTX:ysc%CHE%TSEMISS(ji)%NTX+iws-1)
308 WRITE(iluout,*)
'Window index, Time index'
310 WRITE(iluout,*) jw,ysc%CHE%TSEMISS(ji)%NTX+jw-1
332 indx1 = ysc%CHE%TSEMISS(ji)%NTX
334 IF (indx2 > iws) indx2=ysc%CHE%TSEMISS(ji)%NPX
347 indx1 = ysc%CHE%TSEMISS(ji)%NTX-ysc%CHE%TSEMISS(ji)%NPX+1
348 indx2 = mod((indx1+1),iws)
356 ysc%CHE%TSEMISS(ji)%NDX = indx1
359 IF (ysc%CHE%TSEMISS(ji)%NTX < inbts)
THEN
360 itim1 = ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NTX)
361 itim2 = ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NTX+1)
363 itim1 = ysc%CHE%TSEMISS(ji)%NETIMES(inbts)
364 itim2 = ysc%CHE%TSEMISS(ji)%NETIMES(ysc%CHE%TSEMISS(ji)%NPX)+itperiod
375 zalpha = (
REAL(ISIMTIME) - itim1) / (itim2-itim1)
376 ysc%CHE%TSEMISS(ji)%XFWORK(:) = zalpha*ysc%CHE%TSEMISS(ji)%XEMISDATA(:,indx2) +&
377 (1.-zalpha)*ysc%CHE%TSEMISS(ji)%XEMISDATA(:,indx1)
379 WRITE(iluout,*)
' Current time INDEX : ',ysc%CHE%TSEMISS(ji)%NTX
380 WRITE(iluout,*)
' TIME : ',isimtime,
' (',itim1,
',',itim2,
')'
381 WRITE(iluout,*)
' Window size : ',ysc%CHE%TSEMISS(ji)%NWS
382 WRITE(iluout,*)
' Current data INDEX : ',indx1,indx2
383 IF (iverb >= 10)
WRITE(iluout,*)
' FLUX : ',ysc%CHE%TSEMISS(ji)%XFWORK
394 IF (ysc%SV%NSV_AEREND > 0)
THEN
395 cnames=>ysc%SV%CSV(ysc%SV%NSV_CHSBEG:ysc%SV%NSV_AEREND)
397 cnames=>ysc%SV%CSV(ysc%SV%NSV_CHSBEG:ysc%SV%NSV_CHSEND)
399 curpronos=>ysc%CHE%TSPRONOSLIST
400 DO WHILE(
ASSOCIATED(curpronos))
401 IF (curpronos%NAMINDEX > ineq)
THEN
402 WRITE(iluout,*)
'FATAL ERROR in CH_EMISSION_FLUXN : SIZE(ZEMIS,2) =',&
403 ineq,
', INDEX bugge =',curpronos%NAMINDEX
404 CALL
abor1_sfx(
'CH_EMISSION_FLUXN: FATAL ERROR')
407 zemis(:,curpronos%NAMINDEX) = 0.
410 DO ji=1,curpronos%NBCOEFF
412 zemis(:,curpronos%NAMINDEX) = zemis(:,curpronos%NAMINDEX)+&
413 curpronos%XCOEFF(ji)*ysc%CHE%TSEMISS(curpronos%NEFINDEX(ji))%XFWORK(:)
417 WRITE(iluout,*)
'Agregation for ',cnames(curpronos%NAMINDEX)
418 IF (iverb >= 10)
WRITE(iluout,*)
'ZEMIS = ',zemis(:,curpronos%NAMINDEX)
420 IF ((cnames(curpronos%NAMINDEX) ==
"CO") .AND. any(zemis(:,curpronos%NAMINDEX).GT.0.))
THEN
421 zfco(:) = zemis(:,curpronos%NAMINDEX)
425 curpronos=>curpronos%NEXT
430 WHERE (psfsv(:,:) >= 0.)
431 zemis(:,:) = zemis(:,:) + psfsv(:,:)
433 zdepot(:,:) = psfsv(:,:)
436 IF ((lch_aero_flux).AND.(ysc%SV%NSV_AERBEG > 0))
THEN
438 CALL
ch_aer_emission(zemis, prhoa, ysc%SV%CSV, ysc%SV%NSV_CHSBEG, pfco=zfco)
444 psfsv(:,:) = psfsv(:,:) + zemis(:,:)
448 IF (iverb >= 6)
WRITE(iluout,*)
'******** END CH_EMISSION_FLUX ********'
449 IF (lhook) CALL dr_hook(
'CH_EMISSION_FLUX_N',1,zhook_handle)
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine abor1_sfx(YTEXT)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine ch_emission_flux_n(YSC, HPROGRAM, PSIMTIME, PSFSV, PRHOA, PTSTEP, KNBTS_MAX)
subroutine ch_aer_emission(PFLUX, PRHODREF, HSV, KSV_CHSBEG, PFCO)