Arrays Fortran 90-带标量和数组的代数运算
我正在使用一个Fortran 90程序,除其他程序外,该程序声明了以下变量:Arrays Fortran 90-带标量和数组的代数运算,arrays,fortran,scalar,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 =
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\u node\u lf
的维度是多少?它是标量吗?它是否继承了数组sucsat
、h2osoi\u vol
、watsat
和bsw
的维度?smp\u节点lf缺少维度,因为它是一个标量,并且多次接收该标量操作的值,并被重写,如果没有任何东西可以将其值保存到向量或其他东西
它永远不会继承任何这些元素的维度,永远不会继承向量,它接收的所有内容都是标量
如果您必须检索它的值,假设原始代码能够按原样执行,那么在这个循环中应该有另一个部分在被另一个过程覆盖之前保存该值。
若并没有这样的事情,那个么实现它,您可能正在处理不完整的代码,而这些代码并没有执行它所说的任何操作
我已经处理了相当多的“完美代码”,它们“在我上次使用时创造了奇迹”,但在代码行中却找不到任何奇迹。它可能是标量,也可能不是标量。没有一个完整的例子,这是不可能告诉。假设它是一个标量,为什么会让人困惑呢?请注意,右侧的表达式似乎是标量表达式。根据它的声明,
smp\u node\u lf
就我所知是标量表达式。这次行动让你困惑的是什么?一些数学运算中的一组数组组件(每个都是标量)。@francescalus让我困惑的是smp\u node\u lf
中缺少维度。是不是c
xj
?假设指数j
代表土壤层,c
代表植被类型。假设我想在循环后打印j=1和c=1的smp\u node\u lf
值。这可能吗?如果像其他变量一样用维度(:,:)来声明它,访问它的索引将很简单,但我对它是一个维度感到困惑。@Thiagvelo所以你的问题有两个问题:1。您不知道代码是否有效,因此不存在“问题”,因此不需要提出解决方案。我们不能做出任何明确的声明,除非我们有一个完整性的定义,我们不能确定smp\u node\u lf
是一个标量。一个维度smp\u节点\u lf(7,23,1,5)
可能存在于其他地方。