2017-03-13 2 views
0

일반적인 경계 조건 설정에 대한 도움을 주시면 감사하겠습니다. -grad(y) + g(y) = 0 여기서 g은 알 수없는 기능인 y입니다. 여기에 내가 일을 얻을 수있는 간단한 1D 예입니다 :일반 경계 조건

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 

에 인접 셀을 찾고 있습니다 경계 조건은 인접한면 중심에서 정의됩니다.

우리는 경계 조건에서 그라데이션을 따라 얼굴에 셀 값을 투영하여 공간의 경계 조건의 첫번째 순서는 정확한 수 : y_Pf=RdPR에 가장 가까운 셀 센터에서 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

감사합니다. 가까이에있는 것처럼 보입니다. 그러나 플럭스 용어가 어떻게 도입되었는지는 분명치 않습니다. 아마 그것은 발산 속성과 관련이 있습니까? 이 접근법은 또한 얼굴 값과 셀 중심 값이 경계에서 동일하도록 제한하는 것으로 보입니다. 위의 예는 [이 플롯] (http://imgur.com/a/jJz3M)을 참조하십시오.) 셀 크기에 따라 오차가 발생합니다. –

+0

나는 소스가 왜 그렇게 생겼는지 알고 싶어한다고 느꼈다. 내가 왜 그렇게 생겼는지 알아내는 좋은 변명.파생물을 설명하고 경계를보다 잘 외삽 할 수 있도록 내 대답을 편집했습니다. – jeguyer