gpt4 book ai didi

fortran - Fortran 中的用户定义运算符

转载 作者:行者123 更新时间:2023-12-01 03:53:12 25 4
gpt4 key购买 nike

我有一个关于在 Fortran 中编程用户定义运算符的正确方法的问题。更具体地说,我将提供我的问题的示例。我正在为名为“粒子”的球形粒子创建用户定义的数据类型。我想定义一个运算符,它采用现有的 Particle 对象数组并向其中添加一个新的 Particle 对象。我想知道如何定义用户定义的运算符来执行这样的操作。

目前,在 Particle 的类型定义中,我有以下几行:

procedure, public:: addNewParticleTo
generic:: operator(.spawn.) => addNewParticleTo

之后,我有一个定义如下的子例程:
subroutine addNewParticleTo(a_LHS, a_RHS)
implicit none
class(Particle), dimension(:), allocatable, intent(in):: a_LHS
class(Particle), dimension(:), allocatable, intent(inout):: a_RHS
<rest of the code>
end subroutine addNewParticleTo

我打算将运算符调用为:
particle .spawn. particleArray

我想知道这是否是这样做的正确方法。对此的任何建议或建议都将非常有帮助。

最佳答案

要扩展评论,您需要拥有 operator代码为 function .此外,每个输入都需要是 intent(in) .这确实允许像 array = particle .spawn. array 这样的东西。 .

但是,您的子例程需要进行另一项更改:您的参数之一应该是标量。 [第一个,除非你玩pass属性。]

function addNewParticleTo(A, B) result(C)
class(particle), intent(in) :: A
class(particle), allocatable, intent(in) :: B(:)
class(particle), allocatable :: C(:)
! ... code to do the appending
end function

最后,我的建议是,将其用作类型绑定(bind)运算符会使事情变得非常复杂,例如多态性等等。另外, array = particle .spawn. array看起来很不直观。

相反,只是一个简单的子程序,以便 call add_to_particle_array(all_particles, new_particle)作品看起来更干净。这更接近您的原始代码,但没有回答您关于运营商的问题,唉。

关于fortran - Fortran 中的用户定义运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com