首页> 中国专利> 基于STEP文件的从CAD模型到MCNP几何模型的转换算法

基于STEP文件的从CAD模型到MCNP几何模型的转换算法

摘要

本发明提供一种基于STEP文件的MCNP输入文件转换算法,该算法涉及物理、核科学技术领域。该算法是在CAD软件生成的STEP文件基础上,对STEP文件先进行信息提取然后通过几何运算来还原真实的模型结构,最后转换成MCNP可识别的INP文件格式。为解决复杂模型问题,该算法采用构造栅元树的方法将模型中所有的栅元信息存放于栅元树中,通过遍历栅元树就能输出成MCNP可识别的INP文件格式。使曲面卡和栅元卡输出具有不遗漏,位置准确,处理灵活的特点。

著录项

  • 公开/公告号CN104794133A

    专利类型发明专利

  • 公开/公告日2015-07-22

    原文格式PDF

  • 申请/专利权人 兰州大学;

    申请/专利号CN201410027712.2

  • 发明设计人 周庆国;吴炯;杨家明;汪俊琼;

    申请日2014-01-21

  • 分类号

  • 代理机构

  • 代理人

  • 地址 730000 甘肃省兰州市天水南路222号

  • 入库时间 2023-12-18 09:52:52

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-02-02

    授权

    授权

  • 2015-08-19

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20140121

    实质审查的生效

  • 2015-07-22

    公开

    公开

说明书

技术领域

本发明涉及物理、核科学技术和CAD建模等领域,核心内容是基于STEP文件的从CAD 模型到MCNP几何模型的转换算法。

背景技术

蒙特卡洛中子-光子输运程序MCNP(Monte Carlo N-Particle Code)是美国新墨西哥洛 斯阿拉莫斯国家实验室应用理论物理部的Monte Carlo小组经过数十年的研究开发的一个基 于蒙特卡洛方法的大型多功能Monte Carlo粒子输运程序。因其良好的粒子输运性能在物理、 核科学领域有着广泛的应用。但其输入文件(INP file)结构复杂,手写容易出错等问题, 国际上出现了很多解决这一问题的软件,类似Visual Editor,Moritz,DesignModeler,MCAM 等软件,由于这些软件有的不能添加材料,有的不能对导入的模型进行修改等原因不能满足 用户的需求。另外,能解决上述问题的思路大致有三类,意思从BREP表示到CSG表示的转换, 二是基于大型三维建模软件的二次开发,三是基于中性文件的转换。第一种由于两种转换的 表示涉及到大量的数学知识和计算机图形学的知识,在转换的过程中会带来诸多麻烦。第二 种太容易受到软件本身数据结构定义的限制,并在一般大型的三维建模软件像CATIA和 solidworks等都是商业软件,版权很贵。因此我们提出了基于中性文件STEP(Stander for the  Exchange of Product Model Data)的从CAD模型到MCNP几何模型的转换算法。因为CAD系 统具有强大的几何建模功能,我们可以将CAD系统构建的模型导出成STEP文件后在转换为 INP file。

STEP标准是ISO(国际标准化组织)提出的信息交换标准,通过一种不依赖于任何系 统的中性机制,为解决不同CAX系统间的数据交换和共享提供了可行性。STEP可以被多种CAD 建模软件支持,因此通过设计STEP文件到INP文件的转换算法以实现CAD模型到MCNP模型 的转换,最终实现MCNP辅助建模,这样的转换算法具有通用性,可实现多个CAD系统与MCNP 模型的交互。

发明内容

针对INP文件格式,为了实现通用的CAD建模软件与MCNP模型之间的交互,本发明 公开一种全新的基于STEP文件的从CAD模型到MCNP几何模型的转换算法。

本发明通过对STEP文件进行分析,提取文件中有用的几何信息,通过进一步几何运 算,得到INP file需要的几何信息和拓扑信息,然后根据INP文件格式将CAD模型转换成 相应的栅元卡和曲面卡形式,完成CAD建模软件与MCNP模型之间的交互。为了提高算法的灵 活性,在前一阶段对体进行分析基础上进行了改进,改进之后的算法可以直接对模型中的面 进行分析,能够输出任意模型的曲面卡。对于栅元卡的输出则采用构造栅元树的方法进行。 本部分将分为四个部分来介绍发明内容,主要分为,本算法整体思路,对STEP文件信息提取 算法,构造栅元树算法和栅元树输出算法。

本发明整体算法步骤如下:

Step1提取STEP文件中封闭壳(CLOSED_SHELL)信息:根据不同的曲面卡生成所需参数 提取STEP文件中相对应的法方向、点坐标半径、角度等信息。根据不同的栅元卡生成所需参 数提取STEP文件中相当对应体的信息,并将对应的字符转换成数字;

