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. 请教:关于动网格中使用interfaceHeight工具监测波高的问题

请教:关于动网格中使用interfaceHeight工具监测波高的问题

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

    前辈老师们好!最近在做液舱晃荡相关模拟,想使用OpenFOAM自带的interfaceHeight工具进行波高的监测,但该工具定义的监测点无法跟随动网格的运动而运动。

    举例说明:假如需要监测液舱舱壁处某位置的波高,由于舱壁是运动的,因此监测点需要跟随舱壁一起运动,因此目前的想法是修改interfaceHeight工具的代码,使得监测点能够以跟动网格同样的规律运动起来。

    interfaceHeight.H定义的监测点坐标为:

    //- List of locations to report the height at
    List<point> locations_;
    

    以线性简谐运动网格oscillatingLinearMotion为例,其控制运动的部分代码如下:

    Foam::solidBodyMotionFunctions::oscillatingLinearMotion::transformation() const
    {
        scalar t = time_.value();
        const vector displacement = amplitude_*sin(omega_*t);
        ……
    }
    

    设定振幅与频率,使得液舱以如下规律做横向振荡运动:
    \begin{equation}
    \lambda=0.001sin(5.0498t)
    \end{equation}
    要使监测点以同样的规律运动起来,在振幅与频率已知的情况下,则需要获取时间t,因此仿造动网格文件获取时间的方式,在interfaceHeight.C中修改监测点坐标代码如下,拟监测随体坐标上(0.5,0,0.5)处的波高:

    void Foam::functionObjects::interfaceHeight::writePositions()
    {
        scalar time = time_.value();
        locations_[0][0] = 0.5 + 0.001*sin(5.0498*time); locations_[0][1] = 0; locations_[0][2] = 0.5;
        ……
    }
    

    其余部分均未改变,但在编译时报错:

    movingInterfaceHeight.C:(.text+0x1f30): multiple definition of `non-virtual thunk to Foam::functionObjects::interfaceHeight::write()'; /home/user/OpenFOAM/OpenFOAM-8/platforms/linux64GccDPInt32Opt/src/functionObjects/field/interfaceHeight/interfaceHeight.o:interfaceHeight.C:(.text+0x1f00): first defined here
    collect2: error: ld returned 1 exit status
    make: *** [/home/user/OpenFOAM/OpenFOAM-8/wmake/makefiles/general:169:/home/user/OpenFOAM/OpenFOAM-8/platforms/linux64GccDPInt32Opt/lib/libfieldFunctionObjects.so] 错误 1
    

    想请教前辈老师们,这种错误该如何解决呢?这么修改使得监测点动起来的方式正确吗?感谢前辈老师们的解答!

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #2

    openfoam-8里面怎么跟你的区别这么大,我的interfaceHeight是这样的:

    // Write out
            if (Pstream::master())
            {
                // Interface heights above the boundary and location
                const scalar hIB =
                    liquid_ ? sumLengthAlpha : sumLength - sumLengthAlpha;
                const scalar hIL = hIB - hLB;
    
                // Position of the interface
                const point p = locations_[li] - gHat*hIL;
    
                const Foam::Omanip<int> w = valueWidth(1);
    
                file(fileID::heightFile) << w << hIB << w << hIL;
                file(fileID::positionFile) << '(' << w << p.x() << w << p.y()
                    << valueWidth() << p.z() << ") ";
            }
    
    

    按照你的思路,你把你的代码加到const point p = locations_[li] - gHat*hIL;这个的定义里面不可以么?:

    scalar time = time_.value();
    const point p = 0.5 + 0.001*sin(5.0498*time) - gHat*hIL; 
    

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    华鸟华 1 条回复 最后回复
  • 华鸟华 离线
    华鸟华 离线
    华鸟
    在 中回复了 李东岳 最后由 编辑
    #3

    @李东岳 感谢李老师的解答!老师,我用的也是openfoam8,截取代码的时候没全截取给您带来误解了,抱歉。我是将代码添加在了writePositions()函数的最前面,如下:

    void Foam::functionObjects::movingInterfaceHeight::writePositions()
    {
        scalar time = time_.value();
        locations_[0][0] = 0.5 + 0.001*sin(5.3*time); locations_[0][1] = 0; locations_[0][2] = 0.5;
    
        const uniformDimensionedVectorField& g = 
            mesh_.lookupObject<uniformDimensionedVectorField>("g");
        const vector gHat = g.value()/mag(g.value());
    
        const volScalarField& alpha =
            mesh_.lookupObject<volScalarField>(alphaName_);
    
        autoPtr<interpolation<scalar>>
            interpolator
            (
                interpolation<scalar>::New(interpolationScheme_, alpha)
            );
    

    writePositions()函数下,最前面的两行即为添加的代码,后来我将整个interfaceHeight工具的代码复制了重新构建了一个“movingInterfaceHeight”工具,重新编译后问题解决了。

    按照老师您说的,将其添加在const point p = locations_[li] - gHat*hIL的定义中存在一定的问题:

     // Position of the interface
    const point p = locations_[li] - gHat*hIL;
    

    其中的locations_[li]为三维坐标点,point p = locations_[li] - gHat*hIL对xyz坐标均进行了计算,按照我的简谐运动规律$\lambda=0.001sin(5.0498t)$,仅x坐标发生改变,y与z应在坐标不变的情况下完成```point p``的计算,是否可以修改成以下代码:

    // Position of the interface
    const point p = locations_[li];  //首先定义一个point p
    scalar time = time_.value();
    //分别对p的xyz坐标进行计算
    p.x() = 0.5 + 0.001*sin(5.0498*time) - gHat*hIL;
    p.y() = 0 - gHat*hIL;
    p.z() = 0.5 - gHat*hIL;
    

    感谢李老师指导!

    1 条回复 最后回复

  • 登录

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