📄 dsmceq.f
字号:
! dsmceq - Dilute gas simulation using DSMC algorithm
! This version illustrates the approach to equilibrium
program dsmceq
integer*4 MAXnpart, MAXncell
parameter( MAXnpart = 10000, MAXncell = 500 )
integer*4 npart, seed, i, plusMinus, ncell, coltot, col
integer*4 istep, nstep
integer*4 cell_n(MAXncell), index(MAXncell), Xref(MAXnpart)
real*8 pi, boltz, mass, diam, T, density, L, eff_num, v_init
real*8 x(MAXnpart), v(MAXnpart,3)
real*8 vmagI(MAXnpart), vmagF(MAXnpart)
real*8 tau, vrmax(MAXncell), selxtra(MAXncell), coeff
common /SortList/ ncell, npart, cell_n, index, Xref
integer*4 colider
real*8 rand
!* Initialize constants (particle mass, diameter, etc.)
pi = 3.141592654
boltz = 1.3806e-23 ! Boltzmann's constant (J/K)
mass = 6.63e-26 ! Mass of argon atom (kg)
diam = 3.66e-10 ! Effective diameter of argon atom (m)
T = 273 ! Temperature (K)
density = 1.78 ! Density of argon at STP (kg/m^3)
L = 1e-6 ! System size is one micron
write(*,*) 'Enter number of simulation particles: '
read(*,*) npart
eff_num = density/mass*L**3/npart
write(*,*) 'Each particle represents ', eff_num, ' atoms'
!* Assign random positions and velocities to particles
seed = 1 ! Initial seed for rand (DO NOT USE ZERO)
v_init = sqrt(3.0*boltz*T/mass) ! Initial speed
do i=1,npart
x(i) = L*rand(seed) ! Assign random positions
plusMinus = (1 - 2*int(2*rand(seed))) ! +1 or -1 (equal prob.)
v(i,1) = plusMinus * v_init
v(i,2) = 0.0 ! Only x-component is non-zero
v(i,3) = 0.0
enddo
!* Record inital particle speeds
do i=1,npart
vmagI(i) = sqrt( v(i,1)**2 + v(i,2)**2 + v(i,3)**2 )
enddo
!* Initialize variables used for evaluating collisions
ncell = 15 ! Number of cells
tau = 0.2*(L/ncell)/v_init ! Set timestep tau
do i=1,ncell
vrmax(i) = 3*v_init ! Estimated max rel. speed
selxtra(i) = 0.0 ! Used by routine 'colider'
enddo
coeff = 0.5*eff_num*pi*diam**2*tau/(L**3/ncell)
coltot = 0 ! Count total collisions
!* Declare object for lists used in sorting
!! FORTRAN program uses common blocks to pass these lists
!* Loop for the desired number of time steps
write(*,*) 'Enter total number of time steps: '
read(*,*) nstep
do istep = 1,nstep
!* Move all the particles ballistically
do i=1,npart
x(i) = x(i) + v(i,1)*tau ! Update x position of particle
x(i) = dmod(x(i)+L,L) ! Periodic boundary conditions
enddo
!* Sort the particles into cells
call sorter(x,L)
!* Evaluate collisions among the particles
col = colider(v,vrmax,tau,seed,selxtra,coeff)
coltot = coltot + col ! Increment collision count
!* Periodically display the current progress
if( mod(istep,10) .lt. 1 ) then
write(*,*) 'Done ', istep, ' of ', nstep, ' steps; ',
& coltot, ' collisions'
endif
enddo
! Record final particle speeds
do i=1,npart
vmagF(i) = sqrt( v(i,1)**2 + v(i,2)**2 + v(i,3)**2 )
enddo
!* Print out the plotting variables: vmagI, vmagF
open(11,file='vmagI.txt',status='unknown')
open(12,file='vmagF.txt',status='unknown')
do i=1,npart
write(11,*) vmagI(i)
write(12,*) vmagF(i)
enddo
stop
end
!***** To plot in MATLAB; use the script below ********************
!load vmagI.txt; load vmagF.txt;
!%* Plot the histogram of the initial speed distribution
!figure(1); clf;
!vbin = 50:100:1050; % Bins for histogram
!hist(vmagI,vbin); title('Initial speed distribution');
!xlabel('Speed (m/s)'); ylabel('Number');
!%* Plot the histogram of the final speed distribution
!figure(2); clf;
!hist(vmagF,vbin);
!title(sprintf('Final speed distribution'));
!xlabel('Speed (m/s)'); ylabel('Number');
!*****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -