将条件存储为fipy作为数组而不是fipy对象

时间:2017-09-06 05:57:49

标签: python fipy

我是fipy的新手,所以如果这是一个愚蠢的问题我会道歉(this似乎没有帮助我)。 但有没有办法以人类可读(或python可读)的形式存储fipy对象,除了上面的问题建议?这仅适用于单元格变量。 如果我想比默认的fipy查看器做更多花哨/定制的绘图,我该怎么办呢?

以简单的一维扩散为例:

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)

但是,我可以将网格存储为数组吗?或者我可以在每一步中存储DiffusionTerm而不是CellVariable的值吗?

就我而言,我想绘制每个时间步长的热梯度(从扩散项中提取)。 我可以做吗?怎么样?

1 个答案:

答案 0 :(得分:2)

  

但是有没有办法将fipy对象存储在人类可读的(或   python-readable)形式,除了上面的问题中的建议?

有很多选择。任何FiPy对象都可以使用fipy.dump进行pickle,这将在并行运行时收集数据。例如,

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')

然后,您可以使用

在另一个Python会话中阅读此内容
var = fipy.dump.read('dump.gz')

然而,Pickle并不适合长期存储,因为它依赖于使用相同版本的代码来读取数据。另一种方法是使用

保存Numpy数组
np.save('dump.npy', var)

然后用

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

如果我想做更多花哨/定制的绘图而不是内容   默认的fipy查看器,我该怎么办?如果我想再做一些   花哨/定制的绘图比默认的fipy查看器,如何   我能做到吗?

要以人类可读的形式保存数据,并在另一个包中绘制位置和值数据,您可以尝试使用pandas

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

但是,我可以将网格存储为数组吗?

您当然可以选择任何Python对象,但使用实际对象的知识可以更好地进行长期存储。对于网格网格,只需要dxdynxny才能重新实现。 Mesh对象有一个__getstate__方法,它提供了对对象进行pickle的要求。所有需要存储的都是此方法返回的内容。

  

或者我可以存储DiffusionTerm的值而不是   CellVariable在每一步?

DiffusionTerm并不真正存储除系数之外的任何内容。该方程存储其矩阵和b向量。