Step2组成封闭壳(CLOSED_SHELL)的所有曲面方程求取:根据STEP文件中的关键字先 判断出曲面的类型,然后根据Step1中提取的信息,通过数学几何计算求出各种曲面的方程。 声明新的栅元节点并根据曲面卡形式,将封闭壳中所包含的所有曲面的参数以及面信息均存 于该节点中;

Step3STEP文件中封闭壳(CLOSED_SHELL)之间包含关系判定:若封闭壳A包含封闭壳 B,则Produce(A,B)=1;若封闭壳B包含封闭壳A,则Produce(A,B)=-1;若封闭壳A与封闭 壳B不存在包含关系,则Produce(A,B)=0;

Step4栅元树构造:根据Step3中Produce(A,B)函数的返回值构造栅元树。这里假设C1 为新加入的栅元节点,C2为栅元树中的节点,将节点C1与栅元树中的所有栅元节点进行比 较即求对应的Produce(C1,C2)值。当Produce(C1,C2)=1时,将A作为B的孩子节点;当 Produce(C1,C2)=-1,将A作为B的父节点;当Produce(C1,C2)=0时,将A作为B的兄弟节 点;

Step5判断STEP文件中所有封闭壳搜索是否完成:完成时,转Step6;若没有,转Step1;

Step6选择标号方式对栅元树中栅元进行标号;

Step7曲面卡、栅元卡输出:遍历栅元树,按序输出栅元树中所有栅元节点中所包含的 曲面卡的信息于txt文件中,同时将遍历到的栅元节点作为根节点,再次遍历该节点下面所 有层的所有节点,得到它们的栅元号并以“a±f1±f2…#b#c#d…”的形式输出于同 一个txt文件中(a表示当前栅元节点栅元号,f1、f2…表示该栅元边界曲面的曲面号±表 示曲面方向,b、c、d…表示当前栅元节点下面所有层栅元节点的栅元号);

Step8算法结束。

由于在STEP文件里的信息包括了产品的整个生命周期,信息丰富,我们只需获得我 们所需的信息即可。所以本算法在对STEP文件进行信息提取时只提取对栅元卡和曲面卡输出 有用的信息。

在Step1中对于STEP文件信息的提取时采用的是按索引号和关键字的方式提取信息 的。

对于一般的STEP文件不能仅仅是按照行的模式读取,因为可能存在STEP文件不是以 行的形式来进行存储的,所以本算法采取以分号作为结束标志进行文件读取,避免了格式不 同而读取失败的情况发生。

STEP文件信息提取算法步骤如下:

Step1令K=“CLOSED_SHELL”;

Step2以分号作为读取结束标志读取STEP文件存于字符数组ch1中;

Step3判断K是否在该字符数组中,是则转Step4,否则转Step2;

Step4将字符数组ch1中括号里的索引数字存到字符数组ch2中,令K=“ch2[i]=”;

Step5以分号作为读取结束标志读取STEP文件存于字符数组ch1中;

Step6判断有关于曲面类型的字符串(如“PLANE”、“CYLINDRICAL_SURFACE”等)以及字 符串“CARTESIAN_POINT”和“DIRECTION”是否在数组串ch1中,是则转Step7,否则转Step4;

Step7根据Step6中不同的关键子类型提取不同的参数,并将字符转换成相应的数字存 到该CLOSED_SHELL所对应的栅元节点中;

Step8算法结束。

本算法在声明新的栅元节点时,节点里面包含构成封闭壳各个面的法向量、点、半径、 顶角、栅元序号、组成封闭壳的所有面的曲面卡以及指向孩子、兄弟和父亲节点的三个指针 信息。

算法中的判定封闭壳之间的包含关系采用的是点对面算法。

点对面算法实现如下(A,B与上面假设相同):提取组成封闭壳A的所有对面组,设 为(f11,f12)、(f21,f22)、(f31f32)……,取B上任意一点M,判断下面的关系式是否成立:

Σi=1n(d(M,fi1)+d(M,fi2))=Σi=1nd(fi1,fi2)

上式中d(M,fi1),d(M,fi2)表示点M到面fi1和fi2的距离

d(fi1,fi2)表示面fi1与fi2之间的距离。

n表示对面组的组数。

上式若成立则A(B)包含于B(A)中,否则B与A不存在包含关系。

除了对面组以外,组成封闭壳的曲面中还包含单独的面,即不存在面的位置与之相对 的面。

对于该类曲面,算法中进行单独考虑。如圆柱面,只需判断式子d(M,f)<R是否成 立,若成立则B包含于A中,否则不存在包含关系。

