浸入边界法与符号距离场结合:OpenFOAM流固耦合仿真实践

简介:sdfibm是一套基于符号距离场与OpenFOAM v6的浸入边界方法C++程序包,面向从事流固耦合、多颗粒流仿真的CFD研究者和工程师。程序内置安装脚本与完整示例拓扑,可在个人电脑或HPC集群上编译运行,并通过符号链接快速启用命令。压缩包共153个文件,其中包括44个C++头文件、12个源文件以及controlDict、fvSchemes、blockMeshDict等典型的OpenFOAM字典配置,也有后处理相关的JSON和Shell脚本,整体体积28.24MB,便于对照案例逐项理解求解器设置。目前已有787人学习下载。压缩包内提供可直接编译的求解器源码、颗粒/流体案例设置、边界条件文件和排错记录,读者可借此复现典型流固耦合算例,也能基于源码二次开发自定义模型,适合熟悉OpenFOAM基础操作并希望深入探索浸入边界方法的进阶用户。

1. 浸入边界法遇到符号距离场:网格这道坎直接绕过去

做流固耦合最让人头疼的往往不是求解器,而是网格。贴体网格方案遇到复杂几何,光体网格就要调一两个星期,动边界算例还得重新生成,时间都耗在网格上。sdfibm这个资源把几何体装进符号距离场(Signed Distance Field),配合OpenFOAM在固定笛卡尔背景网格上做浸入边界法(IBM),圆柱绕流、颗粒沉降这类问题可以直接跑起来,不再做贴体网格的重复劳动。实现语言是C++,适合已经会用OpenFOAM、想补上浸入边界能力的人,也适合需要复现颗粒与流体耦合结果的工程师。

2. 符号距离场与浸入边界法的技术内幕:从几何表示到力耦合

先把原理讲透,后面配置参数时才不会一脸懵。sdfibm的核心思路是把固体几何当成一个标量场来看待,而不是让它表面的三角网格参与计算。这个转变解决了网格生成的问题,也引入了新的参数,比如带宽、分辨率,这些都得理解清楚才能调好。

2.1 为什么选符号距离场:梯度就是法向量

符号距离场对空间每个点存一个到最近固体表面的带符号距离。固体内部为负,外部为正,表面恰好为0。SDF把几何从离散面片变成连续标量场,后续找边界法向、判断内外、追踪移动边界都变成规整的场操作。

对浸入边界法来说,最关键的属性是SDF的梯度。梯度方向就是表面法向,梯度大小在表面附近很稳定。这意味着可以直接把SDF梯度当成法向量来用,不需要做几何求交,不需要判断点在多面体内部还是外部。STL三角面表示法做内外判断时要做射线求交,加上最近距离遍历,面片数量一多性能就很难看。SDF用一套固定开销的标量场就搞定了。

不过SDF也有代价:它必须依赖背景网格来采样。网格间距直接决定了边界表示的精度,网格越密,SDF越接近真实几何,但计算量也线性上升。我在实际使用中会把SDF单独存成一个场文件,背景网格有多密,SDF的采样点就有多密。这个存储开销对一个二维算例来说完全可接受,三维算例就要权衡内存了。

2.2 直接力浸入边界法:力从拉格朗日点传回欧拉网格

浸入边界法有好几个流派,sdfibm走的是直接力路线。直接力法的思路很朴素:先把固体表面离散成一组拉格朗日标记点,在每个点上根据速度残差反推出需要的力,再把力插值回欧拉背景网格,加进OpenFOAM的动量方程里。

OpenFOAM里动量方程会多一个源项fi。常规做法是先预测一个不考虑浸入边界的速度场,然后计算拉格朗日点上流体速度与固体表面速度的差值,用这个差值反推力,再通过权重函数传播到周围网格。这个力算出来之后,还要保证它不影响压力方程的收敛性,这就涉及到松弛因子和时间步的配合。

这里有个容易误解的点:SDF不直接参与力的计算。SDF的作用是空间定位,告诉你哪些网格点处于边界附近、法向朝哪边。力的大小完全由速度残差决定。换句话说,SDF告诉你“边界在哪里”,直接力告诉你“边界上需要多大的推力”。两件事分开处理,代码结构才清晰。

2.3 源码结构与编译:C++实现和OpenFOAM环境依赖

sdfibm的源码按典型的OpenFOAM第三方工具箱布局组织。核心是一个求解器,加上一套SDF初始化和刚体动力学库。初始化部分负责把STL输入转成SDF场,求解器部分负责时间推进中流场与固体的耦合。

编译前要确认OpenFOAM版本和C++编译器匹配。不同OpenFOAM版本对C++标准库的封装有差异,某个版本的源码换到新编译器下,模板报错会非常折磨人。常规流程是先加载OpenFOAM环境,再编译库和求解器:

source /opt/openfoam8/etc/bashrc cd $HOME/sdfibm ./Allwmake -j4

这段命令里,source把OpenFOAM的环境变量加载进来,包括wmake脚本和第三方库路径。Allwmake是OpenFOAM体系的统一编译入口,-j4表示用4个核并行编译。编译失败先看路径里有没有版本冲突,我遇到过两次都是因为机器上装了多个OpenFOAM版本,source脚本把环境指到了旧版本上,导致新版源码链接到旧库,报错位置完全看不懂。

编译完成之后,工作目录里会生成一个可执行文件,这就是后面跑算例用的主程序。编译通过只代表环境没问题,真正的坑都在算例配置阶段。

3. 跑通第一个算例:从SDF生成到背景网格设置

跑通算例的关键在于流程顺序:先有SDF,再有背景网格,最后设置刚体参数。这个顺序不能乱,因为SDF的生成依赖背景网格的范围,背景网格的边界设置又依赖SDF中的几何位置。

3.1 生成SDF:从STL到标量场

sdfibm允许用自带几何工具生成简单形状,圆柱、球、箱体都有现成接口,复杂几何就丢STL进去。转换时需要注意三个参数:背景网格范围、网格间距、SDF带宽。网格间距决定边界表示的精度,带宽决定边界附近多少层网格参与力的插值。

带宽设小了,力的插值不连续;设大了,会绕开SDF的局域性优势,增加无谓的计算量。对于一般的外流场算例,我会把带宽取3到5层网格。比如网格间距是0.01,带宽就取0.03到0.05。这样既保证边界过渡平滑,又不至于污染离壁面较远的流动。

注意:SDF带宽过窄是初学者最容易犯的配置错误。边界法向会在局部跳动,受力曲线出现锯齿,看起来像数值振荡,其实是采样点没有覆盖足够的插值范围。

3.2 用blockMesh准备背景网格与流场边界

背景网格是笛卡尔均匀网格,由blockMesh生成。这里和贴体网格计算一样,也要设置进出口、壁面条件。唯一不同是几何体不再出现在网格边界上,而是藏在SDF场里。

看一个blockMeshDict的关键片段:

vertices ( (0 0 0) (1 0 0) (1 1 0) (0 1 0) (0 0 0.02) (1 0 0.02) (1 1 0.02) (0 1 0.02) ); blocks ( hex (0 1 2 3 4 5 6 7) (100 100 1) simpleGrading (1 1 1) );

这个片段定义了1乘1乘0.02的计算域,x和y方向各100个网格,z方向只有1层。浸入边界算例一般是二维或准三维,z方向给一层就够。simpleGrading (1 1 1)表示三个方向均匀网格,没有做拉伸。

提示:z方向的厚度不影响二维计算结果,但要保证大于两倍SDF带宽,否则上下两个边界会互相干扰。

100乘100的网格对入门算例已经够用,想要更好精度再整体加密。浸入边界法不像贴体网格那样可以在边界附近局部加密,只能靠全局加密来提升边界分辨率,这也是它省掉网格工作量的代价。

3.3 刚体运动参数与时间步选择

固定几何和动边界算例在配置上的区别,主要在刚体运动部分。固定圆柱只要把质量设成很大,或者关闭运动求解器即可。自由沉降或摆动算例则需要给出质量、转动惯量、初始速度、重力加速度。

常见的配置文件里会有这样一段:

rhoS 2700.0 radius 0.005 youngsModulus 1e8 poissonsRatio 0.3

rhoS是固体密度,radius是等效半径,后两个是变形体颗粒才用到的弹性参数。刚体算例中弹性参数不会被使用,但配置里最好还是写上,避免某些版本读配置时报缺字段。

时间步选择上,我一般先保证库朗数在0.3以下,再观察力曲线有没有高频振荡。浸入边界法的稳定裕度比贴体网格小,时间步太激进非常容易翻车,特别是在颗粒接触阶段,物理上的碰撞力对时间步极其敏感。

4. 关键参数与数据结构:这些旋钮决定仿真质量

跑通算例之后,下一步是理解哪些参数在真正控制结果。sdfibm本质上还是在调用OpenFOAM的压力速度耦合流程,但浸入边界源项改变了求解器的收敛行为,所以常规的OpenFOAM参数也要跟着调整。

4.1 数值参数:从松弛因子到力滤波

看一个fvSolution片段:

solvers { p { solver GAMG; tolerance 1e-06; relTol 0.01; smoother DICGaussSeidel; } U { solver smoothSolver; smoother symGaussSeidel; tolerance 1e-06; relTol 0; } };

压力用GAMG多重网格求解器,适合笛卡尔网格。速度用smoothSolver加对称高斯赛德尔平滑。tolerance控制绝对残差,relTol控制相对残差。压力相对容差设为0.01,意思是每步压力迭代的残差降到初始残差的1%就算收敛,速度则要完全迭代到绝对容差。

如果力信号出现锯齿状波动,先看是不是压力迭代没收敛。浸入边界源项会对压力速度耦合产生额外扰动,迭代次数不够时,每条时间步都会留下小残差,反映到力信号上就是噪声。

关键参数之间是联动的,不能单独调一个。下表是常用参数的合理范围:

参数典型值作用常见坑
网格间距0.01~0.05边界表示精度太小导致计算量翻倍
SDF带宽3~5层网格力的插值平滑太窄导致边界法向跳动
库朗数<0.3时间步稳定性过大导致力信号振荡
压力relTol0.01~0.001压力迭代收敛过松导致边界斑块
固体密度实际物理值刚体惯性计算单位不一致导致力差千倍

4.2 物体识别与后处理:用等值面显示固体

结果文件里,固体边界并不像贴体网格那样作为网格面存在。需要在后处理时通过SDF等值面来显示固体形状。

在可视化软件里加载SDF场,提取值为0的等值面,就得到固体表面。这个方法的优势很明显:固体变形或移动时,不需要重新生成网格,等值面会自动跟着SDF场走。后处理脚本里也经常用这个等值面来切片观察物体周围的流线。

4.3 想改耦合逻辑时的切入点

如果只是调参,不需要改源码。想换一种力插值方式,或者加一个热源项,就得到源码里改。最常见的切入点是力计算模块,里面有一段循环,遍历所有边界标记点,计算每个点的力残差,再通过权重函数分配到背景网格。

常见的权重函数是高斯型或三线性插值。源码里的核心循环逻辑可以理解为这样:

