限制条件是什么?
正确的限制条件规范对于PDE系统的解法至关重要
在一个FlexPDE脚本中,限制条件被表示成为行走的边界
原始的限制条件类型是VALUEHE和NATURAL
VALUE边界条件指定为必须在区域边界内变化的数值。
NATURAL边界条件限制为一个区域边界内的通量。(NATURAL边界条件的精确含义取决于边界条件所确定的PDE,详细情况在“natural boundary conditions”章节中有所说明)
例如,在上面提到的的扩散问题中,我们在底部和顶部边缘增加固定数值,以及零通量条件,如下所示:
BOUNDARIES
region 1
start(0,0)
value(u) = 0 line to (1,0) { fixed value on bottom }
natural(u)=0 line to (1,1) { insulated right side }
value(u)=1 line to (0,1) { fixed value on top }
natural(u)=0 line to finish { insulated left side }
…
怎样提出我的问题?
FlexPDE可以阅读用可读性语言来描述的,关于待解决问题特性的文本脚本。在简单应用中,脚本将非常简单,而复杂的应用则可能要求对FlexPDE功能的更多了解。在下面的讨论中,我们将从FlexPDE的简单特征开始,随着我们的进程逐步深入到更加复杂的特性中。
FlexPDE拥有一个内置的编辑器,通过它您可以建立您的问题脚本。您可以编辑脚本并运行,然后再编辑再运行直到您得到您所需要的结果。您可以保存脚本以备将来使用或者将其作为今后修改的基础。
开始一个问题设置的最简单办法就是复制一个已经存在的相似的问题。
但是也有其他的办法,定义四个基础部分:
定义变量及方程式
定义域
定义具体的参数
制定图片输出
这些步骤在以下几个部分将会加以描述。我们将应用一个简单的二维热流问题来作为实例,通过运用FlexPDE中的最基本元素来建立脚本。在接下来的部分,我们将把脚本加以完善,以改进的方式把FlexPDE更强大的能力加入其中。三维应用强烈的依赖于二维概念,我们将在一个单独的章节中进行阐述。
接下来我们将不会着力于全面阐述全部有用的选项,而是通过说明最常用的窗体来使用户清楚软件的概念。在FlexPDE的说明书中将会包含全部选项的详细描述。某些选项也可能会在以后的章节中有所介绍。
问题设置指导
在为FlexPDE陈述问题时,以下有一些应该遵守的指导规则。
起始于物理系统的基本综述,基本守恒原理的表达常常比频繁出现在教科书中的沉重的数据处理仿真“简化”要更好操作。
起始于一个简单的模型,可能一个你已知道答案的问题更适宜。这样你既可以检验你对于的问题陈述是否正确,又可以增加您对于FlexPDE可靠性的信心。(一个有效的方法是假定一个解析答案,将其插入PDE来生成得出计算结果所必须的源条目。确定已经将合适的边界条件考虑其中)
开始的时候不必担心非线性系数或具体特性的精确形式。尝试求解一个简单问题,然后添加其他复杂条件。
制订出范围。首先描绘出外部界限,将边界条件定位为您所需要的。然后覆盖其他具体区域,之后的区域将会覆盖或取代其下面的区域,这样你就不用重复很多复杂的界面。
详细说明在求解过程中可能会有所帮助的任何事情。不要只是将您所需要的结果进行区分然后不知道为什么会发生错误。抓住反馈。
符号
大多数情况下,FlexPDE中的符号像在程序设计语言中的符号一样都是简单的文本用法。
微分可以通过dx()形式来表示,所有的同等命名都可以被识别,如二级衍生符号dxx(),向量操作:div,grad,curl等。
命名不分大小写,F和f相同。
变量和方程式
FlexPDE需要知道的两个主要的信息是:您要分析的变量是什么,定义他们的偏微分方程是什么。
问题脚本的VARIABLES和EQUATIONS部分提供这些信息。二者是紧密相关的,所以对于每个变量都必须有一个对应的方程。
在简单问题中,您可能只有一个变量,如电压或温度。此时,您可以简单的将变量和方程式声明为:
VARIABLES
Phi
EQUATIONS
Div(grad(phi))+S=0
在更加复杂的情况下,可能会出现多个变量和方程。FlexPDE需要知道如何把方程同变量关联起来,因为构建模型时的一些细节需要依靠这些联系。
变量和方程相联系的最简单的方式是按照顺序:
VARIABLES
A,B
EQUATIONS
Div(grad(A)) + B = 0
Div(grad(B)) + A = 0
第一个等式被假设成是用来定义所列的第一个变量的,依此类推。
事实上更清楚的方式是标记出每个方程以及其定义的变量:
EQUATIONS
A: Div(grad(A)) + B = 0
B: Div(grad(B)) + A = 0
绘制范围
问题的范围在BOUNDARIES部分中描述了,由REGIONS组成,每一个都被假定为具有唯一的具体特性。一个REGION可能包含许多闭合的循环或岛,但是它们被假定为属于同一种特性。
一个REGION的详述从声明REGION<number >开始,头文件后的所有的循环都包含在这个部分。
后面的REGIONS覆盖前面的REGIONS
REGION可以命名,如REGION<number>“Name”形式
REGION 1应该包含全部区域
Region的形状被描述成为绕着周界行走,从一个接点到另一个LINE或ARC部分。每一个部分都假定它与前面部分的终点相连的,而START语句使事件滚动。您可以使用FINISH来使某部分归回起点。
矩形区域由四条线组成:
START(x1,y1) LINE TO(x2,y1) TO (x2,y2) TO (x1,y2) TO FINISH
(当然,任意四边形都是具有同样的构造,所改变的仅仅是坐标而已。任意多边形都可以通过增加点来构建)
弧可以用多种方法创建,最简单的一种是通过描述原点和角度来完成:
START(r,0) ARC(CENTER=0,0) ANGLE=360
弧也可以通过详细说明原点和终点来说明:
START(r,0) ARC(CENTER=0,0) TO (0,r) { a 90 degree arc }
(如果原点和起点的距离不等于原点和终点的距离,那么您将建立一个椭圆弧)
环可以被命名为STARE“Name”(…)
那么BOUNDARIES部分的原型将是:
BOUNDARIES
REGION 1
<closed loops around the domain>
REGION 2
<closed loops around overlays of the second material>
…
您可以一次创建区域的一部分,使用“domain”菜单按钮来预览您目前为止所创建的图样。
“save”和“save as”菜单按钮允许您在工作中随时保存您的工作,以防万一。
一个问题的例子
让我们建立一个包含在两个平面之间的圆形的作为范例。我们将简单的将平面处理为正方形的上下面,圆在其间居中。使用以上的声明,增加所需的控制标签,我们得到:
BOUNDARIES
REGION 1 'box' { the bounding box }
START(-1,-1) LINE TO(1,-1) TO (1,1) TO (-1,1) TO FINISH
REGION 2 'blob' { the embedded circular 'blob' }
START 'ring' (1/2,0) ARC(CENTER=0,0) ANGLE=360 TO FINISH
提示:建立区域边界的详细规则在相关章节"Sections | Boundaries"有所介绍。
建立一个网
当您选择“run”按钮时,FlexPDE将会开始自动创建有限元素网以适合您所描述的区域,在自动产生的网中,单元的大小将由区域边界中的外部点间的空间决定,或者由弧的曲率决定。
在我们的实例中,自动完如下所示:
图…
注意区域2的圆形边界被绘制成单元支架。
这里有几个可以让用户用来改变自动生成的网的控制按钮。在“控制网的密度”一章的相关部分有详细介绍。
作为范例,我们可以通过使用修改器NODE_SPACING来将区域2的圆形区域的网格设得更加密集:
NODE_SPACING:
REGION 2 'blob'{ the embedded 'blob' }
START(1/2,0)
NODE_SPACING = 0.05
ARC(CENTER=0,0) ANGLE=360 TO FINISH
产生的网如下图
图…..
多数情况下,干涉网的生成并不必要,因为就像我们将要看到的一样,一旦FlexPDE在解法中察觉到有明显曲率就会适度的调整网。
定义具体参数
多数实际问题的复杂度都来源于一个事实,在微分方程组中的系数在会随着构成结构的物质不同而有不同的值。
在FlexPDE中有两个简单的方法解决了问题。首先,物质参数是被命名的而且默认值已经在DEFINITIONS部分中给出,其次,物质参数也已经在所限制区域中被赋值。
到目前为止,无论测试问题是热能流动问题还是静电问题或者其他方面的问题,影响并不明显。尽管如此,为了在以下的讨论中更加具体,让我们来假定它是一个热量问题,描述的是一个埋入导体的绝缘体,导体位于热源之间。我们给绝缘体一个0.001的传导率,设定周围的导体的传导率为1。
首先,我们定义常数的名称并在定义区间赋予其默认数值:
DEFINITION
K=1
现在让我们将常量代入方程式
EQUATIONS
Div(-k*grad(phi)) = S
之后我们来详细说明一下区域2的区域值:
REGION 2'blob'{ the embedded blob }
K=0.001
START(1/2,0) ARC(CENTER=0,0) ANGLE=360 TO FINISH
[提示:为了表达清晰,我们也可以在区域1中将导体的传导率定义为1]
设置边界条件
边界条件被指定为区域中沿周长移动的修改器。
边界条件的主要类型为VALUE和NATURAL
VALUE边界条件设定了值,即变量必须取在区域边界上。
NATURAL边界条件设定了区域边界的通量。通过laplace方程,NATURAL边界条件与neumann或者正常的派生边界条件是等价的。
[提示:NATURAL边界条件的精确含义取决于已设的边界条件的PDE]
每一个边界条件的声明都是变量命名的理由。这些命名将边界条件和所列方程式之一相关连,因为实际上方程式是由边界条件而调控的的。例如,被VALUE(u)=0修改的方程式,原来就是由定义u决定的。NATURAL(u)=0将取决于定义u的方程的形式的含义。
在我们的范例中。假定我们希望将底边定义为零温度系数,绝缘边界在右侧,温度1度为顶边,绝缘边界在左侧。命令如下
…
REGION 1'box'{ the bounding box }
START(-1,-1)
VALUE(Phi)=0 LINE TO(1,-1) { Phi=0 in base line }
NATURAL(Phi)=0 LINE TO (1,1) { normal derivative =0 on right side }
VALUE(Phi)=1 LINE TO (-1,1) { Phi = 1 on top }
NATURAL(Phi) LINE TO FINISH { normal derivative =0 on left side }
注意VALUE或NATURAL的声明指出了将被应用于接下来的边界区域的条件,这一条件要一直应用直至陈述改变。
另外还要注意区域的形状(线或弧)在边界条件改变后将要重新设置。
[提示:其他的边界条件形式也可以被允许,参照“Sections|Boundaries”]
请求绘图输出
PLOTS部分包括绘图输出请求。FlexPDE认可四种主要绘图形式:
CONTOUR-一个自变量等高线图,可以被涂色
SURFACE-一个自变量的三维表面
VECTOR-箭头区域
ELEVATION-沿着定义路径的输出
您可以请求生产任何数量的图,图的值可以是变量,坐标以及定义参数等任意相容的代数结合。
在范例中,我们将请求一个温度等高线,一个热流矢量图,k阶grad,温度沿着中心线的正面图以及一滴水表面的常态热流的正面图:
PLOTS
CONTOUR(Phi)
VECTOR(-k*grad(Phi))
ELEVATION(Phi) FROM (0,-1) to (0,1)
ELEVATION(Normal(-k*grad(Phi))) ON 'ring'
当FlexPDE完成求解和插入网格的过程后,PLOTS部分中的输出请求就会被完成,而且满足所有的单元都在误差范围内。同PLOTS部分的形式一样但是被命名为MONITORS的部分,将在更加频繁间隔内完成暂时输出,这些输出将作为一个求解过程中的即时报告。
所有的关于PLOTS的纪录在以PG3为后缀的文件和以PDE为后缀的脚本文件中有所记载。这些记录了的部分可以通过调用FlexPDE主菜单中的VIEW项来观看。MONITORS并未记录在.PG3文件中。
[提示:FlexPDE接受其他格式的命令,包括GRID和HISTORIES分区。查看相关章节“Sections | Monitors and Plots”]
将全部汇总
在前面的部分中,我们已经逐渐建立起了一个问题规范。
汇总起来如下:
TITLE 'Heat flow around an Insulating blob'
VARIABLES
Phi { the temperature }
DEFINITIONS
K = 1 { default conductivity }
R = 0.5 { blob radius }
EQUATIONS
Div(-k*grad(phi)) = 0
BOUNDARIES
REGION 1 'box'
START(-1,-1)
VALUE(Phi)=0 LINE TO (1,-1)
NATURAL(Phi)=0 LINE TO (1,1)
VALUE(Phi)=1 LINE TO (-1,1)
NATURAL(Phi)=0LINE TO FINISH
REGION 2'blob'{the embedded blob}
k=0.001
START 'ring' (R,0) ARC(CENTER=0,0) ANGLE=360 TO FINISH
PLOTS
CONTOUR(Phi)
VECTOR(-k*grad(Phi))
ELEVATION(Phi) FROM (0,-1) to (0,1)
ELEVATION(Normal(-k*grad(Phi))) ON 'ring'
END
我们已经用23条可读语句定义了一个完整并有意义的问题 |