在单元格/随机坐标中拆分矩形/在FORTRAN中存储在数组中

时间:2014-08-03 08:54:43

标签: random fortran

我想在单元格中拆分一个矩形。在每个单元格中,它应该创建一个随机坐标(y,z)。 Rectangle split in cells

矩形的宽度和高度是已知的(initialW / initalH)。 计算细胞的大小(dy / dz)。 数字,即矩形的部分数量,是已知的。 (numberCellsY / numberCellsZ)

这是我在Fortran中的代码,用于拆分单元格中的矩形:Cells

yRVEMin = 0.0
yRVEMax = initialW
dy = ( yRVEMax - yRVEMin ) / numberCellsY         

zRVEMin = 0.0
zRVEMax = initialH
dz = ( zRVEMax - zRVEMin ) / numberCellsZ


do i = 1, numberCellsY 
   yMin(i) = (i-1)*dy
   yMax(i) = i*dy
end do

do j = 1, numberCellsZ 
    zMin(j) = (j-1)*dz
    zMax(j) = j*dz
end do

现在我想在每个单元格中生成一个随机坐标。对我来说,问题是将coodinates存储在一个数组中。它不一定都存储在一个数组中,但至少应尽可能存储。

要用坐标填充单元格,它应该从左下角的单元格开始,遍历行(y方向),然后在最后一个单元格(numberCellsY)之后跳过一个更高的列(z-dicrection)并再次从左侧新行的第一个单元格。应该这么做,直到达到规定的数量(nfibers)。

这是一个令人遗憾的尝试:

call random_seed
  l = 0
    do k = 1 , nfibers
        if (l < numberCellsY) then
            l = l + 1
        else
            l = 1
        end if
        call random_number(y) 
        fiberCoordY(k) = yMin(l) + y * (yMax(l) - yMin(l))
    end do

n = 0
    do m = 1 , nfibers
        if (n < numberCellsZ) then
            n = n + 1
        else
           n = 1
        end if
        call random_number(z) 
       fiberCoordZ(m) = zMin(n) + z * (zMax(n) - zMin(n))
    end do

输出不是我想要的!只要达到numberCellsY步,fiberCoordZ应该保持开启(zMin(1)/ zMax(1)。

以下设置的输出:

nfibers = 9 
numberCellsY = 3 
numberCellsZ = 3 
initialW = 9.0 
initialH = 9.0

我对fiberCoordY的随机输出是:

1.768946    3.362770     8.667685     1.898700    5.796713   8.770239       2.463412       3.546694    7.074708

和fiberCoordZ是:

2.234807    5.213032     6.762228     2.948657    5.937295    8.649946      0.6795220     4.340364    8.352566

在这种情况下,前3个数量的fiberCoordz应该具有0.0到3.0之间的值。比数4 - 6的值介于3.0和6.0之间。数字7 - 9的值在6.0 - 9.0之间。

我该如何解决这个问题?如果某人有更好的解决方案,请发布!

由于

2 个答案:

答案 0 :(得分:1)

看着

n = 0
do m = 1 , nfibers
  if (n < numberCellsZ) then
    n = n + 1
  else
   n = 1
  end if
  call random_number(z) 
  fiberCoordZ(m) = zMin(n) + z * (zMax(n) - zMin(n))
end do

我们看到z坐标偏移(感兴趣的底部单元格边界)不正确地增加:对于每个连续的nfibers/numberCellsZ坐标n应该是常数。

n只应在每次numberCellsY迭代时递增,所以可能是像

这样的条件
if (MOD(m, numberCellsY).eq.1) n=n+1

会更好。

答案 1 :(得分:0)

谢谢francescalus!它工作正常。

我为nfibers&gt;的案例添加了一点内容。 numberCellsY * numberCellsZ

n=0
do m = 1 , nfibers
       if (MOD(m, numberCellsY).eq.1 .and. (n < numberCellsY))  then
           n=n+1
       end if

       if (MOD(m, numberCellsY*numberCellsZ).eq.1 )  then
           n = 1
       end if

       call random_number(z) 
       fiberCoordZ(m) = zMin(n) + z * (zMax(n) - zMin(n))
end do