数字旗手

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

0%

本文转载自这里,修正了一些格式和文字错误。 引子 在C++发明阶段,C++之父Stroustrup和贝尔实验室的C++小组对原先的宏方法进行了修订,对其进行了简化并将它从预处理范围移入了编译器。这种新的代码替换装置被称为模板,而且它变现了完全不同的代码重用方法:模板对源代码重用,而不是通过继承和组合重用对象代码。当用户使用模板时,参数由编译器来替换,这非常像原来的宏方法,却更清晰,更容易使用。 模板使类和函数可在编译时定义所需处理和返回的数据类型,一个模板并非一个实实在在的类或函数,仅仅是一个类和函数的描述。由于模板可以实现逻辑相同、数据类型不同的程序代码复制,所以使用模板机制可以减轻编程
Read more »

Intro 1 第一个例子演示了怎样创建一个Mesh Object。 头文件: 1 2 3 #include "libmesh/libmesh.h" //用来初始化库 #include "libmesh/mesh.h" //包含基本的mesh功能 using namespace libMesh; //所有的东西都在libMesh命名空间中 入口函数代码: 1 LibMeshInit init (argc, argv); // 初始化,这是必要的一步,因为libMesh可能依赖其他的比如MPI、PETSc等函数库 因为该程序的用法是: 1 ./ex1 -d DIM
Read more »

本文尝试详细地走一遍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 »