2017-03-13 9 views
0

-grad(y) + g(y) = 0ここで、gは不明な関数の一部ですyです。ここで私は仕事を得ることができないという単純な1次元の例だ:一般的な境界条件

N=3 
h=1./(float(N)-1.) 

mesh = Grid1D(nx=N, dx=h) 

c=CellVariable(mesh=mesh,value=0.5) 

## Dirichlet boundary conditions 
#c.constrain(2., mesh.facesLeft) 
#c.constrain(1., mesh.facesRight) 

## Neumann boundary conditions 
c.faceGrad.constrain(-1, where=mesh.facesLeft) 
c.faceGrad.constrain(-c.faceValue , where=mesh.facesRight) 

Eq = DiffusionTerm(coeff=1.0) 
Eq.cacheMatrix() 
Eq.cacheRHSvector() 
Eq.solve(var=c) 
m = Eq.matrix.numpyArray 
b = Eq.RHSvector 

このコードは解決されませんが、私は行列を見ることがないとRHS:

m= array([[-2., 2., 0.], 
      [ 2., -4., 2.], 
      [ 0., 2., -2.]]) 

b= array([-1. , 0. , 0.5]) 

行列、m、ソース用語が最後の行に含まれていないため、明確に単数形です。どのようにそれを含めるための任意の提案?

答えて

0

は、[編集:1次実装の導出およびデモンストレーションを追加]

一般的な境界条件を持つknown issuesがあります。

このような境界条件をソースとして実装することは可能です。 discretization of the DiffusionTerm$\sum_f D_f (n\cdot\nabla(y))_f A_f$を使用して、$f=R$を特別なケースとして扱い、希望の境界条件-n\cdot\nabla(y) - y = 0の代わりに使用します。私たちは、DiffusionTerm

c.faceGrad.constrain([-1], where=mesh.facesLeft) 

D = 1. 
Dface = FaceVariable(mesh=mesh, value=D) 
Dface.setValue(0., where=mesh.facesRight) 

D_(f=R)をゼロにして、暗黙のソースD_(f=R) (n\cdot\nabla(y))_(f=R) A_(f=R)またはD_(f=R) (-y)_(f=R) A_(f=R)を追加することでこれを実現します。ソースはセル中心で定義ので、我々はソース

Af = mesh._faceAreas[mesh.facesRight.value][0] 
Eq = DiffusionTerm(coeff=Dface) - ImplicitSourceTerm(coeff=mask_coeff * D * Af) 

ImplicitSourceTermは、の値で動作するように、この処理は正確だけ0次であるに追加し$f=R$

mask_coeff = (mesh.facesRight * mesh.faceNormals).divergence 

に隣接するセルの位置を特定され境界条件は隣接する顔中心で定義される。我々は、境界条件の勾配に沿った面にセルの値を投影した空間内に正確な境界条件1の順序を作ることができる

f=RdPRからy_Pはセル中心にyの値である y_(f=R) ~ y_P + n\cdot\nabla(y)_(f=R) dPR最も近いです点PからRに向かう距離。

したがって、境界条件-n\cdot\nabla(y)_(f=R) - y_(f=R) = 0-n\cdot\nabla(y)_(f=R) - (y_P + n\cdot\nabla(y)_(f=R) dPR) = 0になります。これはn\cdot\nabla(y)_(f=R) = -y_P/(1 + dPR)で解決できます。 DiffusionTermための境界に対応する暗黙のソースはhttps://www.mail-archive.com/[email protected]/msg03671.htmlから始まる、これD_(f=R) (-y_P/(1 + dPR)) A_(f=R)

dPR = mesh._cellDistances[mesh.facesRight.value][0] 
Af = mesh._faceAreas[mesh.facesRight.value][0] 
Eq = DiffusionTerm(coeff=Dface) - ImplicitSourceTerm(coeff=mask_coeff * D * Af/(1 + dPR)) 

FiPyメーリングリストでこの議論された最後の夏です。はい、それは今、すべてかなり不器用です。

+0

ありがとうございます。しかし、フラックス項がどのように導入されたかは分かりませんが、おそらくそれは分岐属性と関係していますか?このアプローチはまた、顔の値とセルの中心値が境界で等しくなるように制約するように思われる。 (上記の例については、[this plot](http://imgur.com/a/jJz3M)を参照してください。)これにより、セルのサイズに合わせて誤差が生じます。 –

+0

私は、ソースがなぜそんなに見えるのか知りたいと思っていた気がしました。なぜそれがそれのように見えるのか私には良い言い訳です。私は派生を記述し、境界をよりよく外挿するために私の答えを編集しました。 – jeguyer

関連する問題