2

面内のフラックスのコンポーネントを制約せずに、fipy メッシュの境界面に法線方向のフラックスを特定の値に明示的に設定するにはどうすればよいですか?

ノイマン境界条件は、(1) 境界面に垂直な磁束の固定成分、または (2) 面での磁束の完全な仕様として指定できます。デフォルトの fipy 条件は前者 (値 = 0) ですが、明示的なメソッド (faceGrad.constrain) は後者です。この問題は、次のコードを fipy拡散.mesh20x20 の例の最後に追加し、さまざまな面のグラデーション結果に注意することで理解できます。

facesNeumann = mesh.exteriorFaces & ~facesTopLeft & ~facesBottomRight
print 'grad(phi) with default Neumann BC...'
print phi.faceGrad.value.T[facesNeumann.value]
phi.faceGrad.constrain(0.,facesNeumann)
DiffusionTerm().solve(var=phi)
print 'and with explicit Neumann BC...'
print phi.faceGrad.value.T[facesNeumann.value]
4

3 に答える 3

2

固定フラックス境界条件に関する議論を参照してください。基本的に、目的の境界フラックスの発散を含むソースを FiPy のデフォルトの非フラックス条件に追加します。

于 2016-09-19T14:29:30.643 に答える
2

方程式を解くこととは関係なく、変数の境界に垂直なフラックスを指定するだけでは、それを行う方法はないようです。構文はphi.faceGrad[0].constrain(...)例かもしれませんが、現在FiPyでは機能しません。また、任意の向きの面に実装するのは難しい場合があります。

ただし、実際には、FiPy で方程式を解くときに境界の接線成分は使用されず、法線成分のみが解に影響を与えます。たとえば、次のコードを見てください。

import fipy as fp
mesh = fp.Grid2D(nx=2, ny=1)
var = fp.CellVariable(mesh=mesh)
var.constrain(1, mesh.facesLeft)
var.constrain(0, mesh.facesRight)
#var.faceGrad.constrain(0, mesh.facesTop)
fp.DiffusionTerm().solve(var)
print 'face gradient on top plane:',var.faceGrad[0, mesh.facesTop.value]
print 'variable value:',var

これにより、次の出力が得られます

face gradient on top plane: [-0.5 -0.5]
variable value: [ 0.75  0.25]

答えは正解ですが、上面の勾配は -0.5 です。ただし、行の#var.faceGrad.constrain(0, mesh.facesTop)コメントを外すと、結果は次のようになります。

face gradient on top plane: [ 0.  0.]
variable value: [ 0.75  0.25]

接線面の勾配は 0 になりましたが、答えは同じです。要点は、面の勾配を接線方向に ( を介して.constrain) 設定しても、ソリューションには影響しないということです。

于 2016-09-19T16:49:12.690 に答える
1

固定フラックス境界条件に関する議論は私の質問に答えますが、ドキュメントは非常に簡単で理解できませんでした。以下は、mesh20x20 の例と同様に、単純な 2D ケースにこれを適用する方法を示す実際の例です。

import matplotlib.pyplot as plt
from fipy import *

nx = 20
ny = nx
dx = 1.
dy = dx
L = dx * nx
msh = Grid2D(dx=dx, dy=dy, nx=nx, ny=ny)

xFace, yFace = msh.faceCenters
xCell,yCell = msh.cellCenters    
phi = CellVariable(name = "solution variable",
                   mesh = msh,
                   value = 0.)    
D = FaceVariable(name='diffusion coefficient',mesh=msh,value=1.)

# Dirichlet condition on top face
valueTop = FaceVariable(name='valueTop',mesh=msh,value=xFace*0.1-1)
phi.constrain(valueTop, msh.facesTop)

# Fixed flux (Neumann) on base
D.constrain(0., msh.facesBottom)
fluxBottom = -0.05

eq = DiffusionTerm(coeff=D) + (msh.facesBottom * fluxBottom).divergence
eq.solve(var=phi)

# confirm only y component of gradient is zero
print phi.faceGrad.value.T[msh.facesBottom.value]

plt.scatter(phi.value, yCell)
plt.show()

viewer = Viewer(vars=phi, datamin=-1., datamax=1.)
viewer.plot()
于 2016-09-26T23:24:40.610 に答える