decomposePar 的手动分块/手动指定计算区域分块 您所在的位置:网站首页 lv鞋5码相当于几码的鞋 decomposePar 的手动分块/手动指定计算区域分块

decomposePar 的手动分块/手动指定计算区域分块

2024-05-12 12:20| 来源: 网络整理| 查看: 265

似乎之前没法出去,重新发一下 OpenFOAM 进行并行计算之前,需要讲计算区域分成若干个小块,每个小块指定一个线程进行计算。目前有的方法是simple, hierarchical, scotch 和 manual。simple 和 hierarchial 本质上是一样的,后者能选方向,scotch 尽量减少连接各个区域的面积。但是有些时候这三者都不适用的时候,就需要手动分区了。 最近做catalytic simulation,计算最繁重的地方是catalyticWall 边界, 因此想使用更多的核计算catalytic边界。理论上说最好的办法是把catalyticWall 边界平均分配到各个线程,即将catalyticWall 边界平均分成n分,由这n个subArea出发,寻找平均并且使得processor间接触面积最小的分区,但是似乎并没有找到这种方法(如果有人知道的话请不吝赐教。。),那么就出现了第二种方法,首先将计算区域划分成包含catalytic 边界的小区域A和不包含catalytic 边界的大区域B,将A继续分为n等分,分别指定给一些线程,然后B指定给另个(或多个)线程,如图所示: manual 方式需要一个目录文件来进行分区,但是网格数量很多的时候,手动指定并不可行,cfd-online上一篇帖子叙述了使用setFields手动分块 的一种办法,我没试过,感觉应该有更decent的办法,转过来权当抛砖引玉。

步骤:

准备两个文件,system/setFieldsDict, /preDecomp.py ,附在本文最后, 使用scotch方式decomposePar,并且在0/目录下创建cellDist decomposePar -cellDist

desomposeParDict 内:

numberOfSubdomains 2; method scotch; 使用setFields 创建分块(此时需要system/下有setFieldsDict), setFields 这一步是使用python打开"0/cellDist",修改和删除一些行,即把cellDist里面的volScalarField改为labelList,同时删除边界节点(是节点么?),如果preDecomp.py已经编辑好了,可以直接执行: python prepDecomp.py 最后,修改decomposeParDist, 中method 为manual, 并执行:(个人认为rm -r -processor* 是不需要的,直接decomposePar -force 就可以了,另我删除了原帖中setFields 和python prepDecomp.py) rm -r processor* decomposePar

最后附上文中setFieldsDict 和需要粘贴在prepDecomp.py中的内容,各个box可以随心

/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 1.7.1 | | \\ / A nd | Web: www.OpenFOAM.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object setFieldsDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // defaultFieldValues ( volScalarFieldValue cellDist 0 ); regions ( boxToCell { box ( 0.5 0 0 ) ( 1 0.5 1 ) ; fieldValues ( volScalarFieldValue cellDist 1); } boxToCell { box ( 0 0.5 0 ) ( 0.5 1 1 ) ; fieldValues ( volScalarFieldValue cellDist 2); } boxToCell { box ( 0.5 0.5 0 ) ( 1 1 1 ) ; fieldValues ( volScalarFieldValue cellDist 3); } ); // ************************************************************************* // # file prepDecomp.py #read file with open("0/cellDist", "r") as cdFile: lines = cdFile.readlines() #replace and delete unwanted lines lines[11] = lines[11].replace("volScalarField", "labelList") lines[12] = lines[12].replace("0", "constant") del lines[17:21] bfline = 0 for i, line in enumerate(lines): if (line.find("boundaryField") != -1): bfline = i break del lines[i:] #write file with open("constant/cellDist", "w") as cdFile: for line in lines: cdFile.write(line)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有