2017-09-25 2 views
2

enter image description here정확한 Fipy 코드

화상 컨트롤 식, 초기 및 경계 condition.It의 descripe 플레이트와 유체 사이의 열 전달 문제를 포함으로 2-D하는 PDE 약관을 번역. fipy를 사용하여 var를 포함하는 2-d 문제와 경계 조건을 인코딩하는 방법을 모르겠습니다. 내 시도입니다.

from fipy import * 
import numpy as np 
#constant 
Pe=2400 
le_L=1/20000 
L_l=20000 
alphas=1 
alphaf=1 
a=1/Pe+le_L 
b=1/Pe+L_l 
Bi=0.4 
c=Bi/Pe*L_l 
#generate 
mesh=Grid2D(dx=1,dy=1) 
Ts=CellVariable(mesh=mesh,name='Ts',value=900) 
Tf=CellVariable(mesh=mesh,name='Tf',value=300) 
#condition 
Ts.faceGrad.constrain([0.],mesh.facesLeft) 
Ts.faceGrad.constrain([0.],mesh.facesRight) 
Ts.faceGrad.constrain([-1.*Bi*(Tf.value-Ts.value)],mesh.facesBottom) 
Ts.faceGrad.constrain([0.],mesh.facesTop) 

Tf.constrain(300,mesh.facesLeft) 
Tf.grad.constrain(0,mesh.facesRight) 



a=CellVariable(mesh=mesh,rank=1) 
a[:]=1 

#eq 
eq1=TransientTerm(var=Ts)==DiffusionTerm(coeff=[[a,b]],var=Ts) 
eq2=TransientTerm(var=Tf)==DiffusionTerm(coeff=[[a,0]],var=Tf)-  
ExponentialConvectionTerm(a,var=Tf)+ImplicitSourceTerm(c,var=Tf)-   
ImplicitSourceTerm(c,var=Ts) 

eq=eq1&eq2 

#solve 
dt=0.1 
steps=100 
viewer=Viewer(vars=(Ts,Tf),datamax=1000,datamin=0) 
for i in range(steps): 
eq.solve(dt=dt) 
viewer.plot() 

나는 그것이 틀렸다는 어떤 도움을 환영 어디로 가는지 모르겠어요 failed.And 찾을; 많은 감사합니다! BTW, 내가 얻고 싶은 최종 이미지는 enter image description here ...... 많은 thx입니다!

답변

1

다음 실행을 [일반 경계 조건을 해결하기 위해 편집] 당신이 찾고있는 성격의 결과를 보인다 :

from fipy import * 
import numpy as np 
#constant 
Pe=2400. 
le_L=1./20000. 
L_l=20000. 
alphasx=alphasy=1. 
alphaf=1. 
Bi=0.4 
c=Bi/Pe*L_l 

Dsxx = alphasx 
Dsyy = alphasy * L_l**2 
Ds = 1./Pe * le_L * (1./alphaf) * Variable([[alphasx, 0.], 
              [0., alphasy * L_l**2]]) 

Df = Variable([[1./Pe * le_L, 0], 
       [0., 0.]]) 

#generate 
mesh=Grid2D(Lx=1.,Ly=1.,nx=100, ny=100) 
Ts=CellVariable(mesh=mesh,name='Ts',value=900.) 
Tf=CellVariable(mesh=mesh,name='Tf',value=900.) 
#condition 
bottom_mask = (mesh.facesBottom * mesh.faceNormals).divergence 
dPR = mesh._cellDistances[mesh.facesBottom.value][0] 
Af = mesh._faceAreas[mesh.facesBottom.value][0] 
bottom_coeff = bottom_mask * Ds[1,1] * Af/(1 + dPR) 

Tf.constrain(300,mesh.facesLeft) 



#eq 
eq1=(TransientTerm(var=Ts)==DiffusionTerm(coeff=Ds,var=Ts) 
    + ImplicitSourceTerm(coeff=bottom_coeff * -Bi, var=Tf) 
    - ImplicitSourceTerm(coeff=bottom_coeff * -Bi, var=Ts)) 
eq2=(TransientTerm(var=Tf)==DiffusionTerm(coeff=Df,var=Tf) 
    -ExponentialConvectionTerm(coeff=[[1.], [0]],var=Tf) 
    +ImplicitSourceTerm(c,var=Tf) 
    -ImplicitSourceTerm(c,var=Ts)) 

eq=eq1&eq2 

#solve 
dt=0.01 
steps=100 
viewer=Viewer(vars=(Ts,Tf),datamax=1000,datamin=0) 
for i in range(steps): 
    eq.solve(dt=dt) 
    viewer.plot() 
  • 내가가 계수의 번호를 변경 당신이 제공 한 수학에 동의하십시오.
  • 가 나는 수레하는 int 치의 많이 변경
  • 의 int는 FiPy에서 잘 작동하지 않기 때문에 비 등방성 확산을 위해 FiPy 기대하는 형상으로 확산 계수를 고정
  • 내가 이상 해결하기 위해 도메인을 제공
  • (메쉬 단지 하나의 셀만 가지고있어 공간적 변화가 불가능 함)
  • 나는 general boundary conditions을 다루는 가장 좋은 방법을 소개했다. 못 생겼지 만 생각해.

방정식과 경계 조건 간의 비선형 종속성을 설명하기 위해 스위핑을 도입하려고합니다.

+0

고마워요! 당신은 소스 기간으로 경계를 정의함으로써 소개하는 방법을 의미합니까? 스위핑을 피할 수있는 경계 조건을 업데이트 할 'for'주기에 추가 할 수 있습니까? 범위 (단계) : Ts.faceGrad.constrain ([- eq1 = TransientTerm (var = Ts) == DiffusionTerm (Ds, var = Ts); eq2 = TransientTerm (var = Tf) = ImplicitSourceTerm (c, var = Tf) -ImplicitSourceTerm (c, var = Tf) == DiffusionTerm (Df, var = Tf) -Exponent ialConvectionTerm ([[1.], [0]], Ts); eq = eq1 & eq.solve (dt = dt) viewer.plot() –

+0

스윕은 필요하지 않을 수도있다. 방정식/경계 조건에 비선형 종속성이 있다고 생각하지 않습니다. 선형 종속성은 결합 된 해석에 의해 처리되어야합니다. 루프에서'.constrain() '을 반복해서 호출하는 것은 좋은 생각이라고 생각하지 않습니다. 내가 쓴 소스는 현재 일반적인 경계 조건에 대한 최선의 권장 사항입니다. – jeguyer

+0

나는이 방법에 대해 배웠다. 그러나이 문제의 프로토 타입은 ** 직사각형 솔리드의 바닥에서 유체의 맨 위로의 열전달 **이다. 그래서 나는 mask = (m.facesTop * m.faceNormals)를 코딩한다. 발산 dPR = m._cellDistances [m.facesTop.value] [0] Af = m._faceAreas [m.facesTop.value] [0] coeff_top = mask * Df [1,1] * Af/(1+ dpR)'을 사용하여 다음과 같이 계산할 수 있습니다. eq1 = TransientTerm (var = Ts) == DiffusionTerm (coeff = Ds, var = Ts) \ + ImplicitSourceTerm (coeff = top_coeff * -Bi, var = Tf) \ - ImplicitSourceTerm (coeff = bottom_coeff * -Bi, var = Ts)'첫 번째 방정식은 그렇지만 제대로 작동하지 않습니다 ... 어디가 잘못 되었습니까? –

관련 문제