2016-10-28 3 views
1

깊이 (h (t))가 시간이 변하는 도메인에서 간단한 확산 방정식 (dT/dt = K d2T/dx2)을 풀려고합니다. 따라서 결과 방정식은 다음과 같습니다.FiPy - 도메인 확장/프레임 증가

dT/dt = K/h^2 d2T/dx2 + z/h dh/dt dT/dz 

여기서 z는 이제 고정 0 -> 1 도메인입니다.

새로운 용어는 프레임 이류이고 나는 그것을 포함하려고 노력하고 있지만 공간적으로 종속 된 계수로 고민하고 있습니다. 나는 대류 용어 외부를 포함

:

mesh.cellCenters[0]*PowerLawConvectionTerm(...) 

이 오류 얻을 :

TermMultiplyError: Must multiply terms by int or float 

을하지만 방정식을 재구성하면 공간 의존도는 대류 기간 내에 있도록 :

PowerLawConvectionTerm(coeff=(mesh.cellCenters[0]**2,),...) 

방정식을 풀 때 다른 오류가 발생합니다 :

AssertionError: assert(len(id1) == len(id2) == len(vector)) 

이 용어를 포함하는 올바른 방법은 무엇입니까? 내가 바보 같은 실수를해서 어딘가에 있니?

답변

1

FiPy의 방정식 그래서 용어의 유도체의 외부 승수를 FiPy에서

fipy.TransientTerm() == fipy.DiffusionTerm(K/h**2) \ 
         + fipy.ConvectionTerm(z * z_hat * h_t/h) \ 
         - h_t/h * T 

를 기록 없을 수 있도록이 두 부분으로 마지막 항을 분할 수 있습니다 해결하는 가장 좋은 방법 추가 소스 용어가 필요합니다. 여기에서는

K = 1. ## some constant 
h = fipy.Variable(...) ## variable that is continuously updated 
h_old = fipy.Variable(...) ## variable that is continuously updated 
h_t = (h - h_old)/dt ## variable dependent on h and h_old 
T = fipy.CellVariable(...) 
z_hat = [0, 1] ## vector required for convection term coefficient 

T explicilty 일부가 공식에 따라 setValue를 사용하여 각 스위프 또는 시간 단계에서 업데이트 hh_old 대한 해결 가변되고 있다는 가정한다. 또한, 마지막 항은 명시하고 h_t 평가 방법에 따라 암시 소스

- h_t/h * T -> - fipy.ImplicitSourceTerm(1/dt) + h_old/h/dt * T 

로 분할 할 수 있습니다. 암시 적 소스는 솔루션을 매우 안정적으로 만들어야합니다.

+0

z를 어떻게 정의합니까? 나는 mesh.cellCenters [0]'을 사용하고 있습니다. (당분간 1D에서 일하고 있지만 수직 차원이 될 것입니다.) 그리고 위의 AssertError를 얻습니다. 해결 방법을 찾았습니다. [http://scicomp.stackexchange.com/questions/20784/diffusion-with-space-dependent-drift-in-fipy] 여기서 'z * z_hat'조합은 'CellVariable (mesh = mesh, value = z)'- 더 좋은 방법이 있습니까? h_t는 z = h에서 필드 자체'h_t = A * f (T)'에서 계산 된 후 간단한 업데이트 'h_new = h_old + dt * h_t'에서 사용됩니다. 소스 용어를 나눠서' 여기서 일하니? 감사합니다. –