【OpenFOAM】-olaFlow-算例10-wavemakerTank

news2025/7/19 3:47:46

算例路径: olaFlow\tutorials\wavemakerTank
算例描述: 采用 Flap和Piston两种方式的动网格进行造波
学习目标: 了解 olaDyMFlow 的使用;理解动网格使用和参数设置,理解 dynamicMotionSolverFvMesh 参数设置;理解造波边界运动方式生成
学习体会:
    (1) dynamicMotionSolverFvMesh 根据边界上的压强计算网格运动,反之它也为流体计算提供了反馈。它通过改变该边界上的速度边界条来件指定被定义物体的局部速度。
    (2) 与算例9动边界(网格)消波类似,理解肤浅,逐步理解动网格 !!!

算例快照:
在这里插入图片描述

图1 动网格推板造波水池

在这里插入图片描述

图2 动网格摇板造波水池

文件结构:

.
├── 0.org
│   ├── U
│   ├── alpha.water
│   ├── alpha.water.org
│   ├── p_rgh
│   └── pointDisplacement
├── cleanCase
├── constant
│   ├── dynamicMeshDict
│   ├── flapWaveGen.py
│   ├── g
│   ├── pistonWaveGen.py
│   ├── transportProperties
│   ├── turbulenceProperties
│   └── wavemakerMovementDict
├── runParallelCaseFlap
├── runParallelCasePiston
└── system
    ├── blockMeshDict
    ├── controlDict
    ├── decomposeParDict
    ├── fvSchemes
    ├── fvSolution
    └── setFieldsDict

算例文件解析:
除以下解析的文件外,其他文件与 baseWaveFlume 一样。
参考 【OpenFOAM】-olaFlow-算例1- baseWaveFlume

【runParallelCasePiston】/【runParallelCaseFlap】

#!/bin/bash
mkdir 0
blockMesh > blockMesh.log

rm -fr 0
cp -r 0.org 0

setFields > setFields.log

cd constant
python pistonWaveGen.py  # 创建推板运动方式
# python flapWaveGen.py  # 创建摇板运动方式
cd ..

decomposePar > decomposePar.log
mpirun -np 4 olaDyMFlow -parallel > olaDyMFlow.log # 动网格造波

【0.org\U】

dimensions      [0 1 -1 0 0 0 0];
internalField   uniform (0 0 0);
boundaryField
{
    inlet
    {
        type            movingWallVelocity; // 运动壁面的速度边界条件
        value           uniform (0 0 0);
    }
    outlet
    {
        type            waveAbsorption2DVelocity;
        absorptionDir   180;
        nPaddles        10;
        value           uniform (0 0 0);
    }
    bottom
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
    "wall."
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
    atmosphere
    {
        type            pressureInletOutletVelocity;
        value           uniform (0 0 0);
    }
}

【0.org\pointDisplacement】

dimensions      [0 1 0 0 0 0 0];
internalField   uniform (0 0 0);
boundaryField
{
    inlet  // 与算例9中的动网格消波相似
    {
        type            wavemakerMovement;      // 造波机运动边界条件
        wavemakerDictName wavemakerMovementDict;;  // 造波机运动设置字典
        value           uniform (0 0 0);
    }
    outlet
    {
        type            fixedValue;
        value           uniform (0 0 0);
    }
    bottom
    {
        type            fixedNormalSlip;   //边界上的法向分量由用户指定;切向分量为滑移条件,即从内部场复制
        n               (0 0 1);  // 法向方向
        value           uniform (0 0 0);
    }
    "wall."
    {
        //type            zeroGradient;
        type            fixedNormalSlip;    //边界上的法向分量由用户指定;切向分量为滑移条件,即从内部场复制
        n               (0 1 0); 
        value           uniform (0 0 0);
    }
    atmosphere
    {
        type            zeroGradient;
        /*type            fixedNormalSlip;
        n               (0 0 1);
        value           uniform (0 0 0);*/
    }
}

【constant\dynamicMeshDict】
dynamicMotionSolverFvMesh参考 https://openfoamwiki.net/index.php/Parameter_Definitions_-_dynamicMotionSolverFvMesh#inverseDistance

dynamicFvMesh      dynamicMotionSolverFvMesh; 
// 应用于 FSI 领域。这种网格控制几乎专门用于涉及刚体运动的问题。
// 该求解器围绕指定的边界使网格变形,根据边界上的压强计算网格运动,反之它也为流体计算提供了反馈。它通过改变该边界上的速度边界条来件指定被定义物体的局部速度(包括平动和转动)。

motionSolverLibs   ("libfvMotionSolvers.so");

