2017-09-06 3 views
1

나는 fipy를 처음 사용하므로 어리석은 질문 인 경우 사과합니다. this은 도움이되지 않습니다. 위의 질문에서 제안한 것 외에 사람이 읽을 수있는 형식 (또는 파이썬에서 읽을 수있는 형식)으로 fipy 개체를 저장하는 방법이 있습니까? 이것은 셀 변수에만 적용됩니다. 기본 fipy 뷰어보다 더 멋진/사용자 정의 된 플로팅을하고 싶다면 어떻게해야합니까?fipy 개체 대신 배열로 fypy에 용어 저장

테이크 예를 들어 간단한 1D 확산 :

from fipy import * 
# USER-DEFINED PARAMETERS 
nx = 100 
dx = 0.1 
D = 1.0 
bound1 = 30 
bound2 = 70 

# PREPARED FOR SOLUTION 
mesh = Grid1D(nx=nx, dx=dx) 
print "mesh", mesh 

# define some parameters specific to this solution 
T0 = bound2 
Tinf = bound1 

hour = 3600 
day = hour*24 
ndays = 1 
duration = ndays*day 

T = CellVariable(name="Temperature", mesh=mesh, value=bound1) 
# Constant temperature boundary condition 
T.constrain(T0, mesh.facesLeft) 
T.constrain(Tinf, mesh.facesRight) 
# SOLUTION 
eq = (TransientTerm() == DiffusionTerm(coeff=D)) 
timeStepDuration = 0.5*hour 
steps = int(duration/timeStepDuration) 
for step in range(steps): 
    eqCirc.solve(var=T,dt=timeStepDuration) 

하지만, 예를 들어, 배열로 메쉬를 저장할 수? 또는 각 단계에서 CellVariable 대신 DiffusionTerm 값을 저장할 수 있습니까?

필자의 경우, 각 시간 간격마다 거리 구배로 온도 구배를 그리려고합니다 (확산 기간에서 추출). 할 수 있습니까? 방법?

답변

2

위의 질문에서 제안한 것 이외에 사람이 읽을 수있는 형식 (또는 파이썬에서 읽을 수있는 형식)으로 fipy 개체를 저장할 수있는 방법이 있습니까?

다양한 옵션이 있습니다. 모든 FiPy 오브젝트는 fipy.dump을 사용하여 절편 될 수 있으며, 병렬로 실행될 때 데이터를 수집합니다. 이 코드의 동일한 버전을 사용에 따라 예를 들어,

import fipy 
mesh = fipy.Grid2D(nx=3, ny=3) 
var = fipy.CellVariable(mesh=mesh) 
var[:] = mesh.x * mesh.y 
fipy.dump.write(var, 'dump.gz') 

그런 다음, 피클하지 장기 저장을 위해 중대하다 그러나

var = fipy.dump.read('dump.gz') 

또 다른 파이썬 세션이 다시 읽을 수 있습니다 데이터를 다시 읽습니다. 대안은 사용

np.save('dump.npy', var) 

을 NumPy와 배열을 저장 한 다음 내가 기본 fipy에있는 것보다 좀 더 화려한/사용자 정의 플롯을 수행 할 경우

var_array = np.load('dump.npy') 
var = fipy.CellVariable(mesh=mesh, value=var_array) 

으로 읽는 것입니다 뷰어, 어떻게해야합니까? 공상/맞춤형 플롯팅을 기본 fipy 뷰어에 비해 더 많이 수행하려면 어떻게해야합니까? 어떻게 할 수 있습니까?

다른 패키지에 플롯의 위치 및 값 데이터를 사람이 읽을 수있는 형태로 데이터를 저장하려면, 당신은 팬더

import pandas 
df = pandas.DataFrame({'x' : mesh.x, 'y': mesh.y, 'value': var}) 
df.to_csv('dump.csv') 

하지만, 예를 들어, 저장할 수를 사용하여 시도 할 수 있습니다 배열로 메쉬?

물론 파이썬 객체를 피클 할 수 있지만 실제 객체에 대한 지식을 사용하면 장기간 저장하는 것이 좋습니다. 그리드 메쉬의 경우, 다시 축하하려면 dx, dy, nx, ny 만 필요합니다. 메쉬 객체는 객체를 pickling하기위한 요구 사항을 제공하는 __getstate__ 메소드를 가지고 있습니다. 저장해야 할 모든 것이이 메소드가 반환하는 것입니다.

각 단계에서 CellVariable 대신 DiffusionTerm 값을 저장할 수 있습니까?

DiffusionTerm에는 실제로 계수가 저장되지 않습니다. 방정식은 행렬과 벡터를 저장합니다.

+0

또 다른 옵션은'fipy.TSVViewer (T.faceGrad) .plot ('dump.tsv.gz')'입니다. 이것은 또한 미래 보장형이지만, 데이터를 FiPy로 다시 체크 포인트하기위한 가장 쉬운 형식은 아닙니다. pickle, numpy 및 TSV (.gz 압축 포함) 모두 디스크 공간의 순서와 거의 같습니다. – jeguyer