我正在尝试按质量对n
粒子进行合并,其中每个粒子都有一个关联的x,y,z位置,分别存储在xyzh(1,n)
,xyzh(2,n)
,xyzh(3,n)
中,每个粒子也具有相等的质量,存储在particlemass
中。我的代码如下所示:
integer, intent(in) :: n,iunit
real, intent(in) :: particlemass
integer, parameter :: nbins = 500 ! number of bins
real, parameter :: mmax = 1.0072 ! max mass
integer :: i,j
integer :: ibins(nbins)
real :: ri,mi,dm
real :: rbins(nbins),mass(nbins),mbins(nbins)
!-- Initialise parameters
rbins = 0.0
ibins = 0
mbins = 0.0
我在这里设置我的垃圾箱,dm
是每个垃圾箱的质量,mbins
累计添加每个垃圾箱的质量,因此mbins
的行看起来像1,2, 3,4如果我们假设每个箱子中的质量是1。
!--Set bins
dm = mmax/float(nbins) ! mass of each bin
do i = 1,nbins
mbins(i) = float(i)*dm ! cumulatively adds mass in each bin
enddo
我在这里做的是将数据分成500个分档(nbins
)。我计算每个粒子ri
的半径,然后将这些值合并到rbins(nbins)
。
我尝试做的是将粒子添加到每个bin中,当它的质量超过某个值时,即第一个bin的质量,即mbins(1)
,或者每个连续mbins
之间的值/质量差异,然后我们移动到下一个箱子并开始在那里添加粒子,直到满足相同的标准。
!--Binning data
parts: do i = 1,n
!--Calculate properties of the particle
if (xyzh(4,i) < tiny(xyzh)) cycle parts ! skip dead particles
ri = sqrt(dot_product(xyzh(1:3,i),xyzh(1:3,i))) ! radius of each particle
mi = mi + particlemass
!--Find the bin
j = 1
do while (mi <= mbins(1) .and. j<nbins)
j = j + 1
enddo
if (j<nbins) then
ibins(j) = ibins(j) + 1
rbins(j) = rbins(j) + ri
endif
enddo parts
在这里,我将结果写入文件并计算每个bin中的质量。
!--Write out results
open(iunit,file='results.dat')
do i = 1,nbins
mass = ibins(i)*particlemass ! mass in each shell
write(iunit,*) mass(i),mbins(i),rbins(i)/ibins(i)
enddo
close(unit)
而不是在mass(i)
给我相同的质量值,我只是得到零,我的rbins(i)/ibins(i)
给了我NaNs。
我在这里做错了什么,我将如何正确地装入这些粒子?
非常感谢您的建议。
更新:只有第一行似乎有效,但其余的都是零。