solver            displacementLaplacian; // 一种 fvMesh 的网格运动求解器,器原理是对运动位移进行单元中心的Laplacian 运算。(Based on solving the cell-centre Laplacian for the motion displacement.)
//参考 https://www.openfoam.com/documentation/guides/latest/api/classFoam_1_1displacementLaplacianFvMotionSolver.html

displacementLaplacianCoeffs
{
    diffusivity inversePointDistance (inlet);
    //eg. diffusivity    quadratic     inverseDistance      5.0     ( Body );
    //              [ Distance Type]  [diffusivity model][ Distance] [Patch]
    // diffusivity: 该参数控制网格运动的分布。假设一种基本情况,即一个动边界和另一组静态边界。网格运动求解器须要找到某种方式来将边界的运动扩散到域中。OpenFOAM 中有如下几种可用的方法。若不确定如何选择,可以省略改参数,程序会使用默认值。
    // (1) inverseDistance
    // (2) inverseFaceDistance
    // (3) inversePointDistance
    // (4) inverseVolume
    // (5) uniform

// inversePointDistance: 

}

【constant\wavemakerMovementDict】

#include "wavemakerMovement.txt"  // 读取文件wavemakerMovement.txt

【constant\wavemakerMovement.txt】 for Pistion

// 运行pistonWaveGen.py生成
wavemakerType   Piston;  // 造波版类型
tSmooth         1.5;
genAbs          0;

timeSeries 621(
0.0
0.05
0.1
... )

paddlePosition 10(
621(
-0.008087650377905872
0.003925783549844903
0.01589620577150058
... )
621( ... ) // 每个paddle的运动
... );

paddleEta 10(
621(
0.04987574680586761
0.04997075156666095
0.0495182663162379
... )
621( ... ) ... );

【constant\wavemakerMovement.txt】 for Flap

// 运行flapWaveGen.py生成
wavemakerType   Flap;  // 造波版类型
tSmooth         1.5;
genAbs          0;

timeSeries 621(
0.0
0.05
0.1
... )

paddleTilt 10(
621(
-2.2802830032546137
1.1073069810089098
4.4751216177835795
... )
621( ... ) // 每个paddle的倾斜程度
... );

【constant\pistonWaveGen.py】

#!/usr/bin/python
import numpy as np

def dispersion(T, h):  # 定义色散方程求解 
    L0 = 9.81*T**2/(2.*np.pi)
    L = L0
    for i in range(0,100):
        Lnew = L0 * np.tanh(2.*np.pi/L*h)
        if(abs(Lnew-L)<0.001):
            L = Lnew
            break
        L = Lnew
    return L

## Piston wavemaker data ##
H = 0.1
T = 3.0
h = 0.4
phase0 = 0.
direction = 15.  // 斜向波 15°

nPaddles = 10
bLims = [0., 5.]

t0 = 0.
tEnd = 31.
dt = 0.05
########################

# Calculations
L = dispersion(T, h)
k = 2.*np.pi/L
w = 2.*np.pi/T

times = np.linspace(t0, tEnd, round((tEnd-t0)/dt)+1)
coords = np.linspace(bLims[0], bLims[1], nPaddles+1)
coords = coords[:-1] + np.diff(coords)/2.

HoS = 4. * np.sinh(k*h)**2. / (np.sinh(2.*k*h) + 2.*k*h)
S = H/HoS

# Export
fid = open('wavemakerMovement.txt', 'w')

fid.write('wavemakerType   Piston;\n')
fid.write('tSmooth         1.5;\n')
fid.write('genAbs          0;\n\n')

fid.write('timeSeries {0}(\n'.format( len(times) ))
for t in times:
    fid.write('{0}\n'.format(t))
fid.write(');\n\n'.format( len(times) ))

fid.write('paddlePosition {0}(\n'.format( nPaddles ))
for i in range(0, nPaddles):
    fid.write('{0}(\n'.format( len(times) ))
    for t in times:
        x = S/2. * np.cos(-w*t + np.pi/2. + phase0 + 2.*np.pi*coords[i]/L*np.sin(direction*np.pi/180.) )
        fid.write('{0}\n'.format(x))       
    fid.write(')\n')
fid.write(');\n\n')

fid.write('paddleEta {0}(\n'.format( nPaddles ))
for i in range(0, nPaddles):
    fid.write('{0}(\n'.format( len(times) ))
    for t in times:
        x = H/2. * np.cos(-w*t + phase0 + 2.*np.pi*coords[i]/L*np.sin(direction*np.pi/180.) )
        fid.write('{0}\n'.format(x))       
    fid.write(')\n')
fid.write(');\n\n')

fid.close()

【constant\flapWaveGen.py】

#!/usr/bin/python

import numpy as np

