# IDEALS3D_pub **Repository Path**: buaa-spl/ideals3d_pub ## Basic Information - **Project Name**: IDEALS3D_pub - **Description**: Inverse Design of Energetic materiAl Structures for 3D - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-24 - **Last Updated**: 2025-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IDEALS3D (Inverse Design of Energetic materiAl Structures for 3D) > 含能材料结构的三维逆向设计 ## Quick start!!! Run RunPaper.sh and the results will be stored at Share/G47800/Model/DDPM-0.15-50000epoch/Generate ## 1 目标 以固体火箭发动机装药为例,实现含能材料结构的三维逆向设计。即给定一个发动机的内弹道曲线(pc~t),生成一系列与内弹道曲线相匹配的装药结构。必要时需要在生成结果的基础上开展装药微调,以满足特定工程需求(如装配和工艺) - **装药插值**:在高维设计空间中,通过插值方法实现药型的连续演变。比如将一个车轮型装药连续演变为一个翼柱形装药。 - **装药生成**:在高维设计空间中,通过生成式扩散模型,实现一定条件下药型的生成。比如生成一系列装药结构,使其内弹道曲线与给定曲线相匹配。 - **装药微调**:在生成结果的基础上,通过优化算法,实现装药结构的微调,以满足特定工程需求。 ## 2 方法 ### 2.1 三维药型数据集 首先,在COMSOL中使用参数化建模方式建立约42种装药的几何模型,在一定范围内随机选取几何尺寸,形成47800个装药实例。然后,在每个三维模型的初始燃面处划分三角形网格(保存为BS.stl文件)、空腔区域划分四面体网格(保存为CR.txt文件)、固体区域划分四面体网格(保存为SR.txt文件)。接着,在空腔区域和固体区域随机取点,形成点云,以计算点云的符号距离场(SDF),形成训练集。最后,使用同样的方式再次随机取点,形成区别于训练集的点云,构成测试集。 ### 2.2 三维药型特征提取 构造基于深度程函法的自动解码器架构(Deep Eikonal Auto Decoder, **DEAD**)实现药形特征提取。DEAD神经网络的输入为空间坐标、隐向量(latent vector)和几何向量(geometry vector,三个分量,分别是装药无量纲长度、星角数和封头椭球比),输出为符号距离场(SDF)。其中,不同的隐向量代表不同的药型SDF,**可以通过改变隐向量来表达不同的装药形状**。训练过此分为两步:1)预训练。使用标记SDF数据作为Loss,训练DEAD神经网络,使其能够从给定的点云数据中学习到装药特征。2)物理信息微调。使用标记SDF数据和程函方程残差共同作为Loss,微调DEAD神经网络,使其能够更好地满足程函方程。 为了指导调整超参数和评估训练结果,提出基于SDF和程函方程的二维评估方法。训练过程中,需要在测试集上计算SDF残差和程函方程残差,确保他们同步减小,避免出现过拟合现象。 ### 2.3 装药性能与结构特征数据集构建 获得训练集中每个药型(47800个)的隐向量(latent vector)和几何向量(geometry vector)之后,还需要再添加随机的属性向量(property vector,五个分量,分别是无量纲推进剂能量值、无量纲燃速、无量纲压力指数、无量纲装药半径和无量纲喉部面积)以扩充数据量。之后,计算每个药型的内弹道性能曲线向量(performance vector)。最终,将隐向量lv、几何向量gv、内弹道曲线向量bv和属性向量pv一一对应,构成一个丰富的装药性能与结构特征数据集(Performance and Structure Feature Dataset,PSFD)。 ### 2.4 装药结构生成 装药逆向设计可以抽象为:**以内弹道曲线向量bv和属性向量pv为条件,生成符合先验的隐向量lv和几何向量gv**。 使用生成式扩散模型DDPM,以性能向量和属性向量为条件,从纯粹的g高斯噪声出发,通过马尔科夫链一步步去躁,最终生成符合先验分布的隐向量和几何向量。所生成的隐向量通过DEAD解码器解码,可得到对应的装药三维模型。为了增强性能向量和属性向量的条件表达效果,我们采用了基于多头注意力机制的Transformer encoder完成性能取消的特征提取,使用Classifer-free guidance技术调节生成结果的多样性。设计人员可以在诸多生成的结果中进一步寻优,以找到容易工程实现的结果。 ### 2.5 装药结构微调 对于工程问题,还存在装配工艺问题。比如为了安装潜入式喷管,需要在装药出口处留有一定空间;为了在头部安装点火器,需要在装药头部开孔;为了满足火箭总体需求,需要限制装药总长度。而装药逆向设计的结果不一定能满足这些工程约束条件,因此需要完成装药结构的微调。微调过程即为一个优化的过程:在已生成的隐向量基础上进一步优化隐向量,使得内弹道曲线匹配程度最高,且可以满足给定的工程约束条件。鉴于每次计算目标函数时需要计算内弹道曲线,计算量巨大,不便于工程应用。为了简化,将目标函数修改为**最小化隐向量距离初始值的欧式距离**,这意味,**装药微调可以在尽量不改变药型主要特征的前提下,微调药型,使得其结构满足工程约束条件。** ## 3 难点 (1)三维药型数据集的建立。工作量大,数据匮乏。 (2)DEAD模型的训练。由于Loss中引入程函方程残差,需要完成自动求导计算,较耗费显存资源。 (3)DDPM模型的训练。装药生成结果受到超参数的影响较大,需要反复调试。 ## 4 特色 本方法使用基于深度程函法的自动解码器架构实现了药形特征提取,进而使用生成式扩散模型实现了特征的生成,最终实现了装药结构的三维逆向设计。具体地: (1)装药逆向设计是一项极具创新性与挑战性的课题。传统的几何参数优化式设计范式必须事先选定药型,不能称之为完整的逆向设计;新发展的形状优化范式,虽然可以生成新的药型,但往往需要大量的迭代计算,且生成的药型往往不满足工程约束条件。而本方法可以生成大量合理可行的结果,显著提升装药设计效率。 (2)我们提出了一种**基于深度程函法的自动解码器架构**(Deep Eikonal Auto Decoder, **DEAD**)实现了装药特征提取。DEAD神经网络的输入为空间坐标、隐向量和几何向量,输出为符号距离场(SDF)。其中,不同的隐向量代表不同的药型SDF,**可以通过改变隐向量来表达不同的装药形状**。DEAD架构是神经场、自动解码器与物理信息神经网络法的创新结合,充分利用了神经场在表示三维形体数据方面的优势,又充分利用了自动解码器在特征提取方面的优势,还充分利用了物理信息神经网络法在处理偏微分方程方面的优势。 之所以称之**深度程函法**是因为在训练过程中在训练过程(微调阶段)中直接采用**程函方程的残差作为Loss**,而非传统上采用完全的监督训练方式。充分利用物理信息神经网络法的无网格特性(mesh-free),我们在训练过程中设计了3套点云,分别为:A)初始燃面点云BS;B)空腔区域点云CR;C)固体区域点云SR。程函方程的残差以及边界条件在这三套网格上计算完毕之后加权形成损失函数Loss,以指导DEAD的训练过程(微调阶段)。与DeepSDF方法相比,DEAD可以从偏微分方程的角度真正学会求解不同装药的燃面推移问题,达到增强其泛化能力消除过拟合的目标。与基于气固二义分割的装药生成方法相比,DEAD在训练过程中就完成了燃面退移,解码后的SDF场不仅包含了气-固空间分布,还描述了整个燃面退移过程。这样做,规避了在推理过程中耗时的三维装药燃面推移计算问题,大大提升了计算效率。 为了节省**深度程函法**的显存消耗,我们并不会依次将每个batch(如64个药型)的所有点云都加载到GPU完成Loss计算,而是从每个batch中随机抽取一小部分点云加载到GPU完成Loss计算,从而大大降低了显存消耗。经试验,这种做法对收敛性无明显影响。 (3)使用生成式扩散模型DDPM实现装药生成,可以高效产生大量合理可行的结果,显著提升装药设计效率。经过k-means聚类之后,设计师可以在集中基本模式中进一步则优,以找到容易工程实现的结果。 (4)特别地,对于一些工程约束条件较强的问题,还可以通过装药结构重构的方式(优化隐变量、燃速和装药半径),留足安装喷管的空间,增加性能匹配程度,提升装填分数,以满足实际工程需求。 ## 5 DEAD模型训练流程 ### 5.1 环境配置 模型的训练过程建议在A800 GPU (显存为80GB)上完成 模型的推理过程可以在A5000 GPU (显存为25GB)上完成 - python-3.8.20(**建议使用anaconda管理**) - pytorch-2.4.1 / pytoch-cuda-12.1,用于神经网络构建与训练 ```bash conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia ``` - paraview-5.10(**可通过下载安装openfoam12间接获得** [请参考](https://openfoam.org/download/12-ubuntu/)),用于可视化结果和燃面面积计算 - tqdm-4.66.5,用于显示训练进度条 - pyevtk-1.6.0,用于输出vtk文件 - matplotlib-3.7.5,用于绘制曲线图和三维点云图 - numpy-stl-3.1.2,用于读取stl文件 - scipy-1.10.1,用于积分计算 - umap-learn-0.5.7,用于高维隐向量可视化 - sklearn-1.3.2,用于聚类分析 运行前首先需要声明环境变量,以确保python可以找到`IDEALS3D`根目录和`paraview`的python库。 以笔者为例,则是以下命令 ```bash # 添加IDEALS3D的路径 export PYTHONPATH="$PYTHONPATH:/home/hpc/program/IDEALS3D/" # 添加paraview的python库路径 export PYTHONPATH="$PYTHONPATH:/opt/paraviewopenfoam510/lib/python3.8/site-packages" ``` (非必要)此外,如果需要让vscode的pylance正确工作,可以找到`IDEALS3D`根目录,需要在`settings.json`中添加以下内容 ```json { "python.analysis.extraPaths": [ "/opt/paraviewopenfoam510/lib/python3.8/site-packages" ] } ``` ### 5.2 设置配置文件 ... ### 5.3 生成数据集 ... ### 5.4 开始训练 ... ### 5.5 解码 ... ### 5.6 燃面面积计算 ... ## 6 DDPM模型训练流程 ### 6.1 环境配置 同5.1 ### 6.2 设置配置文件 ... ### 6.3 生成PSFD数据集 ... ### 6.4 开始训练 ... ## 7 模型应用 ### 7.1 装药插值 执行以下命令,完成双线性插值 ```bash python DEAD/AutoDecoder/Evaluation/Interpolation.py ``` ![插值结果](doc/join.png) ### 7.2 装药生成 执行以下命令,完成特征向量的生成,包括(lv,gv,av1). 保存在Samples.npz文件中。 ```bash python DDPM/Evaluation/Generation.py ``` 执行以下命令,完成UMap的绘制,可以在二维空间中绘制出高维特征空间。如果之前没有UMap模型,需要先训练模型。 ```bash python DDPM/Evaluation/UMap.py ``` ![UMap结果](doc/distribution.png) 执行以下命令,完成特征向量的聚类分析,过滤掉重复的解,将聚类后的解保存在Samples_clustered.npz文件中。 需要注意的是,我们使用的kMeans算法,需要人为设定聚类中心数,可参考UMap图像决定聚类中心数。 Tips:聚类步骤是非常重要的,可以将生成的**成千上万个解过滤为十余个解**,极大减少计算量。 ```bash python DDPM/Evaluation/Clustering.py ``` 执行以下命令,使用DEAD完成解码(代码一并也完成了燃面退移计算) ```bash python DDPM/Evaluation/Decoding.py ``` 执行以下命令,完成内弹道计算 ```bash python DDPM/Evaluation/InternalBallistic.py ``` ### 7.3 装药微调 执行以下命令,在生成装药的基础上开展装药微调,必要的输入设置参数见`OPT/Dictionaries/dictionary.xml` ```bash python OPT/Optimization.py ``` 执行以下命令,完成解码。解码可得到优化前的装药和优化后的装药,优化过程的装药则被省略 ```bash python OPT/Evaluation/Decoding.py ``` 执行以下命令,完成内弹道计算 ```bash python OPT/Evaluation/InternalBallistic.py ``` ![优化过程](doc/output.gif)