当前位置: 首页 > article >正文

别再被湍流模型搞晕了!用Python从零实现一个超简单的DNS求解器(附完整代码)

用Python从零实现极简DNS求解器让Navier-Stokes方程看得见摸得着当第一次听说直接数值模拟(DNS)时我盯着那组复杂的Navier-Stokes方程看了整整一个下午——那些偏微分符号像天书一样令人望而生畏。直到有一天我决定用Python把这些方程变成可以运行的代码才发现原来理解流体力学可以如此直观。本文将带你用不到200行Python代码构建一个能真实运行的二维方腔流DNS求解器让你亲手触摸流体运动的每一个细节。1. 准备工作理解极简版NS方程在开始编码前我们需要对Navier-Stokes方程做适当简化。考虑二维不可压缩流动控制方程可表示为# 连续性方程 ∂u/∂x ∂v/∂y 0 # x方向动量方程 ∂u/∂t u∂u/∂x v∂u/∂y -1/ρ ∂p/∂x ν(∂²u/∂x² ∂²u/∂y²) # y方向动量方程 ∂v/∂t u∂v/∂x v∂v/∂y -1/ρ ∂p/∂y ν(∂²v/∂x² ∂²v/∂y²)其中u,v分别是x,y方向速度分量p是压力ρ是流体密度(设为1)ν是运动粘度系数提示方腔流问题指在一个矩形区域内顶部壁面以恒定速度移动其余三面为静止壁面是验证CFD方法的经典案例。2. 数值方法有限差分法实现2.1 网格生成与变量排列我们采用交错网格(staggered grid)布置变量避免压力振荡问题import numpy as np # 参数设置 nx, ny 41, 41 # 网格数 dx 1.0 / (nx-1) dy 1.0 / (ny-1) # 初始化变量 (在交错网格位置) u np.zeros((ny, nx)) # x速度 (位于网格右面) v np.zeros((ny, nx)) # y速度 (位于网格上面) p np.zeros((ny, nx)) # 压力 (位于网格中心)2.2 压力泊松方程求解压力通过求解泊松方程获得我们使用松弛迭代法def solve_pressure(p, u, v, dx, dy, rho1.0, nit50): pn np.empty_like(p) for _ in range(nit): pn p.copy() p[1:-1,1:-1] ((dy**2*(pn[1:-1,2:]pn[1:-1,0:-2]) dx**2*(pn[2:,1:-1]pn[0:-2,1:-1])) - rho*dx**2*dy**2*((u[1:-1,2:]-u[1:-1,0:-2])/(2*dx) (v[2:,1:-1]-v[0:-2,1:-1])/(2*dy))) / (2*(dx**2dy**2)) # 边界条件 p[0,:] p[1,:] # dp/dy 0 at y0 p[-1,:] 0 # p0 at y1 p[:,0] p[:,1] # dp/dx 0 at x0 p[:,-1] p[:,-2] # dp/dx 0 at x1 return p2.3 时间推进算法采用分步法(time-splitting)进行时间积分def time_step(u, v, p, dx, dy, dt, nu0.1, rho1.0): # 临时速度场 un u.copy() vn v.copy() # 对流项计算 u[1:-1,1:-1] (un[1:-1,1:-1] - dt/dx*un[1:-1,1:-1]*(un[1:-1,1:-1]-un[1:-1,0:-2]) - dt/dy*vn[1:-1,1:-1]*(un[1:-1,1:-1]-un[0:-2,1:-1]) nu*(dt/dx**2*(un[1:-1,2:]-2*un[1:-1,1:-1]un[1:-1,0:-2]) dt/dy**2*(un[2:,1:-1]-2*un[1:-1,1:-1]un[0:-2,1:-1]))) v[1:-1,1:-1] (vn[1:-1,1:-1] - dt/dx*un[1:-1,1:-1]*(vn[1:-1,1:-1]-vn[1:-1,0:-2]) - dt/dy*vn[1:-1,1:-1]*(vn[1:-1,1:-1]-vn[0:-2,1:-1]) nu*(dt/dx**2*(vn[1:-1,2:]-2*vn[1:-1,1:-1]vn[1:-1,0:-2]) dt/dy**2*(vn[2:,1:-1]-2*vn[1:-1,1:-1]vn[0:-2,1:-1]))) # 压力修正 p solve_pressure(p, u, v, dx, dy, rho) # 速度修正 u[1:-1,1:-1] - dt/dx * (p[1:-1,2:]-p[1:-1,0:-2])/2 v[1:-1,1:-1] - dt/dy * (p[2:,1:-1]-p[0:-2,1:-1])/2 # 边界条件 u[0,:] 0 # 下壁面 u[-1,:] 1 # 上壁面移动 u[:,0] 0 # 左壁面 u[:,-1] 0 # 右壁面 v[0,:] 0 # 下壁面 v[-1,:] 0 # 上壁面 v[:,0] 0 # 左壁面 v[:,-1] 0 # 右壁面 return u, v, p3. 完整求解流程实现现在我们将所有部分组合起来形成完整的求解器import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 参数设置 nx, ny 41, 41 nt 500 # 时间步数 dt 0.001 nu 0.1 # 粘度系数 rho 1.0 dx 1.0/(nx-1) dy 1.0/(ny-1) # 初始化 u np.zeros((ny,nx)) v np.zeros((ny,nx)) p np.zeros((ny,nx)) # 主循环 for n in range(nt): u, v, p time_step(u, v, p, dx, dy, dt, nu, rho) # 每50步可视化 if n % 50 0: fig plt.figure(figsize(11,7)) plt.contourf(np.linspace(0,1,nx), np.linspace(0,1,ny), p, alpha0.5) plt.colorbar() plt.quiver(np.linspace(0,1,nx), np.linspace(0,1,ny), u, v) plt.xlabel(X) plt.ylabel(Y) plt.title(fTime Step {n}) plt.show()4. 结果分析与可视化运行上述代码后我们可以观察到方腔内逐渐形成的涡旋结构。为了更专业地分析结果添加流线可视化def plot_streamlines(u, v, p): x np.linspace(0, 1, nx) y np.linspace(0, 1, ny) X, Y np.meshgrid(x, y) plt.figure(figsize(11,7)) plt.streamplot(X, Y, u, v, density2, colork, linewidth1) plt.contourf(X, Y, p, alpha0.5) plt.colorbar() plt.xlabel(X) plt.ylabel(Y) plt.title(Streamlines and Pressure Contour) plt.show() plot_streamlines(u, v, p)典型输出应显示顶部移动壁面驱动的顺时针主涡左下角和右下角的次级涡压力在角落区域达到最大值5. 性能优化与扩展建议虽然我们的求解器已经可以工作但在实际应用中还需要考虑以下优化计算效率提升技巧使用Numba加速数值计算实现多核并行计算采用更高效的线性代数求解器物理模型扩展方向添加温度场模拟自然对流实现三维版本求解器引入自适应网格细化(AMR)技术# Numba加速示例 from numba import jit jit(nopythonTrue) def time_step_accelerated(u, v, p, dx, dy, dt, nu, rho): # 实现与之前相同的逻辑但会被编译为机器码 ...第一次运行这个求解器时我惊讶地发现原来那些抽象的数学符号真的能转化为肉眼可见的流体运动。当第一个涡旋在屏幕上出现时那种啊哈时刻的兴奋感至今难忘。建议你在修改参数(如粘度系数、网格分辨率)后重新运行观察流动模式的变化——这才是理解CFD最有趣的方式。

