颗粒受力模型列表工作原理¶
背景与动机¶
颗粒种类繁多,颗粒的受力模型丰富。在我们旧版本的fortran程序PARTURB中,我们通过预设颗粒模型的受力方案来区分不同种类的颗粒力,例如:
球形:经验阻力公式+升力+重力
实际问题中,颗粒的受力模型繁多,仅阻力模型就比较多,如果仍然采用预设方案,所需要的排列组合的颗粒种类非常庞大。而在大多数情况下,科研者主要关心一些常用的组合,同时也需要能够自定义颗粒的受力的组合形式。
为了进一步简化力模型添加和调用的过程。如果采用之前预设方案,需要有大段重复的代码,而且可维护性随着颗粒种类的增加而变差。我们需要一种颗粒受力模型列表,帮助我们管理模型,并且可以根据列表中的模型顺序自动化执行。
基本方案¶
从字典文件输入颗粒力模型和力矩模型列表 例如
FM=["Stokes", "Saffman", "Basset"] TM=["Jeffery", "FluidInertialTorque"]
以上模型的名字未来可能尽可能简写,尽可能保证3-6个字符之间
对应颗粒可自定义相应的模型,例如
0={ModelID=1,Size=100,DR=1000,Radius=0.001, AR=[1,1,1], G=[0,0,0], FM=["Stokes"], TM=["Stokes"]} 1={ModelID=1,Size=100,DR=1000,Radius=0.001, AR=[1,1,1], G=[0,0,0], FM=["Oseen", "Saffman"], TM=["Stokes"]} 2={ModelID=1,Size=100,DR=1000,Radius=0.001, AR=[1,1,1], G=[0,0,0], FM=["MaxeyRily", "Saffman", "Basset"], TM=["Stokes"]} 3={ModelID=1,Size=100,DR=1000,Radius=0.001, AR=[1,1,1], G=[0,0,0], FM=["Stokes"], TM=["Stokes"]}
其中让ModelID=1~99预留出来作为用户自定义的大类标签,比如1为自定义普通球形颗粒,2为自定义普通非球形颗粒等.
由程序读取列表,并解析颗粒所需力模型,在颗粒求解过程中依次执行相应的模型叠加。
通过ModelID预置一些常用的组合
比如三位到四位的ModelID作为预置模型,比如ModelID=105(具体以发布版本说明为准), 为惯性球形颗粒,其中颗粒受力模型为 Stokes+Saffman, 力矩模型为StokesTorque.
实现方案¶
模型设计¶
拟采用vector作为容器存储各个模型的指针,并与不同种类的颗粒进行绑定
各个受力模型,拟采用class的继承方案,例如
template <typename T_real, int N_dim=3> requires (N_dim==3 || N_dim==2) struct SphereForceModel { struct Stokes:public ForceModel{ virtual const std::string getName(){ return "Sphere::"+std::to_string(N_dim)+"D Stokes Force"; } virtual void Force(ParticleField<N_dim> & pfield, ParticleBase* ptr_particle){ } }; struct Oseen:public ForceModel{ virtual const std::string getName(){ return "Sphere::"+std::to_string(N_dim)+"D Oseen Force"; } virtual void Force(ParticleField<N_dim> & pfield, ParticleBase* ptr_particle){ } };
其中 ForceModel 为所有力模型的基类。