Fortran 派生类型运算符

Posted

技术标签:

【中文标题】Fortran 派生类型运算符【英文标题】:Fortran Derived Type Operators 【发布时间】:2016-10-04 04:12:56 【问题描述】:

我有点困惑,因为我正在运行我的代码以使用 u = v * scalar 和 v = scalar * u 进行标量向量乘法

我认为下面的代码会给我模棱两可的声明 通用的“*”。 vsm_real32、vsm_real64 和 vsm_real128 和函数 svm 不冲突?

 Procedure :: vsm_real32, vsm_real64,  &
              vsm_real128 

 Procedure, Pass (tb) :: svm

 Generic :: Operator (*) => vsm_real32,   &
                vsm_real64, vsm_real128,  &
                svm

 Contains

 Function vsm_real32 (tb, sc_real32) Result (ta)
   Type (Vector) :: ta
   Class (Vector), Intent (In) :: tb
   Real (Real32), Intent (In) :: sc_real32

   Call vsmd (ta, tb, sc_real32, "*")

 End Function vsm_real32

 Function vsm_real64 (tb, sc_real64) Result (ta)
   Type (Vector) :: ta
   Class (Vector), Intent (In) :: tb
   Real (Real64), Intent (In) :: sc_real64

   Call vsmd (ta, tb, sc_real64, "*")

 End Function vsm_real64


 Function vsm_real128 (tb, sc_real128) Result (ta)
   Type (Vector) :: ta
   Class (Vector), Intent (In) :: tb
   Real (Real128), Intent (In) :: sc_real128

   Call vsmd (ta, tb, sc_real128, "*")

 End Function vsm_real128


 Function svm (sc, tb) Result (ta)
   Type (Vector) :: ta
   Class (*), Intent (In) :: sc
   Class (Vector), Intent (In) :: tb

   Call vsmd (ta, tb, sc, "*")

 End Function svm

【问题讨论】:

【参考方案1】:

通用绑定用于操作员。可区分过程的要求仅基于虚拟参数的位置。

(对于表达式a * b,第一个虚拟参数始终对应a,第二个对应b。在这种情况下,传递的参数不会影响消歧。)

vsm_* 函数都有一个必需的第二个虚拟参数,该参数因函数而异。因此,第二个参数是可区分的,因此 vsm_* 函数都是可区分的。

svm 函数的第二个参数是Vector 类型。这是与 vsm_* 函数 (REAL) 的第二个参数的类型不同的类型,因此第二个参数是可区分的,因此 svm 函数可与所有 vsm_* 函数区分开来。

参考 F2008 C1212。​​

【讨论】:

以上是关于Fortran 派生类型运算符的主要内容,如果未能解决你的问题,请参考以下文章

Fortran中的“%”是什么意思/做什么?

派生类型中的可变长度数组

fortran中逻辑数据类型,在内存中的存储情况?

Fortran 派生类型

确定内存中的 Fortran 派生类型大小

在 fortran 中命名派生类型的良好做法