Você está na página 1de 5

Algoritimo

Dados:: dt, iprnt, icmax,nout, ipud, ipucel, fpuout, nmat, matnam, r0, c, s,
gamma, cv, av, qc, dy, nplate, mp, r00, xl, u0
passo 1: Leitura dos dados no arquivo de entrada
passo 2: criação dos arquivos de saída
passo 3: gravação dos dados iniciais no arquivo de saída
passo 4: atualização do ciclo de tempo, icycl=icycl+1
passo 5: cálculo do tempo da iteração, t=dt*float(icycl)
passo 6: cálculo da velocidade da primeira partícula,
u(1)=u(1)-(p(2)-p(1)+q(2)-q(1))/dma(1)*dt
passo 7: cálculo de EULERIAN POSITION OF THE GRIDS, xe(1)=xe(1)+u(1)*dt
passo 8: cálculo da velocidade para a i-ésima partícula,
u(i)=u(i)-(p(i+1)+q(i+1)-p(i)-q(i))/dma(i)*dt
passo 9: cálculo da variação de velocidade entre a i-ésima particula e
sua antecessora, du=u(i)-u(i-1)
passo 10: cálculo de EULERIAN POSITION OF THE GRIDS para a i-ésima
partícula, xe(i)=xe(i)+u(i)*dt
passo 11: determinação da variação do volume da i-ésima partícula,
dv=du/dm(i)*dt
passo 12: cálculo do volume da i-ésima partícula, v(i)=vo(i)+dv
passo 13: cálculo da viscosidade artificial da i-ésima particula,
q(i)=qc(abs(m(i)))*du*abs(du)/(v(i)+vo(i))
passo 14: cálculo da energia interna da i-ésima partícula,
e(i)=e(i)-(p(i)+q(i))*dv
passo 15: call eos(p(i),v(i),e(i),m(i))
passo 16: vo(i)=v(i)
passo 17: se i =número de células+1 continua, caso contrário i=i+1 e
voltar para o passo 8
passo 18: se resto de icycl dividido por iprnt=0 gravar resultados no
arquivo de saída
passo 19: se resto da divisão de icycl por ipud for diferente de 0 pular
para o passo 25
passo 20: i=1
passo 21: nunit=10+i
passo 22: icel=ipucel(i)
passo 23: write(nunit,90) t,xe(icel),u(icel),p(icel)
passo 24: se i=nout siga caso contrário i=i+1 e voltar para passo 21
passo 25: se icycl menor ou igual a icmax pular para o passo
close(10)
close(20)
do 40 i=1,nout
nunit=10+i
close(nunit)
40 continue
else
goto 10
end if
pause 'Press any key to end:'
90 format (4(3x,f9.4))
stop
!90 format (1h,2(2x,f9.4))
end

subroutine input
use dflib
common
/cell/u(500),q(500),p(500),v(500),e(500),m(500),vo(500),dm(500),dma(500),xe(500)
,n,dt,t
common /out/iprnt,icmax,ipud,ipucel(5),nout
common
/mat/c(10),s(10),v0(10),gamma0(10),b(10),cv(10),av(10),qc(10),r0(10),xl(10),nc(1
0),dx(10),dy(10)
character*60 title,matnam(10)
character*12 fin,fout,fpuout(5)
character*1 explos
!Codigo adicionado por mim
character::opcao
logical*4::result
print*,'Show available files for input? (s/n)'
Página 1
Algoritimo
read*,opcao
if (opcao.eq.'s'.or.opcao.eq.'S') then
result=SYSTEMQQ('dir/p')
print*,''
end if
!fim do codigo adicionado por mim
write(*,*) 'Input file name? '
read(*,91) fin
open(unit=10, status='old',file=fin)
read(10,90) title
write(*,900) title
read(10,91) fout
open(unit=20,status='replace',file=fout)
write(20,900) title
read(10,*) dt,iprnt,icmax
read(10,*) nout,ipud
do 5 k=1,nout
read(10,700) ipucel(k),fpuout(k)
nunit=10+k
open(unit=nunit,status='replace',file=fpuout(k))
write(nunit,800) 'time (us)','x (mm)','u (km/s)','p (GPa)'
5 continue
read(10,*) nmat
write(20,902) nmat
write(*,902) nmat

