【OpenFOAM】-olaFlow-算例6- waveFloatingObject

news2025/1/18 6:43:34

算例路径: olaFlow\tutorials\waveFloatingObject
算例描述: 波浪作用下的浮体的刚体运动,属于流固耦合(FSI)问题
学习目标: 动网格设置和使用,网格变形控制,浮体的物理参数设置,浮体做刚体运动的约束设置
算例快照:
在这里插入图片描述

图1 波浪与浮体的相互作用

在这里插入图片描述

图2 波浪与浮体的相互作用过程中的网格变形

文件结构:

.
├── 0.org
│   ├── U
│   ├── alpha.water
│   ├── epsilon
│   ├── k
│   ├── nut
│   ├── p_rgh
│   └── pointDisplacement
├── cleanCase
├── constant
│   ├── dynamicMeshDict
│   ├── dynamicMeshDict.sixDoF
│   ├── dynamicMeshDict.solid
│   ├── g
│   ├── transportProperties
│   ├── turbulenceProperties
│   └── waveDict
├── runCase
└── system
    ├── blockMeshDict
    ├── controlDict
    ├── decomposeParDict
    ├── fvSchemes
    ├── fvSolution
    ├── setFieldsDict
    └── topoSetDict

算例文件解析:

【runCase】

#!/bin/bash
mkdir 0

echo blockMesh meshing...
blockMesh > blockMesh.log

echo Creating floating object...
topoSet > topoSet.log    
subsetMesh -overwrite c0 -patch floatingObject > subsetMesh.log
# 用 toposet 工具选中Box c0
# 用 subsetMesh 工具扣除掉 c0 包含的单元,并将暴露出的内部面形成的 patch 重命名为 floatingObject

echo Preparing 0 folder...
rm -fr 0
cp -r 0.org 0

echo Setting the fields...
setFields > setFields.log

echo Running...
olaDyMFlow > olaDyMFlow.log

echo Simulation complete.

【0.org\U】

dimensions      [0 1 -1 0 0 0 0];
internalField   uniform (0 0 0);
boundaryField
{
    inlet
    {
        type            waveVelocity;
        waveDictName    waveDict;
        value           uniform (0 0 0);
    }
    outlet
    {
        type            waveAbsorption2DVelocity;
        absorptionDir   666.0;
        value           uniform (0 0 0);
    }
    stationaryWalls
    {
        type            noSlip;
    }
    atmosphere
    {
        type            pressureInletOutletVelocity;
        value           uniform (0 0 0);
    }
    floatingObject
    {
        type            movingWallVelocity;   //运动边界的速度设置 movingWallVelocity
        value           uniform (0 0 0);
    }
}

【0.org\pointDisplacement】

// 位移初、边值条件
dimensions      [0 1 0 0 0 0 0];
internalField   uniform (0 0 0);
boundaryField
{
    inlet
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
...   
    floatingObject
    {
        type            calculated;  // calculated
        value           uniform (0 0 0);
    }
}

【0.org\k】
【0.org\nut】
【0.org\epsilon】
对浮体结构表面使用了壁面函数边界。

【0.org\p_rgh】
【0.org\alpha.water】
参考 【OpenFOAM】-olaFlow-算例1- baseWaveFlume

【constant\dynamicMeshDict】
动网格相关参数定义参考 Parameter Definitions - dynamicMotionSolverFvMesh

dynamicFvMesh       dynamicMotionSolverFvMesh;
motionSolverLibs    ("libsixDoFRigidBodyMotion.so"); // 引入运动求解器的库
motionSolver        sixDoFRigidBodyMotion;  // 指定运动求解器,六自由度刚体运动