Step3中的Produce(A,B)函数采用的是点对面算法对不同的包含关系返回不同的值 即1,-1,0。

在STEP文件中封闭壳(CLOSED_SHELL)存储顺序并不是按照CAD模型 中栅元由里向外的顺序进行存放的,新加入的栅元可能包含树中的栅元,对于这种情况 Produce(A,B)函数返回值为-1。

当树中栅元包含新加入的栅元时Produce(A,B)函数返回值为1。

当树中栅元与新加入的栅元互相独立时,Produce(A,B)函数返回值为0。

根据Produce(A,B)不同的返回值采取不同的操作来构造栅元树。

构造栅元树算法步骤如下(C1,C2同上):

Step1将宇宙空间看成一个栅元,并且作为栅元树的根节点T;

Step2判断根节点的孩子节点是否为Null,是则转Step3,否则转Step4;

Step3声明一个新的栅元节点,并进行初始化。将新加入的封闭壳(CLOSED_SHELL)的信 息均存于该栅元节点C1中,一个封闭壳就可以看成一个栅元。将C1作为根节点的孩子节点;

Step4将C1和C2进行包含关系计算,得到Produce(C1,C2)值;

Step5

1)当Produce(C1,C2)=1并且C2子节点为Null时,将C1直接作为C2的子节点插入栅元 树转Step6

2)当Produce(C1,C2)=-1时,将C1作为C2的父节点插入栅元树转Step6;

3)当Produce(C1,C2)=0并且C2兄弟节点为Null时,将C1直接作为C2的兄弟节点插入 栅元树转Step6;

4)当Produce(C1,C2)=1并且C2子节点不为Null时,令C2为C2的子节点转Step4;

5)当Produce(C1,C2)=0并且C2兄弟节点不为Null时,将C1直接作为C2的兄弟节点插 入栅元树转Step4;

Step6算法结束。

本算法采用构造栅元树的方法存储整个空间中所有栅元信息以及组成该栅元的所有 曲面的曲面卡信息。在进行曲面卡以及栅元卡的输出过程中只需对该栅元树进行遍历即可, 并且栅元树具有随意扩充,灵活性大等特点,在对复杂的CAD模型处理过程中更具优势。

在进行栅元标号的过程中,本算法采用自动编号和人工标号两种方式进行,在进行文 件转换的过程中可以根据实际需要任意改变栅元序号,这样更有利于粒子输运的模拟。

通过前面栅元树的构造可知第n层栅元必然包含n+1、n+2…层的所有栅元,本算法 巧妙的采用遍历n+1、n+2…层中所有节点的方法,得到其栅元号,然后以“a±f1±f2… #b#c#d…”的方式对栅元卡进行输出。

栅元卡输出算法步骤如下:

Step1取栅元树中的根节点,输出该栅元节点的栅元号;

Step2遍历该节点下面各层中的节点,每遍历到一个节点就在同一行以“#栅元号”的 方式输出;

Step3判断该节点的兄弟节点和孩子节点是否为空:若孩子节点和兄弟节点均为空,则转 Step4,若只有其中一个节点不为空就将该节点作为根节点转Step2,若两个节点均不为空 则将孩子节点作为根节点转Step2之后继续将兄弟节点作为根节点转Step2;

Step4算法结束。

附图说明

图1是整个STEP文件转换算法流程图

图2是栅元节点中所包含的所有信息结构图

图3是STEP文件信息提取算法流程图

图4是栅元树构造算法流程图

图5是本发明栅元树构造的实施案例示意图

图6是本发明的一个实施案例示意图

具体实施方式

实施例1,本实施例涉及一般的CAD生成文件STEP文件的转换方法,其流程图参照 图1。具体的步骤包括STEP文件信息提取、栅元树构造、对栅元树中栅元进行标号、曲面卡 输出和栅元卡输出。

步骤一、STEP文件信息提取

1)以分号作为结束标志,搜索STEP文件中含有关键字“CLOSED_SHELL”的字符串(如 #96=CLOSED_SHELL('',(#97,#98,#99,#100,#101,#102));),将其后面括号内的所有索引序号 字符加上字符“=”存于一个字符数组中(ch[]={“#97=”,“#98=”,“#99=”,“#100=”, “#101=”,“#102=”};),然后搜索文件中含有ch[i]的字符串(下面以ch[0]为例)得到 “#97=ADVANCED_FACE('',(#113),#105,.F.);)”。

2)对于含有关键字“ADVANCED_FACE”的字符串,为了避免信息冗余,只将索引号“#105” 放于索引字符数组内,继续搜索含“#105=”的字符串,得到“#105=PLANE('',#232);”。

3)此时,由关键字“PLANE”可确定“#97”代表的是一个平面(STEP文件中不同类 型的曲面对应不同的关键字,常见的有“CYLINDRICAL_SURFACE”圆柱面、 “SPHERICAL_SURFACE”球面、“CONICAL_SURFACE”圆锥面和“PLANE”平面,不同的关键字有 不同的搜索信息),继续搜索含“#232=”的字符串,得到 “#232=AXIS2_PLACEMENT_3D('',#285,#246,#247);”。

4)对于含有关键字“AXIS2_PLACEMENT_3D”的字符串,同样为了避免信息冗余,只将 索引号“#285”和“#246”放于索引字符数组内,继续搜索含“#285=”和“#246=”的字符 串,得到“#285=CARTESIAN_POINT('',(-30.,17.3205080756888,100.));”和 “#246=DIRECTION('',(1.,0.,0.));”关键字“CARTESIAN_POINT”表示点,“DIRECTION”表 示该平面的法向量。

5)处理含有关键字“CARTESIAN_POINT”和“DIRECTION”的字符串:直接提取出点坐 标和向量坐标并将其转换成数字,存于该(CLOSED_SHELL)对应的栅元节点中。设转换后平 面法向量、点(x0,y0,z0),便求得平面方程为:

Ax+By+Cz-D=0

其中D=Ax0+By0+Cz0,将对应的曲面卡和曲面号(每增加一个曲面,曲面号加1)存于该栅 元节点中。

表一,得到不同种类面的曲面卡以及判断栅元之间包含关系需要提取的STEP文件中 的信息:

步骤二、栅元树构造。构造步骤见图4,现对图6的栅元树进行构造(将栅元节点E, F插入栅元树中,E包含于栅元C中,F包含C且与A和D互相独立)。

1)将树中所有栅元A,B,C,D与栅元E进行包含关系判定,E先与栅元树中的栅元A进 行包含关系判定得Produce(A,E)=0(即栅元E与栅元A相互独立)。

2)按照算法流程图4,下一个与E进行包含关系判定的栅元为C,得Produce(C,E)=1(即 栅元E包含于C中)。

3)按照算法流程图4,下一个与E进行包含关系判定的栅元为栅元C的子节点,而C 的子节点为空,从而E将作为栅元C的子节点插入到栅元树中。

4)将树中所有栅元A,B,C,D,E与栅元F进行包含关系判定,F先与栅元树中的栅 元A进行包含关系判定得Produce(A,F)=0(即栅元F与栅元A相互独立)。

5)按照算法流程图4,下一个与F进行包含关系判定的栅元为C,得 Produce(C,F)=-1(即栅元F包含C)。又C的兄弟节点不为空,下一个与F进行包含关系判定 的栅元为D,得Produce(D,F)=0(即栅元F与D互相独立)。

6)按照算法流程图4,将F作为C的父节点插栅元树中,并且将F作为A的兄弟(即 将A的兄弟指针指向F),将D作为F的兄弟节点(即将F的兄弟指针指向D)。

7)栅元树构造结束。

步骤三、对栅元树中栅元进行标号

步骤三有两种标号方式可以选,即自动标号和人工标号。自动标号只需遍历整个栅元 树,每遍历到一个栅元节点,栅元号就加一,并且将栅元号存于栅元节点中。对图7进行自 动标号(后根遍历标号)结果如图8。人工标号方式即按照个人意愿和实际需要对栅元树中栅 元进行标号,在进行人工标号的过程中采取对其中指定的几个栅元进行标号,其他栅元随意 的方式,此种情况标号的具体步骤如下:

Step1对栅元树进行遍历,在遍历的过程中选取要进行人工标号的栅元,写入人工标号,并 且记录标号最大值Max;

Step2重新遍历栅元树,对未标号的栅元标号,标号数字从Max+1开始;

Step3标号结束。

步骤四、曲面卡输出和栅元卡输出。

1)曲面卡输出,遍历栅元树,每遍历到一个栅元节点就将组成该栅元节点中的曲面卡 按照的方式输出曲面号和曲面卡。

2)栅元卡输出,对图5进行栅元卡输出。从下往上遍历该栅元树,输出的第一个栅 元为B,又B无孩子无兄弟,所以只输出B栅元号1,遍历到第二、第三个栅元为E、D与B 性质相同从而只输出栅元号2,3(这里只对栅元号输出进行讨论)。

3)接下来遍历到栅元节点C,将C作为根节点,遍历C的下面所有层的所有节点得到 节点E,按照栅元卡输出形式得到第四个栅元的栅元卡为“4#2”。接下来按照得到第四个 栅元栅元卡的方法依次处理节点F,A和根节点。分别得到“5#2#4”,“6#1”和“7#1#2 #3#4#5#6”,按行输出到txt文件中。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号