如何在Fortran中存储值

时间:2017-10-07 05:15:24

标签: arrays sorting fortran gfortran binning

我正在尝试按质量对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。 我在这里做错了什么,我将如何正确地装入这些粒子?

非常感谢您的建议。

更新:只有第一行似乎有效,但其余的都是零。

0 个答案:

没有答案