相关文章:

别再被湍流模型搞晕了!用Python从零实现一个超简单的DNS求解器(附完整代码)

用Python从零实现极简DNS求解器:让Navier-Stokes方程看得见摸得着 当第一次听说"直接数值模拟"(DNS)时,我盯着那组复杂的Navier-Stokes方程看了整整一个下午——那些偏微分符号像天书一样令人望而生畏。直到有一天,我决定用Python把…...

LeetCode--28.找出字符串中第一个匹配项的下标(字符串/KMP算法)

28.找出字符串中第一个匹配项的下标 题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1&…...

Navicat Premium for Mac 终极重置指南:快速恢复试用期

Navicat Premium for Mac 终极重置指南:快速恢复试用期 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac Navicat P…...

ComfyUI-Manager 终极指南:轻松管理ComfyUI自定义节点和模型

ComfyUI-Manager 终极指南:轻松管理ComfyUI自定义节点和模型 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various…...

Layui layer.confirm怎么设置三个按钮(如:是、否、取消)

layer.confirm三个按钮需严格配对btn数组与yes、btn2、btn3三个回调函数,每个回调必须接收index参数并调用layer.close(index),否则弹窗残留或点击无效;cancel仅响应右上角,非第三个按钮回调。layer.confirm 三个按钮怎么配参数直…...

交付绩效域写作指导(理论+实操,防“回马枪”版)

