1
!-------------------------------------------------------------------------------
3
! This file is part of Code_Saturne, a general-purpose CFD tool.
5
! Copyright (C) 1998-2011 EDF S.A.
7
! This program is free software; you can redistribute it and/or modify it under
8
! the terms of the GNU General Public License as published by the Free Software
9
! Foundation; either version 2 of the License, or (at your option) any later
12
! This program is distributed in the hope that it will be useful, but WITHOUT
13
! ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14
! FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17
! You should have received a copy of the GNU General Public License along with
18
! this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
19
! Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
!-------------------------------------------------------------------------------
23
subroutine cs_gascomb &
25
( ncelet , ncel , icb1 , icb2 , &
28
f1m , f2m , f3m , f4m , f5m , f6m , f7m , f8m , f9m , &
29
pdfm1 , pdfm2 , doxyd , dfuel , hrec , &
30
af1 , af2 , cx1m , cx2m , wmf1 , wmf2 , &
31
fuel1 , fuel2 , fuel3 , fuel4 , fuel5 ,fuel6 , fuel7 , &
32
oxyd , prod1 , prod2 , prod3 , xiner , &
33
fs3no , fs4no , yfs4no )
35
!===============================================================================
38
! CALCUL DES CONCENTRATIONS GAZEUSES MOYENNES
42
!__________________.____._____.________________________________________________.
43
! name !type!mode ! role !
44
!__________________!____!_____!________________________________________________!
45
! ncelet ! i ! <-- ! number of extended (real + ghost) cells !
46
! ncel ! i ! <-- ! number of cells !
47
! indpdf ! te ! <-- ! passage par les pdf !
48
! f1m ! tr ! <-- ! moyenne du traceur 1 mvl [chx1m+co] !
49
! f2m ! tr ! <-- ! moyenne du traceur 2 mvl [chx2m+co] !
50
! f3m ! tr ! <-- ! moyenne du traceur 3 (oxydant 1) !
51
! f4m ! tr ! <-- ! moyenne du traceur 4 (oxydant 2) !
52
! f5m ! tr ! <-- ! moyenne du traceur 5 (oxydant 3) !
53
! f6m ! tr ! <-- ! moyenne du traceur 6 (humidite ) !
54
! f7m ! tr ! <-- ! moyenne du traceur 7 (C + O2 ) !
55
! f8m ! tr ! <-- ! moyenne du traceur 8 (C + CO2 ) !
56
! f9m ! tr ! <-- ! moyenne du traceur 9 (C + H2O ) !
57
! pdfm1 ! tr ! <-- ! borne minimum de la pdf !
58
! pdfm2 ! tr ! <-- ! borne maximum de la pdf !
59
! dfuel ! tr ! <-- ! amplitude du pic de dirac en 0 !
60
! doxyd ! tr ! <-- ! amplitude du pic de dirac en 1 !
61
! hrec ! tr ! <-- ! hauteur du rectangle de la pdf !
62
! fuel1 ! tr ! <- ! fraction massique chx1m !
63
! fuel2 ! tr ! <- ! fraction massique chx2m !
64
! fuel3 ! tr ! <- ! fraction massique co !
65
! fuel4 ! tr ! <- ! fraction massique h2s !
66
! fuel5 ! tr ! <- ! fraction massique h2 !
67
! fuel6 ! tr ! <- ! fraction massique hcn !
68
! oxyd ! tr ! <- ! fraction massique o2 !
69
! prod1 ! tr ! <- ! fraction massique co2 !
70
! prod2 ! tr ! <- ! fraction massique h2o !
71
! prod3 ! tr ! <- ! fraction massique so2 !
72
! prod4 ! tr ! <- ! fraction massique nh3 !
73
! xiner ! tr ! <- ! fraction massique n2 !
74
!__________________!____!_____!________________________________________________!
76
! TYPE : E (ENTIER), R (REEL), A (ALPHAMNUMERIQUE), T (TABLEAU)
77
! L (LOGIQUE) .. ET TYPES COMPOSES (EX : TR TABLEAU REEL)
78
! MODE : <-- donnee, --> resultat, <-> Donnee modifiee
79
! --- tableau de travail
80
!===============================================================================
82
!==============================================================================
84
!==============================================================================
101
!===============================================================================
107
integer ncelet , ncel
111
double precision rtp(ncelet,*), x2(ncel)
112
double precision f1m(ncel) , f2m(ncel) , f3m(ncel)
113
double precision f4m(ncel) , f5m(ncel) , f6m(ncel)
114
double precision f7m(ncel) , f8m(ncel) , f9m(ncel)
117
double precision pdfm1(ncel), pdfm2(ncel) , dfuel(ncel)
118
double precision doxyd(ncel) , hrec(ncel)
120
double precision af1(ncel,ngazg), af2(ncel,ngazg)
121
double precision cx1m(ncel), cx2m(ncel) , wmf1(ncel) , wmf2(ncel)
123
double precision fuel1(ncel), fuel2(ncel) , fuel3(ncel)
124
double precision fuel4(ncel), fuel5(ncel) , fuel6(ncel), fuel7(ncel)
125
double precision oxyd(ncel)
126
double precision prod1(ncel), prod2(ncel), prod3(ncel)
127
double precision xiner(ncel)
129
double precision fs3no(ncel),fs4no(ncel)
130
double precision yfs4no(ncel,ngazg)
134
parameter (NBPRINT=15)
135
integer INTTMP(NBPRINT)
138
integer n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15
140
double precision bb1 , bb2 , fs1 , fs2 , fs3 , fs4
141
double precision anu1 , anu2 , anu3 , anu4 , anu5
142
double precision reac1 , reac2 , reac3 , reac4 , reac5
143
double precision scomb , soxy
144
double precision wmco , wmh2s , wmh2 , wmhcn
145
double precision wmo2 , wmco2 , wmh2o , wmso2 , wmnh3 , wmn2
146
double precision zco2t
147
double precision somm , sommax , sommin
149
double precision zz(ngazem) , zzox(ngazem) , zzcl(ngazem)
150
double precision zzs1(ngazem),zzs2(ngazem),zzs3(ngazem),zzs4(ngazem)
153
!===============================================================================
154
! 1. CALCULS PRELIMINAIRES
155
!===============================================================================
157
! --- Masses molaires
169
! ---- Initialisation des fractions massiques avec l'oxydant 1
172
fuel1(iel) = wmf1(iel)*af3(icb1)
173
fuel2(iel) = wmf2(iel)*af3(icb2)
174
fuel3(iel) = wmco *af3(ico)
175
fuel4(iel) = wmh2s *af3(ih2s)
176
fuel5(iel) = wmh2 *af3(ihy)
177
fuel6(iel) = wmhcn *af3(ihcn)
178
fuel7(iel) = wmnh3 *af3(inh3)
179
oxyd(iel) = wmo2 *af3(io2)
180
prod1(iel) = wmco2 *af3(ico2)
181
prod2(iel) = wmh2o *af3(ih2o)
182
prod3(iel) = wmso2 *af3(iso2)
183
xiner(iel) = wmn2 *af3(in2)
186
!===============================================================================
187
! 3. CALCUL DE LA COMPOSITION DU MELANGE SANS LES PDF
188
! SI LES FLUCTUATIONS DE S SONT TROP FAIBLES
189
!===============================================================================
193
if ( indpdf(iel).eq.0 ) then
195
! --> Calculs preliminaires
196
if ( ieqco2 .eq. 1 ) then
197
zco2t = (rtp(iel,isca(iyco2))/ (1.d0-x2(iel)))/wmco2
202
! --> Composition de la phase gazeuse avant combustion
205
zz(ii) = af1(iel,ii)*f1m(iel)+af2(iel,ii)*f2m(iel) &
206
+af3(ii)*f3m(iel)+af4(ii)*f4m(iel)+af5(ii)*f5m(iel) &
207
+af6(ii)*f6m(iel)+af7(ii)*f7m(iel)+af8(ii)*f8m(iel) &
211
! --> Calcul de la composition du melange
216
reac1 = min(zz(ihy),(zz(io2)/anu1))
217
zz(ihy) = zz(ihy) - reac1
218
zz(io2) = zz(io2) - anu1*reac1
219
zz(ih2o)= zz(ih2o) + reac1
223
anu2 = 0.25d0*abs(cx1m(iel)-cx2m(iel))
224
reac2 = min(zz(icb1), (zz(io2)/anu2))
225
zz(icb1)= zz(icb1) - reac2
226
zz(icb2)= zz(icb2) + reac2
227
zz(io2) = zz(io2) - anu2*reac2
228
zz(ih2o) = zz(ih2o) + 2.d0*anu2*reac2
232
anu3 = 0.25d0*(2.d0 + cx2m(iel))
233
reac3 = min(zz(icb2), (zz(io2)/anu3))
234
zz(icb2) = zz(icb2) - reac3
235
zz(ico) = zz(ico) + reac3
236
zz(io2) = zz(io2) - anu3*reac3
237
zz(ih2o) = zz(ih2o) + 0.5d0*cx2m(iel)*reac3
242
reac4 = min(zz(ih2s), (zz(io2)/anu4))
243
zz(ih2s) = zz(ih2s) - reac4
244
zz(io2) = zz(io2) - anu4*reac4
245
zz(ih2o) = zz(ih2o) + reac4
246
zz(iso2) = zz(iso2) + reac4
251
if ( ieqco2 .eq. 0 ) then
252
reac5 = min(zz(ico), (zz(io2)/anu5))
253
else if ( ieqco2 .eq. 1 ) then
254
reac5 = min(max(zco2t-zz(ico2),0.d0),zz(ico),zz(io2)/anu5)
256
zz(ico) = zz(ico) - reac5
257
zz(io2) = zz(io2) - anu5*reac5
258
zz(ico2)= zz(ico2) + reac5
260
fuel1(iel) = zz(icb1) * wmf1(iel)
261
fuel2(iel) = zz(icb2) * wmf2(iel)
262
fuel3(iel) = zz(ico ) * wmco
263
fuel4(iel) = zz(ih2s) * wmh2s
264
fuel5(iel) = zz(ihy ) * wmh2
265
fuel6(iel) = zz(ihcn) * wmhcn
266
fuel7(iel) = zz(inh3) * wmnh3
267
oxyd (iel) = zz(io2 ) * wmo2
268
prod1(iel) = zz(ico2) * wmco2
269
prod2(iel) = zz(ih2o) * wmh2o
270
prod3(iel) = zz(iso2) * wmso2
271
xiner(iel) = zz(in2 ) * wmn2
277
!===============================================================================
278
! 4. CALCUL DE LA COMPOSITION DU MELANGE AVEC LES PDF
279
!===============================================================================
283
if ( indpdf(iel).eq.1 ) then
285
! --> Calculs preliminaires
287
if ( ieqco2 .eq. 1 ) then
288
zco2t = (rtp(iel,isca(iyco2))/(1.d0-x2(iel)))/wmco2
293
soxy = f3m(iel)+f4m(iel)+f5m(iel)+f6m(iel)+f7m(iel)+f8m(iel)+f9m(iel)
298
zzox(ii) = ( af3(ii)*f3m(iel)+af4(ii)*f4m(iel) &
299
+af5(ii)*f5m(iel)+af6(ii)*f6m(iel) &
300
+af7(ii)*f7m(iel)+af8(ii)*f8m(iel) &
301
+af9(ii)*f9m(iel) ) / soxy
304
scomb = f1m(iel)+f2m(iel)
306
zzcl(ii) = ( af1(iel,ii)*f1m(iel)+af2(iel,ii)*f2m(iel) ) / scomb
309
! 1ere reaction : recombinaison de l'hydrogene
311
reac1 = min(zzox(ihy),(2.d0*zzox(io2)))
312
zzox(ihy ) = zzox(ihy ) - reac1
313
zzox(ih2o) = zzox(ih2o) + reac1
314
zzox(io2 ) = zzox(io2 ) - 0.5d0*reac1
316
! 2eme reaction : CHx1 + (x1-x2)/4 O2 => CHx2 + (x1-x2)/2 H2O
318
if ( zzcl(icb1) .gt. 0.d0 .and. zzox(io2) .gt. 0.d0 ) then
319
fs1 = zzox(io2)/( abs(cx1m(iel)-cx2m(iel))/4.d0 &
320
*zzcl(icb1)+zzox(io2) )
326
zzs1(ii) = fs1*zzcl(ii)+(1.d0-fs1)*zzox(ii)
328
zzs1(icb2) = zzs1(icb1)+zzs1(icb2)
329
zzs1(ih2o) = zzs1(ih2o) + 0.5d0*abs(cx1m(iel)-cx2m(iel))*zzs1(icb1)
334
! 3eme reaction : CHx2 + (2+x2)/4 O2 => CO + x2/2 H2O
336
if ( zzs1(icb2).gt. 0.d0 .and. zzox(io2).gt. 0.d0 ) then
337
fs2 = fs1 * zzox(io2) / ( (2.d0+cx2m(iel))/4.d0 &
338
*zzs1(icb2)+zzox(io2) )
344
zzs2(ii) = (fs2/fs1)*zzs1(ii)+(1.d0-(fs2/fs1))*zzox(ii)
346
zzs2(ico )= zzs2(ico)+zzs2(icb2)
347
zzs2(ih2o)= zzs2(ih2o)+cx2m(iel)/2.d0*zzs2(icb2)
351
! 4eme reaction : H2S + 3/2 O2 => H2O + SO2
353
if ( zzs2(ih2s).gt. 0.d0 .and. zzox(io2).gt. 0.d0 ) then
354
fs3 = fs2 * zzox(io2) / ( 1.5d0*zzs2(ih2s)+zzox(io2) )
360
zzs3(ii) = (fs3/fs2)*zzs2(ii)+(1.d0-(fs3/fs2))*zzox(ii)
362
zzs3(iso2) = zzs3(iso2)+zzs3(ih2s)
363
zzs3(ih2o) = zzs3(ih2o)+zzs3(ih2s)
367
! 5eme reaction CO+1/2 O2 => CO2
369
if ( ( zzs3(ico).gt. 0.d0 .and. zzox(io2).gt. 0.d0 ) &
370
.and. ieqco2 .eq. 0 ) then
371
fs4 = fs3 * zzox(io2) / ( zzs3(ico) + zzox(io2) )
377
zzs4(ii) = (fs4/fs3)*zzs3(ii)+(1.d0-(fs4/fs3))*zzox(ii)
380
if ( ieqco2 .eq. 0 ) then
381
zzs4(ico2) = zzs4(ico2)+zzs4(ico)
382
zzs4(io2 ) = zzs4(io2)/2.d0
386
! Stockage de fs3 , fs4 et des concentrations en fs4 pour le modele de NOx
388
if ( ieqnox .eq. 1 ) then
392
if ( zzs3(ico).gt. 0.d0 .and. zzox(io2).gt. 0.d0 ) then
393
fs4no(iel) = fs3 * zzox(io2) / ( zzs3(ico) + zzox(io2) )
399
yfs4no(iel,ii) = (fs4no(iel)/fs3)*zzs3(ii) &
400
+(1.d0-(fs4no(iel)/fs3))*zzox(ii)
402
yfs4no(iel,ico2) = yfs4no(iel,ico2)+yfs4no(iel,ico)
403
yfs4no(iel,io2 ) = yfs4no(iel,io2)/2.d0
404
yfs4no(iel,ico ) = 0.d0
406
yfs4no(iel,icb1) = yfs4no(iel,icb1) * wmf1(iel)
407
yfs4no(iel,icb2) = yfs4no(iel,icb2) * wmf2(iel)
409
yfs4no(iel,ii) = yfs4no(iel,ii)*wmole(ii)
414
! D�sormais on connait les concentrations e
416
! les concentrations interm�diaires sont lin�aires par morceaux
417
! et les param�tres de la pdf dfuel,doxyd, pdfm1,pdfm2,hrec
419
! On initialise par les concentrations aux extr�mit�s
421
zz(ii) = dfuel(iel)*zzcl(ii)+doxyd(iel)*zzox(ii)
423
! Integration sur le premier intervalle de richesse (entre s1 et 1)
424
bb1 = max(pdfm1(iel),fs1)
425
bb2 = min(pdfm2(iel),1.d0)
426
if( bb2.gt.bb1 ) then
428
zz(ii) = zz(ii) + hrec(iel)*(bb2-bb1)/(1.d0-fs1) &
429
*( zzs1(ii)-fs1*zzcl(ii) &
430
+(zzcl(ii)-zzs1(ii))*(bb1+bb2)*0.5d0 )
433
! Int�gration sur le deuxi�me intervalle de (entre s2 et s1)
434
bb1 = max(pdfm1(iel),fs2)
435
bb2 = min(pdfm2(iel),fs1)
436
if( bb2.gt.bb1 ) then
438
zz(ii) = zz(ii) + hrec(iel)*(bb2-bb1)/(fs1-fs2) &
439
*( fs1*zzs2(ii)-fs2*zzs1(ii) &
440
+(zzs1(ii)-zzs2(ii))*(bb1+bb2)*0.5d0 )
443
! Integration sur le troisi�me intervalle de (entre s3 et s2)
444
bb1 = max(pdfm1(iel),fs3)
445
bb2 = min(pdfm2(iel),fs2)
446
if( bb2.gt.bb1 ) then
448
zz(ii) = zz(ii) + hrec(iel)*(bb2-bb1)/(fs2-fs3) &
449
*( fs2*zzs3(ii)-fs3*zzs2(ii) &
450
+(zzs2(ii)-zzs3(ii))*(bb1+bb2)*0.5d0 )
454
! Integration sur le quatrieme intervalle de (entre s4 et s3)
455
bb1 = max(pdfm1(iel),fs4)
456
bb2 = min(pdfm2(iel),fs3)
457
if ( bb2.gt.bb1 ) then
459
zz(ii) = zz(ii) + hrec(iel)*(bb2-bb1)/(fs3-fs4) &
460
*( fs3*zzs4(ii)-fs4*zzs3(ii) &
461
+(zzs3(ii)-zzs4(ii))*(bb1+bb2)*0.5d0 )
464
! Integration sur le cinquieme intervalle de (entre 0 et s4)
465
bb1 = max(pdfm1(iel),0.d0)
466
bb2 = min(pdfm2(iel),fs4)
467
if ( bb2.gt.bb1 ) then
469
zz(ii) = zz(ii) + hrec(iel)*(bb2-bb1)/(fs4-0.d0) &
470
*( fs4*zzox(ii)-0.d0*zzs4(ii) &
471
+(zzs4(ii)-zzox(ii))*(bb1+bb2)*0.5d0 )
475
if ( ieqco2 .eq. 1 ) then
480
reac5 = min(max(zco2t-zz(ico2),0.d0),zz(ico),zz(io2)/anu5)
482
zz(ico ) = zz(ico ) - reac5
483
zz(io2 ) = zz(io2 ) - anu5*reac5
484
zz(ico2) = zz(ico2) + reac5
488
fuel1(iel) = zz(icb1) * wmf1(iel)
489
fuel2(iel) = zz(icb2) * wmf2(iel)
490
fuel3(iel) = zz(ico ) * wmco
491
fuel4(iel) = zz(ih2s) * wmh2s
492
fuel5(iel) = zz(ihy ) * wmh2
493
fuel6(iel) = zz(ihcn) * wmhcn
494
fuel7(iel) = zz(inh3) * wmnh3
495
oxyd(iel) = zz(io2 ) * wmo2
496
prod1(iel) = zz(ico2) * wmco2
497
prod2(iel) = zz(ih2o) * wmh2o
498
prod3(iel) = zz(iso2) * wmso2
499
xiner(iel) = zz(in2 ) * wmn2
506
!===============================================================================
508
!===============================================================================
525
! --> Controle des parametres de la pdf
528
if ( indpdf(iel).ne.0 ) then
533
! --> Controle des differentes valeurs des fractions massiques
539
somm = fuel1(iel) + fuel2(iel) + fuel3(iel) &
540
+ fuel4(iel) + fuel5(iel) + fuel6(iel) + fuel7(iel) &
542
+ prod1(iel) + prod2(iel) + prod3(iel) &
545
sommin = min(sommin,somm)
546
sommax = max(sommax,somm)
548
if ( abs(somm-1.d0).lt.epsicp ) then
552
if ( fuel1(iel).lt.(-epzero) .or. &
553
fuel1(iel).gt.(1.d0+epzero) ) n4 = n4 +1
554
if ( fuel2(iel).lt.(-epzero) .or. &
555
fuel2(iel).gt.(1.d0+epzero) ) n5 = n5 +1
556
if ( fuel3(iel).lt.(-epzero) .or. &
557
fuel3(iel).gt.(1.d0+epzero) ) n6 = n6 +1
558
if ( fuel4(iel).lt.(-epzero) .or. &
559
fuel4(iel).gt.(1.d0+epzero) ) n7 = n7 +1
560
if ( fuel5(iel).lt.(-epzero) .or. &
561
fuel5(iel).gt.(1.d0+epzero) ) n8 = n8 +1
562
if ( fuel6(iel).lt.(-epzero) .or. &
563
fuel6(iel).gt.(1.d0+epzero) ) n9 = n9 +1
564
if ( fuel7(iel).lt.(-epzero) .or. &
565
fuel7(iel).gt.(1.d0+epzero) ) n10 = n10+1
566
if ( oxyd(iel).lt.(-epzero) .or. &
567
oxyd(iel).gt.(1.d0+epzero) ) n11 = n11+1
568
if ( xiner(iel).lt.(-epzero) .or. &
569
xiner(iel).gt.(1.d0+epzero) ) n12 = n12+1
570
if ( prod1(iel).lt.(-epzero) .or. &
571
prod1(iel).gt.(1.d0+epzero) ) n13 = n13+1
572
if ( prod2(iel).lt.(-epzero) .or. &
573
prod2(iel).gt.(1.d0+epzero) ) n14 = n14+1
574
if ( prod3(iel).lt.(-epzero) .or. &
575
prod3(iel).gt.(1.d0+epzero) ) n15 = n15+1
596
if (irangp.ge.0) then
597
call parism(nbprint,inttmp)
601
write(nfecra,1000) inttmp(1),inttmp(2)
602
write(nfecra,2200) (inttmp(ii),ii=3,15)
604
if ( irangp .ge. 0 ) then
609
write(nfecra,*) ' Somme Min MAX = ', sommin, sommax
616
'MODELISATION DE LA COMBUSTION AVEC LE MODELE DE DIFFUSION ', &
617
'TURBULENTE (CPCYM2)',/, &
618
'CHIMIE RAPIDE A 3 CORPS - EXTENSION A 3 COMBUSTIBLES ', &
619
'(Application au FUEL)',/, &
620
'==========================================================', &
621
'==================',/, &
622
' Nb de points de calculs = ',&
624
' Nb de points turbulents (passage par les PDF) = ',&
628
'CONTROLE DES VALEURS DES FRACTIONS MASSIQUES',/, &
629
' Nb de points de calculs qui respectent somme des Yi = 1 = ', &
631
' Nb de points YCHX1 , YCHX2 < 0 ou > 1 = ',I9,I9,/, &
632
' Nb de points YC0 , YH2S < 0 ou > 1 = ',I9,I9,/, &
633
' Nb de points YH2 , YHCN < 0 ou > 1 = ',I9,I9,/, &
634
' Nb de points YNH3 < 0 ou > 1 = ',I9, /, &
635
' Nb de points YO2 , YN2 < 0 ou > 1 = ',I9,I9,/, &
636
' Nb de points YCO2 , YH2O < 0 ou > 1 = ',I9,I9,/, &
637
' Nb de points YSO2 < 0 ou > 1 = ',I9 )
640
'MODELE DE CO CHARBON ACTIVE : ',/, &
641
' AVEC IEQCO2 = ',I2,/, &
642
'HORS SEUL LES OPTIONS 0 , 1 et 2 SONT DISPONIBLES',/, &
643
' ARRET DU CALCUL : VERIFIER USPPMO')