Преобразование значений плотности из сферической системы координат в декартову / скриптовую проверку

У меня есть следующая проблема:

  • сферическая система координат, куб данных 50*31*89, полный координат со значениями плотности и температуры
  • Мне нужно перенести значение плотности из каждой сферической "ячейки" в соответствующую "ячейку" в декартовой системе с размером 150*150*50.

Я написал сценарий, но не уверен, что он правильный. Был бы рад, если бы кто-нибудь смог это проверить.

Вывод, который мне нужен, это файл ascii со значениями плотности. Позже я преобразую эти значения в двоичный файл данных вокселей, чтобы использовать его в Blender.

import numpy as np

# some "fix wired" information from input file
nI = 50
nJ = 31
nK = 89
n = nI * nJ * nK
radius = 3e10 

# define grid data arrays
r = np.zeros( nI )                 # radius
theta = np.zeros( nJ )             # polar angle
phi = np.zeros( nK  )              # azimuth angle
D = np.zeros( ( nI, nJ, nK ) )     # density
T = np.zeros( ( nI, nJ, nK ) )     # temperature 

# read data from input file
file = open( "PLANET3DP.DATA", "r" )
text = file.readlines()
file.close()
i = 0
for line in text:
    if( line.find( "Grid: radial" ) > -1 ):
        I1 = i + 2
    if( line.find( "Grid: polar" ) > -1 ):
        J1 = i + 2
    if( line.find( "Grid: azimuthal" ) > -1 ):
        K1 = i + 2
    if ( line.find( "Data:" ) > -1 ):
        data1 = i + 1
    i = i + 1
for I in range( 0, nI ):
    w = text[ I1 + I ].split()
    r[ I ] = float( w[ 1 ] )
#print( r )
for J in range( 0, nJ ):
    w = text[ J1 + J ].split()
    theta[ J ] = float( w[ 1 ] )
#print( theta )
for K in range( 0, nK ):
    w = text[ K1 + K ].split()
    phi[ K ] = float( w[ 1 ] )
#print( phi )
for i in range( 0, n ):
    w = text[ data1 + i ].split()
    I = int( w[ 0 ] ) - 1
    J = int( w[ 1 ] ) - 1
    K = int( w[ 2 ] ) - 1
    D[ I, J, K ] = float( w[ 3 ] )
    T[ I, J, K ] = float( w[ 4 ] )

# define 3 vectors that describe a 3D cartesian coordinate system
x = np.linspace(-radius,radius,150)
y = np.linspace(-radius,radius,150)
z = np.linspace(-radius,radius,50)

# pick densities from spherical coordiates
D2 = np.zeros( ( 150, 150, 50 ) )
for i in range( 0, 150 ):
    for j in range( 0, 150 ):
        for k in range( 0, 50 ):
            r2 = np.sqrt( x[ i ] ** 2 + y[ j ] ** 2 + z[ k ] ** 2 )
            theta2 = np.arccos( z[ k ] / r2 )
            phi2 = np.arctan2( y[ j ], x[ i ] )
            ii = np.where( r > r2 )
            jj = np.where( theta > theta2 )
            kk = np.where( phi > phi2 )
            if ii[ 0 ].size > 0 and jj[ 0 ].size > 0 and kk[ 0 ].size > 0:
                I = np.min( ii )
                J = np.min( jj )
                K = np.min( kk )
                D2[ i, j, k ] = D[ I, J, K ]
            else:
                D2[ i, j, k ] = 0
#print( D2 )
file = open( "only_density.csv", "w" )
for I in range( 0, 150 ):
    for J in range( 0, 150 ):
        for K in range( 0, 50 ):
            file.write( str( D2[ I, J, K ] ) + "\n" )
file.close()

0 ответов

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