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(); }
 
			