新手小白求教,有没有能够通过读取向量文件数据获取动边界速度的功能
-
@yzxwh 确实有点奇怪,可能我理解有误。
timeVaryingMappedFixedValue
读取数据主要用了MappedFile.C
中的checkTable
函数。觉得把初始化中的这两行代码移到初始化括号外,每次运行应该就会更新文件夹中的时间文件夹。// Read the times for which data is available const fileName samplePointsDir = samplePointsFile.path(); sampleTimes_ = Time::findTimes(samplePointsDir);
MappedFile.C
中部分代码:template<class Type> void Foam::PatchFunction1Types::MappedFile<Type>::checkTable ( const scalar t ) const { const polyMesh& mesh = this->patch_.boundaryMesh().mesh(); const Time& time = mesh.time(); // Initialise if (!mapperPtr_) { ... // Read the times for which data is available const fileName samplePointsDir = samplePointsFile.path(); sampleTimes_ = Time::findTimes(samplePointsDir); DebugInfo << "In directory " << samplePointsDir << " found times " << pointToPointPlanarInterpolation::timeNames(sampleTimes_) << endl; }
-
-
@yzxwh 这块我没接触过,说下自己的理解:
- 如果不人为调整,后面自动生成的
pointmotionU
,不同时刻的结果是不一样,还是一直等同于初始0文件中设定的值? - 大致看了下程序,
velocityLaplacianFvMotionSolver
是继承velocityMotionSolver
,pointMotionU_
在velocityMotionSolver.C
中已经定义,在主函数中就不需要重复定义了。即使主函数定义了,读取的数值也没传递到定义的类中,也没起到作用。
velocityLaplacianFvMotionSolver.C
里边有个updateCoeffs()
,正常是通过这里更新数值。如果自动生成的pointmotionU
一直都是一样的,考虑在updateCoeffs()
前强制增加读取文件试试
pointmotionU_.read();
- 后面计算网格量大的话,单进程估计计算太慢。不过可以先把单进程调试通,再考虑如何改并行程序。
- 如果不人为调整,后面自动生成的
-
@coolhhh 万分感谢大佬的指点,回答一下第一点:后面生成的pointmotionU的确是不一样的,我可能表达有误,由于圆管的运动是通过别的软件生成决定的,所以圆管的运动数据是实时传输到of里面的。of里面的动边界相当于我另一个软件的圆管,但他的运动完全由那边所决定,我的想法是在运行过程中修改最新时步的pointmotionU文件最下面几行的边界条件代码,举个例子 如第一张图所示这是当前最新时刻的边界速度,我通过python强行修改了这个边界速度如下图
我是想让下一步能够以修改的边界条件进行运算,以此类推,往后每一步都会修改边界速度,然后下一步以新的边界速度运算,不过我的尝试没有成功,pointmotionU边界的读取似乎只与初始时刻相关。
关于大佬说的剩下三点我再好好理解理解,再次感谢大佬的悉心指点。 -
@coolhhh 大佬,我这边在velocityLaplacianFvMotionSolver.C添加了读取文件的代码pointmotionU_.read();文件的确是每个时步都被读取了,但是读取的边界条件一直是修改之前的。我还采用赋值的方法强行给pointmotionU_赋值,代码如下
强制读取当前时刻修改后的pointmotionu的数据存到temppointmotionu中然后再赋给pointmotionu,两个结果都在运算中打印出来了,结果发现,temppointmotionu是成功读取修改后数据的,但是赋值后的pointmotionu依旧是修改前的数据。是否是该类型无法被直接赋值,望指点。 -
- 看起来没问题,我也按照你的问题写了个简单例子测试,输出结果是正确的。
#include "fvCFD.H" class Parent { protected: int protectedVar = 5; public: void modifyVariable() { int tmp = 10; int tmp2 = tmp; Parent::protectedVar = tmp; Info << "tmp2 = " << tmp2 << nl << endl; Info << "Parent::protectedVar = " << Parent::protectedVar << nl << endl; } }; class Child : public Parent { public: void accessParentFunction() { Parent::modifyVariable(); Info << "Child::protectedVar = " << Parent::protectedVar << nl << endl; } }; int main(int argc, char *argv[]) { #include "setRootCase.H" Child child; child.accessParentFunction(); Info<< "End\n" << endl; return 0; }
- 看到
velocityMotionsolver.H
函数中有个返回引用函数:pointVectorField& pointMotionu()
,试试能不能创建一个引用,然后修改引用的值,看看结果会不会变化。
pointVectorField& pointMotionURef = pointMotionU(); pointMotionURef = tempPointMotionU; Info << "pointMotionURef = " << pointMotionURef << endl; Info << "pointMotionU = " << pointMotionU_ << endl;