Fortran 90 - 使用标量和数组进行代数运算

时间:2018-03-15 21:42:33

标签: arrays fortran scalar

我正在使用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

我正在尝试"翻译"这个程序的十几行到R,但上面的摘录特别让我感到困惑。

smp_node_lf的维度是多少?它是标量吗?它是否继承了数组sucsath2osoi_volwatsatbsw的维度?

1 个答案:

答案 0 :(得分:1)

smp_node_lf缺少维度,因为它是一个标量,并且它正在多次接收该标量操作的值,如果没有任何内容可以将其值保存到向量或其他内容,则会被重写。

它永远不会继承任何元素的维度,永远不会有一个要继承的向量,它接收的所有东西都是标量

如果你必须检索它的值,假设原始代码能够原样,那么在这个循环中应该有另一个部分,在它被另一个传递覆盖之前保存该值。 如果没有这样的东西,实现它,你可能正在处理不完整的代码,它没有做任何事情。

我已经处理了我的“完美代码”的公平份额,“当我上次使用时创造了奇迹”,并且在其代码行中找不到任何奇迹。