do 10 i=1,nmat
read(10,90) matnam(i)
read(10,*) r0(i),c(i),s(i),gamma0(i),cv(i),av(i),qc(i),dy(i)
write(20,903) matnam(i)
write(20,904)
r0(i),c(i),s(i),gamma0(i),cv(i),av(i)*1.e5,qc(i),dy(i)
write(*,903) matnam(i)
write(*,904)
r0(i),c(i),s(i),gamma0(i),cv(i),av(i)*1.e5,qc(i),dy(i)
v0(i)=1./r0(i)
b(i)=r0(i)*gamma0(i)
cv(i)=cv(i)/238.85
qc(I)=-2.0*qc(i)*qc(i)
10 continue
p(1)=1.e-4
q(1)=0.
xe(1)=0.
n=0
ia=2
read(10,*) nplate
write(20,905) nplate
write(*,905) nplate
do 20,i=1,nplate
read (10,*) mp,r00,xl(i),nc(i),u0
if (i.eq.1.and.s(mp).ge.0.) u(1)=u0
dx(i)=xl(i)/float(nc(i))
write(20,906) matnam(mp),r00,' g/cc',xl(i),' mm/',nc(i),' (dx=
',dx(i),' mm)',u0,' km/s'
write (*,906) matnam(mp),r00,' g/cc',xl(i),' mm/',nc(i),' (dx=
',dx(i),' mm)',u0,' km/s'
explos='n'
if (i.ne.1) goto 1
if (s(mp).ge.0.) then
u(1)=u0
else
explos='y'
call gltw(r0(mp),c(mp),gamma0(mp),xl(i),nc(i),u0)
end if
1 n=n+nc(i)
ib=ia+nc(i)-1
do 30 ii=ia,ib
Página 2
Algoritimo
m(ii)=mp
if (explos.eq.'y') goto 9
u(ii)=u0
p(ii)=1.e-4
v(ii)=1./r00
vo(ii)=v(ii)
e(ii)=0.
xe(ii)=xe(ii-1)+dx(i)
9 dm(ii)=r0(m(ii))*dx(i)
dma(ii-1)=(dm(ii)+dm(ii-1))/2.
q(ii)=0.
if ((r00.lt.r0(mp)).and.(s(mp).ge.0.)) m(ii)=-mp
30 continue
ia=ib+1
20 continue
p(n+2)=1.e-4
q(n+2)=0.
dma(n+1)=(dm(n+2)+dm(n+1))/2.
m(1)=10
m(n+2)=10
write (20,901) dt
write (*,901) dt
return
! 90 format(a60)
! 91 format(a12)
! 99 format(1h,i3,2x,a10,6(f9.4))
! !700 format(1h,5x,a12)
! 700 format(i5,5x,a12)
! 800 format(1h,5x,'time (us)',4x,'x (mm)',5x,'u (km/s)',5x,'p (GPa)')
! !800 format(1h,5x,a10,4x,a10,5x,a10,5x,a10)
! 900 format(1h,a60)
! 901 format(1h,/,' Time step is ',f9.4, 'microsecond',/)
! 902 format(1h,/,' Number of materials is ',i2)
! 903 format(1h,5x,a60)
! 904 format(1h,5x,5(f7.4),1x ,e10.5,2(f9.4))
! 905 format(1h,//,' Number of plates is ',i2)
! 906 format(1h,5x,a10,/,5x,f9.4,a5,f9.4,a4,i3,a7,f7.4,a4,f9.4,a5)
90 format(a60)
91 format(a12)
99 format(i3,2x,a10,6(f9.4))
700 format(i5,5x,a12)
800 format(5x,a9,4x,a6,5x,a8,5x,a7)
900 format(a60)
901 format(/,' Time step is ',f9.4, 'microsecond',/)
902 format(/,' Number of materials is ',i2)
903 format(5x,a60)
904 format(5x,5(f7.4),1x ,e10.5,2(f9.4))
905 format(//,' Number of plates is ',i2)
906 format(5x,a10,/,5x,f9.4,a5,f9.4,a4,i3,a7,f7.4,a4,f9.4,a5)
return
end subroutine input

subroutine eos(p,v,e,m)
common
/mat/c(10),s(10),v0(10),gamma0(10),b(10),cv(10),av(10),qc(10),r0(10),xl(10),nc(1
0),dx(10),dy(10)
mm=abs(m)
if (s(mm).lt.0.) then
p=e*(gamma0(m)-1.)/v
return
end if
dv=v0(mm)-v
if (dv.gt.0.) then
m=mm
ph=c(m)*c(m)*dv/(v0(m)-s(m)*dv)**2+1.e-4
eh=ph*dv/2.
p=ph+b(m)*(e-eh)
return
Página 3
Algoritimo
end if
if ((m.lt.0).or.(av(m).le.0.)) then
p=1.e-4
return
end if
er=-dv*cv(m)/v0(m)/av(m)
p=b(m)*(e-er)+1.e-4
if (p.lt.-dy(m)) p=1.e-4
return
end subroutine eos

subroutine gltw(r0,dcj,gexp,x0,nexp,upist)
common
/cell/u(500),q(500),p(500),v(500),e(500),m(500),vo(500),dm(500),dma(500),xe(500)
,n,dt,t
texp=x0/dcj
dx=x0/float(nexp)
dm1=r0*dx
gm1=gexp-1.
gp1=gexp+1.
ucj=dcj/gp1
ccj=dcj-ucj
pcj=r0*dcj*dcj/gp1
vcj=gexp/gp1/r0
pvgcj=pcj*vcj**gexp
ufs=ucj-2./gm1*ccj
if ((upist.lt.ufs).or.(upist.gt.ucj)) upist=ufs
g1=gp1/gm1
c1=-dm1*(pvgcj*gexp)**(1./gm1)/g1**(-g1)/texp
xl1=0.
i=0
10 continue
c2=c1+(dcj-ufs-xl1/texp)**g1
if (c2.le.0.) then
c2=0.
else
c2=c2**(1./g1)
end if
xl2=(dcj-ufs-c2)*texp
dl=xl2-xl1
icell=nexp-i+1
r=dm1/(xl2-xl1)
v(icell)=1./r
vo(icell)=v(icell)
c=sqrt(pvgcj*gexp*r**gm1)
p(icell)=pcj*(c/ccj)**(2.*gexp/gm1)
u(icell)=c*2./gm1+ufs
e(icell)=p(icell)*v(icell)/gm1
xe(icell)=x0-xl1
i=i+1
if (u(icell).le.upist) then
u(icell)=upist
c=gm1/2.*(u(icell)-ufs)
p(icell)=pcj*(c/ccj)**(2.*gexp/gm1)
v(icell)=(pvgcj/p(icell))**(1./gexp)
e(icell)=p(icell)*v(icell)/gm1
dl=v(icell)*dm1
do 50 j=icell-1,2,-1
xl2=xl1+dl
p(j)=p(j+1)
v(j)=v(j+1)
vo(j)=v(j)
u(j)=u(j+1)
e(j)=e(j+1)
xe(j)=x0-xl2
xl1=xl2
50 continue
else
Página 4
Algoritimo
if (i.ne.nexp) then
xl1=xl2
goto 10
end if
end if
u(1)=u(2)
xe(1)=xe(2)-dl
return
end subroutine gltw
subroutine output
common
/cell/u(500),q(500),p(500),v(500),e(500),m(500),vo(500),dm(500),dma(500),xe(500)
,n,dt,t
write(*,900) '***',T,' microsec'
write(20,900) '***',T,' microsec'
write(20,901) 'cell','Mat','X ','Veloc ','Density','Pres ','Energy
','Visc '
write(20,901) ' ',' ', 'mm ','km/s ','g/cc ','GPa ','GPa-cc/g
','GPa '
do 10 i=2,n+1
xl=(xe(i)+xe(i-1))/2.
ul=(u(i)+u(i-1))/2.
rl=1./v(i)
write(20,90) i-1,m(i),xl,ul,rl,p(i),e(i),q(i)
10 continue
return
! 90 format (1h,1x,i4,2x,i3,1x,6(2x,f9.4))
! 900 format (1h,///,a5,f9.4,a9,/)
! 901 FORMAT (1h,1x,a5,2x,a3,6(2x,a9))
90 format (1x,i4,2x,i3,1x,6(2x,f9.4))
900 format (///,a5,f9.4,a9,/)
901 FORMAT (1x,a5,2x,a3,6(2x,a9))
return
end subroutine output

Página 5

Você também pode gostar