precice tourorials中的受力问题
-
openfoam的受力分析需要在controldict中添加force子字典,但是我在运行preCICE的教程时发现有些教程的concroldict中没有这个部分的,但他依旧实现了force和displacement的互相传递,这个是怎么做到的?
如果是它是通过的adapter所实现的内容能否推荐以下对应的博客,我在precice官方的页面https://precice.org/adapter-openfoam-overview.html看不到这样的功能
ps:以下是这个问题在外站的提问,里边有截图,本站附图的方式我暂时没学会https://www.zhihu.com/question/4035300749 -
@RolandLent 源码在openfoam-adapter的FSI/Force.C和ForceBase.C中
-
@lwjetmann好的,谢谢
-
此回复已被删除!
-
@Mina-Lee 在 precice tourorials中的受力问题 中说:
因为你编译的openfoam-adapter里,已经对流固耦合交界面的force变量引用了,OF在运行完成后,adapter会引用force变量,precice运行完毕后,会覆盖这个force变量。
precice就是给openfoam施加了一个狄利克雷位移边界条件-理解了这句话就全明白了。其他的能理解,但是这个“precice运行完毕后,会覆盖这个force变量”指的是
在controldict中定义了“forces”那么openfoam输出的forec是重新计算的,与流固耦合过程中交换的不是一个值的意思吗 -
@RolandLent precice中没有计算OF力的能力,力都是在OF里计算的。OF中的力也是通过force函数计算的。
pecice只干三件事:
1、引用of中的力变量,提取流固耦合交界面的力变量;引用位移变量。2、precice内部运算。3、覆盖引用的位移变量。 -
@Mina-Lee 在 precice tourorials中的受力问题 中说:
@RolandLent precice中没有计算OF力的能力,力都是在OF里计算的。OF中的力也是通过force函数计算的。
pecice只干三件事:
1、引用of中的力变量,提取流固耦合交界面的力变量;引用位移变量。2、precice内部运算。3、覆盖引用的位移变量。我阅读了第一位回答者的源代码,力的计算是precice的of适配器实现的,我在适配器的forcebase类里边找到了计算力的方法,这里附上计算压力和黏性力的部分
if (solverType_.compare("incompressible") == 0) { forceField.boundaryFieldRef()[patchID] = surface * pb[patchID] * rhob[patchID]; } else if (solverType_.compare("compressible") == 0) { forceField.boundaryFieldRef()[patchID] = surface * pb[patchID]; }
forceField.boundaryFieldRef()[patchID] += surface & devRhoReffb[patchID];
如果是用of的solid求解器就是向您这样的执行方式了
// Check if a force field with the requested name exists. // If yes (e.g., solids4Foam), bind Force_ to that field. // If not (e.g., pimpleFoam without the Forces function object), create it. if (mesh_.foundObject<volVectorField>(nameForce)) { Force_ = &const_cast<volVectorField&>( mesh_.lookupObject<volVectorField>(nameForce)); } else { ForceOwning_.reset(new volVectorField( IOobject( nameForce, mesh_.time().timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE), mesh, dimensionedVector( "fdim", dimensionSet(1, 1, -2, 0, 0, 0, 0), Foam::vector::zero))); Force_ = ForceOwning_.get(); }