尽管交付绩效域去年刚考过,但越是考过的考点,越容易换角度再杀回来。今年如果命题组想“回马枪”,大概率会在价值深度、可交付物范畴、质量全周期这些点上加码。本文帮你把核心逻辑理透,顺便给出一套考场直接能用的论文框架。一、…...

全面掌握BilibiliDown:高效下载B站视频的实战指南

全面掌握BilibiliDown:高效下载B站视频的实战指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bi…...

200K极致轻量化:勇芳自动校时工具的技术与应用探析

在软件行业普遍追求功能丰富性的今天,勇芳自动校时工具走出了一条截然不同的发展道路。 它以极致的轻量化设计理念,用仅仅200K的体积,实现了精准的网络时间同步功能。 这款由吾爱论坛wyl0205开发的小工具,向我们展示了软件设计的…...

从‘链式法则’到‘误差信号’:手绘流程图拆解BP,像调试程序一样理解神经网络学习

从‘链式法则’到‘误差信号’:手绘流程图拆解BP,像调试程序一样理解神经网络学习 第一次看到反向传播的数学推导时,那些偏导数和链式法则让我想起了刚学编程时调试递归函数的痛苦经历。直到有一天,我把神经网络的前向传播想象成函…...

MIPI C-PHY协议解析:嵌入式时钟与高速数据传输的革新设计

1. MIPI C-PHY:重新定义高速数据传输的游戏规则 当你在手机上滑动4K视频时,有没有想过这些海量数据是如何在芯片间闪电般传递的?这就是MIPI C-PHY的舞台。作为移动产业处理器接口联盟的革新之作,C-PHY用三根线完成了传统D-PHY四根…...

USB驱动调试进阶:自定义CyUSB.inf后设备管理器识别但Cypress Console无显示的排查与解决

1. 问题现象与背景分析 当你修改了CyUSB.inf文件后,设备管理器能够正确识别USB设备,但Cypress USB Console却一片空白,这种情况在FX2LP开发中并不少见。我遇到过好几次类似的问题,每次都要折腾大半天才能找到原因。先说说典型的症…...

从CARRY4到高效加法器:揭秘FPGA进位链的优化实践

1. 从半加器到全加器:加法器的底层逻辑 第一次接触FPGA加法器设计时,我也被各种专业术语搞得晕头转向。直到有一天,我把加法器想象成小学生列竖式计算,突然就豁然开朗了。想象你在纸上计算1219,是不是要从右往左一位一…...

深夜告警炸裂?这份Linux故障排查“作战地图”请收好匚

先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。 查询参数/dishes?spicytrue&typeSichuan -> …...

不满意Oh My Zsh启动卡顿,来试试Starship吧必

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

mysql数据库性能基准测试工具推荐_使用sysbench进行压力测试

sysbench 是 MySQL 压测的事实工业标准,因其 Lua 脚本灵活性、指标可对标 SLO 且被主流云厂商广泛采用;必须源码编译以适配 MySQL 8.0 认证机制;prepare 卡住多因权限、网络或 max_allowed_packet 不足;不同 Lua 脚本事务结构差异…...

LingBot-Depth在AR/VR中的应用:快速获取场景深度,开发更简单

LingBot-Depth在AR/VR中的应用:快速获取场景深度,开发更简单 1. AR/VR开发中的深度感知挑战 在增强现实(AR)和虚拟现实(VR)应用开发中,准确获取场景深度信息是核心技术挑战之一。传统深度获取方式通常面临以下问题: 硬件依赖&a…...

Ubuntu20.04下ROS2 Humble安装避坑指南:从清华源加速到环境变量配置

Ubuntu 20.04下ROS2 Humble高效安装与深度配置指南 1. 系统环境准备与优化 在Ubuntu 20.04上安装ROS2 Humble需要先确保系统环境配置正确。许多安装失败案例都源于基础环境未正确设置,特别是locale和软件源配置。 关键环境检查项: # 检查当前locale设…...

Layui表格如何监听单元格编辑开始(进入编辑状态)事件

layui table 的 edit 事件仅在编辑完成(失焦或回车)时触发,非双击开始编辑时刻;需通过委托监听 .layui-table-body td 的 dblclick 或 focusin input[lay-edit] 实现“开始编辑”捕获。layui table 的 edit 事件只在编辑完成时触发…...

EMC实战:网络机顶盒网口辐射优化方案解析

