6 SUBROUTINE ch_emission_flux_n (DTCO, U, CHE, SV, CHU, HPROGRAM,PSIMTIME,PSFSV, PRHOA, PTSTEP, KNBTS_MAX)
48 USE modi_read_surf_field2d
49 USE modi_init_io_surf_n
50 USE modi_end_io_surf_n
54 USE modi_ch_aer_emission
74 TYPE(
sv_t),
INTENT(INOUT) :: SV
77 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
78 REAL,
INTENT(IN) :: PSIMTIME
81 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PSFSV
82 REAL,
DIMENSION(:),
INTENT(IN) :: PRHOA
83 REAL,
INTENT(IN) :: PTSTEP
84 INTEGER,
INTENT(IN) :: KNBTS_MAX
95 INTEGER :: ITIM1,ITIM2
96 INTEGER :: INDX1,INDX2
97 INTEGER :: ISIMTIME, ITPERIOD
98 CHARACTER (LEN=16) :: YRECFM
103 CHARACTER(LEN=6),
DIMENSION(:),
POINTER :: CNAMES
104 REAL,
DIMENSION(SIZE(PSFSV,1),KNBTS_MAX) :: ZWORK
105 REAL,
DIMENSION(SIZE(PSFSV,1),SIZE(PSFSV,2)) :: ZEMIS
106 REAL,
DIMENSION(SIZE(PSFSV,1)) :: ZFCO
115 LOGICAL :: GCO = .false.
116 REAL(KIND=JPRB) :: ZHOOK_HANDLE
123 IF (
lhook)
CALL dr_hook(
'CH_EMISSION_FLUX_N',0,zhook_handle)
127 ksize1d =
SIZE(psfsv,1)
135 IF (che%XTIME_SIMUL == 0.)
THEN 136 che%XTIME_SIMUL = psimtime
138 che%XTIME_SIMUL = che%XTIME_SIMUL + ptstep
141 IF (iverb >= 5)
WRITE(iluout,*)
'******** CH_EMISSION_FLUX ********' 142 DO ji=1,
SIZE(che%TSEMISS)
144 isimtime = che%XTIME_SIMUL
146 inbts =
SIZE(che%TSEMISS(ji)%NETIMES)
147 iws = che%TSEMISS(ji)%NWS
148 indx1 = che%TSEMISS(ji)%NDX
154 WRITE(iluout,*)
'NO interpolation for ',trim(che%TSEMISS(ji)%CNAME
155 IF (iverb >= 10 )
WRITE(iluout,*) che%TSEMISS(ji)%XFWORK
159 WRITE(iluout,*)
'Interpolation (T =',isimtime,
') : ',che%TSEMISS(ji
161 IF (isimtime < che%TSEMISS(ji)%NETIMES(1))
THEN 163 che%TSEMISS(ji)%NTX = 1
167 IF (isimtime > che%TSEMISS(ji)%NETIMES(inbts))
THEN 169 itperiod = (1+(che%TSEMISS(ji)%NETIMES(inbts)-&
174 WRITE(iluout,*)
' ITPERIOD = ', itperiod
175 WRITE(iluout,*)
' ISIMTIME modifie = ', isimtime
177 IF (che%TSEMISS(ji)%NTX == inbts .AND. isimtime<che%TSEMISS(ji)%NETIMES
THEN 179 che%TSEMISS(ji)%NTX = che%TSEMISS(ji)%NPX
189 DO WHILE (che%TSEMISS(ji)%NTX < inbts)
190 IF (isimtime >= che%TSEMISS(ji)%NETIMES(che%TSEMISS(ji)%NTX+1))
THEN 191 che%TSEMISS(ji)%NTX = che%TSEMISS(ji)%NTX + 1
201 IF (indx1 >= iws)
THEN 205 IF (che%TSEMISS(ji)%LREAD)
THEN 209 IF (.NOT. lioinit)
THEN 212 IF (iverb >= 6)
WRITE(iluout,*)
'INIT des I/O DONE.' 215 yrecfm=
'E_'//trim(che%TSEMISS(ji)%CNAME)
217 WRITE (iluout,*)
'READ emission :',trim(yrecfm),&
218 ', SIZE(ZWORK)=',
SIZE(zwork,1),inbts
222 WHERE(zwork(:,1:inbts) == 999.)
223 zwork(:,1:inbts) = 0.
225 WHERE(zwork(:,1:inbts) == 1.e20)
226 zwork(:,1:inbts) = 0.
229 zwork(:,itime) = zwork(:,itime)*chu%XCONVERSION(:)
233 IF ((che%TSEMISS(ji)%NTX+iws-1) > inbts)
THEN 238 WRITE (iluout,*)
'Periodic CASE : NPX =',che%TSEMISS(ji
239 IF (iws < (inbts-che%TSEMISS(ji)%NPX+1))
THEN 251 che%TSEMISS(ji)%XEMISDATA(:,1:inbts-che%TSEMISS(ji)%NTX+1) =
255 WRITE(iluout,*)
'Window SIZE smaller than INBTS !' 256 WRITE(iluout,*)
'Window index, Time index' 257 DO jw=1,inbts-che%TSEMISS(ji)%NTX+1
258 WRITE(iluout,*) jw,che%TSEMISS(ji)%NTX+jw-1
262 che%TSEMISS(ji)%XEMISDATA(:,inbts-che%TSEMISS(ji)%NTX+2:iws)
266 DO jw=inbts-che%TSEMISS(ji)%NTX+2,iws
267 WRITE(iluout,*) jw,che%TSEMISS(ji)%NPX+jw-(inbts-che%TSEMISS
285 iws = inbts-che%TSEMISS(ji)%NPX+1
286 che%TSEMISS(ji)%NWS = iws
287 che%TSEMISS(ji)%XEMISDATA(:,1:iws) = zwork(:,che%TSEMISS(ji)%NPX
289 WRITE(iluout,*)
'Window SIZE equal or greater than INBTS !' 290 WRITE(iluout,*)
'Window index, Time index' 292 WRITE(iluout,*) jw,che%TSEMISS(ji)%NPX+jw-1
295 indx1 = che%TSEMISS(ji)%NTX-che%TSEMISS(ji)%NPX+1
296 indx2 = mod((indx1+1),iws)
297 che%TSEMISS(ji)%LREAD = .false.
312 che%TSEMISS(ji)%XEMISDATA(:,1:iws) = zwork(:,che%TSEMISS(ji)%NTX
314 WRITE(iluout,*)
'Window index, Time index' 316 WRITE(iluout,*) jw,che%TSEMISS(ji)%NTX+jw-1
338 indx1 = che%TSEMISS(ji)%NTX
340 IF (indx2 > iws) indx2=che%TSEMISS(ji)%NPX
353 indx1 = che%TSEMISS(ji)%NTX-che%TSEMISS(ji)%NPX+1
354 indx2 = mod((indx1+1),iws)
362 che%TSEMISS(ji)%NDX = indx1
365 IF (che%TSEMISS(ji)%NTX < inbts)
THEN 366 itim1 = che%TSEMISS(ji)%NETIMES(che%TSEMISS(ji)%NTX)
367 itim2 = che%TSEMISS(ji)%NETIMES(che%TSEMISS(ji)%NTX+1)
369 itim1 = che%TSEMISS(ji)%NETIMES(inbts)
370 itim2 = che%TSEMISS(ji)%NETIMES(che%TSEMISS(ji)%NPX)+itperiod
381 zalpha = (
REAL(ISIMTIME) - ITIM1) / (ITIM2-ITIM1)
382 che%TSEMISS(ji)%XFWORK(:) = zalpha*che%TSEMISS(ji)%XEMISDATA(:,indx2
385 WRITE(iluout,*)
' Current time INDEX : ',che%TSEMISS(ji)%NTX
386 WRITE(iluout,*)
' TIME : ',isimtime,
' (',itim1,
',',itim2,
')' 387 WRITE(iluout,*)
' Window size : ',che%TSEMISS(ji)%NWS
388 WRITE(iluout,*)
' Current data INDEX : ',indx1,indx2
389 IF (iverb >= 10)
WRITE(iluout,*)
' FLUX : ',che%TSEMISS(ji)%XFWORK
400 IF (sv%NSV_AEREND > 0)
THEN 406 DO WHILE(
ASSOCIATED(curpronos))
407 IF (curpronos%NAMINDEX > ineq)
THEN 408 WRITE(iluout,*)
'FATAL ERROR in CH_EMISSION_FLUXN : SIZE(ZEMIS,2) =' 409 ', INDEX bugge =',curpronos%NAMINDEX
410 CALL abor1_sfx(
'CH_EMISSION_FLUXN: FATAL ERROR')
413 zemis(:,curpronos%NAMINDEX) = 0.
416 DO ji=1,curpronos%NBCOEFF
418 zemis(:,curpronos%NAMINDEX) = zemis(:,curpronos%NAMINDEX)+&
419 curpronos%XCOEFF(ji)*che%TSEMISS(curpronos%NEFINDEX(ji))%XFWORK
423 WRITE(iluout,*)
'Agregation for ',cnames(curpronos%NAMINDEX)
424 IF (iverb >= 10)
WRITE(iluout,*)
'ZEMIS = ',zemis(:,curpronos%NAMINDEX
426 IF ((cnames(curpronos%NAMINDEX) ==
"CO") .AND. any(zemis(:,curpronos%NAMINDEX
THEN 427 zfco(:) = zemis(:,curpronos%NAMINDEX)
431 curpronos=>curpronos%NEXT
443 psfsv(:,:) = psfsv(:,:) + zemis(:,:)
447 IF (iverb >= 6)
WRITE(iluout,*)
'******** END CH_EMISSION_FLUX ********' 448 IF (
lhook)
CALL dr_hook(
'CH_EMISSION_FLUX_N',1,zhook_handle)
subroutine abor1_sfx(YTEXT)
subroutine ch_emission_flux_n(DTCO, U, CHE, SV, CHU, HPROGRAM, PSI
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine read_surf_field2d(HPROGRAM, PFIELD2D, HFIELDNAME, HCOMMEN
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION
subroutine ch_aer_emission(PFLUX, PRHODREF, HSV, KSV_CHSBEG, PFCO)