Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 新手小白求教,有没有能够通过读取向量文件数据获取动边界速度的功能

新手小白求教,有没有能够通过读取向量文件数据获取动边界速度的功能

已定时 已固定 已锁定 已移动 OpenFOAM
26 帖子 3 发布者 9.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Y 离线
    Y 离线
    yzxwh
    写于 最后由 编辑
    #1

    各位大佬,我想做一个管道运动的模拟,但是管道的速度是随机变化的,速度存储在一个文件中,想每个时步通过读这个文件得到管道的三向运动速度,有没有办法能够直接实现,求教。

    1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    写于 最后由 编辑
    #2

    使用timeVaryingMappedFixedValue边界,把速度文件写成这个边界所需要的文件格式。参考帖子 LES定义入口速度的问题(DSRFG方法)

    Y 2 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #3

    @coolhhh 谢谢大佬,我去试试看

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #4

    @coolhhh 大佬,我先用timeVaryingUniformFixedValue测试了下,因为是与别的软件耦合的缘故,动网格的速度是从另一个软件实时传到所要读取的文件中的,结果发现这个timeVaryingUniformFixedValue边界条件只在初始时刻读取文件,后续运行过程中就不重新读取了,timeVaryingMappedFixedValue边界应该也是一样只在初始时刻读取吧。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #5

    @yzxwh timeVaryingMappedFixedValue确实是在初始时刻会把数据文件夹的数据列表一次性读完,后面计算过程中增加的数据不会识别到。如果是实时读取的话,就要对timeVaryingMappedFixedValue边界改写一下,实现自己要的功能

    Y 1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #6

    @coolhhh 谢谢大佬的答复,我去研究研究timeVaryingMappedFixedValue的源码。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #7

    @yzxwh 想到一个比较笨的方法,尝试初始时刻先生成各个时间命名的空文件夹,然后每步计算把数据再存入空文件夹中,可能能读取到,就不用改代码了

    Y 2 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #8

    @coolhhh 大佬,你指的是每一个时间文件替换掉相应动边界的数据吗,这个我用python实现了,但是我在调试中发现中途改变动边界数据并不会使下一个时步读取这个替换的数据进行计算,除非是终止计算,改controldict的starttime才能重新读取替换后的速度。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #9

    @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;
        }
    
    Y 1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #10

    @coolhhh 谢谢大佬指点,我明早试试看。

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #11

    @coolhhh 大佬,我把main函数主体放进了python中,利用python可以控制pimplefoam来进行求解,并且可以将每个时步文件的动边界速度pointmotionU进行强制的实时修改,这个时候如果我想让pimplefoam能够时刻读取新的pointmotionU是否就是将pointmotionU的读取和写入功能放在runtime里面?像下面的截图里面一样?52b9dcd0-6936-48c7-a533-9b7105465a1b-image.png

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #12

    @yzxwh

    1. 我没用过pointVectorField定义场,这是定义边界场吗,测试是否可以运行?
      我看这个帖子的#9楼,是通过获取边界的patchIndex调用的边界场。
    2. 类似pisoFoam这些求解器,定义场只要一开始定义一次即可,把定义场写到循环前面。每个时刻就会自动读取时间文件夹中的数据
    3. pointmotionU是自己直接生成文件的吗,那就不需要AUTO_WRITE,可以设置为NO_WRITE。是否用的并行计算,自己强制改pointmotionU,在不同processor文件夹中修改数据是否挺麻烦的?
    Y 1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #13

    @coolhhh 回答下大佬的问题:1.pointVectorField是定义的边界场;
    2.像piso这些求解器,定义场一开始定义一次后,人为调整最新时刻的边界条件,后续的计算不会读取新的边界条件,一直是初始定义的边界条件;
    3..在dynamicmeshdict文件里面设置motionSolver velocityLaplacian这个运动求解器就需要初始化pointmotionU,后续计算中会直接生成pointmotionU;应该不是并行计算,这块我比较生疏,没有专门去设置过。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #14

    @yzxwh 这块我没接触过,说下自己的理解:

    1. 如果不人为调整,后面自动生成的pointmotionU,不同时刻的结果是不一样,还是一直等同于初始0文件中设定的值?
    2. 大致看了下程序,velocityLaplacianFvMotionSolver是继承velocityMotionSolver,pointMotionU_在velocityMotionSolver.C中已经定义,在主函数中就不需要重复定义了。即使主函数定义了,读取的数值也没传递到定义的类中,也没起到作用。

    98b03eb4-0dc7-4700-9aaf-2d0e8030be18-image.png

    1. velocityLaplacianFvMotionSolver.C里边有个updateCoeffs(),正常是通过这里更新数值。如果自动生成的pointmotionU一直都是一样的,考虑在updateCoeffs()前强制增加读取文件试试
    pointmotionU_.read();
    

    4b2ae291-e901-4dd3-be3a-f58ab444b208-image.png

    1. 后面计算网格量大的话,单进程估计计算太慢。不过可以先把单进程调试通,再考虑如何改并行程序。
    Y 1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #15

    @coolhhh 万分感谢大佬的指点,回答一下第一点:后面生成的pointmotionU的确是不一样的,我可能表达有误,由于圆管的运动是通过别的软件生成决定的,所以圆管的运动数据是实时传输到of里面的。of里面的动边界相当于我另一个软件的圆管,但他的运动完全由那边所决定,我的想法是在运行过程中修改最新时步的pointmotionU文件最下面几行的边界条件代码,举个例子2126c159-9a22-41da-965e-7df8510e0cb9-image.png 如第一张图所示这是当前最新时刻的边界速度,我通过python强行修改了这个边界速度如下图f45679d5-af92-493a-a261-8bcd9a99fba4-image.png
    我是想让下一步能够以修改的边界条件进行运算,以此类推,往后每一步都会修改边界速度,然后下一步以新的边界速度运算,不过我的尝试没有成功,pointmotionU边界的读取似乎只与初始时刻相关。
    关于大佬说的剩下三点我再好好理解理解,再次感谢大佬的悉心指点。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #16

    @yzxwh 确实可能MUST_READ只是在初始启动时候会读取文件而已,大概率需要手动增加pointmotionU_.read();到程序中,实现每个时间步调用时候先读取数据

    Y 2 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #17

    @coolhhh 好的大佬

    1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #18

    @coolhhh 大佬,我这边在velocityLaplacianFvMotionSolver.C添加了读取文件的代码pointmotionU_.read();文件的确是每个时步都被读取了,但是读取的边界条件一直是修改之前的。我还采用赋值的方法强行给pointmotionU_赋值,代码如下
    e1981527-2995-4ee2-8ffb-22291d908547-image.png
    强制读取当前时刻修改后的pointmotionu的数据存到temppointmotionu中然后再赋给pointmotionu,两个结果都在运算中打印出来了,结果发现,temppointmotionu是成功读取修改后数据的,但是赋值后的pointmotionu依旧是修改前的数据。是否是该类型无法被直接赋值,望指点。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 yzxwh 最后由 编辑
    #19

    @yzxwh 最后输出语句如果直接写pointMotionU_ ,输出结果会等于tempPointMotionU吗?不能直接等于应该会报错的,可以再新建一个tempPointMotionU2,直接幅值tempPointMotionU2 = tempPointMotionU;看看输出结果

    Info << "Reading pointMotionU_ from tempPointMotionU from file: " << pointMotionU_ << endl;
    
    Y 1 条回复 最后回复
  • Y 离线
    Y 离线
    yzxwh
    在 中回复了 coolhhh 最后由 编辑
    #20

    @coolhhh 大佬,我已经尝试过了 直接幅值tempPointMotionU2 = tempPointMotionU;是可以的,但是pointMotionU_ 还是没办法被赋值到,同时也不存在报错的问题。这是由于pointMotionU_ 是存在于velocityMotionsolver中的protected类型所导致的吗? 1ed5ade4-6108-4e56-b4dc-3d0fb381956e-image.png
    下面是velocityMotionsolver的C文件构造函数中初始化列表进行初始化的。
    3ca15143-16b1-4a10-a71d-e093e4a44099-image.png
    新手小白不太明白,望指点。

    C 1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]