2016-09-18 9 views
2

fipy 메쉬의 경계면에 대한 플럭스 법선을 명시 적으로 특정 값으로 설정하고면 내의 플럭스 구성 요소를 제한하지 않으려면 어떻게해야합니까?Fipy에서 노이만 (경계에 고정 된 자속) 경계 조건을 어떻게 지정합니까?

노이만 경계 조건은 (1) 경계면에 수직 인 플럭스의 고정 된 구성 요소 또는 (2) 얼굴에서 플럭스의 완전한 사양으로 지정할 수 있습니다. 기본 fipy 조건은 전자 (값 = 0)이지만 명시적인 방법 (faceGrad.constrain)은 후자입니다. 이 문제는 다음 코드를 fyy diffusion.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] 

답변

2

fixed flux boundary conditions에 대한 토론을 참조하십시오. 기본적으로 원하는 경계 플럭스의 발산을 포함하는 소스를 FiPy의 기본 무 플럭스 조건에 추가합니다.

2

방정식을 푸는 것과 무관 한 변수의 경계에 대한 플럭스 법선을 지정하는면에서 그 어떤 방법으로도 보이지 않습니다. 구문은 예를 들어 phi.faceGrad[0].constrain(...) 일 수 있지만 현재 FiPy에서는 작동하지 않습니다. 또한 임의의 지향면을 구현하기가 어려울 수 있습니다.

그러나 실제 목적을 위해 경계에 접선 인 구성 요소는 FiPy에서 방정식을 풀 때 사용되지 않으며 일반 구성 요소 만 솔루션에 영향을 미칩니다. 예를 들어,이

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

답이 정확한지의 출력을 제공

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 

다음 코드를 가지고 있지만, 상면 구배는 -0.5이다. 광고 #var.faceGrad.constrain(0, mesh.facesTop)은 주석 처리되는 경우에는, 그 결과

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

접선면 구배 현재 0이지만, 응답은 동일하다. 요점은 얼굴 기울기를 접선 방향으로 설정하면 (.constrain 경유) 솔루션에 영향을 미치지 않는다는 것입니다.

+0

어떤 경계 조건이 다른 조건의 그라디언트의 크기에 종속되기를 원하면 일반 구성 요소 만 설정하려고합니다. 말해,'phi1.constrain (fp.numerix.dot (phi2.faceGrad, phi2.faceGrad))'여기서 경계 상에'phi2'의 법선 성분만을 지정하고 싶습니다. 이 대답은 그렇게 할 수 없다는 뜻입니까? (나는 호기심이 좋은 좋은 예가 없다.) 어쩌면 @ jeguyer의 대답이 그 경우에 적절합니까? – muon

+1

@muon; 나는 대부분의 임의의 복잡한 상호 의존적 인 경계 조건에 대해 제약 방법이 실패하고 소스 용어 방법이 필요하다고 생각한다 (@ jeguyer 대답). – wd15

+0

의미가 있습니다. 감사! – muon

1

고정 된 자속 경계 조건에 대한 논의가 제 질문에 대한 답을 얻었지만 매우 간결한 문서를 이해하지 못했습니다. 다음은 mesh2x20 예제와 비슷한 간단한 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()