# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import vtk
import h5py
[docs]
def write_3d_vector_fields_to_hdf5(dat, result_filename, scale_factor=1.0):
x_vec, y_vec, z_vec = [np.array(x) * scale_factor for x in dat["grid_points"]]
fields_dat = dat["fields"]
xlen = len(x_vec)
ylen = len(y_vec)
zlen = len(z_vec)
with h5py.File(result_filename, "w") as fh:
# write grid points / grid coordinates:
points_group = fh.create_group('grid_points')
points_group.create_dataset('x', (xlen,), 'f', x_vec)
points_group.create_dataset('y', (ylen,), 'f', y_vec)
points_group.create_dataset('z', (zlen,), 'f', z_vec)
fields_group = fh.create_group('fields')
for fi in fields_dat:
# f_group = fields_group.create_group(fi["name"])
# write scalar field to group:
clen = len(fi['data']) # vector components length
field_shape = (xlen, ylen, zlen, clen)
data_combined = np.stack(fi['data'], axis=3)
fields_group.create_dataset(fi['name'], field_shape, 'f', data_combined)
[docs]
def write_3d_vector_fields_as_vtk_point_data(dat,result_filename,scale_factor=1.0):
vtk_p = vtk.vtkPoints()
x_vec, y_vec, z_vec = [np.array(x)*scale_factor for x in dat["grid_points"]]
fields_dat = dat["fields"]
xlen = len(x_vec)
ylen = len(y_vec)
zlen = len(z_vec)
vtk_fields = []
for fi in fields_dat:
vfi = vtk.vtkDoubleArray()
vfi.SetNumberOfComponents(3)
vfi.SetName(fi['name'])
vtk_fields.append(vfi)
n_fields = len(vtk_fields)
#x_dat = fields_dat[component_indices[0]]['data']
#y_dat = fields_dat[component_indices[1]]['data']
#z_dat = fields_dat[component_indices[2]]['data']
for zi in range(zlen):
for yi in range(ylen):
for xi in range(xlen):
vtk_p.InsertNextPoint([x_vec[xi], y_vec[yi], z_vec[zi]])
for i in range(n_fields):
vtk_fields[i].InsertNextTuple([
fields_dat[i]['data'][0][xi, yi, zi],
fields_dat[i]['data'][1][xi, yi, zi],
fields_dat[i]['data'][2][xi, yi, zi]
])
vtk_grid = vtk.vtkStructuredGrid()
vtk_grid.SetDimensions(xlen,ylen,zlen)
vtk_grid.SetPoints(vtk_p)
for i in range(n_fields):
vtk_grid.GetPointData().AddArray(vtk_fields[i])
#print(vtk_grid)
writer = vtk.vtkXMLStructuredGridWriter()
writer.SetFileName(result_filename)
writer.SetInputData(vtk_grid)
writer.Write()
[docs]
def write_3d_scalar_fields_to_hdf5(dat, result_filename, scale_factor=1.0):
x_vec, y_vec, z_vec = [np.array(x)*scale_factor for x in dat["grid_points"]]
fields_dat = dat["fields"]
xlen = len(x_vec)
ylen = len(y_vec)
zlen = len(z_vec)
field_shape = (xlen, ylen, zlen)
with h5py.File(result_filename, "w") as fh:
# write grid points / grid coordinates:
points_group = fh.create_group('grid_points')
points_group.create_dataset('x', (xlen,), 'f', x_vec)
points_group.create_dataset('y', (ylen,), 'f', y_vec)
points_group.create_dataset('z', (zlen,), 'f', z_vec)
fields_group = fh.create_group('fields')
for fi in fields_dat:
#f_group = fields_group.create_group(fi["name"])
# write scalar field to group:
fields_group.create_dataset(fi['name'], field_shape, 'f', fi['data'])
[docs]
def write_3d_scalar_fields_as_vtk_point_data(dat, result_filename, scale_factor=1.0):
vtk_p = vtk.vtkPoints()
x_vec,y_vec,z_vec = [np.array(x)*scale_factor for x in dat["grid_points"]]
fields_dat = dat["fields"]
xlen = len(x_vec)
ylen = len(y_vec)
zlen = len(z_vec)
vtk_fields = []
for fi in fields_dat:
vfi = vtk.vtkDoubleArray()
vfi.SetName(fi["name"])
vtk_fields.append(vfi)
n_fields = len(vtk_fields)
for zi in range(zlen):
for yi in range(ylen):
for xi in range(xlen):
vtk_p.InsertNextPoint([x_vec[xi],y_vec[yi],z_vec[zi]])
for i in range(n_fields):
vtk_fields[i].InsertNextValue(fields_dat[i]["data"][xi, yi, zi])
vtk_grid = vtk.vtkStructuredGrid()
vtk_grid.SetDimensions(xlen,ylen,zlen)
vtk_grid.SetPoints(vtk_p)
for i in range(n_fields):
vtk_grid.GetPointData().AddArray(vtk_fields[i])
#print(vtk_grid)
writer = vtk.vtkXMLStructuredGridWriter()
writer.SetFileName(result_filename)
writer.SetInputData(vtk_grid)
writer.Write()
[docs]
def plot_3d_grid(meshgrid, field_dat, Xi):
'''
Plots a field imported from a comsol 3d csv file.
:param numpy.Array meshgrid: the meshgrid (as defined by numpy meshgrid) for the 3d field
:param numpy.Array field_dat: the scalar field to plot
:param int Xi: the index of the slice in x direction to plot
'''
X,Y,Z = meshgrid
P = field_dat
X_ = X[:,Xi, :]
Y_ = Y[:,Xi, :]
Z_ = Z[:,Xi, :]
P_ = P[:,Xi, :]
fig = plt.figure()
#ax = fig.gca(projection='3d')
#surf = ax.plot_surface(Z_,Y_,P_,linewidth=0, antialiased=False,cmap=cm.coolwarm)
#ax.set_zlim(-10, 10)
#fig.colorbar(surf, shrink=0.5, aspect=5)
plt.contourf(Z_,Y_,P_,20)
plt.colorbar()
plt.show()