com*_*ohn 5 fortran user-defined-functions user-defined-types fortran90 fortran95
我有一个关于在 Fortran 中编写用户定义运算符的正确方法的问题。更具体地说,我将提供我的问题的示例。我正在致力于为称为“粒子”的球形粒子创建用户定义的数据类型。我想定义一个运算符,它采用现有的 Particle 对象数组并向其中添加一个新的 Particle 对象。我想知道如何定义用户定义的运算符来执行这样的操作。
目前,在 Particle 的类型定义中,我有以下几行:
procedure, public:: addNewParticleTo
generic:: operator(.spawn.) => addNewParticleTo
Run Code Online (Sandbox Code Playgroud)
接下来,我有一个定义如下的子例程:
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
Run Code Online (Sandbox Code Playgroud)
我打算将运算符调用为:
particle .spawn. particleArray
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是执行此操作的正确方法。对此的任何建议或建议都会非常有帮助。
要扩展注释,您需要将代码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
Run Code Online (Sandbox Code Playgroud)
最后,我的建议是,将其作为类型绑定运算符会使事情变得非常复杂,具有多态性等。而且,array = particle .spawn. array看起来很不直观。
相反,只是一个简单的子例程,这样call add_to_particle_array(all_particles, new_particle)工作起来就显得更干净了。这更接近您的原始代码,但没有回答您有关运算符的问题,唉。
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |