前言

今天阅读了一本说明书,《gdbOF: A Debugging Tool for OpenFOAM》

受himryangzz视频启发去读相关内容,在此对himryangzz表示感谢

希望本篇文章能为需要gdb调试of的人节约时间


文章前言:

文章前言说of确实做的很不错,但调试者需要对of类的结构有较好的理解

gdbOF正是为了解决该问题而存在的,内置的一些宏可以让of调试更容易,一些数据结构类看起来更透明简单

总而言之,文章介绍说gdbOF内置的这些宏很实用

那我们看看王婆卖的什么瓜


第一章:

  • 在 WM_PROJECT DIR/etc/bashrc可设置$WM_COMPILE_OPTION为调试模式
#- Optimised, debug, profiling:
# WM_COMPILE_OPTION = Opt | Debug | Prof
export WM_COMPILE_OPTION=Opt

也可这样设置为debug模式和opt模式

alias of_version_debug='source /opt/openfoam_version/etc/bashrc WM_COMPILE_OPTION=Debug'
alias of_version='source /opt/openfoam_version/etc/bashrc'

installgdbOF.sh在运行时会检查是否在debug状态

可能有小伙伴发现自己的debug模式会报错,找不到一些链接库这样,这是由于apt install导致的,需要改为编译安装,类似cmake加-g也可


第二章:

讲了下用gdb怎么更好的把结果输出出来

例如书中提及的第一个指令,

$(gdb) p *v@v_size

咱稍微改一下就是压力场所有的数值

写到这里已经可以让很多做of的人期待书内后面的内容了

书里说如果我们需要快速的提取我们想要的信息,那么就需要我们对openfoam的继承树很了解

那么就拿p下手,了解下相关继承树

gdb打印出来这样



这东西不能多看,看多了精神容易出问题

我们之前博客也提过p是volScalarFiel类,构造方法是这样的

template<class Type, template<class> class PatchField, class GeoMesh>
Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField
(
const IOobject& io,
const Mesh& mesh
)
:
Internal(io, mesh, dimless, false),
timeIndex_(this->time().timeIndex()),
field0Ptr_(nullptr),
fieldPrevIterPtr_(nullptr),
boundaryField_(mesh.boundary())
{
readFields(); // Check compatibility between field and mesh if (this->size() != GeoMesh::size(this->mesh()))
{
FatalIOErrorInFunction(this->readStream(typeName))
<< " number of field elements = " << this->size()
<< " number of mesh elements = " << GeoMesh::size(this->mesh())
<< exit(FatalIOError);
} readOldTimeIfPresent(); if (debug)
{
InfoInFunction
<< "Finishing read-construction of" << endl << this->info() << endl;
}

能看到初始化了很多东西,下面展开看下初始化了什么

     Internal(io, mesh, dimless, false),
timeIndex_(this->time().timeIndex()),
field0Ptr_(nullptr),
fieldPrevIterPtr_(nullptr),
boundaryField_(mesh.boundary())

这次你再看gdb打印那些烂东西,咱对比一下

对劲了对劲了,

非常对劲!

咱们再说说

$(gdb) p *v@v_size

要展示什么数据,是内部面的压力场的数据,为什么这么说

因为我用gdb中打开p的地址,指向的是内部场

那这么看我们可以畅所欲为的抽取所有数据了,

其实本来就可以的,但是gdbOF好就好在为你指明了要抽取哪些

比如说边界面数据书内的提示是

$(gdb) p *(vSF.boundaryField_.ptrs_.v_[0].v_)@(vSF.boundaryField_.ptrs_.v_[0].size_)

书内解释说vSF是volScalarField的缩写,那p刚好符合要求,输入即可看到边界场的值

比如说我们打开这个boundary,

FoamFile
{
version 2.0;
format ascii;
class polyBoundaryMesh;
location "constant/polyMesh";
object boundary;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 3
(
movingWall
{
type wall;
inGroups List<word> 1(wall);
nFaces 20;
startFace 760;
}
fixedWalls
{
type wall;
inGroups List<word> 1(wall);
nFaces 60;
startFace 780;
}
frontAndBack
{
type empty;
inGroups List<word> 1(empty);
nFaces 800;
startFace 840;
}
)

有3个patch那么UList就应该是三维,Ulist[2]是frontAndBack,因为是empty,按理说就应该是没有数据



确实是如此

继续回头看书上内容,读到这里已经非常惊喜了

这得省多少劲

但也不必过于乐观,目前这个测试案例比较简单,具体调试时候不一定碰到什么问题

书上继续说以上都是甜头,接下来我们内置集成的一些宏更有用,比如说ppatchesvalueslimits,pinternalvalueslimits.,ppatchlist等

书上也提及了一个问题,就是of有时候代码跳转不过去,确实是有这个问题的,书上说,碰见这样的你就一步步走吧

这里gdbOF也提供了便利,step, next and finish这些宏也内置好了


第三章:

书中提及,在of中矩阵的显示是个难题,gdb采用了c风格的代码显示,遍历显示倒是好写,但性能太差,of这种大矩阵没法用

这点gdbOF利用python做出了改进,分别介绍了pfvmatrixfull和pfvmatrixsparse的伪代码。

这里额外说一句啊,其实很赞同matlab的矩阵表达方式的,非常快,而且向量化编程写法可以让速度提升一大截,以后看看有没有机会把matlab 植入到of中

看他们伪代码的意思貌似是收集一部分数据自己进行LU分解,之前我也读过一些论文说ofLU分解效率不大行的,可能gdbOF给出了python版本的解决方案

** Structure of gdbOF Command pfvmatrixsparse.**

1. Get parameters
2. Get upper and lower arrays with gdb
3. Redirect data to aux file
4. Format aux files: gdb format → python format
5. Call python script to assemble the matrix
(a) Read aux files
(b) Do lduAddressing for sparse matrix
(c) Generate sparse file header
6. Format aux files: python format → gdb format
7. Show in output or/and save file in octave format adding the header to the body

这里简述一下库中其他程序功能

pfindCell用于找位置,在此基础上pinternalvalueslimits抽取场值以及中心节点数据,pfvmatrix用于观察为该单元组装的方程式,psurfacevalues范围周围一圈的面值

翻译不一定准确,最好还是从源码上看

gdbOF内还有调试图形界面,可能是最近推出来的,但个人还是建议使用gdb配合他们的宏,他们的宏确实是能减少好多使用时间

如果这图形界面做的和paraFoam似的,我宁可用matlab或python做后处理


第四章:

第四章做了案例演示,gdbOF这个成果他们发表在了论文上,案例演示内容和论文基本一样

我感觉这样的案例演示恰恰是of缺少的,像matlab或fluent人家帮助文档都有案例演示,就连c++都有,of的数据结构这么复杂,每个类的创建或者函数的使用稍微配一个案例,简单说说即可,

你看查matlab帮助文档的有几个关心matlab函数重载啥样,有例子照虎画猫不更简单吗

但是很可惜,开源有利有弊,但绝不讨好任何人,

of门槛一下就上去了

案例中很常用pfvmatrixfull这个命令,可以着重去看下

pfindcell的具体使用方法如下:

(gdb)p findce11 0.05 0.45 0.05
RESULTS:
Nearest cell centroid cell number:400
Containing point cell number (-1=out):400

psurfacevalues的具体使用方法如下:

(gdb) psurfacevalues phir 400
internal Face:
$5 = 0
internal Face:
$6 = -0.0045
internal Face:
$7 = 0
empty Face
empty Face
boundary Face:
$8 = 0.0045

附录:

附录A展示了LDU分解的伪代码

for k : sizeDiag
A[k][k] = diag[k]
end for
for k : sizeAddr
i = lowerAddr[k]
j = upperAddr[k]
A[i][j] = upper[k]
A[j][i] = lower[k]
end for

附录B说明了volField (volScalarField, volVectorField or volTensorField),与对应的surfaceField区别

前者的内部区域场存储在体网格中心,后者存储在体网格交界面

比如说看下面这个伪代码,intFieldValue以及patchFieldValue的获取方式值得借鉴

l = myVolField.internalField.size_
i = 0
while(i<l)
intFieldValue = myVolField.internalField.v_[i]
//do something
i++
l = myVolField.boundaryField.ptrs_.size_
while(i<l)
patch = myVolField.boundaryField.ptrs_.v_[i]
l2 = patch.size_
j = 0
while(j<l2)
patchFieldValue = patch.v_[j]
//do something
j++
i++

附录C介绍了在面网格上的数据如何查询

大概意思是找到和查询面最近的点,然后用体的值估计,因为体的值和面的值相关

伪代码如下所示:(这里对patch面分别做了处理)

cellIndex = mesh.searchCellIndex(point)
for f : nFaces
fieldFaceValue = false
if isInternalFace(f)
if owner[f]==cellIndex || neighbour[f]==cellIndex
fieldFaceValue = field.internalField[f]
else
if owner[f]==cellIndex
patchIndex = whichPatch(f)
f_local = whichFace(f,patchIndex)
fieldFaceValue = field.boundaryField[patchIndex][f_local]
if(fieldFaceValue)
//do something with fieldFaceValue
end for

附录D是gdbOF命令行查询表,不一一展示了,有兴趣的查文档


结语

有一说一,这些宏确实能提高开发效率

这要是能集成在code或vim插件里就更好了,

如果我这边做好了会在博客里分享下,

后续如果对ofgdb宏有更多自己的看法也会分享


其他

本周塞尔维亚天王诺瓦克德约科维奇世界第一共计378周,超过格拉夫的377周,名副其实的世界第一,

喜悦之情难以言表

2023-02-27 21:08:22 星期一,写到这里记录一下当前时刻

每当处于逆境时,自己会选择看一些德约集锦或是穿上德约衣服球鞋拿着德约球拍奔赴球场

从2012年开始,粉了十年

论文致谢一定会有德约科维奇名字

逆境之王诺瓦克德约科维奇,在此表示祝贺


一起探索openfoam也是相当有趣的一件事,非常欢迎私信讨论

指正的价值要比打赏更重要,下面是个人联系方式,希望能结交到志同道合的朋友

gdbOF阅读笔记的更多相关文章

  1. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  2. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  3. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  4. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

  5. uml大战需求分析阅读笔记01

    <<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...

  6. Hadoop阅读笔记(七)——代理模式

    关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...

  7. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  8. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

  9. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...

  10. Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

    继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...

随机推荐

  1. MySQL空间暴涨150G导致锁定,发生了什么

    背景 12月1号中午突然收到大量报警,某客户环境操作数据库大量失败,报错信息如下图所示: 这个报错我是第一次见,一时间有点无所适从,但是从字面意思来看是MySQL目前处于LOCK_WRITE_GROW ...

  2. 论文解读(PCL)《Probabilistic Contrastive Learning for Domain Adaptation》

    论文信息 论文标题:Probabilistic Contrastive Learning for Domain Adaptation论文作者:Junjie Li, Yixin Zhang, Zilei ...

  3. 关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL

    一.关于如何在C#中调用C++的DLL,以及如何在C++中调用C#的DLL 注:clr指公共语言运行库 CLR是一门非常恶搞的语言,就好像是在C++里面写C#的文件一样,也就是一种所谓的"托 ...

  4. Linux基础守护进程、高级IO、进程间通信

    守护进程(Daemon) 前言 Linux常用于服务器,程序通常不运行在前台.运行于前台的进程和终端关联,一旦终端关闭,进程也随之退出.因为守护进程不和终端关联,因此它的标准输出和标准输入也无法工作, ...

  5. Safari浏览器对SVG中的<foreignObject>标签支持不友好,渲染容易错位

    在 svg 中需要写一个 markdown 编辑器,需要用到 <foreignObject> 绘制来html,编辑器选择了 simplemde.大致html部分结构如下,<markd ...

  6. [R语言] WGCNA入门教程

    文章目录 wgcna入门-雌性小鼠肝脏表达数据的网络分析:寻找与体重有关的模块 1 数据输入和清洗 1.1 加载基因表达数据 1.2 数据清洗 1.3 加载临床特征数据 2 建设表达网络与模块检测 2 ...

  7. python进阶之路14 之函数内置方法、可迭代对象、异常捕获处理

    重要内置函数 1.map() 映射 l1 = [1, 2, 3, 4, 5] # def func(a): # return a+1 res = map(lambda x:x+1, l1) print ...

  8. ES6 中 Promise对象使用学习

    转载请注明出处: Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口.它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接 ...

  9. Pytorch:单卡多进程并行训练

    1 导引 我们在博客<Python:多进程并行编程与进程池>中介绍了如何使用Python的multiprocessing模块进行并行编程.不过在深度学习的项目中,我们进行单机多进程编程时一 ...

  10. VUE Angular通用动态列表组件-亦可为自动轮播组件-02-根据数据量自动横向滚动,鼠标划入停止滚动

    本文为横向轮播,纵向轮播/动态列表组件请戳---- 代码是angular的,稍微改改就可以放入Vue项目里,差别不大哟 以下代码可以根据实际情况自行调整 父组件html <app-scroll- ...