Matlab PDE工具箱周期边界条件

时间:2016-02-03 16:33:33

标签: matlab toolbox pde

我们如何修改matlab PDE工具箱代码以实现周期性边界条件?

1 个答案:

答案 0 :(得分:0)

我能够在2016a中实现周期性边界条件,以便在pde工具箱中使用。由于没有记录许多功能和数据结构,因此花了相当多的时间。请注意我的域是一个三维立方体,但这里的方法也适用于2D。 (我已经测试了它的抛物线和双曲线问题)。似乎应该可以通过改变PDE工具箱来实现周期性边界条件" H"矩阵,但我还没有能够采用这种方法来处理椭圆,抛物线或双曲线问题。

以下是实现抛物线和双曲线问题的周期性边界条件的方法(使用pde工具箱的线条方法):

  1. 使用点的delaunay三角剖分创建网格(确保触及域边界的节点具有在相对面上匹配的节点)。请注意,不能使用pde工具箱为3D立方体生成的网格节点,因为它们没有适当的周期性结构。

  2. 将周期性边界条件视为时间相关的dirichlet边界条件。你可能在使用matlab处理时间相关的边界条件时遇到一些麻烦(我必须在这里省略细节)。但是,我在applyBoundaryCondition()函数中使用的函数如下:

  3. function [bcMatrix] = tdependentdiri(region,state)

    %nan用于"技巧" matlab将边界条件视为时间依赖的dirichlet

    if(isnan(state.time))

    bcMatrix = NaN;
    

    否则

    bcMatrix = state.u;
    

    1. 更新fas数据(来自generateMesh()中的genmeshinternal())。不幸的是,我们无法看到genmeshinternal()的代码。然而,fas是具有六个条目的单元格,每个条目是2xN矩阵。每个条目的第二行。第一行指定一个四面体,其面部位于域的边界上。第二行指定(四面体的)节点位于域的内部。编写一个算法来更新网格的fas。实际上,您需要在以下行(在generateMesh()中)更新每个变量(使用网格数据):
    2. [nodes,fas,tet,Hmax,Hmin] = genmeshinternal(self.Geometry,Hmax,Hmin,geomOrder);

      请注意,节点和tet由delaunay三角测量处理。

      1. "周期映射"节点和边界值(随时间变化)应该在callValueFuncOnFace()中完成。基本上,您需要将边界上当前解决方案的值更改为其定期合作伙伴位置的值(此处由pbc_indx指示):
      2. state.u = self.uN(:,pbc_indx); %self.uN保存当前时间的解决方案

        我把它放在以下行之后: appRegion = self.applicationRegion(xyzPts(:,i),faceNormals(:,i));

        可能有一种更简单的方法,但至少这一种方法最终会有效。