def dispersion(T, h):    
    L0 = 9.81*T**2/(2.*np.pi)
    L = L0
    for i in range(0,100):
        Lnew = L0 * np.tanh(2.*np.pi/L*h)
        if(abs(Lnew-L)<0.001):
            L = Lnew
            break
        L = Lnew
    return L

## Flap wavemaker data ##
H = 0.1
T = 3.0
h = 0.4
phase0 = 0.
direction = 15.

nPaddles = 10
bLims = [0., 5.]

t0 = 0.
tEnd = 31.
dt = 0.05
########################

# Calculations
L = dispersion(T, h)
k = 2.*np.pi/L
w = 2.*np.pi/T

times = np.linspace(t0, tEnd, round((tEnd-t0)/dt)+1)
coords = np.linspace(bLims[0], bLims[1], nPaddles+1)
coords = coords[:-1] + np.diff(coords)/2.

HoS = 4. * np.sinh(k*h)/(k*h) * (k*h*np.sinh(k*h) - np.cosh(k*h) + 1.)/(np.sinh(2.*k*h) + 2.*k*h)
S = H/HoS

# Export
fid = open('wavemakerMovement.txt', 'w')

fid.write('wavemakerType   Flap;\n')
fid.write('tSmooth         1.5;\n')
fid.write('genAbs          0;\n\n')

fid.write('timeSeries {0}(\n'.format( len(times) ))
for t in times:
    fid.write('{0}\n'.format(t))
fid.write(');\n\n'.format( len(times) ))

fid.write('paddleTilt {0}(\n'.format( nPaddles ))
for i in range(0, nPaddles):
    fid.write('{0}(\n'.format( len(times) ))
    for t in times:
        x = S/2. * np.cos(-w*t + np.pi/2. + phase0 + 2.*np.pi*coords[i]/L*np.sin(direction*np.pi/180.) )
        x = np.arctan(x/h)
        x = x*180./np.pi
        fid.write('{0}\n'.format(x))       
    fid.write(')\n')
fid.write(');\n')

fid.close()

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

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

相关文章

ChatGPT对于普通人有什么机会和影响?

ChatGPT爆火“出圈”&#xff0c;短短三个月里&#xff0c;势如破竹。 月活已经达到1亿&#xff0c;什么概念呢&#xff1f;Tiktok在海外达到1亿月活用了将近9个月时间&#xff0c;Instagram用了大约2年半&#xff0c;就连比尔盖茨都表示“Web3没那么重要&#xff0c;元宇宙没…

STM32---备份寄存器BKP和 FLASH学习使用

BKP库函数 学习BKP&#xff0c;首先就是知道BKP每一个函数的作用然后如何使用即可 使用备份域的作用只需要操作上面的两个函数即可&#xff0c;其余的都是它的其他功能 BKP简介 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份…

【Jupyter Notebook的简单入门使用】

【Jupyter Notebook的简单入门使用】简单介绍安装与配置简单使用Markdown关闭简单介绍 Jupyter官网 Jupyter Notebook 介绍 简单来讲&#xff0c;它是一个网页应用&#xff0c;可以进行文档编写&#xff0c;甚至运行 py 代码等功能 安装与配置 下载合适版本的 python &#…

【C语言】带你彻底理解指针(1)

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦&#xff01;&#xff01;✨✨✨✨ 文章目录指针的介绍&#xff1a;一、简单指针&#x1f308;1.1 指针的定义与使用1.2 指针与数组二、指针数组✨三、数组指针&#x1f31e;3.1 数组指针的定义3.2 ”数组名“与”&数组名“3.…

达梦数据库DSC集群部署

一、概述 1.1 DSC 集群架构 1.2 架构说明 1、DMDSC 集群是一个多实例、单数据库的系统。 多个数据库实例可以同时访问、修改同一个数据库的数据。 2、数据文件、控制文件在集群系统中只有一份,不论有几个节点,这些节点都平等地使用这些文件, 这些文件保存在共享存储上。 3…

肠道核心菌属——双歧杆菌属,了解并拥有它

双歧杆菌 双歧杆菌属&#xff08;Bifidobacterium&#xff09;是放线菌门严格厌氧的革兰氏阳性多形性杆状细菌。末端常常分叉&#xff0c;故名双歧杆菌。是人和动物肠道的重要核心菌群和有益生理菌群&#xff0c;也是母乳喂养婴儿中发现的第二大菌。 肥胖、糖尿病和过敏等各种疾…

高德地图基础教程超详细版

在当前社会&#xff0c;对于地图的使用是很必须的&#xff0c;所以对于程序员来说也是需要掌握的技能&#xff0c;目前主流的又百度地图和高德地图&#xff0c;但是我建议使用高德地图&#xff0c;因为百度地图的API着实不好用吖&#xff0c;不好理解&#xff0c;对于开发人员来…

