2016-02-03 40 views

回答

0

我能夠在2016a中實現週期性邊界條件,以便在pde工具箱中使用。這花了不少時間,因爲沒有記錄太多的函數和數據結構。請注意我的域是一個三維立方體,但這裏的方法也適用於2D。 (我已經測試過拋物線和雙曲問題)。似乎應該通過改變PDE工具箱的「H」矩陣來實現週期邊界條件,但是我還沒有能夠得到這種方法來處理橢圓,拋物線或雙曲問題。

下面是用於實現拋物線和雙曲線問題週期性邊界條件(使用PDE工具箱線的方法)的方法:

  1. 使用點的Delaunay三角網創建一個網格(確保接觸域的邊界的節點具有在相反面上「匹配」的節點)。請注意,不能使用pde工具箱爲3D立方體生成的網格節點,因爲它們沒有適當的週期性結構。

  2. 將週期性邊界條件視爲時間相關的狄利克雷邊界條件。你可能會遇到一些麻煩讓matlab在時間依賴的邊界條件下處理(我不得不在這裏忽略細節)。然而,在這裏的是,我在applyBoundaryCondition()函數所使用的功能如下:

函數[bcMatrix]

%用於楠= tdependentdiri(地區,州),以 「欺騙」 MATLAB成處理的邊界條件爲時間依賴的狄利克雷

如果(isnan(state.time))

bcMatrix = NaN; 

別的

bcMatrix = state.u; 

  • 更新FAS數據(內generateMesh從genmeshinternal()())。不幸的是,我們無法看到genmeshinternal())的代碼。然而,fas是包含六個條目的單元格,其中每個條目都是2xN矩陣。每個條目的第二行。第一行指定一個面在域邊界上的四面體。第二行指定哪個節點(四面體)位於域的內部。編寫一個算法來更新網格的fas。實際上,您需要更新以下行(在generateMesh()內)中的每個變量(使用網格數據):
  • [nodes,fas,tet,Hmax,Hmin] = genmeshinternal(self。幾何形狀,HMAX,HMIN,geomOrder);

    請注意,節點和tet由delaunay三角剖分照顧。

    1. 節點和邊界值(隨時間變化)的「週期性映射」應在callValueFuncOnFace()內完成。基本上你需要在它的週期性合作伙伴的位置(由pbc_indx這裏表示)來改變邊界上當前解決值的值:

    state.u = self.uN(:,pbc_indx); %self.uN保存當前時間的解決方案

    我把這個正確的行後面寫着: appRegion = self.applicationRegion(xyzPts(:,i),faceNormals(:,i));

    可能有一個更簡單的方法,但至少這個最終的作品。