for (int i = 0; i < nBodyPoints; i++) { vector point = sdfPosition[i]; label cellI = findCell(mesh, point); if (cellI < 0) continue; // 计算速度残差 vector uRes = uInterp[i] - uBody[i]; forceInterp[i] = rho * uRes / dt; }

这段逻辑里,findCell查这个标记点落在哪个网格单元,uInterp是插值得到的流体速度,uBody是固体表面该点的速度,两者相减得到残差,再除以时间步长换算成加速度量级的力。注意dt和rho的单位要一致。OpenFOAM默认单位体系里这些量没有标注单位,但物理量纲要自己维护。我曾在某套单位制算例里把密度当成常数1,结果所有力都小了千倍,查了很久才意识到是单位没对齐。

5. 常见问题与避坑:连续五个算例踩出的经验

这一章直接给结论。每条都是实际算例里遇到过的,按现象、原因、解决三步写,可以减少排查时间。

5.1 SDF等值面与网格线重合导致力尖峰

现象:圆柱绕流的升力系数曲线出现周期性尖峰,频率和网格间距一致,明显不是物理现象。

原因:SDF等值面与背景网格线严格重合时,拉格朗日标记点正好落在网格节点附近,插值权重出现病态放大,个别点的力残差被异常放大。

解决:把SDF采样网格整体偏移半个网格间距,或者让几何体旋转一个微小角度,避开重合。偏移量很小,对精度几乎没有影响,但能立刻去除几何奇点。

5.2 多颗粒算例时间步必须同步调整

现象:单颗粒沉降正常,加入第二个颗粒后,几步之内速度发散。

原因:颗粒间的近距接触依赖排斥力模型,颗粒距离越近排斥力越大,这个力对时间步非常敏感。碰撞力的计算依赖上一时间步的位置,时间步大时接触判断滞后一个步长,能量不断累积。

解决:接触阶段时间步降到原来的一半甚至四分之一。颗粒间距小于2倍网格间距时,要密切关注受力曲线,看到接触力突跳就缩小步长。

5.3 压力迭代假收敛与边界斑块

现象:计算没有报错,力和力矩曲线也很好看,但把压力场调出来看,物体附近出现明显不连续的斑块。

原因:压力残差的监测点离边界远,边界附近的局部不收敛被全局残差掩盖。GAMG求解器在某些配置下对边界源项处理得不够干净。

解决:在fvSolution中把压力求解器的容差收紧一个数量级,把nCellsInCoarsestLevel调大一点,让最粗层足够大。修改后等值面斑块消失。

5.4 STL坐标系和背景网格坐标系不一致

现象:模型导入后偏出计算域,或者形状看起来被拉伸。

原因:STL文件里的顶点数据和背景网格使用不同的单位或轴序。有些工具导出STL用毫米,背景网格用米,差了千倍。

解决:生成SDF之前先检查STL的包围盒边界值:

python3 -c " import numpy as np from stl import mesh m = mesh.Mesh.from_file('geometry.stl') print(m.points.max(axis=0), m.points.min(axis=0)) "

看包围盒输出,如果坐标量级在0.005到0.05之间说明单位是米,在5到50之间说明单位是毫米。毫米数据要在导入参数里先缩放。

5.5 OpenFOAM版本与C++模板编译报错

现象:源码编译报错,定位到的头文件和报错代码看不出直接关联。

原因:不同OpenFOAM版本对STL容器的封装有差异,旧版本源码在新版本环境下找不到对应接口。这类C++模板报错信息往往指向三层之外的模板参数,很难直接定位。

解决:直接用项目推荐的版本,不要顺手升级。版本不一致引发的编译问题,排查成本比换环境的成本高得多。对依赖较多数学库的C++项目,环境一致性比什么都重要。

6. 验证与进阶:从单圆柱到多体干涉

6.1 经典算例验证:用圆柱绕流给流程做体检

跑通后的第一件事是算标准圆柱绕流。重点关注阻力系数均值和升力系数脉动,以及涡脱落频率对应的斯特劳哈尔数。不同雷诺数有公开可查的参考值,适合做整体校验:

雷诺数流态斯特劳哈尔数阻力系数均值
40定常对称无涡脱约1.5
100周期性涡脱约0.17约1.3
200周期性涡脱约0.19约1.4

我习惯在同一套背景网格上先跑Re=40的定常算例,此时流动稳定,没有涡脱落,用于确认边界力没有异常振荡。确认平滑之后再切到Re=100。这个顺序相当于给整个流程做了一次最小单元验证。某高校实验室的A同学一开始直接跑Re=100,升力系数偏大,就是因为网格分辨率不够,边界层分离点靠后,涡脱频率对不上。

6.2 进阶方向:多体干涉与性能瓶颈

进阶玩法之一是圆柱换成一排等间距的管束,观察尾流涡干涉。之二是三球沉降算例,两个小球在下落过程中会因为尾流和接触而横向偏移,这是检验刚体碰撞和流体耦合的经典场景。之三是放开弹性参数做变形体,观察模态变化。

多体干涉算例的性能瓶颈主要在力插值。标记点数量上升后,findCell的调用次数线性增长。常见做法是把标记点按网格单元做空间哈希,每个网格单元预先存一份标记点索引表,查找从遍历全部点变成直接查表,性能提升明显。我在单核到多核扩展测试里看到,标记点数量超过十万之后,哈希索引比逐个查找快五倍。

从那以后,我每次换几何模型都会先检查SDF包围盒和等值面,再跑一个Re=40的最小验证,确认边界力平滑后才拉高雷诺数。这个习惯帮我省掉了无数次后半夜的重算。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

家居集团战略落地实操手册:6S系统与管控流程设计

家居集团战略落地实操手册:6S系统与管控流程设计

简介&#xff1a;本资源是一份面向家居制造业集团高管、战略规划与运营管控从业者及管理咨询顾问的专业级PPT方案&#xff0c;聚焦集团层面战略验证与管控体系设计双重任务&#xff0c;解决多元化扩张中战略落地难、总部定位模糊、业务协同不足等核心痛点。文件为1个2.8MB的PPT…

2026/10/20 1:42:07 阅读更多 →
如何本地免费激活 WeMod 专业版:Wand-Enhancer 完整实操指南

如何本地免费激活 WeMod 专业版:Wand-Enhancer 完整实操指南

如何本地免费激活 WeMod 专业版&#xff1a;Wand-Enhancer 完整实操指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 如果你不想再为 WeMod 的订…

2026/10/20 1:42:07 阅读更多 →
【Spring-SSE】除了 SSE 和 WebSocket,还有哪些现代浏览器支持的服务器推送技术?各自的适用边界是什么?

【Spring-SSE】除了 SSE 和 WebSocket,还有哪些现代浏览器支持的服务器推送技术?各自的适用边界是什么?

现代浏览器服务器推送技术全景:风控规则热更新系统的架构选型与边界分析 发布时间:2026年04月01日 适用环境:Spring Boot 3.2.0+、JDK 17、Chrome 120+、Safari 16+、Firefox 115+ 用户问题原文:除了 SSE 和 WebSocket,还有哪些现代浏览器支持的服务器推送技术?各自的适…

2026/10/20 1:41:06 阅读更多 →

最新新闻

上海数据集团职位分析:平台运营岗

上海数据集团职位分析:平台运营岗

岗位定位:国资体系数据平台高阶运营专家岗(5年资深岗),区别于普通互联网内容/用户运营,属于数据平台战略运营+需求产品化+用户体系搭建+价值宣贯+数据运营分析的B端中台运营岗位。核心承接上海数据集团数据中台、数据空间、公共数据服务平台的整体运营体系搭建与落地,是连…

2026/10/20 2:18:26 阅读更多 →
Agent 接进企业微信和钉钉:验签、收发与卡片交互的渠道适配层

Agent 接进企业微信和钉钉:验签、收发与卡片交互的渠道适配层

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 2:18:26 阅读更多 →
通义千问API实战指南:从基础调用到性能优化与成本控制

通义千问API实战指南:从基础调用到性能优化与成本控制

做了这么多年的开发&#xff0c;越来越觉得大模型API已经不只是锦上添花的东西&#xff0c;而是很多业务场景里的刚需。最近团队里好几个项目都涉及到文本生成、意图识别和内容总结&#xff0c;对比了一圈之后&#xff0c;我选择了通义千问的API做主力接入。主要原因很直接&…

2026/10/20 2:18:26 阅读更多 →
从零搭建AI诊断Agent:LLM选型、工具调用与Prompt编排实战

从零搭建AI诊断Agent:LLM选型、工具调用与Prompt编排实战

最近一直在折腾一个设备故障诊断方向的Agent项目&#xff0c;从最开始只想着“接个大模型API就完事”&#xff0c;到后面被迫把LLM、Tools、Prompt这三块硬骨头一个个啃下来&#xff0c;中间踩了不少坑。今天不聊虚的&#xff0c;直接把我沉淀下来的这套从零搭建AI诊断Agent的方…

2026/10/20 2:18:26 阅读更多 →
东方有线职位分析:信息与数字化中心—政企智数支撑

东方有线职位分析:信息与数字化中心—政企智数支撑

岗位定位:国企广电体系政企数智化平台技术支撑+架构交付+运维优化专项岗,属于技术落地中层骨干岗。区别于纯开发、纯运维岗位,本岗是政企数字化项目售前方案+架构设计+落地实施+高可用运维+性能优化+变更管控的复合型技术支撑岗,核心服务东方有线政务、政企、智慧社区、数字…

2026/10/20 2:18:26 阅读更多 →
Few-shot RAG 实战:给几个示例,模型就知道该怎么答

Few-shot RAG 实战:给几个示例,模型就知道该怎么答

个人主页&#xff1a;> for_ever_love__ <&#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目: > 大模型开发从0到1 < 其他栏目: > iOS项目总结大全 < 其他栏目: > 我想学python了 < 其他栏目: > iOS UI < 文章目录Few-shot RAG 实…

2026/10/20 2:17:26 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →