数字旗手

电气化、自动化、数字化、智能化、智慧化

0%

本文尝试详细地走一遍MOOSE的运行路径,对其加深理解。 编译 MOOSE是一个大型工程,从它的编译过程可以看出各个部分之间怎样联系起来。这里以MOOSE的第一个例子为研究对象,分析整个过程。其路径在: 1 moose/examples/ex01_inputfile 整个编译过程都写在了Makefile文件中。 定义环境变量 首先先定义一下环境变量: 1 2 3 EXAMPLE_DIR ?= $(shell dirname `pwd`) MOOSE_DIR ?= $(shell dirname $(EXAMPLE_DIR)) FRAMEWORK
Read more »

引子 MOOSE,全名是Multiphysics Object Oriented Simulation Environment,是一套求解多物理场耦合的工程问题的框架。其设计规范,采用面向对象的编程范式,非常易于扩展和维护,而且尽可能地隐藏问题背后的计算数学问题,比如自适应网格算法、并行计算技术等,使得用户能够着眼于自己所要研究的科学问题。 特点 其有如下特点: 1. 与维度无关的编程,用户代码不需要考虑维度问题 2. 基于有限元,可以是连续有限元,也可以是间断有限元 3. 多物理场耦合,隐藏编程细节 4. 非规则网格,有多种形状:三角形、四边形、六边形、六面体、八面体等,可读入和
Read more »

引子 moose的相场模块提供了通用的求解相场模型的算法,其通式采用的是自由能泛函的原始形式,只要用户要求解的模型满足这里内置的方程形式,那么用户仅需要提供自由能的导数和材料参数,就可以迅速进行模拟。比如教程中的调幅分解模型。 如果用户不能知道相场的原始形式,也可以自己开发模型,比如用于模拟枝晶生长的Kobayashi模型,就不满足上述规则,此时可以自己创建模型。 牛顿迭代法 moose内核模型的表达形式是将原来的控制方程中的右端项都移动到左端,得到这样的形式: 其中,N是分量的个数。 如果写成有限元函数的形式: 其中: 即,原来的连续的场变量由节点上的离散的系数来代替。 单变量求根
Read more »

2016-12-26更新: 将方程求解过程更加细致地表述。 引子 本例展示了一种无矩阵(matrix-free)方法的使用,即不明确存储矩阵元素来求解二阶变系数Possion方程。同时求解时使用了多重网格算法。 应用无矩阵方法的原因是:当前科学计算的一个瓶颈是对于内存而不是高速缓存中的数据的读取:比如对于一个矩阵和一个向量的乘法运算,现在的CPU能很快地计算浮点数的乘法和加法,但通常需要很长时间等待数据从内存中传入。因此,如果我们不再从内存中寻找矩阵元素,而是重新计算它们,那么可能整体时间就能减少。 这个无矩阵方法中还涉及向量化/矢量化编程:把for循环的操作,用矩阵操作的形式代替。在向量化
Read more »

引子 自适应网格是一项很重要的减小计算量、提高计算效率的方法。 流程 求解步 在求解步时,传入时间步数来判断是否自适应: 1 adaptiveRefine(currentIncrement); 如果时间步数满足要自适应的间隔,那么就开始自适应: 1 2 3 if ((currentIncrement>0) && (currentIncrement%skipRemeshingSteps==0)){ this->refineMesh(currentIncrement); } 这个refineMesh函数会调用init函数参数是非0的情形: 1 init(_currentI
Read more »

引子 本例将使用PRISMS-PF模拟凝固过程中的枝晶生长。因为原先的PRISMS-PF架构中在构建右端项时只有接收一步解,而枝晶的浓度场控制方程与相场参量的变化率相关,即需要用到相场的前后两步解,所以需要扩展PRISMS-PF的原先架构,本例也主要是说明怎样对原程序进行扩展。 获得源码 源码在这里 扩展过程 定义要使用解的个数 在parameter.h中新增宏定义numSolution,其决定方程中用到几步解,比如在枝晶生长的模拟中用到两步解,其就等于2,之前的所有模拟中都等于1。 1 #define numSolution 2 这里涉及头文件的包含顺序,放在后面定义的话,会不
Read more »

引子 PRISMS-PF的1.0版本相对于最开始的0.8版本,进行了较大的重构,更加模块化,更加容易扩展。同时引入了更加多的功能,比如施加各种边界条件,引入自适应网格等。但带来的一个问题是:文件数量增多,且互相调用,刚开始很容易在文件跳转之间绕晕,所以需要理清整个文件结构和程序运行脉络。 文件结构 基础头文件 首先是deal.II的各种头文件: 1 include/dealIIheaders.h PDE的无矩阵解法的模板类: 1 include/matrixFreePDE.h 包含各种属性的物理场的模板类: 1 include/fields.h 模型中用到的变量
Read more »

概述 PRISMS是“PRedictive Integrated Structural Materials Science”的缩写,是美国能源部旗下的一个软件创新中心,致力于开发用于多尺度结构材料模拟的开源计算工具。该中心目前已释放出多个开源软件,基于包括相场模型、晶体塑性模型等。这里是对PhaseField的学习。源码在这里。 几点说明: * 最好是从最早的v0.8学起,v0.8是最早公开的代码,程序结构简单,耦合程度低,便于学习。 * PRISMS-PF的版本与其所基于的deal.II版本需要对应,v0.8基于deal.II的v8.2.1,v1.0基于v8.4.1。这是因为deal
Read more »

引子 本例提供了一个框架来应用MatrixFree类,既包括求解非线性偏微分方程过程,同时演示MatrixFree类怎样处理“constraints”以及如何在分布式节点上并行。这个算例显示基于单元的运算在六面体单元的二阶或更高阶插值上要比稀疏矩阵-向量乘法快得多,能达到后者10倍的浮点运算速率。 使用MatrixFree类,可以不用组装一个大型的稀疏矩阵,其运算都是基于单元。这里的并行也充分利用了现代超算机器的架构,分为三个层级: * 不同节点之间使用MPI并行 * 单个节点内使用“动态任务规划”进行线程并行 * 单个核心内使用处理器的向量单元进行显式向量化并行 很多通用有限元包,
Read more »

引子 本文是对曾攀老师的《有限元分析及应用》和王勖成老师的《有限单元法》关于单元刚度矩阵和整体刚度矩阵部分的学习笔记。 刚度矩阵在有限元方法中占有最重要的位置,分析和了解其性质对于我们更深层次地掌握有限元法具有重要的作用。不同的方程对应不同的刚度矩阵,所以,具体刚度矩阵的性质需要针对具体的方程才能下定论。这里只对结构力学的刚度矩阵进行初探,以期对其他方程也能有更深的理解。 单元刚度矩阵的性质 性质1:矩阵元素具有明确物理意义 以一维2节点杆单元为例,其刚度方程为: 分两种情况进行具体讨论: (1)考虑单元左端,即节点1,发生单位位移,而右端,即节点2,固定: 此时: 这说明,$k_{
Read more »