1. 网络机顶盒EMC问题的背景与挑战 家里用网络机顶盒追剧时突然卡顿?打游戏ping值莫名飙升?这些问题很可能与网口辐射干扰有关。作为从业10年的硬件工程师,我处理过上百个类似案例,发现网络机顶盒的EMC问题就像"电子设备的慢…...

Harmonyos在语文教学中的应用-17. 会意字拆解器(对应:日月明)

17. 会意字拆解器(对应:日月明) 功能介绍: 解析《日月明》中会意字构字规律的演示工具。选择“明”字,屏幕分为两部分,左边飞入“日”,右边飞入“月”,两部分合并闪烁变为“明”。支持“森、众、尘”等字。通过动态演示,让学生明白“日+月=明”的逻辑,激发自主识字兴…...

终极模组管理指南:如何用AML启动器轻松解决XCOM 2模组冲突问题

终极模组管理指南:如何用AML启动器轻松解决XCOM 2模组冲突问题 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_m…...

DVWA1.9文件上传High级绕过实战:3种隐藏木马技巧与防御思路

DVWA1.9文件上传High级绕过实战:3种隐藏木马技巧与防御思路 在Web安全领域,文件上传漏洞始终是攻击者最青睐的攻击向量之一。DVWA(Damn Vulnerable Web Application)作为经典的漏洞演练平台,其High级别的文件上传防护机…...

Jetson 启动视觉定制全攻略:从cboot到桌面背景的深度修改

1. Jetson视觉定制全景概览 当你拿到一台崭新的Jetson设备,第一眼看到的往往是那个熟悉的绿色NVIDIA logo。但对于产品开发者来说,这个默认界面就像穿着别人的工作服上班——专业但缺乏品牌个性。我经手过十几个基于Jetson的机器人项目,每次客…...

如何规避SQL存储过程注入_严格清洗变量并使用预处理

SQL Server动态SQL注入的根本原因是字符串拼接,唯一有效防御是全程参数化:值必须用sp_executesql参数绑定,表名列名等无法参数化的部分须白名单校验。SQL Server 存储过程中 EXEC 动态拼接字符串时为什么总被注入?因为 EXEC&#…...

2026年OpenClaw怎么搭建?3分钟腾讯云新手集成及百炼Coding Plan步骤

2026年OpenClaw怎么搭建?3分钟腾讯云新手集成及百炼Coding Plan步骤。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启动、Skills集成…...

.NET 诊断技巧 | 日志框架原理、手写日志框架学习纷

一、 什么是 AI Skills:从工具级到框架级的演化 AI Skills(AI 技能) 的概念最早在 Claude Code 等前沿 Agent 实践中被强化。最初,Skills 被视为“工具级”的增强,如简单的文件读写或终端操作,方便用户快速…...

Golang怎么理解GC垃圾回收机制_Golang如何分析和优化Go的内存回收性能【详解】

Go GC 不会立即归还内存给操作系统,而是在空闲超时(默认5分钟)或内存压力突增(如设置GOMEMLIMIT)时由scavenger触发;pprof不显示mmap/cgo等OS层内存,RSS高于HeapSys 20%以上通常表明存在此类问题…...

Z-Image-Turbo-辉夜巫女部署案例:A10G显卡上实现<2s单图生成响应时间

Z-Image-Turbo-辉夜巫女部署案例&#xff1a;A10G显卡上实现<2s单图生成响应时间 1. 引言&#xff1a;当二次元创作遇上极速生成 想象一下&#xff0c;你脑海中浮现出一个“辉夜巫女”的绝美画面——银发、红瞳、身着传统巫女服&#xff0c;背景是飘落的樱花。在传统的工作…...

从零到一:手把手教你构建专属Pikachu漏洞演练场

1. 为什么需要搭建Pikachu漏洞演练场 刚开始学习网络安全时&#xff0c;很多人都会遇到一个尴尬的问题&#xff1a;学了很多理论&#xff0c;但找不到合适的实战环境。直接拿真实网站练手既不道德也不合法&#xff0c;这时候就需要一个安全、可控的漏洞演练平台。Pikachu就是这…...

超轻量级AI助手nanobot:5分钟快速部署与chainlit交互体验

超轻量级AI助手nanobot&#xff1a;5分钟快速部署与chainlit交互体验 1. nanobot简介&#xff1a;极简设计的AI助手 在AI助手领域&#xff0c;体积庞大、资源消耗高的系统比比皆是。而nanobot却走了一条截然不同的道路——用仅约4000行代码实现了OpenClaw的核心功能&#xff…...