sixDoFRigidBodyMotionCoeffs  // 指定六自由度刚体运动系数
{
    // 指定浮体的 patch 名称,主要有以下几层含义:
    // (1) 围绕该 patch 网格发生变形;
    // (2) 6Dof 体的速度作为流体求解的边界条件;
    // (3) 沿该 patch 表面积分来计算流体作用力。
    patches         (floatingObject);  // 浮体 patch 名称,而非边界条件
    
    // innerDistance 和 outerDistance 用于设置浮体运动时的网格变形。 
    // innerDistance 距离内的网格节点全部做刚体运动;
    // 介于 innerDistance 和 outerDistance 之间的网格会发生变形;
    // outerDistance 之外的网格不会发生变形。效果如图2所示。
    // outerDistance 必须大于 innerDistance。
    innerDistance   0.05;    
    outerDistance   0.35;

    centreOfMass    (0.5 0.45 0.35);  // 全局坐标系下的质心坐标,为初始位置
    
    // Cuboid dimensions
    Lx              0.3;
    Ly              0.2;
    Lz              0.5;

    // Density of the solid
    rhoSolid        500;  // 浮体的密度

    // Cuboid mass
    mass            #calc "$rhoSolid*$Lx*$Ly*$Lz";  // 计算质量

    // Cuboid moment of inertia about the centre of mass
    momentOfInertia #codeStream   // 计算惯性矩
    {
        codeInclude
        #{
            #include "diagTensor.H"
        #};

        code
        #{
            scalar sqrLx = sqr($Lx);
            scalar sqrLy = sqr($Ly);
            scalar sqrLz = sqr($Lz);
            os  <<
                $mass
               *diagTensor(sqrLy + sqrLz, sqrLx + sqrLz, sqrLx + sqrLy)/12.0;
        #};
    };
    
    report          on; // 输出开关,将 6DoF 体的状态写入时间文件。在非 0 时间文件夹下的 uniform 文件夹中提供了 6DoF 体的运动状态。
    
   // 以下这两个参数用于确保 6Dof 求解器的稳定性。在高加速度的情况下,6Dof 求解器会变得不稳定。在边界上,高加速度会反馈给流体高的速度,反过来会产生大的流体作用力,导致迅速的减速,这种情形会使 6Dof 求解器发散。因此OpenFOAM 采用以下两个参数来壁面上述情形发生。
   // accelerationDamping 主要用于消除突然加速产生的发散,该参数降低了浮体上的计算加速度,但它与加速度的值成比例,类似于阻尼系数,因此,突然的加速会形成较大的松弛。正常的加速度是典型的时间历程的结果,形成的加速相对较小。此参数在 0 至 1.0 之间取值,推荐值为 0.9 至 1.0。
   // accelerationRelaxation 会直接降低加速度,计算过程中实际采用的加速度会在计算值的基础上直接乘该松弛系数,适用于新衍生出的边界条件和物体速度,须小心使用,太小的值会使物体不能正确响应流体作用力,若计算的流体作用力与产生的运动之间的差异太大会引起发散。此参数在 0 至 1.0 之间取值,推荐值为 0.9 至 1.0。
    accelerationRelaxation 0.7;
    //accelerationDamping 0;

    solver  // 指定 6Dof 运动的求解算法
    {
        type Newmark;  // options:  Newmark(二阶隐式算法), CrankNicolson(二阶隐式算法,默认参数时,与Newmark法相同), symplectic(二阶显示算法)
    }
    
   // constrains 直接控制浮体许可的运动,与 restraints 不同, 后者施加的是反作用力。constrains 不产生任何力,直接限制物体运动。物体运动类型关键字包括:
   // (1) axis:仅约束转动,不约束平动。仅允许绕所定义的轴转动,将物体运动限制为一个绕该轴的转动自由度加三个平动自由度
   // (2) line:与 axis 类似,不过约束的是平动,转动不受限制。仅允许沿所定义的向量方向的平动,将物体运动限制为一个沿定义方向的平动自由度加三个转动自由度
   // (3) plane:允许 2D 平动,限制了刚体在第3维上的运动。运动方向由平面方向(法向量)定义,矢量的原点取在刚体重心的初始位置,允许刚体在定义平面内任意平动。
   // (4) point:限制了刚体平动,允许刚体绕所定义的旋转中心的任意方向的转动。不要求旋转中心位于刚体重心处,可用于定义球形连接( spherical joint),使刚体绕节点转动。
   // (5) orientation:限制了刚体转动,平动不受约束。若未定义旋转中心,则默认刚体质心。
   // 以上约束可以组合使用,如 “point + axis”的组合模拟了销钉连接(铰接)。
   
    constraints   // 浮体的运动约束条件
    {
        // fixedPoint
        // {
        //     sixDoFRigidBodyMotionConstraint point;
        //     centreOfRotation (0.5 0.45 0.1);
        // }

        fixedLine  // 自定义约束名称
        {
            sixDoFRigidBodyMotionConstraint line; 
            centreOfRotation (0.5 0.45 0.1);  // 旋转中心
            direction (0 1 0);  // 允许沿 y 轴平动
        }

        fixedAxis
        {
            sixDoFRigidBodyMotionConstraint axis;
            axis (0 1 0);  // 允许绕 y 轴转动和平动
        }
    }
}

