Преобразование сетки 3D-декартовой сетки в сферическое сечение
Я моделирую конвекцию в сферическом сечении методом конечных элементов. Я пытаюсь деформировать трехмерную декартову сетку в сферическое сечение с 3480 <= radius <= 6371 км, а угловой диапазон в тэте и фи составляет 80 градусов. Пожалуйста, проверьте это изображение, левая сторона - это трехмерная декартова сетка, которая у меня есть, а правая сторона - требуемая деформированная геометрия сетки. Я использовал некоторую функцию преобразования, чтобы деформировать сетку, но не смог достичь конечной цели. Я ищу некоторые предложения по алгоритму или функции преобразования, чтобы деформировать сетку в сферическую секцию.
1 ответ
Решение
Не уверен, что это действительно то же самое, но на глаз это выглядит достаточно близко:
import numpy as np
phi, theta, R = np.ogrid[-40:40:21j, -40:40:21j, 3480:6371:21j]
y, x = np.tan(phi*np.pi/180), np.tan(theta*np.pi/180)
z = R / np.sqrt(x*x + y*y + 1)
y, x = y*z, x*z
from mpl_toolkits.mplot3d import Axes3D
import pylab
fig = pylab.figure(1)
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(x[..., 20], y[..., 20], z[..., 20])
ax.plot_wireframe(0.01*x[..., 20], 0.01*y[..., 20], 0.01*z[..., 20]) # hack to scale z axis
ax.plot_wireframe(x[:, 20, :], y[:, 20, :], z[:, 20, :])
ax.plot_wireframe(x[0, ...], y[0, ...], z[0, ...])
fig.show()