Fortran 90 - 标量和数组的代数运算
Fortran 90 - Algebra operation with scalar and arrays
我正在使用 Fortran 90 程序,在许多其他程序中,声明了以下变量:
real(r8) :: smp_node_lf
real(r8), pointer :: sucsat(:,:)
real(r8), pointer :: h2osoi_vol(:,:)
real(r8), pointer :: watsat(:,:)
real(r8), pointer :: bsw(:,:)
在程序的某个时刻,有一个代数运算如下所示:
do j = 1,nlevgrnd
do c = 1,fn
...
smp_node_lf = -sucsat(c,j)*(h2osoi_vol(c,j)/watsat(c,j))**(-bsw(c,j))
...
end do
end do
我正在尝试 "translate" 此程序的十几行到 R,但上面的摘录尤其让我感到困惑。
smp_node_lf
的维度是多少?它是标量吗?它是否继承数组 sucsat
、h2osoi_vol
、watsat
和 bsw
的维度?
smp_node_lf缺少维度,因为它是一个标量,并且它多次接收该标量运算的值,正在重写,如果没有任何东西可以将其值保存到向量中什么的。
它永远不会继承任何这些元素的维度,永远不会继承向量,它接收的一切都是标量
如果您必须检索它的值,假设原始代码能够按原样处理,那么在这个循环中应该有另一个部分在它被另一遍覆盖之前保存该值。
如果没有这样的东西,请实现它,您可能正在处理不完整的代码,这些代码没有做任何事情。
我已经处理了 "perfect code" 的公平份额,"did miracles when I used last time" 在其代码行中没有发现任何奇迹。
我正在使用 Fortran 90 程序,在许多其他程序中,声明了以下变量:
real(r8) :: smp_node_lf
real(r8), pointer :: sucsat(:,:)
real(r8), pointer :: h2osoi_vol(:,:)
real(r8), pointer :: watsat(:,:)
real(r8), pointer :: bsw(:,:)
在程序的某个时刻,有一个代数运算如下所示:
do j = 1,nlevgrnd
do c = 1,fn
...
smp_node_lf = -sucsat(c,j)*(h2osoi_vol(c,j)/watsat(c,j))**(-bsw(c,j))
...
end do
end do
我正在尝试 "translate" 此程序的十几行到 R,但上面的摘录尤其让我感到困惑。
smp_node_lf
的维度是多少?它是标量吗?它是否继承数组 sucsat
、h2osoi_vol
、watsat
和 bsw
的维度?
smp_node_lf缺少维度,因为它是一个标量,并且它多次接收该标量运算的值,正在重写,如果没有任何东西可以将其值保存到向量中什么的。
它永远不会继承任何这些元素的维度,永远不会继承向量,它接收的一切都是标量
如果您必须检索它的值,假设原始代码能够按原样处理,那么在这个循环中应该有另一个部分在它被另一遍覆盖之前保存该值。 如果没有这样的东西,请实现它,您可能正在处理不完整的代码,这些代码没有做任何事情。
我已经处理了 "perfect code" 的公平份额,"did miracles when I used last time" 在其代码行中没有发现任何奇迹。