首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将术语以数组形式存储在fipy中,而不是fipy对象

将术语以数组形式存储在fipy中,而不是fipy对象
EN

Stack Overflow用户
提问于 2017-09-06 05:57:49
回答 1查看 380关注 0票数 2

我对fipy并不熟悉,所以如果这是个愚蠢的问题,我很抱歉(而且this似乎帮不了我)。但是,除了上述问题中的建议之外,是否有一种方法可以以人类可读的(或python可读的)形式存储fipy对象?这仅适用于单元格变量。如果我想做一些比默认的fipy查看器更花哨的/定制的绘图,我怎么做呢?

举一个简单的一维扩散为例:

代码语言:javascript
复制
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的值吗?

在我的例子中,我想用距离来绘制每个时间步骤的热梯度(从扩散项中提取出来)。我能做吗?多么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-06 21:09:32

但是,除了上述问题中的建议之外,是否有一种方法可以以人类可读的(或python可读的)形式存储fipy对象?

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

代码语言:javascript
复制
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会话中使用

代码语言:javascript
复制
var = fipy.dump.read('dump.gz')

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

代码语言:javascript
复制
np.save('dump.npy', var)

然后用

代码语言:javascript
复制
var_array = np.load('dump.npy')
var = fipy.CellVariable(mesh=mesh, value=var_array)

如果我想做一些比默认的fipy查看器更花哨的/定制的绘图,我怎么做呢?如果我想做一些比默认的fipy查看器更花哨的/定制的绘图,我怎么做呢?

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

代码语言:javascript
复制
import pandas
df = pandas.DataFrame({'x' : mesh.x, 'y': mesh.y, 'value': var})
df.to_csv('dump.csv')

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

当然,您可以提取任何Python对象,但是使用实际对象的知识更有利于长期存储。对于网格网格,只需要dxdynxny才能恢复。网格对象有一个__getstate__方法,它给出了对对象进行酸洗的要求。所需存储的只是此方法返回的内容。

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

除了它的系数外,DiffusionTerm实际上不存储任何东西。该方程存储其矩阵和b向量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46067801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档