pointers - 将空间点声明为实数而不是整数
问题描述
我试图在下面的示例代码中演示我想要做什么。我有一堆 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
解决方案
看起来您想解决偏微分方程或通过将连续方程离散为有限点集而出现的其他数学问题。这些点通常在x和y方向上的正交网格上,但网格可以旋转、倾斜、变形甚至完全非结构化。记住这一点很有用,因为这意味着您需要尝试不同的东西。
对于结构化网格,您可以使用 Fortran 数组来存储每个数据点中的变量值。
real :: u(1:nx,1:ny), f(1:nx, 1:ny)
您可以对每个点的x
和y
坐标执行相同的操作。
对于x和y中的简单正交网格,您可以只使用 1D 数组作为x
和y
坐标
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 站点。我们本可以立即将您发送到那里,但是您的第一个问题版本非常不同,并且显然不适合该站点。
推荐阅读
- r - 是否有可以将 4.25 舍入为 4.3 而不是 4.2 的 R 函数?
- c# - 简化许多 LINQ Join
- r - R:使用链接抓取嵌套的 html 表格(单元格内的表格)
- node.js - 使用更改流(Node.js)获取文档中嵌套数组元素的增量
- allennlp - AllenNLP:对 url 的 HEAD 请求失败,状态码为 404 - 打开信息提取
- javascript - 如何让 async/await 函数与 setTimeout 一起工作
- c++ - MergeSort:我的问题来自不正确的索引或递归实例变量
- apache-spark - RDD 是保存在内存中还是在操作完成后立即从内存中清除?
- flutter - 颤振:按下按钮时如何使用 if 语句检查时间
- laravel - 如何在 Laravel 中选择具有关系的自定义属性字段?