【constant\dynamicMeshDict.sixDoF】

dynamicFvMesh       dynamicMotionSolverFvMesh;
motionSolverLibs    ("libsixDoFRigidBodyMotion.so");
motionSolver        sixDoFRigidBodyMotion;

sixDoFRigidBodyMotionCoeffs
{
    patches         (floatingObject);
    innerDistance   0.05;
    outerDistance   0.35;

    centreOfMass    (0.5 0.45 0.35);

    // Cuboid dimensions
    Lx              0.3;
    Ly              0.2;
    Lz              0.5;

    // Density of the solid
    rhoSolid        500;

    // Cuboid mass
    mass            #calc "$rhoSolid*$Lx*$Ly*$Lz";

    // Cuboid moment of inertia about the centre of mass
    momentOfInertia #codeStream
    {
        codeInclude
        #{
            #include "diagTensor.H"
        #};

        code
        #{
            scalar sqrLx = sqr($Lx);
            scalar sqrLy = sqr($Ly);
            scalar sqrLz = sqr($Lz);
            os  <<
                $mass
               *diagTensor(sqrLy + sqrLz, sqrLx + sqrLz, sqrLx + sqrLy)/12.0;
        #};
    };

    report          on;
    accelerationRelaxation 0.7;
    //accelerationDamping 0;

    solver
    {
        type Newmark;
    }

    constraints
    {
        // fixedPoint
        // {
        //     sixDoFRigidBodyMotionConstraint point;
        //     centreOfRotation (0.5 0.45 0.1);
        // }

        fixedLine
        {
            sixDoFRigidBodyMotionConstraint line;
            centreOfRotation (0.5 0.45 0.1);
            direction (0 1 0);
        }

        fixedAxis
        {
            sixDoFRigidBodyMotionConstraint axis;
            axis (0 1 0);
        }
    }
}

【constant\dynamicMeshDict.solid】

dynamicFvMesh       dynamicMotionSolverFvMesh;
motionSolverLibs   ("librigidBodyMeshMotion.so");
motionSolver       rigidBodyMotion;

rigidBodyMotionCoeffs
{
    report          on;

    solver
    {
        type Newmark;
    }

    accelerationRelaxation 0.7;

    bodies
    {
        floatingObject
        {
            type            cuboid;
            parent          root;

            // Cuboid dimensions
            Lx              0.3;
            Ly              0.2;
            Lz              0.5;

            // Density of the cuboid
            rho             500;

            // Cuboid mass
            mass            #calc "$rho*$Lx*$Ly*$Lz";
            L               ($Lx $Ly $Lz);
            centreOfMass    (0 0 0.25);
            transform       (1 0 0 0 1 0 0 0 1) (0.5 0.45 0.1);

            joint
            {
                type            composite;
                joints
                (
                    {
                        type Py;
                    }
                    {
                        type Ry;
                    }
                );
            }

            patches         (floatingObject);
            innerDistance   0.05;
            outerDistance   0.35;
        }
    }
}

