APPENDICE A
Subroutine break per iniettore pintle
subroutine break c c =================================================================== === c
c spray droplet aerodynamic breakup, using the TAB (Taylor Analogy c Breakup) model. this model is based upon a taylor analogy
c between an oscillating and distorting droplet and a spring-mass c system. c c =================================================================== === c include 'comkiva.i' c c <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>< c data distant / 1.5 / data alfa /0.750/ do 70 n=1,np distance=sqrt((xp(n)-xinj(1))**2+(yp(n)-yinj(1))**2 & +(zp(n)-zinj(1))**2) vtot=sqrt(up(n)**2+vp(n)**2+wp(n)**2) distance=distance*cos(alfa) c ================================================= if(distance.lt.distant)then
discri(n)=1.0 goto 70 endif if(discri(n).eq.1.0)then rdrop=radp(n) rdrop=0.0017 partn(n)=partn(n)*rdrop**3/radp(n)**3 discri(n)=0.0 c ******************ricalcolo velocità******************** urelx=up(n)-(u(imom)+utrb(n)) urely=vp(n)-(v(imom)+vtrb(n)) urelz=wp(n)-(w(imom)+wtrb(n)) rrelvl=urelx/(relvel(n)**2+1.e-20) v1x=1.0-rrelvl*urelx v1y=0.0-rrelvl*urely v1z=0.0-rrelvl*urelz
if(v1x.eq.0.0 .and. v1y.eq.0.0 .and. v1z.eq.0.0) v1y=1.0 rv1=1.0/sqrt(v1x**2+v1y**2+v1z**2) en1x=v1x*rv1 en1y=v1y*rv1 en1z=v1z*rv1 v2x=urely*en1z-urelz*en1y v2y=urelz*en1x-urelx*en1z v2z=urelx*en1y-urely*en1x
if(urelx.eq.0.0 .and. urely.eq.0.0 .and. urelz.eq.0.0) then v2x=0.0 v2y=1.0 v2z=0.0 endif rv2=1.0/sqrt(v2x**2+v2y**2+v2z**2) en2x=v2x*rv2 en2y=v2y*rv2 en2z=v2z*rv2 delv=400.0
thv=pi2*fran(0.0) costhv=cos(thv) sinthv=sin(thv) up(n)=up(n)+delv*(costhv*en1x+sinthv*en2x) vp(n)=vp(n)+delv*(costhv*en1y+sinthv*en2y) wp(n)=wp(n)+delv*(costhv*en1z+sinthv*en2z) c **************************************** goto 70 endif c ======================================== imom=i4mom(n) tdrop=tp(n)
if(imom.gt.999999 .or. tdrop.ge.tcrit) go to 70 relvel(n)=sqrt((u(imom)+utrb(n)-up(n))**2 & +(v(imom)+vtrb(n)-vp(n))**2 & +(w(imom)+wtrb(n)-wp(n))**2) if(relvel(n).eq.0.0)goto 70
c +++
c +++ 1st, calculate surface tension, droplet weber number, c +++ oscillation frequency (omega), and viscous damping term c +++ for oscillations (t sub d)
c +++ tb=tdrop*0.1 itb=tb fr=tb-itb surten=fr*surften(itb+2)+(1.0-fr)*surften(itb+1) surten=max(surten,1.e-6) i4=i4p(n) rdrop=radp(n) weber=ro(i4)*relvel(n)**2*rdrop/surten viscp=fr*visliq(itb+2)+(1.0-fr)*visliq(itb+1) viscp=max(viscp,1.e-10) rtd=0.5*csubmu*viscp/(rhop*rdrop**2) omsq=csubk*surten/(rhop*rdrop**3)-rtd**2 if(omsq.le.0.0)goto 50
om=sqrt(omsq) rom=1.0/om webte=cfocbck*weber yweb1=y0p(n)-webte yweb2=rom*y0pdot(n) c +++
c +++ 2nd, calculate amplitude of oscillation and see if c +++ breakup is possible c +++ asq=yweb1**2+yweb2**2 a=sqrt(asq) if(a+webte.le.1.0)goto 60 c +++
c +++ breakup is possible, and will occur if breakup time falls c +++ within current cycle, so 3rd, calculate breakup time t sub b c +++ recipa=1.0/a phicos=min(yweb1*recipa,1.0) phicos=max(phicos,-1.0) phite=acos(phicos) quad=-yweb2*recipa phi=phite if(quad.lt.0.0) phi=pi2-phite tsubb=t if(abs(y0p(n)).ge.1.0)goto 20 coste=1.0
if((webte-a.lt.-1.0 .and. y0pdot(n).lt.0.0)) coste=-1.0 theta=acos((coste-webte)*recipa) if(theta.ge.phi)goto 10 if(pi2-theta.ge.phi) theta=-theta theta=pi2+theta 10 tsubb=t+(theta-phi)*rom if(t+dt.lt.tsubb)goto 60 c +++
c +++ a) calculate new radius that conserves energy, and c +++ new droplet number that conserves mass: c +++ y0p(n)=1.0 y0pdot(n)=-a*om*sin(om*(tsubb-t)+phi) c write(*,*)'faccio breakup' c write(12,*)'faccio breakup' 20 smrb=rdrop/(1.0+4.0*third*y0p(n)**2 & +rhop*rdrop**3/surten*0.125*y0pdot(n)**2) c +++
c +++ aldo: il frammento di programma che segue è stato modificato c +++ cercando di ottenere una distribuzione di gocce più
c +++ rispondente alle attese (ho provato con 20<m<70)! c +++ ======== inizio ======== c +++ xx=fran(0.0) c +++ do 30 m=1,100 c +++ if(rdinj(m).gt.xx) go to 40 c +++ 30 continue c +++ 40 radp(n)=min(0.04*m*smrb,rdrop) c +++ ========= fine ========= c +++ c write(12,*)'smrb',smrb c write(*,*)'smrb',smrb radp(n)=min(smrb,rdrop)
c write(12,*)'raggio dopo breakup',radp(n) c write(*,*)'raggio dopo breakup',radp(n) radpp(n)=radp(n)
partn(n)=partn(n)*rdrop**3/radp(n)**3 c +++
c +++ b) change drop velocity. here, v1 is a vector orthogonal c +++ to urel, n1 is a unit vector in direction of v1, v2 c +++ is a 2nd vector orthogonal to urel and n1, and n2 is c +++ a unit vector in direction of v2
25 urelx=up(n)-(u(imom)+utrb(n)) urely=vp(n)-(v(imom)+vtrb(n)) urelz=wp(n)-(w(imom)+wtrb(n)) rrelvl=urelx/(relvel(n)**2+1.e-20) v1x=1.0-rrelvl*urelx v1y=0.0-rrelvl*urely v1z=0.0-rrelvl*urelz
if(v1x.eq.0.0 .and. v1y.eq.0.0 .and. v1z.eq.0.0) v1y=1.0 rv1=1.0/sqrt(v1x**2+v1y**2+v1z**2) en1x=v1x*rv1 en1y=v1y*rv1 en1z=v1z*rv1 v2x=urely*en1z-urelz*en1y v2y=urelz*en1x-urelx*en1z v2z=urelx*en1y-urely*en1x
if(urelx.eq.0.0 .and. urely.eq.0.0 .and. urelz.eq.0.0) then v2x=0.0 v2y=1.0 v2z=0.0 endif rv2=1.0/sqrt(v2x**2+v2y**2+v2z**2) en2x=v2x*rv2 en2y=v2y*rv2 en2z=v2z*rv2 c +++
c +++ to determine velocity direction, increment normal to drop path. c +++ delv is magnitude of velocity change
c +++ delv=0.5*rdrop*y0pdot(n) thv=pi2*fran(0.0) costhv=cos(thv) sinthv=sin(thv) up(n)=up(n)+delv*(costhv*en1x+sinthv*en2x) vp(n)=vp(n)+delv*(costhv*en1y+sinthv*en2y) wp(n)=wp(n)+delv*(costhv*en1z+sinthv*en2z)
relvel(n)=sqrt((u(imom)+utrb(n)-up(n))**2 & +(v(imom)+vtrb(n)-vp(n))**2 & +(w(imom)+wtrb(n)-wp(n))**2) c +++
c +++ c) reset droplet distortion parameters to zero c +++
50 y0p(n)=0.0 y0pdot(n)=0.0 go to 70 c +++
c +++ particle does not break up this cycle, so update its c +++ distortion parameters c +++ 60 cosodt=cos(om*dt) sinodt=sin(om*dt) ex=exp(-dt*rtd) yweb2=rom*(y0pdot(n)+yweb1*rtd) y0p(n)=webte+ex*(yweb1*cosodt+yweb2*sinodt) y0pdot(n)=(webte-y0p(n))*rtd+ex*om*(yweb2*cosodt-yweb1*sinodt) 70 continue return end
APPENDICE B
Subroutine break per iniettore swirl
subroutine break c c =================================================================== cc spray droplet aerodynamic breakup, using the TAB (Taylor Analogy c Breakup) model. this model is based upon a taylor analogy
c between an oscillating and distorting droplet and a spring-mass c system.
c aldo:simula liquid sheet sia per iniettori swirle cheper pintl c c =================================================================== c include 'comkiva.i' c c <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>< c data distant / 1.5 / do 70 n=1,np distance=sqrt((xp(n)-xinj(1))**2+(yp(n)-yinj(1))**2 & +(zp(n)-zinj(1))**2) vtot=sqrt(up(n)**2+vp(n)**2+wp(n)**2) alfa=0.349 distance=distance*cos(alfa) if(distance.lt.distant)then discri(n)=1.0 goto 70 endif if(discri(n).eq.1.0)then rdrop=radp(n)
if(n.eq.1)write(*,*)'wtang,wtanz(n)',wtang,wtanz(n) teta=(atan(yp(n)/xp(n))) if((xp(n).lt.0.0).and.(yp(n).ge.0.0))teta=pi+teta if((xp(n).le.0.0).and.(yp(n).lt.0.0))teta=pi+teta if((xp(n).gt.0.0).and.(yp(n).lt.0.0))teta=2*pi+teta vass=-wp(n) vsw=vass*1.1 up(n)=-vsw*sin(teta) vp(n)=vsw*cos(teta) wp(n)=-vass rdrop=radp(n) partn(n)=partn(n)*rdrop**3/radp(n)**3 discri(n)=0.0 c ******************ricalcolo velocità******************** urelx=up(n)-(u(imom)+utrb(n)) urely=vp(n)-(v(imom)+vtrb(n)) urelz=wp(n)-(w(imom)+wtrb(n)) rrelvl=urelx/(relvel(n)**2+1.e-20) v1x=1.0-rrelvl*urelx v1y=0.0-rrelvl*urely v1z=0.0-rrelvl*urelz
If(v1x.eq.0.0 .and. v1y.eq.0.0 .and. v1z.eq.0.0) v1y=1.0 rv1=1.0/sqrt(v1x**2+v1y**2+v1z**2) en1x=v1x*rv1 en1y=v1y*rv1 en1z=v1z*rv1 v2x=urely*en1z-urelz*en1y v2y=urelz*en1x-urelx*en1z v2z=urelx*en1y-urely*en1x
if(urelx.eq.0.0 .and. urely.eq.0.0 .and. urelz.eq.0.0) then v2x=0.0
v2y=1.0 v2z=0.0 endif
en2x=v2x*rv2 en2y=v2y*rv2 en2z=v2z*rv2 delv=400.0 thv=pi2*fran(0.0) costhv=cos(thv) sinthv=sin(thv) up(n)=up(n)+delv*(costhv*en1x+sinthv*en2x) vp(n)=vp(n)+delv*(costhv*en1y+sinthv*en2y) wp(n)=wp(n)+delv*(costhv*en1z+sinthv*en2z) c **************************************** c goto 70 endif c ======================================== imom=i4mom(n) tdrop=tp(n)
if(imom.gt.999999 .or. tdrop.ge.tcrit) go to 70 relvel(n)=sqrt((u(imom)+utrb(n)-up(n))**2 & +(v(imom)+vtrb(n)-vp(n))**2 & +(w(imom)+wtrb(n)-wp(n))**2)
c if(distance.lt.2.5)write(*,*)'velocità relativa cuore',relvel(n) c if(distance.lt.2.5)write(12,*)'velocità relativa cuore',relvel(n) c if(distance.gt.2.5)write(*,*)'velocità relativa fuori',relvel(n) c if(distance.gt.2.5)write(12,*)'velocità relativa fuori',relvel(n) if(relvel(n).eq.0.0)goto 70
c +++
c +++ 1st, calculate surface tension, droplet weber number, c +++ oscillation frequency (omega), and viscous damping term c +++ for oscillations (t sub d)
c +++
tb=tdrop*0.1 itb=tb fr=tb-itb
surten=max(surten,1.e-6) i4=i4p(n) rdrop=radp(n) c write(12,*)'raggio nuovo',rdrop c write(*,*)'raggio nuovo',rdrop weber=ro(i4)*relvel(n)**2*rdrop/surten viscp=fr*visliq(itb+2)+(1.0-fr)*visliq(itb+1) viscp=max(viscp,1.e-10) rtd=0.5*csubmu*viscp/(rhop*rdrop**2) omsq=csubk*surten/(rhop*rdrop**3)-rtd**2 if(omsq.le.0.0)goto 50 om=sqrt(omsq) rom=1.0/om webte=cfocbck*weber yweb1=y0p(n)-webte yweb2=rom*y0pdot(n) c +++
c +++ 2nd, calculate amplitude of oscillation and see if c +++ breakup is possible c +++ asq=yweb1**2+yweb2**2 a=sqrt(asq) if(a+webte.le.1.0)goto 60 c +++
c +++ breakup is possible, and will occur if breakup time falls c +++ within current cycle, so 3rd, calculate breakup time t sub b c +++ recipa=1.0/a phicos=min(yweb1*recipa,1.0) phicos=max(phicos,-1.0) phite=acos(phicos) quad=-yweb2*recipa phi=phite if(quad.lt.0.0) phi=pi2-phite tsubb=t
if(abs(y0p(n)).ge.1.0)goto 20 coste=1.0
if((webte-a.lt.-1.0 .and. y0pdot(n).lt.0.0)) coste=-1.0 theta=acos((coste-webte)*recipa) if(theta.ge.phi)goto 10 if(pi2-theta.ge.phi) theta=-theta theta=pi2+theta 10 tsubb=t+(theta-phi)*rom if(t+dt.lt.tsubb)goto 60 c +++
c +++ 4th, parcel breakup -- replace old parcel with new parcel: c +++ a) calculate new radius that conserves energy, and c +++ new droplet number that conserves mass: c +++ y0p(n)=1.0 y0pdot(n)=-a*om*sin(om*(tsubb-t)+phi) c write(*,*)'faccio breakup' c write(12,*)'faccio breakup' 20 smrb=rdrop/(1.0+4.0*third*y0p(n)**2 & +rhop*rdrop**3/surten*0.125*y0pdot(n)**2) c +++
c +++ aldo: il frammento di programma che segue è stato modificato c +++ cercando di ottenere una distribuzione di gocce più
c +++ rispondente alle attese (ho provato con 20<m<70)! c +++ ======== inizio ======== c +++ xx=fran(0.0) c +++ do 30 m=1,100 c +++ if(rdinj(m).gt.xx) go to 40 c +++ 30 continue c +++ 40 radp(n)=min(0.04*m*smrb,rdrop) c +++ ========= fine ========= c +++ radp(n)=min(smrb,rdrop) radpp(n)=radp(n)
partn(n)=partn(n)*rdrop**3/radp(n)**3 c +++
c +++ b) change drop velocity. here, v1 is a vector orthogonal c +++ to urel, n1 is a unit vector in direction of v1, v2 c +++ is a 2nd vector orthogonal to urel and n1, and n2 is c +++ a unit vector in direction of v2
c +++ 25 urelx=up(n)-(u(imom)+utrb(n)) urely=vp(n)-(v(imom)+vtrb(n)) urelz=wp(n)-(w(imom)+wtrb(n)) rrelvl=urelx/(relvel(n)**2+1.e-20) v1x=1.0-rrelvl*urelx v1y=0.0-rrelvl*urely v1z=0.0-rrelvl*urelz
if(v1x.eq.0.0 .and. v1y.eq.0.0 .and. v1z.eq.0.0) v1y=1.0 rv1=1.0/sqrt(v1x**2+v1y**2+v1z**2) en1x=v1x*rv1 en1y=v1y*rv1 en1z=v1z*rv1 v2x=urely*en1z-urelz*en1y v2y=urelz*en1x-urelx*en1z v2z=urelx*en1y-urely*en1x
if(urelx.eq.0.0 .and. urely.eq.0.0 .and. urelz.eq.0.0) then v2x=0.0 v2y=1.0 v2z=0.0 endif rv2=1.0/sqrt(v2x**2+v2y**2+v2z**2) en2x=v2x*rv2 en2y=v2y*rv2 en2z=v2z*rv2 c +++
c +++ to determine velocity direction, increment normal to drop path. c +++ delv is magnitude of velocity change
delv=0.5*rdrop*y0pdot(n) thv=pi2*fran(0.0) costhv=cos(thv) sinthv=sin(thv) up(n)=up(n)+delv*(costhv*en1x+sinthv*en2x) vp(n)=vp(n)+delv*(costhv*en1y+sinthv*en2y) wp(n)=wp(n)+delv*(costhv*en1z+sinthv*en2z) relvel(n)=sqrt((u(imom)+utrb(n)-up(n))**2 & +(v(imom)+vtrb(n)-vp(n))**2 & +(w(imom)+wtrb(n)-wp(n))**2) c +++
c +++ c) reset droplet distortion parameters to zero c +++
50 y0p(n)=0.0 y0pdot(n)=0.0 go to 70 c +++
c +++ particle does not break up this cycle, so update its c +++ distortion parameters c +++ 60 cosodt=cos(om*dt) sinodt=sin(om*dt) ex=exp(-dt*rtd) yweb2=rom*(y0pdot(n)+yweb1*rtd) y0p(n)=webte+ex*(yweb1*cosodt+yweb2*sinodt) y0pdot(n)=(webte-y0p(n))*rtd+ex*om*(yweb2*cosodt-yweb1*sinodt) 70 continue return end
APPENDICE C
Altri modelli utilizzati nelle simulazioni
Modello di turbolenza
Si è fatto uso di una variante del modello di turbolenza k-ε: la teoria RNG, implementata in KIVA da Han e Reitz. Questo modello di turbolenza tiene conto dell’effetto della compressibilità del gas, il quale sappiamo essere caratteristica non trascurabile dei flussi tipicamente presenti all’interno del motore.
Modello di Impingement e coalescenza
Il fenomeno dell’impiengement è di fondamentale importanza nei motori GDI. Per trattarlo al meglio si è fatto uso del modello Nauber-Reitz, che è in grado di considerare le possibili situazioni di interazione liquido-parete, cioè: il caso di una goccia liquida che colpisce una superficie e vi rimane fino all’evaporazione, oppure il caso di una goccia che ancora colpisce la superficie, ma ne viene riflessa con un certo angolo. La scelta è realizzata in funzione del numero di Weber.
Modello di evaporazione
Si è fatto uso del modello di evaporazione implementato nativamente nel KIVA e descritto da Amsden in [19].