首页 > 解决方案 > 将空间点声明为实数而不是整数

问题描述

我试图在下面的示例代码中演示我想要做什么。我有一堆 if/else 条件,我想在编译和运行代码时正确输入它们。但是我不会输入 i,j 是实数的那些,因为 i,j 在代码的开头被定义为整数。我怎样才能以不同的方式对这个问题进行建模,以便我可以输入那些 if/else 条件?谢谢

具体来说,我不希望空间点 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

标签: pointersfortran

解决方案


看起来您想解决偏微分方程或通过将连续方程离散为有限点集而出现的其他数学问题。这些点通常在xy方向上的正交网格上,但网格可以旋转、倾斜、变形甚至完全非结构化。记住这一点很有用,因为这意味着您需要尝试不同的东西。

对于结构化网格,您可以使用 Fortran 数组来存储每个数据点中的变量值。

real ::  u(1:nx,1:ny), f(1:nx, 1:ny)

您可以对每个点的xy坐标执行相同的操作。

对于xy中的简单正交网格,您可以只使用 1D 数组作为xy坐标

real :: x(1:nx), y(1:ny)

这些的含义是具有给定x索引的每个点i都在x坐标处x(i),对于y(j).

当您的计算取决于坐标时,您可以将它们简单地用作

do j = 1, ny
  do i = 1, nx
    f(i,j) = func(x(i), y(j))
  end do
end do

对于您的 if 语句:

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

请注意,您永远不应该比较浮点值(Fortran real)的相等性,例如if (x==5.31). 浮点数不精确,x很容易5.3100000001代替5.31.


您可以在 Internet 上找到无数示例,甚至可以在 Stack Overflow 上找到。只需在网上搜索“Fortran Poisson 方程”,您就会找到大量用于 Jacobi 方法和其他更精细方法的简单代码示例。

请记住,有一个专门用于科学计算的 StackExchange 站点。我们本可以立即将您发送到那里,但是您的第一个问题版本非常不同,并且显然不适合该站点。


推荐阅读