interFoam 或 interDyMFoam 如何调用 sixDoFRigidBodyMotion 类?
-
@bestucan 感谢您的回复。
这几天我在知网找到了一篇硕士论文,其中在第二章第2.3节有对sixDoFRigidBodyMotion类的调用的介绍,以下是硕士论文的网址:
WEC-防波堤集成系统能量捕获效率与消波性能研究[1]毛艳军. WEC-防波堤集成系统能量捕获效率与消波性能研究[D].大连理工大学,2019.DOI:10.26991/d.cnki.gdllu.2019.001609.
我目前遇到的另一个困难是,我想把浮体的位移和速度通过sixDoFRigidBodyMotion下的restraint类传递给系泊线。希望通过一个新的约束模型,调用浮体的位移和速度矢量,作为系泊计算的边界条件。但是目前还没有找到相应的变量或者代码,不知道@bestucan 老师您有什么高见?
-
这几个是并列关系,都是单独的类:
但会互相影响、调用,比如调用了solver,更新过的其他类才有意义什么的。
这个类 sixDoFRigidBodyMotionRestraint 的 Public Member Functions 里没有返回速度的函数。
这个类 sixDoFRigidBodyMotion 的 Public Member Functions 里有 vector & v () 和 const vector & v () const。从这里取速度,但是怎么把速度给系泊什么的,我第一次听这个词,不是很了解
-
@bestucan
非常感谢您的回复,对我的启发很大。之前提到的硕士论文中的流程图如下:
我之前一直在研究
interDyMFoam.C
对sixDoFRigidBodyMotion
类的调用流程,以及sixDoFSolver
下的Newmark.C
的源码结构,所以忽略了对于速度v
这个变量定义的位置。我去看了一下sixDoFSolver
和sixDoFRigidBodyMotion
这两个类的头文件。六自由度运动求解器
sixDoFSolver
在sixDoFSolver.H
62行处,声明了一个sixDoFRigidBodyMotion
的类:sixDoFRigidBodyMotion& body_;
而在
sixDoFRigidBodyMotion
类的头文件sixDoFRigidBodyMotion.H
中,在第79到83行,有如下声明://- Motion state data object sixDoFRigidBodyMotionState motionState_; //- Motion state data object for previous time-step sixDoFRigidBodyMotionState motionState0_;
并且对于速度
v
、加速度a
的声明,源码中将其声明为内联函数,在sixDoFRigidBodyMotionI.H
中的第143到第152行:inline const Foam::vector& Foam::sixDoFRigidBodyMotion::v() const { return motionState_.v(); } inline const Foam::vector& Foam::sixDoFRigidBodyMotion::a() const { return motionState_.a(); }
所以按照代码的思路和我的理解,应该是将所有的状态量如速度
v
、加速度a
等,保存在sixDoFRigidBodyMotionState
这个类中,并且除了当前时间步的运动状态,前一时间步的运动状态也能够访问。关于取速度的问题,我认为是可行的。在查阅源码时,见到了
sixDoFRigidBodyMotionRestraint
的子类linearDamper::restrain()
调用了sixDoFRigidBodyMotion
的v()
。代码在
linearDamper.C
的第73到89行,如下void Foam::sixDoFRigidBodyMotionRestraints::linearDamper::restrain ( const sixDoFRigidBodyMotion& motion, vector& restraintPosition, vector& restraintForce, vector& restraintMoment ) const { restraintForce = -coeff_*motion.v(); restraintMoment = Zero; if (motion.report()) { Info<< " force " << restraintForce << endl; } }
不难理解,阻尼与速度成正比,所以需要得到六自由度浮体的速度
v
,即公式中的motion.v()
。而调用restrain
函数需要把sixDoFRigidBodyMotion& motion
传入,因此实现了对速度的调用。除此之外,类似的像是
sphericalAngularDamper
、sphericalAngularSpring
、linearAxialAngularSpring
、tabulatedAxialAngularSpring
这些约束模型,实现了对角速度omega()
的调用,如下图所示以上是我的一些拙见,有错误的地方还请多多指点。