我试图在下面的示例代码中演示我想做的事情。我有很多if / else条件,我想在编译和运行代码时正确输入它们。但是,我不会输入i,j为实数的数字,因为i,j在代码的开头定义为整数。我该如何对这个问题进行不同的建模,以便我可以输入这些条件?谢谢
具体地说,我不希望空间点i,j为整数。相反,我希望它们成为与空间中任何位置相对应的实数值,例如:(x,y)=(5.31,5.31)。
program sample
integer :: i,j !spatial points
real, parameter :: DeltaX = 0.1
integer, parameter :: n = 10
real, dimension(-n:n, -n:n) :: u,f
do j = -n,n
do i = -n,n
f(i,j) = sin(i*DeltaX+j*DeltaX)
end do
end do
do i = -n+1,n-1 !this loop is only over integers
do j = -n+1,n-1 !this loop is only over integers
if (i == 6 .AND. j == 6 .AND. i == j) then
PRINT*, 'i,j', i,j
u(i,j) = (f(i+1,j+1)+f(i-1,j-1)-f(i,j))/DeltaX**2
else if ( i == 8 .AND. j == 8. .AND. i == j) then
PRINT*, 'i,j ', i,j
u(i,j) = (f(i+1,j+1)+f(i-1,j-1)-f(i,j))/DeltaX**2
else if ( i == 5.31 .AND. j == 5.31 .AND. i == j) then
PRINT*, 'i,j = ', i,j !I will never enter this if statement though
u(i,j) = (f(i+1,j+1)+f(i-1,j-1)-f(i,j))/DeltaX**2
else if ( i == -6.87 .AND. j == -6.87 .AND. i == j) then
PRINT*, 'i,j = ', i,j !I will never enter this if statement either
u(i,j) = (f(i+1,j+1)+f(i-1,j-1)-f(i,j))/DeltaX**2
else
u(i,j) = (f(i+1,j)+f(i-1,j)+f(i,j+1)+f(i,j-1)-4*f(i,j))/DeltaX**2
end if
end do
end do
end program
答案 0 :(得分:3)
您似乎想解决一个偏微分方程或通过将一个连续方程离散化成一组有限的点而出现的其他数学问题。这些点通常在 x 和 y 方向上位于正交网格上,但是网格可以旋转,倾斜,变形甚至完全非结构化。记住这一点很有用,因为这意味着您需要尝试的其他东西。
对于结构化网格,可以使用Fortran数组在每个数据点中存储变量的值。
real :: u(1:nx,1:ny), f(1:nx, 1:ny)
您可以对每个点的x
和y
坐标执行相同的操作。
对于 x 和 y 中的简单正交网格,您可以将一维数组用于x
和y
坐标
real :: x(1:nx), y(1:ny)
这些含义是给定 x 索引i
的每个点都在 x 坐标x(i)
处,并且对于{{1 }}。
当您的计算取决于坐标时,可以简单地将其用作
y(j)
对于您的if语句:
do j = 1, ny
do i = 1, nx
f(i,j) = func(x(i), y(j))
end do
end do
请注意,您应该从不比较浮点值(Fortran do j = 1, ny
do i = 1, nx
if (x(i)>something .and. x(i)<something_else) then
u(i,j) = some_expression with u(i+-1,j+-1) and f(i+-1,j+-1)
else ...
end if
end do
end do
)是否像real
一样。浮点数不精确,if (x==5.31)
可以很容易地成为x
而不是5.3100000001
。
您甚至可以在Stack Overflow上的互联网上找到无数的示例。只需在网上搜索“ Fortran Poisson方程”,您就会发现大量的Jacobi方法和其他更精致方法的简单代码示例。
请记住,有一个专门的StackExchange网站用于科学计算。我们本可以立即将您发送给您,但是您提出的第一个问题却大相径庭,显然不适合该网站。