【constant\turbulenceProperties】

simulationType  laminar; // RAS;
RAS
{
    RASModel        kEpsilon;
    turbulence      on;
    printCoeffs     on;
}

【constant\waveDict】

waveType        regular;
waveTheory      StokesIII;
genAbs          1;
absDir          0.0;
nPaddles        1;
wavePeriod      1.0;
waveHeight      0.1;
waveDir         0.0;
wavePhase       1.57079633;
tSmooth         0.0;

【constant\g】
【constant\transportProperties】
以上均与一般水槽设置相同,参考 【OpenFOAM】-olaFlow-算例1- baseWaveFlume

【system\blockMeshDict】
【system\controlDict】
【system\decomposeParDict】
【system\setFieldsDict】
参考 【OpenFOAM】-olaFlow-算例1- baseWaveFlume

【system\topoSetDict】

actions
(
    {
        name    c0;
        type    cellSet;
        action  new;
        source  boxToCell; // 选中如下box框选中的cell,并将单元集命名为c0
        sourceInfo
        {
            box (0.35 0.35 0.1) (0.65 0.55 0.6);
        }
    }

    {
        name    c0;
        type    cellSet;
        action  invert;  // 反向选择,即求补集
    }
);

【system\fvSchemes】

ddtSchemes
{
    default         CrankNicolson 0.5;
}
gradSchemes
{
    default         Gauss linear;
}
divSchemes
{
    div(rhoPhi,U)  Gauss vanLeerV;
    div((rhoPhi|interpolate(porosity)),U)  Gauss vanLeerV;
    div(phi,alpha)  Gauss vanLeer;
    div(phirb,alpha) Gauss linear;
    div(phi,k)      Gauss upwind;
    div(phi,epsilon) Gauss upwind;
    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
    default         Gauss linear corrected;
}
interpolationSchemes
{
    default         linear;
}
snGradSchemes
{
    default         corrected;
}

【system\fvSolution】

solvers
{
    "alpha.water.*"
    {
        nAlphaCorr      2;
        nAlphaSubCycles 1;
        cAlpha          1;

        MULESCorr       yes;
        nLimiterIter    5;
        alphaApplyPrevCorr  yes;

        solver          smoothSolver;
        smoother        symGaussSeidel;
        tolerance       1e-8;
        relTol          0;
    }

    "pcorr.*"
    {
        solver          PCG;
        preconditioner
        {
            preconditioner  GAMG;
            tolerance       1e-5;
            relTol          0;
            smoother        DICGaussSeidel;
            cacheAgglomeration no;
        }

        tolerance       1e-05;
        relTol          0;
        maxIter         100;
    }

    p_rgh
    {
        solver          GAMG;
        tolerance       1e-8;
        relTol          0.01;
        smoother        DIC;
    }

    p_rghFinal
    {
        solver          PCG;
        preconditioner
        {
            preconditioner  GAMG;
            tolerance       1e-8;
            relTol          0;
            nVcycles        2;
            smoother        DICGaussSeidel;
            nPreSweeps      2;
        }

        tolerance       1e-8;
        relTol          0;
        maxIter         20;
    }

    "(U|k|epsilon)"
    {
        solver          smoothSolver;
        smoother        GaussSeidel;
        tolerance       1e-6;
        relTol          0.1;
        nSweeps         1;
    }

    "(U|k|epsilon)Final"
    {
        solver          smoothSolver;
        smoother        GaussSeidel;
        tolerance       1e-6;
        relTol          0;
        nSweeps         1;
    }
}

PIMPLE
{
    momentumPredictor   no;
    nOuterCorrectors    3;
    nCorrectors         1;
    nNonOrthogonalCorrectors 0;
    correctPhi          yes;
    moveMeshOuterCorrectors yes;
}