浏览器输入www.baidu.com后执行的全部过程

日升时奋斗&#xff0c;日落时自省 <1>URL输入 URL称为 : 统一资源定位符,用于定位互联网上的资源,也就是平常提起的"网址" 地址栏输入网址之后按下回车,浏览器会对输入的信息进行评判 (1)检查输入的内容是否是是一个合法的网址连接(非法地址不行) (2)合法的…

【spring教程】3.IoC容器概述

IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象的实…

【数据结构】二叉树的原理及实现

1.什么是数&#xff1f; 树这种数据结构在计算机中是非常重要的&#xff0c;是一种非线性数据结构。一些数据库的底层与快速索引都离不开树这种数据结构。树是有很多节点组成的具有一定层次关系的集合。最上面的可以看成是树的头&#xff0c;下面的很多节点就在这个头的基础上…

前端如何实现局部滚动效果?

一、基础版局部滚动 重点在于给需要滚动的区域加上 overflow: auto; 属性 废话不多说&#xff0c;先上基础版的局部滚动代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv…

智能优化算法——遗传算法(GA)(纯理论,不包含代码)

今天接着PSO&#xff0c;记录一下遗传算法的实现原理。&#xff08;若有错误&#xff0c;请大佬帮忙指正&#xff01;&#xff09;&#xff08;同样&#xff0c;主要参考b站视频学习加入自己的一些理解&#xff0c;如果想要看视频学习&#xff0c;可以直接移步最后参考链接&…

深度学习引言

动手学深度学习pytorch版-笔记原文链接日常生活中的机器学习机器学习中的关键组件数据模型目标函数优化算法各种机器学习问题监督学习回归分类标记问题搜索推荐系统序列学习无监督学习与环境互动强化学习特点小结原文链接 动手学深度学习pytorch中文版 日常生活中的机器学习 …

可怕,chatGPT用3小时教会我数据分析

chatGPT这玩意真的是我的救星,用它作为我的Python教练,我用三个小时学会了数据处理(Pandas)和绘图(matplotlib)。 这两个库的学习,在之前已经困扰了我7个月。之前卡壳的原因,是我一直没有耐心从零开始,按照教材设置的教程去学习Python——我擅长在项目中学习,一点一点…

Android实现炫酷跳动的闪屏LOGO

前言&#xff1a;在日常开发中&#xff0c;经常会遇到各种视觉效果&#xff0c;有的效果可能一眼看去会让人觉得很复杂&#xff0c;但是我们必须明确一点&#xff1a;所有复杂动效都是可以分解成单一的基础动作&#xff0c;比如缩放&#xff0c;平移&#xff0c;旋转这些基础单…

最新BlackArch发布,提供1400款渗透测试工具

近日&#xff0c;BlackArch Linux新版本发布&#xff0c;此版本为白帽子和安全研究人员提供了大约1400款渗透测试工具&#xff0c;如果你是一位白帽子或者安全研究人员&#xff0c;这个消息无疑会让你很感兴趣。BlackArch Linux是一款基于Arch Linux的发行版&#xff0c;主要面…

luckysheet的使用——07.二次开发自动插入批注功能

在单元格编辑完成后&#xff0c;需要自动在这个单元格上新增批注&#xff0c;此时需要改造旧代码&#xff0c;首先找到路径为 src/controllers/postil.js的文件&#xff0c;找到新增批注时触发的方法&#xff0c;如下&#xff1a; 2.对方法进行改造&#xff0c;新增传入变量co…

深入探讨下,IPC产品与智能家居融合的无限开创性

IPC还有哪些新玩法&#xff1f;随着摄像头的应用场景增加&#xff0c;IPC作为一种能力&#xff0c;正在融入到越来越多的智能设备中&#xff0c;形成了一批富有创意的智能 IPC 融合类产品。 比如&#xff0c;扫地机结合智能 IPC 后&#xff0c;能实现可视化精准识别障碍物&…

C++实现日期类

文章目录前言1.日期类的功能分析1.大致分析2.接口设计2.具体实现1.日期类的成员函数和成员变量2.初始化(构造函数&#xff09;3.对日期进行天数推算4.比较相关的运算符重载5.前置后置自增或自减6.日期相减与流插入流提取1.日期相减2.重载流插入和流提取3.总结前言 之前介绍了C…

数据结构与算法—链表list

目录 链表 链表类型 链表插入 链表删除 写程序注意点 与数组区别 链表应用 LRU 实现思想 链表 链表&#xff0c;一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中有广泛应用。常见CPU缓存&#xff0c;数据库缓存&#xff0c;浏览器缓存等。缓存满时&#…