我想在单元格中拆分一个矩形。在每个单元格中,它应该创建一个随机坐标(y,z)。
矩形的宽度和高度是已知的(initialW / initalH)。 计算细胞的大小(dy / dz)。 数字,即矩形的部分数量,是已知的。 (numberCellsY / numberCellsZ)
这是我在Fortran中的代码,用于拆分单元格中的矩形:
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之间。
我该如何解决这个问题?如果某人有更好的解决方案,请发布!
由于
答案 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