relaxationFactors
{
    equations
    {
        ".*" 1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

23种设计模式(二)——享元模式【对象性能】

文章目录意图什么时候使用享元享元模式的实现内部状态和外部状态享元模式的优缺点与其他模式的关系亦称&#xff1a; 缓存、Cache、Flyweight 意图 享元模式是一种结构型设计模式&#xff0c; 它摒弃了在每个对象中保存所有数据的方式&#xff0c; 通过共享多个对象所共有的相…

数图互通房产管理系统架构分析

数图互通高校房产管理系统V5.0 使用JAVA、Canvas、H5等技术开发的图形数据交互技术架构平台&#xff1b;本系统满足XX大学房屋管理系统需求&#xff0c;高校房产综合管理信息系统平台V5.0遵循高校房产“分级授权、分类管理、网络化、图形化、精细化、流程化”的管理理念&#x…

关于新冠的几点总结

关于新冠的几点总结一、前言:二、病程阶段1. 第一阶段 反复发热2. 第二极端 退烧虚弱3. 第三阶段 咳嗽嗜睡三、处置措施:1. 思想准备2. 药/物准备3. 退烧方式4. 保持体温5. 通则不痛&#xff0c;痛则不通6. 营养补充7. 恢复关键期写在最后一、前言: 所写内容&#xff0c;为个人…

磊科路由器后门蜜罐捕获的事件分布情况

重点物联网 漏洞利用情况本节我们选取了两个漏洞进行分析。UPnP 相关的漏洞我们将在 4.4.3 进行分析&#xff0c;除去 UPnP 相关漏 洞外&#xff0c;被利用最多的是 Eir D1000 路由器的一个漏洞 [44]&#xff08;CVE-2016-10372&#xff09;&#xff0c;我们将对其进行分析。 …

Apollo浅解2

目录 用户、角色、权限 三者间的关系 权限Permission 新增一个应用时 新增一个命名空间时 角色Role 新增一个应用时 新增一个命名空间时 第三方应用 用户、角色、权限 三者间的关系 apollo也采用经典的三层权限设计&#xff0c;用户关联角色&#xff0c;角色关联权限…

DOM基础

一、DOM的概念 文档对象模型(DOM,Document Object Module)是W3C组织推荐的处理可扩展标志语言的标准编程接口&#xff0c;它允许程序和脚本动态的访问和更新文档的内容、结构和样式。 HTML的DOM操作是将文档里所有的内容(包括标签、标签里的内容、标签属性甚至注释等)都当做一…

51单片机入门 第一篇:LED灯

文章目录前言一、LED原理图二、创建keil5工程三、代码的编写四、程序的烧录总结前言 本篇文章讲正式带大家开始学习51单片机&#xff0c;希望这些文章能够很好的帮助到大家学习51单片机。 一、LED原理图 一般的51单片机上都带有8个LED灯&#xff0c;这里8个LED灯分别接到了板…

JS逆向——工信部ICP、IP、域名信息备案管理平台

问题&#xff1a;&#xff08;1&#xff09;数据列表接口token参数验证&#xff08;2&#xff09;authKey参数加密生成 1、页面中请求接口&#xff0c;观察请求头可发现&#xff0c;校验参数token为加密的字符串&#xff0c;根据该字符串并不能直观得到所用的加密方式是什么。 …

数据库大小写不敏感后,值也不敏感了

现象&#xff1a;我有一个账号admin&#xff0c;结果莫名多了一个ADMIN、Admin、AdMin等一些列账号&#xff1b;细品你的密码就算密文签名&#xff0c;是不是在你不知情的情况下也有很多。 原因&#xff1a;数据库安装的时候设置的大小写不敏感导致 解决&#xff1a;建议第三…

Spark 的学习笔记

Spark 的学习笔记 文章目录Spark 的学习笔记1. 概述Spark 优势及特点优秀的数据模型和丰富计算抽象Spark 生态圈Spark 特点Spark 与 HadoopSpark与MRSpark Streaming与StormSpark SQL与HiveSpark 运行模式2. 快速入门使用 Spark Shell 进行交互式分析基础Dataset 上的更多操作缓…

【机器学习】LDA算法原理

问题 线性判别分析&#xff08;Linear Discriminant Analysis&#xff0c;LDA&#xff09;是机器学习中常用的降维方法之一&#xff0c;本文旨在介绍LDA算法的思想&#xff0c;其数学推导过程可能会稍作简化。 LDA的思想 ● LDA是一种线性的、有监督的降维方法&#xff0c;即…

销售流程标准化重要吗?

各行各业都存在销售&#xff0c;但并不是每个销售都可以成为优秀的销售&#xff0c;优秀的销售往往有一套完整的销售流程&#xff0c;为了保证销售新人销售工作的顺利进行&#xff0c;销售流程标准化很有必要。 前言 各行各业都存在销售&#xff0c;但并不是每个销售都可以成为…

前端面试题之计算机网络篇--WebSocket基本使用

WebSocket 普通的包的请求和响应过程 1. 对 WebSocket 的理解 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。它基于TCP传输协议&#xff0c;并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手&#xff0c;两者之间…

HDLBits练习汇总-13-时序逻辑设计测试--状态机(一)

简单摩尔状态机1&#xff08;Fsm1&#xff09; 是一个摩尔状态机&#xff0c;具有两种状态&#xff0c;一种输入&#xff0c;一种输出。实现此状态机。请注意&#xff0c;重置状态为 B。使用异步复位。 模块声明 module top_module(input clk,input areset, // Asynchrono…

基础数学复习(3)——曲线拟合

文章目录基础概念曲线拟合的流程极小化损失函数线性最小二乘超定方程组的最小二乘解&#xff08;必考&#xff09;例题&#xff08;必考&#xff09;使用法方程计算拟合方程使用最小二乘法求解总结基础概念 曲线拟合的流程 选取函数类选取参数的准则&#xff1a;极小化损失函…

实习-------数据库基础

检索数据 1、如果使用DISTINCT关键字&#xff0c;它必须直接放在列名的前面。不能部分使用DISTINCT&#xff0c;DISTINCT关键字应用于所有列而不仅是前置它的列 例如&#xff1a;SELECT DISTINCT vend_id告诉MySQL只返回不同&#xff08;唯一&#xff09;的vend_id行 2、带一…

(六)devops持续集成开发——jenkins的全局工具配置之node环境安装及配置

前言 本节内容主要是关于jenkins集成node组件&#xff0c;从而实现前端node项目的流水线CICD发布功能。我们需要先安装好前端组件node,并在jenkins中配置好node组件&#xff0c;这样就可以流水线发布一个前端工程了。 正文 安装node组件①上传node安装包 ②解压node安装包 t…

用纯python脚本玩转UU加速器

1. 前言 之前几期内容&#xff0c;我们出过纯py形式的Android自动化脚本。同学们一直让再出一下纯py形式的Windows脚本&#xff0c;今天我们以UU加速器为例&#xff0c;给大家出一个简单的学习demo。 2. UU加速器的自动化demo 今天的练习demo也非常简单&#xff0c;大致内容…

张勇用最严厉的内部信,敲打阿里云,也在提振阿里士气

“「客户第一」的价值观&#xff0c;从来都不是高高挂在公司墙上的标语&#xff0c;而是支撑我们每一天获得成长的基石”。这应该是阿里巴巴董事局主席兼CEO张勇&#xff0c;自2015年来最严厉的一封内部信。信件里&#xff0c;张勇一改往日温情形象&#xff0c;措辞严厉的批评了…

pybind11 | 绑定CGAL几何算法(numpy数据交换)

文章目录一 前言二 numpy数据交换2.1 pybind11对numpy的支持2.2 Numpy VF(py::array_t)与CGAL mesh(Surface Mesh)之间的转换三 绑定CGAL算法示例3.1 示例函数3.2 绑定部分代码3.3 示例完整代码四 编译生成和测试4.1 编译生成pyd文件4.2 Python调用测试五 总结参考和拓展一 前言…