2

我是fipy的新手,所以如果这是一个愚蠢的问题,我深表歉意(似乎对我没有帮助)。但是,除了上述问题中的建议之外,有没有办法以人类可读(或 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

就我而言,我想绘制每个时间步长的热梯度(因此从扩散项中提取)与距离。我可以做吗?如何?

4

1 回答 1

2

但是,除了上述问题中的建议之外,有没有办法以人类可读(或 python 可读)的形式存储 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')

然后,您可以在另一个 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')

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

您当然可以 Pickle 任何 Python 对象,但使用实际对象的知识更适合长期存储。对于网格网格,仅需要dx, dy, nx,ny来重新实例化。Mesh 对象有一种__getstate__方法,它给出了对对象进行酸洗的要求。所有需要存储的是这个方法返回的内容。

或者我可以在每个步骤中存储 DiffusionTerm 而不是 CellVariable 的值吗?

除了它的DiffusionTerm系数之外,它并没有真正存储任何东西。该方程存储其矩阵和 b 向量。

于 2017-09-06T21:09:32.493 回答