Forked from
empyre / empyre
355 commits behind the upstream repository.
vtk_conversion_nanowire_segment.py 6.58 KiB
# -*- coding: utf-8 -*-
"""Created on Fri Jan 24 11:17:11 2014 @author: Jan"""
import os
import numpy as np
import matplotlib.pyplot as plt
from pylab import griddata
import pickle
import vtk
from tqdm import tqdm
import pyramid
from pyramid.magdata import MagData
from pyramid.phasemapper import pm
import logging
import logging.config
LOGGING_CONF = os.path.join(os.path.dirname(os.path.realpath(pyramid.__file__)), 'logging.ini')
logging.config.fileConfig(LOGGING_CONF, disable_existing_loggers=False)
###################################################################################################
PATH = '../../output/vtk data/tube_90x30x50_sat_edge_equil.gmr'
b_0 = 1.54
gain = 12
force_calculation = False
###################################################################################################
# Load vtk-data:
if force_calculation or not os.path.exists(PATH+'.pickle'):
# Setting up reader:
reader = vtk.vtkDataSetReader()
reader.SetFileName(PATH+'.vtk')
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
reader.Update()
# Getting output:
output = reader.GetOutput()
# Reading points and vectors:
size = output.GetNumberOfPoints()
vtk_points = output.GetPoints().GetData()
vtk_vectors = output.GetPointData().GetVectors()
# Converting points to numpy array:
point_array = np.zeros(vtk_points.GetSize())
vtk_points.ExportToVoidPointer(point_array)
point_array = np.reshape(point_array, (-1, 3))
# Converting vectors to numpy array:
vector_array = np.zeros(vtk_points.GetSize())
vtk_vectors.ExportToVoidPointer(vector_array)
vector_array = np.reshape(vector_array, (-1, 3))
# Combining data:
data = np.hstack((point_array, vector_array))
with open(PATH+'.pickle', 'w') as pf:
pickle.dump(data, pf)
else:
with open(PATH+'.pickle') as pf:
data = pickle.load(pf)
# Scatter plot of all x-y-coordinates
axis = plt.figure().add_subplot(1, 1, 1)
axis.scatter(data[:, 0], data[:, 1])
plt.show()
###################################################################################################
# Interpolate on regular grid:
if force_calculation or not os.path.exists(PATH+'.nc'):
# Find unique z-slices:
zs = np.unique(data[:, 2])
# Determine the grid spacing:
a = zs[1] - zs[0]
# Determine the size of object:
x_min, x_max = data[:, 0].min(), data[:, 0].max()
y_min, y_max = data[:, 1].min(), data[:, 1].max()
z_min, z_max = data[:, 2].min(), data[:, 2].max()
x_diff, y_diff, z_diff = np.ptp(data[:, 0]), np.ptp(data[:, 1]), np.ptp(data[:, 2])
x_cent, y_cent, z_cent = x_min+x_diff/2., y_min+y_diff/2., z_min+z_diff/2.
# Create regular grid
xs = np.arange(x_cent-x_diff, x_cent+x_diff, a)
ys = np.arange(y_cent-y_diff, y_cent+y_diff, a)
o, p = np.meshgrid(xs, ys)
# Create empty magnitude:
magnitude = np.zeros((3, len(zs), len(ys), len(xs)))
# WITH MASKING OF THE CENTER (SYMMETRIC):
iz_x = np.concatenate([np.linspace(-4.95, -4.95, 50),
np.linspace(-4.95, 0, 50),
np.linspace(0, 4.95, 50),
np.linspace(4.95, 4.95, 50),
np.linspace(-4.95, 0, 50),
np.linspace(0, 4.95, 50), ])
iz_y = np.concatenate([np.linspace(-2.88, 2.88, 50),
np.linspace(2.88, 5.7, 50),
np.linspace(5.7, 2.88, 50),
np.linspace(2.88, -2.88, 50),
np.linspace(-2.88, -5.7, 50),
np.linspace(-5.7, -2.88, 50), ])
for i, z in tqdm(enumerate(zs), total=len(zs)):
subdata = data[data[:, 2] == z, :]
for j in range(3): # For all 3 components!
gridded_subdata = griddata(np.concatenate([subdata[:, 0], iz_x]),
np.concatenate([subdata[:, 1], iz_y]),
np.concatenate([subdata[:, 3 + j], np.zeros(len(iz_x))]),
o, p)
magnitude[j, i, :, :] = gridded_subdata.filled(fill_value=0)
# # WITH MASKING OF THE CENTER (ASYMMETRIC):
# iz_x = np.concatenate([np.linspace(-5.88, -5.88, 50),
# np.linspace(-5.88, 0, 50),
# np.linspace(0, 5.88, 50),
# np.linspace(5.88, 5.88, 50),
# np.linspace(5.88, 0, 50),
# np.linspace(0, -5.88, 50),])
# iz_y = np.concatenate([np.linspace(-2.10, 4.50, 50),
# np.linspace(4.50, 7.90, 50),
# np.linspace(7.90, 4.50, 50),
# np.linspace(4.50, -2.10, 50),
# np.linspace(-2.10, -5.50, 50),
# np.linspace(-5.50, -2.10, 50), ])
# for i, z in tqdm(enumerate(zs), total=len(zs)):
# subdata = data[data[:, 2] == z, :]
# for j in range(3): # For all 3 components!
# gridded_subdata = griddata(np.concatenate([subdata[:, 0], iz_x]),
# np.concatenate([subdata[:, 1], iz_y]),
# np.concatenate([subdata[:, 3 + j], np.zeros(len(iz_x))]),
# o, p)
# magnitude[j, i, :, :] = gridded_subdata.filled(fill_value=0)
# # WITHOUT MASKING OF THE CENTER:
# for i, z in tqdm(enumerate(zs), total=len(zs)):
# subdata = data[data[:, 2] == z, :]
# for j in range(3): # For all 3 components!
# gridded_subdata = griddata(subdata[:, 0], subdata[:, 1], subdata[:, 3 + j], o, p)
# magnitude[j, i, :, :] = gridded_subdata.filled(fill_value=0)
# Creating MagData object:
mag_data = MagData(0.2*10, magnitude)
mag_data.save_to_netcdf4(PATH+'.nc')
else:
mag_data = MagData.load_from_netcdf4(PATH+'.nc')
mag_data.quiver_plot()
###################################################################################################
# Phasemapping:
phase_map = pm(mag_data, dim_uv=(300, 300))
(-phase_map).display_combined(title=r'Combined Plot (B$_0$={} T, Cos x {})'.format(b_0, gain),
gain=gain)
plt.savefig(PATH+'_{}T_cosx{}.png'.format(b_0, gain))
(-phase_map).display_combined(title=r'Combined Plot (B$_0$={} T, Cos x {})'.format(b_0, gain),
gain=gain, interpolation='bilinear')
plt.savefig(PATH+'_{}T_cosx{}_smooth.png'.format(b_0, gain))