Хранение терминов в fipy в виде массивов вместо fipy объектов

Я новичок в fipy, поэтому я прошу прощения, если это глупый вопрос (и это, кажется, не помогает мне). Но есть ли способ хранить fipy-объекты в удобочитаемой (или читабельной) форме, отличной от предложенной в вопросе выше? Это применимо только к переменной ячейки. Если я хочу сделать несколько более необычных / настраиваемых графиков, чем то, что есть в программе просмотра fipy по умолчанию, как я могу это сделать?

Возьмем для примера простую 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)

Но могу ли я, например, сохранить сетку в виде массива? Или я мог бы сохранить значение DiffusionTerm вместо CellVariable на каждом шагу?

В моем случае я хотел бы построить температурный градиент (поэтому извлеките его из диффузионного члена) с расстоянием для каждого временного шага. Могу ли я это сделать? Как?

1 ответ

Решение

Но есть ли способ хранить 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 обязаны восстановить. Объекты сетки имеют __getstate__ метод, который дает требования к травлению объекта. Все, что нужно сохранить - это то, что возвращает этот метод.

Или я мог бы хранить значение DiffusionTerm вместо CellVariable на каждом шаге?

DiffusionTerm на самом деле не хранит ничего, кроме его коэффициента. Уравнение хранит свою матрицу и вектор b.

Другие вопросы по тегам