反映 4d 对称数据
Reflecting 4d symmetric data
我发现没有关于如何反映对称 4d 数据的示例,当 3d 模拟想要使用对称平面 执行时,这可能非常有用减少计算(例如 ANSYS、COMSOL 等)。此示例显示了对应于 COMSOL 仿真的数据文件结构,其结构为:X, Y, Z, Amplitude
该模型沿 Y 平面具有对称性,并在该平面上进行了切片,因此必须计算的网格元素较少。为了获得完整的 Y 平面视图(即 Y 从 -0.5 到 0.5),数据必须沿 Y 平面反射。
此类问题的示例代码如下所示:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
### generate a SIMULATION type-file###
X = np.linspace(-0.5, 0.5, 50)
Y = np.linspace(-0.5, 0, 50) #to be reflected/extended to 0.5
Z = np.linspace(-0.5, 0.5, 50)
Xq, Yq, Zq = np.meshgrid(X, Y, Z)
Amp = 1* np.exp(-((Xq - 0) ** 2 / (0.03) + ( Yq - 0) ** 2 / (0.03) + ( Zq - 0) ** 2 / (0.03)))
datafile = np.vstack([Xq.ravel(), Yq.ravel(), Zq.ravel(), Amp.ravel()]).T #resemble the simulation data structur, in this case X, Y, Z, Amp
### PYTHON POST-PROCESSING ###
X = datafile[:, 0]
Y = datafile[:, 1]
Z = datafile[:, 2]
Amp = datafile[:, 3] #Amplitude could be a Pressure, Force, Magnetic field, etc
xq = 0.0 #choose an arbitrary plane to show amplitude distribution over this plane
yq = np.linspace(min(Y), max(Y), 50)
zq = np.linspace(min(Z), max(Z), 50)
Xq, Yq, Zq = np.meshgrid(xq, yq, zq)
int_plane = griddata((X, Y, Z), Amp, (Xq, Yq, Zq), method='linear')
int_plane = np.squeeze(int_plane)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(Zq, Yq, zs=int_plane)
ax.set_title('3D view');
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
需要考虑的一个重要细节是平面 Y=0 不得重复。
这里的目的是重建数据集的另一半(即整个另一半 3D space + 相应的振幅)。 3D space 的正确反射将输出完整的 3D 高斯分布。如何有效地完成这件事?
您沿 y 轴反射,省略最后一个元素,并将反射数据附加到数据本身
amp = np.vstack((amp, amp[-2::-1]))
示例:
In [37]: x, y, z = (-1, 0, 1), (-50, 0), (-5, 0, 5)
...: X, Y, X = np.meshgrid(x, y, z)
...: data = X+Y+Z
...: print("----------------", data, sep='\n')
...: data = np.vstack((data, data[-2::-1]))
...: print("----------------", data, sep='\n')
----------------
[[[-56 -50 -44]
[-56 -50 -44]
[-56 -50 -44]]
[[ -6 0 6]
[ -6 0 6]
[ -6 0 6]]]
----------------
[[[-56 -50 -44]
[-56 -50 -44]
[-56 -50 -44]]
[[ -6 0 6]
[ -6 0 6]
[ -6 0 6]]
[[-56 -50 -44]
[-56 -50 -44]
[-56 -50 -44]]]
In [38]:
我发现没有关于如何反映对称 4d 数据的示例,当 3d 模拟想要使用对称平面 执行时,这可能非常有用减少计算(例如 ANSYS、COMSOL 等)。此示例显示了对应于 COMSOL 仿真的数据文件结构,其结构为:X, Y, Z, Amplitude
该模型沿 Y 平面具有对称性,并在该平面上进行了切片,因此必须计算的网格元素较少。为了获得完整的 Y 平面视图(即 Y 从 -0.5 到 0.5),数据必须沿 Y 平面反射。
此类问题的示例代码如下所示:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
### generate a SIMULATION type-file###
X = np.linspace(-0.5, 0.5, 50)
Y = np.linspace(-0.5, 0, 50) #to be reflected/extended to 0.5
Z = np.linspace(-0.5, 0.5, 50)
Xq, Yq, Zq = np.meshgrid(X, Y, Z)
Amp = 1* np.exp(-((Xq - 0) ** 2 / (0.03) + ( Yq - 0) ** 2 / (0.03) + ( Zq - 0) ** 2 / (0.03)))
datafile = np.vstack([Xq.ravel(), Yq.ravel(), Zq.ravel(), Amp.ravel()]).T #resemble the simulation data structur, in this case X, Y, Z, Amp
### PYTHON POST-PROCESSING ###
X = datafile[:, 0]
Y = datafile[:, 1]
Z = datafile[:, 2]
Amp = datafile[:, 3] #Amplitude could be a Pressure, Force, Magnetic field, etc
xq = 0.0 #choose an arbitrary plane to show amplitude distribution over this plane
yq = np.linspace(min(Y), max(Y), 50)
zq = np.linspace(min(Z), max(Z), 50)
Xq, Yq, Zq = np.meshgrid(xq, yq, zq)
int_plane = griddata((X, Y, Z), Amp, (Xq, Yq, Zq), method='linear')
int_plane = np.squeeze(int_plane)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(Zq, Yq, zs=int_plane)
ax.set_title('3D view');
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
这里的目的是重建数据集的另一半(即整个另一半 3D space + 相应的振幅)。 3D space 的正确反射将输出完整的 3D 高斯分布。如何有效地完成这件事?
您沿 y 轴反射,省略最后一个元素,并将反射数据附加到数据本身
amp = np.vstack((amp, amp[-2::-1]))
示例:
In [37]: x, y, z = (-1, 0, 1), (-50, 0), (-5, 0, 5)
...: X, Y, X = np.meshgrid(x, y, z)
...: data = X+Y+Z
...: print("----------------", data, sep='\n')
...: data = np.vstack((data, data[-2::-1]))
...: print("----------------", data, sep='\n')
----------------
[[[-56 -50 -44]
[-56 -50 -44]
[-56 -50 -44]]
[[ -6 0 6]
[ -6 0 6]
[ -6 0 6]]]
----------------
[[[-56 -50 -44]
[-56 -50 -44]
[-56 -50 -44]]
[[ -6 0 6]
[ -6 0 6]
[ -6 0 6]]
[[-56 -50 -44]
[-56 -50 -44]
[-56 -50 -44]]]
In [38]: