将空间点声明为实数而不是整数

时间:2018-10-08 23:22:18

标签: pointers fortran

我试图在下面的示例代码中演示我想做的事情。我有很多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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

对于 x y 中的简单正交网格,您可以将一维数组用于xy坐标

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网站用于科学计算。我们本可以立即将您发送给您,但是您提出的第一个问题却大相径庭,显然不适合该网站。