init
This commit is contained in:
7
amspyigrf13.code-workspace
Normal file
7
amspyigrf13.code-workspace
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
]
|
||||
}
|
17
amspyigrf13/__init__.py
Normal file
17
amspyigrf13/__init__.py
Normal file
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
"""
|
||||
Aaron M. Schinders python library for working with the IGRF geomagnetic field model
|
||||
|
||||
Intended to be self contained. Will contain some earlier work for evaluating spherical harmonics.
|
||||
|
||||
"""
|
||||
|
||||
from .amspyigrf_loader import *
|
||||
|
||||
from .amssphharmonics import gso_cosharmonic
|
||||
from .amssphharmonics import gso_sinharmonic
|
||||
|
||||
from .amspyigrf_eval import igrf_potential, igrf_bfield
|
||||
|
||||
from .amsgrs80geom import *
|
BIN
amspyigrf13/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
BIN
amspyigrf13/__pycache__/amsgrs80geom.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/amsgrs80geom.cpython-312.pyc
Normal file
Binary file not shown.
BIN
amspyigrf13/__pycache__/amslegendre.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/amslegendre.cpython-312.pyc
Normal file
Binary file not shown.
BIN
amspyigrf13/__pycache__/amspolyfuns.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/amspolyfuns.cpython-312.pyc
Normal file
Binary file not shown.
BIN
amspyigrf13/__pycache__/amspyigrf_eval.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/amspyigrf_eval.cpython-312.pyc
Normal file
Binary file not shown.
BIN
amspyigrf13/__pycache__/amspyigrf_loader.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/amspyigrf_loader.cpython-312.pyc
Normal file
Binary file not shown.
BIN
amspyigrf13/__pycache__/amssphharmonics.cpython-312.pyc
Normal file
BIN
amspyigrf13/__pycache__/amssphharmonics.cpython-312.pyc
Normal file
Binary file not shown.
461
amspyigrf13/amsgrs80geom.py
Normal file
461
amspyigrf13/amsgrs80geom.py
Normal file
@ -0,0 +1,461 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
__all__ = ["geodetic_rhoz_to_latalt",
|
||||
"geodetic_rhoz_to_latalt",
|
||||
"grs80_lonlatalt_to_xyz",
|
||||
"grs80_xyz_to_lonlatalt",
|
||||
"grs80_uvw_coordsys",
|
||||
"grs80_xyzvectors_to_uvw",
|
||||
"grs80_uvwvectors_to_xyz"
|
||||
]
|
||||
|
||||
pi = np.pi
|
||||
cos = np.cos
|
||||
sin = np.sin
|
||||
tan = np.tan
|
||||
atan = np.atan
|
||||
atan2 = np.atan2
|
||||
sqrt = np.sqrt
|
||||
abs = np.abs
|
||||
|
||||
def arg(x,y):
|
||||
x = np.array(x)
|
||||
y = np.array(y)
|
||||
|
||||
single = False
|
||||
if(len(x.shape)==0):
|
||||
single = True
|
||||
x = np.reshape(x,[1])
|
||||
y = np.reshape(y,[1])
|
||||
|
||||
th = np.atan2(y,x)
|
||||
if(th<0.0):
|
||||
th = th + 2*pi
|
||||
|
||||
if(single):
|
||||
th = th[0]
|
||||
y = y[0]
|
||||
|
||||
return th
|
||||
|
||||
def azel(x,y,z):
|
||||
x = np.array(x)
|
||||
y = np.array(y)
|
||||
z = np.array(z)
|
||||
|
||||
single = False
|
||||
if(len(x.shape)==0):
|
||||
single = True
|
||||
x = np.reshape(x,[1])
|
||||
y = np.reshape(y,[1])
|
||||
z = np.reshape(z,[1])
|
||||
|
||||
th = arg(x,y)
|
||||
rho = np.sqrt(x**2+y**2)
|
||||
el = np.atan(z/rho)
|
||||
|
||||
if(single):
|
||||
th = th[0]
|
||||
el = el[0]
|
||||
|
||||
return [th,el]
|
||||
|
||||
def geodetic_rhoz_to_latalt(p, z):
|
||||
"""
|
||||
[lat, alt] = geodetic_rhoz_to_latalt(p, z):
|
||||
Inputs:
|
||||
p - radial sqrt(x**2+y**2) coordinate [km]
|
||||
z - altitude [km]
|
||||
Outputs:
|
||||
geodetic latitude [deg]
|
||||
geodetic altitude [km]
|
||||
"""
|
||||
|
||||
#GRS-80 ellipsoid parameters
|
||||
a = 6378.137
|
||||
finv = 298.257222101
|
||||
b = a*(1.0-1.0/finv)
|
||||
e2 = (a**2-b**2)/(a**2)
|
||||
e2p = (a**2-b**2)/(b**2)
|
||||
|
||||
#Input conditioning
|
||||
p = np.array(p)
|
||||
z = np.array(z)
|
||||
|
||||
single = False
|
||||
if(len(p.shape)==0):
|
||||
single = True
|
||||
p = p.reshape([1])
|
||||
z = z.reshape([1])
|
||||
|
||||
"""
|
||||
//Ferari's Direct Quartic Solution for k
|
||||
//float ksi,rho2,s,t,u,v,w,k;
|
||||
// ksi = (1.0f-e*e)*(z/a)*(z/a);
|
||||
// rho2 = 1.0f/6.0f*((rho/a)*(rho/a)+ksi-e*e*e*e);
|
||||
// s = e*e*e*e*ksi*(rho/a)*(rho/a)/(4.0f*rho2*rho2*rho2);
|
||||
// t = powf(1+s+::sqrt(s*(s+2)),1.0f/3.0f);
|
||||
// u = rho2*(t+1+1/t);
|
||||
// v = ::sqrtf(u*u+e*e*e*e*ksi);
|
||||
// w = e*e*(u+v-ksi)/(2.0f*v);
|
||||
|
||||
// k = 1+e*e*(::sqrtf(u+v+w*w)+w)/(u+v);
|
||||
|
||||
// ret = ::atanf(k*z/rho);
|
||||
|
||||
//given further down the wikipedia page
|
||||
// https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_ECEF_to_geodetic_coordinates
|
||||
"""
|
||||
|
||||
p = np.abs(p)
|
||||
F = 54.0*b*b*z*z
|
||||
G = p*p+(1-e2)*z*z-e2*(a*a-b*b)
|
||||
c = (e2*e2*F*p*p)/(G*G*G)
|
||||
s = (1.0 + c + np.sqrt(c*c+2*c))**(1.0/3.0)
|
||||
k = s + 1.0 + 1.0/s
|
||||
P = F/(3.0*k*k*G*G)
|
||||
Q = np.sqrt(1.0+2.0*e2*e2*P)
|
||||
r0 = -(P*e2*p)/(1.0+Q) + np.sqrt(0.5*a*a*(1.0+1.0/Q)-(P*(1.0-e2)*z*z)/(Q*(1.0+Q))-0.5*P*p*p)
|
||||
U = np.sqrt((p-e2*r0)*(p-e2*r0)+z*z)
|
||||
V = np.sqrt((p-e2*r0)*(p-e2*r0)+(1.0-e2)*z*z)
|
||||
z0 = b*b*z/(a*V)
|
||||
alt = U*(1.0-b*b/(a*V))
|
||||
lat = np.atan((z+e2p*z0)/p)
|
||||
|
||||
lat = lat * 180.0/pi
|
||||
|
||||
#Output conditioning
|
||||
if(single):
|
||||
lat = lat[0]
|
||||
alt = alt[0]
|
||||
|
||||
return [lat,alt]
|
||||
|
||||
def geodetic_latalt_to_rhoz(lat,alt):
|
||||
"""
|
||||
[lat, alt] = geodetic_latalt_to_rhoz(lat, alt):
|
||||
Inputs:
|
||||
geodetic latitude [deg]
|
||||
geodetic altitude [km]]
|
||||
Outputs:
|
||||
p - radial sqrt(x**2+y**2) coordinate [km]
|
||||
z - altitude [km]
|
||||
"""
|
||||
|
||||
#GRS-80 ellipsoid parameters
|
||||
a = 6378.137
|
||||
finv = 298.257222101
|
||||
b = a*(1.0-1.0/finv)
|
||||
e2 = (a**2-b**2)/(a**2)
|
||||
e2p = (a**2-b**2)/(b**2)
|
||||
|
||||
#Input Conditioning
|
||||
lat = np.array(lat)
|
||||
alt = np.array(alt)
|
||||
|
||||
single = False
|
||||
if(len(lat.shape)==0):
|
||||
single = True
|
||||
lat = lat.reshape([1])
|
||||
alt = alt.reshape([1])
|
||||
|
||||
lat = lat * pi/180.0
|
||||
# lat[lat>90.0] = 90.0-lat[lat>90.0]
|
||||
# lat[lat<-90.0] = -90.0 - lat[lat<-90.0]
|
||||
N = a**2/np.sqrt(a**2*cos(lat)**2+b**2*sin(lat)**2)
|
||||
p = np.abs((N+alt)*np.cos(lat))
|
||||
z = ((b/a)**2*N+alt)*np.sin(lat)
|
||||
|
||||
#Output Conditioning
|
||||
if(single):
|
||||
p = p[0]
|
||||
z = z[0]
|
||||
|
||||
return [p,z]
|
||||
|
||||
def grs80_lonlatalt_to_xyz(lon,lat,alt):
|
||||
"""
|
||||
[x,y,z] = grs80_lonlatalt_to_xyz(lon,lat,alt)
|
||||
Inputs:
|
||||
lon [deg]
|
||||
lat [deg]
|
||||
alt [km]
|
||||
Outputs:
|
||||
x,y,z [km] ECEF coordinates
|
||||
"""
|
||||
lon = np.array(lon)
|
||||
lat = np.array(lat)
|
||||
alt = np.array(alt)
|
||||
|
||||
single = False
|
||||
if(len(lon.shape)==0):
|
||||
single = True
|
||||
lon = lon.reshape([1])
|
||||
lat = lat.reshape([1])
|
||||
alt = alt.reshape([1])
|
||||
|
||||
[rho,z] = geodetic_latalt_to_rhoz(lat,alt)
|
||||
x = rho*np.cos(lon*pi/180.0)
|
||||
y = rho*np.sin(lon*pi/180.0)
|
||||
|
||||
if(single):
|
||||
x = x[0]
|
||||
y = y[0]
|
||||
z = z[0]
|
||||
|
||||
return [x,y,z]
|
||||
|
||||
def grs80_xyz_to_lonlatalt(x,y,z):
|
||||
"""
|
||||
[lon,lat,alt] = grs80_xyz_to_lonlatalt(x,y,z)
|
||||
Inputs:
|
||||
x,y,z [km] ECEF coordinates
|
||||
Outputs:
|
||||
lon [deg]
|
||||
lat [deg]
|
||||
alt [km]
|
||||
"""
|
||||
|
||||
x = np.array(x); y = np.array(y); z = np.array(z)
|
||||
single = False
|
||||
if(len(x.shape)==0):
|
||||
single = True
|
||||
x = x.reshape([1]); y = y.reshape([1]); z = z.reshape([1])
|
||||
|
||||
rho = np.sqrt(x**2+y**2)
|
||||
[lat,alt] = geodetic_rhoz_to_latalt(rho,z)
|
||||
lon = np.atan2(y,x)*180.0/pi
|
||||
|
||||
if(single):
|
||||
lon = lon[0]
|
||||
lat = lat[0]
|
||||
alt = alt[0]
|
||||
|
||||
return [lon,lat,alt]
|
||||
|
||||
def grs80_uvw_coordsys(x,y,z):
|
||||
"""
|
||||
[u,v,w] = grs80_uvw_coordsys(x,y,z)
|
||||
Args:
|
||||
x,y,z - [km] vectors of ECEF coordinates
|
||||
Returns:
|
||||
[u,v,w] - each [3,N] unit vectors pointing along zonal, meridional, and vertical directions
|
||||
"""
|
||||
|
||||
x = np.array(x); y = np.array(y); z = np.array(z)
|
||||
single = False
|
||||
if(len(x.shape)==0):
|
||||
single = True
|
||||
x = x.reshape([1]); y = y.reshape([1]); z = z.reshape([1])
|
||||
|
||||
N = x.shape[0]
|
||||
u = np.zeros([3,N])
|
||||
v = np.zeros([3,N])
|
||||
w = np.zeros([3,N])
|
||||
|
||||
rho = np.sqrt(x**2+y**2)
|
||||
[lat,alt] = geodetic_rhoz_to_latalt(rho,z)
|
||||
lat = lat * pi/180.0
|
||||
lon = np.atan2(y,x)
|
||||
|
||||
u[0,:] = -sin(lon)
|
||||
u[1,:] = cos(lon)
|
||||
u[2,:] = 0.0
|
||||
v[0,:] = -cos(lon)*sin(lat)
|
||||
v[1,:] = -sin(lon)*sin(lat)
|
||||
v[2,:] = cos(lat)
|
||||
w[0,:] = cos(lon)*cos(lat)
|
||||
w[1,:] = sin(lon)*cos(lat)
|
||||
w[2,:] = sin(lat)
|
||||
|
||||
return [u,v,w]
|
||||
|
||||
def _local_vdot(v1,v2):
|
||||
|
||||
v1 = np.array(v1)
|
||||
v2 = np.array(v2)
|
||||
|
||||
single = False
|
||||
if(len(v1.shape)==1):
|
||||
single = True
|
||||
v1 = v1.reshape([3,1])
|
||||
v2 = v2.reshape([3,1])
|
||||
|
||||
dots = np.sum(v1*v2,axis=0)
|
||||
|
||||
if(single):
|
||||
dots = dots[0]
|
||||
|
||||
return dots
|
||||
|
||||
def grs80_xyzvectors_to_uvw(xyzpos,xyzvect):
|
||||
"""
|
||||
[lonlatalt, uvwvect] = grs80_xyzvectors_to_uvw(xyzpos,xyzvect)
|
||||
Inputs:
|
||||
xyzpos [km] - [3,N] array of vector ECEF positions
|
||||
xyzvect - [3,N] array of vectors
|
||||
Outputs:
|
||||
lonlatalt [deg, deg, km] - [3,N] array of vector geodetic coordinates
|
||||
uvwvect - [3,N] array of vectors in terms of local zonal, meridional, and vertical components
|
||||
"""
|
||||
xyzpos = np.array(xyzpos)
|
||||
xyzvect = np.array(xyzvect)
|
||||
|
||||
single = False
|
||||
if(len(xyzpos.shape)==1):
|
||||
single = True
|
||||
xyzpos = xyzpos.reshape([3,1])
|
||||
xyzvect = xyzvect.reshape([3,1])
|
||||
|
||||
N = xyzpos.shape[1]
|
||||
|
||||
[lon,lat,alt] = grs80_xyz_to_lonlatalt(xyzpos[0,:],xyzpos[1,:],xyzpos[2,:])
|
||||
lonlatalt = np.stack([lon,lat,alt],axis=0)
|
||||
[u,v,w] = grs80_uvw_coordsys(xyzpos[0,:],xyzpos[1,:],xyzpos[2,:])
|
||||
|
||||
uc = _local_vdot(xyzvect,u)
|
||||
vc = _local_vdot(xyzvect,v)
|
||||
wc = _local_vdot(xyzvect,w)
|
||||
|
||||
uvwvect = np.stack([uc,vc,wc],axis=0)
|
||||
|
||||
if(single):
|
||||
lonlatalt = np.squeeze(lonlatalt)
|
||||
uvwvect = np.squeeze(uvwvect)
|
||||
|
||||
return [lonlatalt, uvwvect]
|
||||
|
||||
def grs80_uvwvectors_to_xyz(lonlatalt, uvwvect):
|
||||
"""
|
||||
[xyzpos, xyzvect] = grs80_uvwvectors_to_xyz(lonlatalt, uvwvect)
|
||||
Inputs:
|
||||
lonlatalt [deg, deg, km] - [3,N] array of vector geodetic coordinates
|
||||
uvwvect - [3,N] array of vectors in terms of local zonal, meridional, and vertical components
|
||||
Outputs:
|
||||
xyzpos [km] - [3,N] array of vector ECEF positions
|
||||
xyzvect - [3,N] array of vectors
|
||||
"""
|
||||
lonlatalt = np.array(lonlatalt)
|
||||
uvwvect = np.array(uvwvect)
|
||||
|
||||
single = False
|
||||
if(len(lonlatalt.shape)==1):
|
||||
single = True
|
||||
lonlatalt = lonlatalt.reshape([3,1])
|
||||
uvwvect = uvwvect.reshape([3,1])
|
||||
|
||||
[x,y,z] = grs80_lonlatalt_to_xyz(lonlatalt[0,:],lonlatalt[1,:],lonlatalt[2,:])
|
||||
xyzpos = np.stack([x,y,z],axis=0)
|
||||
|
||||
N = lonlatalt.shape[1]
|
||||
xyzvect = np.zeros([3,N])
|
||||
|
||||
[u,v,w] = grs80_uvw_coordsys(x,y,z)
|
||||
|
||||
xyzvect[0,:] = u[0]*uvwvect[0,:] + v[0]*uvwvect[1,:] + w[0]*uvwvect[2,:]
|
||||
xyzvect[1,:] = u[1]*uvwvect[0,:] + v[1]*uvwvect[1,:] + w[1]*uvwvect[2,:]
|
||||
xyzvect[2,:] = u[2]*uvwvect[0,:] + v[2]*uvwvect[1,:] + w[2]*uvwvect[2,:]
|
||||
|
||||
if(single==True):
|
||||
xyzpos = np.squeeze(xyzpos)
|
||||
xyzvect = np.squeeze(xyzvect)
|
||||
|
||||
return [xyzpos, xyzvect]
|
||||
|
||||
###########
|
||||
## Tests ##
|
||||
###########
|
||||
|
||||
def test_geodetic_latitude():
|
||||
|
||||
th = np.linspace(0,2*pi,100)
|
||||
|
||||
a = 6378.137
|
||||
p = cos(th)*a
|
||||
z = sin(th)*a
|
||||
|
||||
[lat,alt] = geodetic_rhoz_to_latalt(p,z)
|
||||
[p2,z2] = geodetic_latalt_to_rhoz(lat,alt)
|
||||
[lat2,alt2] = geodetic_rhoz_to_latalt(p2,z2)
|
||||
|
||||
err1 = np.abs(np.abs(p2)-np.abs(p))
|
||||
err2 = np.abs(z2-z)
|
||||
err3 = np.abs(lat2-lat)
|
||||
err4 = np.abs(alt2-alt)
|
||||
|
||||
for I in range(0,len(th)):
|
||||
ln = "{:1.3f}: {:1.3f},{:1.3f}: {:1.3f},{:1.3f} : {:1.3f} {:1.3f} {:1.3f} {:1.3f}".format(th[I],p[I],z[I],lat[I],alt[I],err1[I],err2[I],err3[I],err4[I])
|
||||
print(ln)
|
||||
|
||||
a = 360000.0
|
||||
p = cos(th)*a
|
||||
z = sin(th)*a
|
||||
|
||||
[lat,alt] = geodetic_rhoz_to_latalt(p,z)
|
||||
[p2,z2] = geodetic_latalt_to_rhoz(lat,alt)
|
||||
[lat2,alt2] = geodetic_rhoz_to_latalt(p2,z2)
|
||||
|
||||
err1 = np.abs(np.abs(p2)-np.abs(p))
|
||||
err2 = np.abs(z2-z)
|
||||
err3 = np.abs(lat2-lat)
|
||||
err4 = np.abs(alt2-alt)
|
||||
|
||||
for I in range(0,len(th)):
|
||||
ln = "{:1.3f}: {:1.3f},{:1.3f}: {:1.3f},{:1.3f} : {:1.3f} {:1.3f} {:1.3f} {:1.3f}".format(th[I],p[I],z[I],lat[I],alt[I],err1[I],err2[I],err3[I],err4[I])
|
||||
print(ln)
|
||||
|
||||
a = 100.0
|
||||
p = cos(th)*a
|
||||
z = sin(th)*a
|
||||
|
||||
[lat,alt] = geodetic_rhoz_to_latalt(p,z)
|
||||
[p2,z2] = geodetic_latalt_to_rhoz(lat,alt)
|
||||
[lat2,alt2] = geodetic_rhoz_to_latalt(p2,z2)
|
||||
|
||||
err1 = np.abs(np.abs(p2)-np.abs(p))
|
||||
err2 = np.abs(z2-z)
|
||||
err3 = np.abs(lat2-lat)
|
||||
err4 = np.abs(alt2-alt)
|
||||
|
||||
for I in range(0,len(th)):
|
||||
ln = "{:1.3f}: {:1.3f},{:1.3f}: {:1.3f},{:1.3f} : {:1.3f} {:1.3f} {:1.3f} {:1.3f}".format(th[I],p[I],z[I],lat[I],alt[I],err1[I],err2[I],err3[I],err4[I])
|
||||
print(ln)
|
||||
|
||||
|
||||
return
|
||||
|
||||
def test_grs80_1():
|
||||
|
||||
[x,y,z] = grs80_lonlatalt_to_xyz(45,0,0)
|
||||
print(x,y,z)
|
||||
[x,y,z] = grs80_lonlatalt_to_xyz(0,45,0)
|
||||
print(x,y,z)
|
||||
|
||||
[lon,lat,alt] = grs80_xyz_to_lonlatalt(6371,0,0)
|
||||
print(lon,lat,alt)
|
||||
|
||||
lon = np.linspace(-180,180,50)
|
||||
lat = np.linspace(-90,90,25)
|
||||
[lon2,lat2] = np.meshgrid(lon,lat,indexing='ij')
|
||||
|
||||
[x,y,z] = grs80_lonlatalt_to_xyz(lon2,lat2,0)
|
||||
[x2,y2,z2] = grs80_lonlatalt_to_xyz(lon2,lat2,-6600)
|
||||
|
||||
plt.figure().add_subplot(projection="3d")
|
||||
plt.plot(x,y,z,'k.',markersize=1)
|
||||
plt.plot(x2,y2,z2,'r.',markersize=1)
|
||||
plt.show()
|
||||
|
||||
return
|
||||
|
||||
|
||||
if(__name__=="__main__"):
|
||||
|
||||
#test_geodetic_latitude()
|
||||
test_grs80_1()
|
||||
|
||||
exit(0)
|
143
amspyigrf13/amslegendre.py
Normal file
143
amspyigrf13/amslegendre.py
Normal file
@ -0,0 +1,143 @@
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
|
||||
factorial = math.factorial
|
||||
comb = math.comb
|
||||
perm = math.perm
|
||||
|
||||
from .amspolyfuns import poly_pow
|
||||
from .amspolyfuns import poly_derivative
|
||||
from .amspolyfuns import polyval
|
||||
|
||||
|
||||
def legendre_poly(L):
|
||||
"""
|
||||
generates polynomial coefficients for Legendre
|
||||
polynomial of order L
|
||||
"""
|
||||
|
||||
L = int(L)
|
||||
if(L<0):
|
||||
return np.float64([0.0])
|
||||
elif(L==0):
|
||||
return np.float64([1.0])
|
||||
|
||||
p = np.float64([-1,0,1])
|
||||
p = poly_pow(p,L)
|
||||
|
||||
for I in range(1,L+1):
|
||||
p = poly_derivative(p)
|
||||
p = p/2/I
|
||||
|
||||
return p
|
||||
|
||||
def legendre_eval(x,L):
|
||||
p = legendre_poly(L)
|
||||
y = polyval(x,p)
|
||||
return y
|
||||
|
||||
|
||||
def alegendre_polypart(L,M):
|
||||
"""
|
||||
Polynomial part of associated legendre function
|
||||
The full associated legendre function, including condon-shortley phase
|
||||
is (1-x^2)*(M/2) * alegendre_polypart(L,M)
|
||||
"""
|
||||
|
||||
M = int(M)
|
||||
L = int(L)
|
||||
if(L<0):
|
||||
return np.float64([0])
|
||||
if(abs(M)>L):
|
||||
return np.float64([0])
|
||||
|
||||
Ma = abs(M)
|
||||
CSP = (-1)**Ma
|
||||
p = legendre_poly(L)
|
||||
|
||||
if(Ma>0):
|
||||
p = poly_derivative(p,Ma)
|
||||
|
||||
p = CSP*p
|
||||
if(M<0):
|
||||
Nrm = factorial(L-Ma)/factorial(L+Ma)*(-1)**Ma*p
|
||||
p = Nrm*p
|
||||
|
||||
return p
|
||||
|
||||
|
||||
def alegendre_eval(x,L,M):
|
||||
"""
|
||||
Evaluates associated legendre function
|
||||
y = P^m_l(x)
|
||||
"""
|
||||
|
||||
L = int(L)
|
||||
M = int(M)
|
||||
Ma = abs(M)
|
||||
|
||||
if(L<0):
|
||||
y = np.zeros(x.shape)
|
||||
return y
|
||||
if(Ma>L):
|
||||
y = np.zeros(x.shape)
|
||||
return y
|
||||
|
||||
if(Ma>0):
|
||||
#sqpart = np.sign(1-x**2)*np.sqrt(1-x**2)**(Ma)
|
||||
#sign doesn't work here - need to convert sqrt(1-cos2) to sin
|
||||
sqpart = np.sqrt(1-x**2)**(Ma)
|
||||
else:
|
||||
sqpart = np.ones(x.shape)
|
||||
|
||||
p = alegendre_polypart(L,M)
|
||||
|
||||
y = polyval(x,p)
|
||||
y = y*sqpart
|
||||
|
||||
return y
|
||||
|
||||
def gso_cosinealegendre(theta, m, n):
|
||||
"""
|
||||
Returns the Graham-Schmidt semi-normalized associated legendre function
|
||||
as described in Winch et. al. 2005.
|
||||
y = P^m_n(cos(theta))
|
||||
|
||||
P^m_n(cos(theta)) = sqrt((2-del^0_m)(n-m)!/(n+m)!) * sin(theta)^m *(d/dcos(theta))^m [P_n(cos(theta))]
|
||||
|
||||
normalization of associated cosine and sine harmonics is 4*pi/(2*n+1)
|
||||
|
||||
for use in the IGRF-13 model
|
||||
"""
|
||||
|
||||
n = int(n)
|
||||
m = int(m)
|
||||
theta = np.array(theta)
|
||||
|
||||
ma = abs(m)
|
||||
|
||||
if(n<0):
|
||||
y = np.zeros(theta.shape)
|
||||
return y
|
||||
if(ma>n):
|
||||
y = np.zeros(theta.shape)
|
||||
return y
|
||||
|
||||
if(ma>0):
|
||||
#sqpart = np.sign(1-x**2)*np.sqrt(1-x**2)**(Ma)
|
||||
#sign doesn't work here - need to convert sqrt(1-cos2) to sin
|
||||
sqpart = np.sin(theta)**(ma)
|
||||
nrm = np.sqrt(2*factorial(n-m)/factorial(n+m))
|
||||
else:
|
||||
sqpart = np.ones(theta.shape)
|
||||
nrm = np.sqrt(factorial(n-m)/factorial(n+m))
|
||||
|
||||
p = legendre_poly(n)
|
||||
if(ma>0):
|
||||
p = poly_derivative(p,ma)
|
||||
|
||||
y = polyval(np.cos(theta),p)
|
||||
|
||||
y = y*nrm*sqpart
|
||||
|
||||
return y
|
192
amspyigrf13/amspolyfuns.py
Normal file
192
amspyigrf13/amspolyfuns.py
Normal file
@ -0,0 +1,192 @@
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
|
||||
factorial = math.factorial
|
||||
comb = math.comb
|
||||
perm = math.perm
|
||||
#print (math.comb(n, k))
|
||||
|
||||
"""
|
||||
Coefficients used in this library are [ a0, a1, ..., an ] for y = a0 + a1*x + ... an*x**n
|
||||
Otherwise I'd go crazy reversing indices everywhree.
|
||||
Polynomial order n is length(poly)-1
|
||||
|
||||
"""
|
||||
|
||||
|
||||
def poly_inputscreen(poly):
|
||||
"""
|
||||
regularizes the input for a polynomial coefficient array
|
||||
"""
|
||||
|
||||
poly = np.array(poly)
|
||||
poly = np.reshape(poly,[np.prod(poly.shape)])
|
||||
if(poly.size==0):
|
||||
poly = np.float32([0])
|
||||
|
||||
return poly
|
||||
|
||||
def poly_string(poly):
|
||||
"""
|
||||
Returns a string representation of the polynomial,
|
||||
omitting zero coefficeints.
|
||||
"""
|
||||
poly = poly_inputscreen(poly)
|
||||
s = ""
|
||||
poly = poly_inputscreen(poly)
|
||||
|
||||
if(poly.shape[0]==0):
|
||||
s = "0.0"
|
||||
return s
|
||||
if(poly.shape[0]==1):
|
||||
s = "{}".format(poly[0])
|
||||
return s
|
||||
|
||||
for I in range(0,poly.shape[0]):
|
||||
skip = np.abs(poly[I])<1E-15 #skip zero coefficients
|
||||
if(not skip):
|
||||
if(I==0):
|
||||
s = s + "{}".format(poly[I])
|
||||
else:
|
||||
s = s + "{}*x^{}".format(poly[I],I)
|
||||
if(I<poly.shape[0]-1):
|
||||
s = s + " + "
|
||||
|
||||
return s
|
||||
|
||||
def poly_print(poly):
|
||||
"""
|
||||
Prints the string representation of the polynomial
|
||||
"""
|
||||
print(poly_string(poly))
|
||||
return
|
||||
|
||||
def polyval(x,poly):
|
||||
poly = poly_inputscreen(poly)
|
||||
x = np.array(x)
|
||||
|
||||
y = np.zeros(x.shape)
|
||||
|
||||
for I in range(0,poly.shape[0]):
|
||||
y = y + poly[I]*x**I
|
||||
|
||||
return y
|
||||
|
||||
|
||||
def poly_trimorder(poly):
|
||||
"""
|
||||
Trims the polynomial array size to the leading nonzero order
|
||||
"""
|
||||
poly = poly_inputscreen(poly)
|
||||
|
||||
ind = poly.shape[0]
|
||||
for I in range(ind-1,-1,-1):
|
||||
if(np.abs(poly[I])>1E-15):
|
||||
ind = I+1
|
||||
break
|
||||
poly = poly[0:ind]
|
||||
|
||||
return poly
|
||||
|
||||
def poly_mult(poly1, poly2):
|
||||
"""
|
||||
Multiplies two polynomials together, returning
|
||||
poly1*poly2
|
||||
[1,1] * [-1,1] = [-1,0,1]
|
||||
[1,1] * [1,1] = [1,2,1]
|
||||
"""
|
||||
poly1 = poly_inputscreen(poly1)
|
||||
poly2 = poly_inputscreen(poly2)
|
||||
|
||||
N1 = poly1.shape[0]
|
||||
N2 = poly2.shape[0]
|
||||
|
||||
poly3 = np.zeros([N1+N2],dtype=np.float64)
|
||||
|
||||
for I in range(0,N1):
|
||||
for J in range(0,N2):
|
||||
poly3[I+J] = poly3[I+J] + poly1[I]*poly2[J]
|
||||
|
||||
poly3 = poly_trimorder(poly3)
|
||||
return poly3
|
||||
|
||||
|
||||
def poly_derivative(poly,N=1):
|
||||
"""
|
||||
derivative of polynomial, of positive integer order
|
||||
returns d^N/dx^N(poly)
|
||||
"""
|
||||
poly = poly_inputscreen(poly)
|
||||
|
||||
N = int(N)
|
||||
if(N<=0):
|
||||
return poly
|
||||
|
||||
for J in range(0,N):
|
||||
for I in range(0,poly.shape[0]-1):
|
||||
poly[I] = poly[I+1]*(I+1)
|
||||
poly[poly.shape[0]-1] = 0
|
||||
|
||||
poly = poly_trimorder(poly)
|
||||
return poly
|
||||
|
||||
def poly_integral(poly,N=1):
|
||||
"""
|
||||
Returns indef. integral of polynomial, compounded N times
|
||||
integral(poly(x)*dx)
|
||||
"""
|
||||
poly = poly_inputscreen(poly)
|
||||
|
||||
N = int(N)
|
||||
if(N<=0):
|
||||
return poly
|
||||
|
||||
N1 = poly.shape[0]
|
||||
N2 = N1 + N
|
||||
poly1 = np.zeros([N2])
|
||||
poly1[0:N1] = poly[:]
|
||||
|
||||
for J in range(0,N):
|
||||
for I in range(poly1.shape[0]-1,0,-1):
|
||||
poly1[I] = poly1[I-1]*1.0/(I)
|
||||
poly1[I-1] = 0
|
||||
|
||||
poly1 = poly_trimorder(poly1)
|
||||
return poly1
|
||||
|
||||
def poly_pow(poly,N):
|
||||
"""
|
||||
Raises polynomial to Nth positive integer power
|
||||
poly(x)^N
|
||||
|
||||
naive algorithm for now
|
||||
can make a faster one by squaring, but ...
|
||||
"""
|
||||
|
||||
N = int(N)
|
||||
if(N<0):
|
||||
return np.array([0])
|
||||
if(N==0):
|
||||
return np.array([1])
|
||||
|
||||
poly = poly_inputscreen(poly)
|
||||
N1 = poly.shape[0]
|
||||
N2 = (N1-1)*N+1
|
||||
poly1 = np.zeros([N2])
|
||||
poly2 = np.zeros([N2])
|
||||
|
||||
poly2[0:N1] = poly[:]
|
||||
|
||||
for I in range(1,N):
|
||||
#swap addresses
|
||||
tmp = poly1
|
||||
poly1 = poly2
|
||||
poly2 = tmp
|
||||
poly2[:] = 0
|
||||
for J in range(0,N1):
|
||||
for K in range(0,N2-N1+1):
|
||||
poly2[J+K] = poly2[J+K] + poly1[K]*poly[J]
|
||||
|
||||
poly2 = poly_trimorder(poly2)
|
||||
return poly2
|
||||
|
136
amspyigrf13/amspyigrf_eval.py
Normal file
136
amspyigrf13/amspyigrf_eval.py
Normal file
@ -0,0 +1,136 @@
|
||||
#!/usr/bin/python3
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
|
||||
from .amspyigrf_loader import *
|
||||
|
||||
from .amssphharmonics import gso_cosharmonic
|
||||
from .amssphharmonics import gso_sinharmonic
|
||||
|
||||
pi = np.pi
|
||||
sin = np.sin
|
||||
cos = np.cos
|
||||
sqrt = np.sqrt
|
||||
|
||||
def ams_xyz_rthetaphi(xyz):
|
||||
"""
|
||||
Returns astronomical latitude and longitude [radians]
|
||||
(elevation and azimuth)
|
||||
Input:
|
||||
xyz [3] or [3xN] array
|
||||
Output:
|
||||
[radius lat lon] [radians] [3] or [3xN] array
|
||||
"""
|
||||
xyz = np.array(xyz)
|
||||
singles = 0
|
||||
|
||||
if(len(xyz.shape)==1):
|
||||
singles = 1
|
||||
xyz = np.reshape(xyz,[3,1])
|
||||
|
||||
r = np.sqrt(np.sum(xyz*xyz,axis=0))
|
||||
#rho = np.sqrt(xyz[0,:]*xyz[0,:]+xyz[1,:]*xyz[1,:])
|
||||
#theta = np.where(rho>0.0,np.arctan(xyz[2,:]/rho))
|
||||
theta = np.arcsin(xyz[2,:]/r)
|
||||
phi = np.arctan2(xyz[1,:],xyz[0,:])
|
||||
|
||||
rtp = np.zeros([3,xyz.shape[1]])
|
||||
rtp[0,:] = r
|
||||
rtp[1,:] = theta
|
||||
rtp[2,:] = phi
|
||||
|
||||
if(singles==1):
|
||||
rtp = np.reshape(rtp,[3])
|
||||
|
||||
return rtp
|
||||
|
||||
def igrf_potential(xyz, coefstruct):
|
||||
"""
|
||||
Returns the IGRF potential function [nT - km] as a function of ECEF
|
||||
coordinates [x,y,z] in [km] in an earth-centered earth-fixed frame.
|
||||
|
||||
Ref for potential function is Aiken et. al. 2021
|
||||
|
||||
Inputs:
|
||||
xyz [3] or [3xN] set of positions [km]
|
||||
coefstruct - contains gh, n, m, and a arrays
|
||||
Outputs:
|
||||
V [scalar] or [N]
|
||||
"""
|
||||
|
||||
xyz = np.array(xyz)
|
||||
single = 0
|
||||
if(len(xyz.shape)==1):
|
||||
single = 1
|
||||
xyz = np.reshape(xyz,[3,1])
|
||||
|
||||
|
||||
gh = coefstruct["gh"] #whether using a sin or cosine harmonic
|
||||
n = coefstruct["n"] #
|
||||
m = coefstruct["m"]
|
||||
a = coefstruct["a"]
|
||||
|
||||
rtp = ams_xyz_rthetaphi(xyz)
|
||||
theta = pi/2.0-rtp[1,:]
|
||||
phi = rtp[2,:]
|
||||
rref = 6371.2 #[km] - reference diameter
|
||||
|
||||
|
||||
V = np.zeros(xyz.shape[1])
|
||||
for I in range(0,a.shape[0]):
|
||||
V = V + a[I]*np.float64(gh[I]==0)*rref*(rref/rtp[0,:])**(n[I]+1)*gso_cosharmonic(theta,phi,n[I],m[I])
|
||||
V = V + a[I]*np.float64(gh[I]==1)*rref*(rref/rtp[0,:])**(n[I]+1)*gso_sinharmonic(theta,phi,n[I],m[I])
|
||||
|
||||
if(single==1):
|
||||
V = V[0]
|
||||
|
||||
return V
|
||||
|
||||
|
||||
def igrf_bfield(xyz,coefstruct):
|
||||
"""
|
||||
Takes a quick and dirty numeric derivative of the potential function
|
||||
to return the B-field [nT] [x,y,z] from the IGRF-13 potential function
|
||||
|
||||
Inputs:
|
||||
xyz [3] or [3xN] set of positions [km] ECEF
|
||||
coefstruct - contains gh, n, m, and a arrays
|
||||
Outputs:
|
||||
B [nT] size [3] or [3xN]
|
||||
"""
|
||||
xyz = np.array(xyz)
|
||||
|
||||
xyz = np.array(xyz)
|
||||
single = 0
|
||||
if(len(xyz.shape)==1):
|
||||
single = 1
|
||||
xyz = np.reshape(xyz,[3,1])
|
||||
|
||||
N = xyz.shape[1]
|
||||
dx = 0.1 #km
|
||||
xp = np.array([dx,0,0]).reshape(3,1)
|
||||
xp = np.repeat(xp,N,axis=1)
|
||||
yp = np.array([0,dx,0]).reshape(3,1)
|
||||
yp = np.repeat(yp,N,axis=1)
|
||||
zp = np.array([0,0,dx]).reshape(3,1)
|
||||
zp = np.repeat(zp,N,axis=1)
|
||||
|
||||
|
||||
phixp = igrf_potential(xyz+xp,coefstruct)
|
||||
phixm = igrf_potential(xyz-xp,coefstruct)
|
||||
phiyp = igrf_potential(xyz+yp,coefstruct)
|
||||
phiym = igrf_potential(xyz-yp,coefstruct)
|
||||
phizp = igrf_potential(xyz+zp,coefstruct)
|
||||
phizm = igrf_potential(xyz-zp,coefstruct)
|
||||
|
||||
B = np.zeros([3,N])
|
||||
B[0,:] = -(phixp-phixm)/2.0/dx
|
||||
B[1,:] = -(phiyp-phiym)/2.0/dx
|
||||
B[2,:] = -(phizp-phizm)/2.0/dx
|
||||
|
||||
if(single==1):
|
||||
B = np.squeeze(B[:,0])
|
||||
|
||||
return B
|
||||
|
||||
|
126
amspyigrf13/amspyigrf_loader.py
Normal file
126
amspyigrf13/amspyigrf_loader.py
Normal file
@ -0,0 +1,126 @@
|
||||
#!/usr/bin/python3
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
import copy
|
||||
|
||||
def ams_whitespacesplit(ln):
|
||||
splitline = []
|
||||
|
||||
I1 = -1
|
||||
I2 = -1
|
||||
mode = 0
|
||||
for I in range(0,len(ln)):
|
||||
c = ln[I]
|
||||
if(not c.isspace() and mode==0):
|
||||
mode = 1
|
||||
I1 = I
|
||||
if(c.isspace() and mode==1):
|
||||
I2 = I
|
||||
s = ln[I1:I2]
|
||||
splitline.append(s)
|
||||
mode = 0
|
||||
if(mode==1):
|
||||
I2 = len(ln)
|
||||
s = ln[I1:I2]
|
||||
splitline.append(s)
|
||||
mode = 0
|
||||
|
||||
return splitline
|
||||
|
||||
def convert_stringlist_to_numeric(stringlist):
|
||||
|
||||
nlist = np.zeros(len(stringlist),dtype=np.float64)
|
||||
|
||||
for I in range(0,len(stringlist)):
|
||||
try:
|
||||
q = float(stringlist[I])
|
||||
except:
|
||||
q = 0.0
|
||||
nlist[I] = q
|
||||
return nlist
|
||||
|
||||
|
||||
def load_igrfdata():
|
||||
datastruct = dict()
|
||||
lns = []
|
||||
sdir = os.path.split(__file__)[0]
|
||||
fname = "{}/igrf13_data.txt".format(sdir)
|
||||
fp = open(fname,"r")
|
||||
|
||||
ln = " "
|
||||
mode = 0
|
||||
N = 0
|
||||
gharray = []
|
||||
narray = []
|
||||
marray = []
|
||||
amplitudetable = []
|
||||
|
||||
while(ln!=""):
|
||||
ln = fp.readline()
|
||||
if(ln.find("g/h n m")>=0 and mode==0):
|
||||
mode = 1
|
||||
#read date line
|
||||
dateline = ams_whitespacesplit(ln)
|
||||
dateline = dateline[3:len(dateline)]
|
||||
dateline = convert_stringlist_to_numeric(dateline)
|
||||
|
||||
datastruct["year"] = dateline
|
||||
elif(mode==1):
|
||||
lns = ams_whitespacesplit(ln)
|
||||
if(len(lns)>5):
|
||||
if(lns[0]=='g'):
|
||||
gh = 0
|
||||
else:
|
||||
gh = 1
|
||||
gharray.append(gh)
|
||||
lnsn = convert_stringlist_to_numeric(lns)
|
||||
narray.append(lnsn[1])
|
||||
marray.append(lnsn[2])
|
||||
amplitudetable.append(lnsn[3:len(lnsn)])
|
||||
N = N + 1
|
||||
|
||||
gharray = np.int32(gharray)
|
||||
narray = np.int32(narray)
|
||||
marray = np.int32(marray)
|
||||
|
||||
atable = np.zeros([len(amplitudetable),len(amplitudetable[0])],dtype=np.float64)
|
||||
for I in range(0,atable.shape[0]):
|
||||
atable[I,:] = amplitudetable[I][:]
|
||||
|
||||
datastruct["gh"] = gharray
|
||||
datastruct["n"] = narray
|
||||
datastruct["m"] = marray
|
||||
datastruct["a"] = atable
|
||||
|
||||
fp.close()
|
||||
|
||||
|
||||
return datastruct
|
||||
|
||||
def igrf_getcomponents(year,igrfdatastruct):
|
||||
|
||||
acomp = None
|
||||
a = igrfdatastruct["a"]
|
||||
|
||||
if(year<1900):
|
||||
acomp = a[:,0]
|
||||
elif(year>=2020):
|
||||
ac0 = a[:,a.shape[1]-2]
|
||||
ac1 = a[:,a.shape[1]-1]
|
||||
acomp = ac0 + ac1*(year-2020)
|
||||
else:
|
||||
I0 = int(np.floor((year-1900)/5.0))
|
||||
I1 = I0 + 1
|
||||
ac0 = a[:,I0]
|
||||
ac1 = a[:,I1]
|
||||
acomp = (ac1-ac0)/5.0*(year-(1900+5*I0)) + ac0
|
||||
|
||||
return acomp
|
||||
|
||||
def igrf_getcompstruct(year, igrfdatastruct):
|
||||
|
||||
acomp = igrf_getcomponents(year, igrfdatastruct);
|
||||
compstruct = copy.deepcopy(igrfdatastruct)
|
||||
compstruct["a"] = acomp
|
||||
|
||||
return compstruct
|
115
amspyigrf13/amssphharmonics.py
Normal file
115
amspyigrf13/amssphharmonics.py
Normal file
@ -0,0 +1,115 @@
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
|
||||
factorial = math.factorial
|
||||
comb = math.comb
|
||||
perm = math.perm
|
||||
#print (math.comb(n, k))
|
||||
|
||||
from .amspolyfuns import poly_pow
|
||||
from .amspolyfuns import poly_derivative
|
||||
from .amspolyfuns import polyval
|
||||
|
||||
from .amslegendre import *
|
||||
|
||||
#import scipy as sp
|
||||
#import scipy.interpolate as interp
|
||||
#scipy.interpolate.LinearNDInterpolator
|
||||
# https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.LinearNDInterpolator.html#scipy.interpolate.LinearNDInterpolator
|
||||
|
||||
def sphericalharmonic_polysin(L,M):
|
||||
"""
|
||||
Returns sin(theta) power and normed cosine polynomial for spherical harmonic
|
||||
Return: [spower, polynomial]
|
||||
Y^M_L(theta,phi) = sin(theta)^spower * poly(cos(theta)) * exp(i*M*phi)
|
||||
"""
|
||||
|
||||
L = int(L)
|
||||
M = int(M)
|
||||
Ma = abs(M)
|
||||
|
||||
polysin = [0, [0.0]]
|
||||
if(L<0):
|
||||
return polysin
|
||||
if(abs(M)>L):
|
||||
return polysin
|
||||
|
||||
Nrm = np.sqrt((2*L+1)/(4*np.pi) * math.factorial(L-Ma)/math.factorial(L+Ma))*((-1)**Ma)
|
||||
p = alegendre_polypart(L,Ma)
|
||||
p = p*Nrm
|
||||
|
||||
polysin = [Ma, p]
|
||||
|
||||
return polysin
|
||||
|
||||
def sphericalharmonic_eval(theta, phi, L, M):
|
||||
"""
|
||||
Returns the values of the spherical harmonic Y^M_L(theta,phi)
|
||||
Y is normalized such that <Y^M_L, Y^M_L> over the unit sphere = 1
|
||||
Integral(conj(Y^M1_L1)*Y^M2_L2 * sin(theta)*dtheta*dphi) = del(L1,L2)del(M1,M2)
|
||||
"""
|
||||
|
||||
L = int(L)
|
||||
M = int(M)
|
||||
Ma = abs(M)
|
||||
|
||||
theta = np.array(theta)
|
||||
phi = np.array(phi)
|
||||
|
||||
if(theta.shape != phi.shape):
|
||||
print("sphericalharmonic_eval: error: theta and phi must have the same shape.")
|
||||
vals = np.array([])
|
||||
return vals
|
||||
|
||||
vals = np.zeros(theta.shape)
|
||||
if(L<0):
|
||||
return vals
|
||||
if(abs(M)>L):
|
||||
return vals
|
||||
|
||||
[spower, poly] = sphericalharmonic_polysin(L,M)
|
||||
|
||||
vals = polyval(np.cos(theta),poly)
|
||||
vals = vals*(np.sin(theta)**Ma)
|
||||
vals = vals*np.exp(1j * phi * M)
|
||||
|
||||
return vals
|
||||
|
||||
def gso_cosharmonic(theta,phi,n,m):
|
||||
"""
|
||||
Returns grahm-schmidt semi-normalized cosine spherical harmonics
|
||||
|
||||
y = P^n_m(cos(theta))*cos(m*phi)
|
||||
P^n_m(cos(theta)) is the graham-schmidt semi-normalized
|
||||
associated legendre function described in
|
||||
Winch et. al. 2005
|
||||
"""
|
||||
theta = np.array(theta)
|
||||
phi = np.array(phi)
|
||||
n = int(n)
|
||||
m = int(m)
|
||||
|
||||
alegendre = gso_cosinealegendre(theta,m,n)
|
||||
y = alegendre*np.cos(m*phi)
|
||||
|
||||
|
||||
return y
|
||||
|
||||
def gso_sinharmonic(theta,phi,n,m):
|
||||
"""
|
||||
Returns grahm-schmidt semi-normalized sine spherical harmonics
|
||||
|
||||
y = P^n_m(cos(theta))*sin(m*phi)
|
||||
P^n_m(cos(theta)) is the graham-schmidt semi-normalized
|
||||
associated legendre function described in
|
||||
Winch et. al. 2005
|
||||
"""
|
||||
theta = np.array(theta)
|
||||
phi = np.array(phi)
|
||||
n = int(n)
|
||||
m = int(m)
|
||||
|
||||
alegendre = gso_cosinealegendre(theta,m,n)
|
||||
y = alegendre*np.sin(m*phi)
|
||||
|
||||
return y
|
199
amspyigrf13/igrf13_data.txt
Normal file
199
amspyigrf13/igrf13_data.txt
Normal file
@ -0,0 +1,199 @@
|
||||
# 13th Generation International Geomagnetic Reference Field Schmidt semi-normalised spherical harmonic coefficients, degree n=1,13
|
||||
# in units nanoTesla for IGRF and definitive DGRF main-field models (degree n=1,8 nanoTesla/year for secular variation (SV))
|
||||
c/s deg ord IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF IGRF SV
|
||||
g/h n m 1900.0 1905.0 1910.0 1915.0 1920.0 1925.0 1930.0 1935.0 1940.0 1945.0 1950.0 1955.0 1960.0 1965.0 1970.0 1975.0 1980.0 1985.0 1990.0 1995.0 2000.0 2005.0 2010.0 2015.0 2020.0 2020-25
|
||||
g 1 0 -31543 -31464 -31354 -31212 -31060 -30926 -30805 -30715 -30654 -30594 -30554 -30500 -30421 -30334 -30220 -30100 -29992 -29873 -29775 -29692 -29619.4 -29554.63 -29496.57 -29441.46 -29404.8 5.7
|
||||
g 1 1 -2298 -2298 -2297 -2306 -2317 -2318 -2316 -2306 -2292 -2285 -2250 -2215 -2169 -2119 -2068 -2013 -1956 -1905 -1848 -1784 -1728.2 -1669.05 -1586.42 -1501.77 -1450.9 7.4
|
||||
h 1 1 5922 5909 5898 5875 5845 5817 5808 5812 5821 5810 5815 5820 5791 5776 5737 5675 5604 5500 5406 5306 5186.1 5077.99 4944.26 4795.99 4652.5 -25.9
|
||||
g 2 0 -677 -728 -769 -802 -839 -893 -951 -1018 -1106 -1244 -1341 -1440 -1555 -1662 -1781 -1902 -1997 -2072 -2131 -2200 -2267.7 -2337.24 -2396.06 -2445.88 -2499.6 -11.0
|
||||
g 2 1 2905 2928 2948 2956 2959 2969 2980 2984 2981 2990 2998 3003 3002 2997 3000 3010 3027 3044 3059 3070 3068.4 3047.69 3026.34 3012.20 2982.0 -7.0
|
||||
h 2 1 -1061 -1086 -1128 -1191 -1259 -1334 -1424 -1520 -1614 -1702 -1810 -1898 -1967 -2016 -2047 -2067 -2129 -2197 -2279 -2366 -2481.6 -2594.50 -2708.54 -2845.41 -2991.6 -30.2
|
||||
g 2 2 924 1041 1176 1309 1407 1471 1517 1550 1566 1578 1576 1581 1590 1594 1611 1632 1663 1687 1686 1681 1670.9 1657.76 1668.17 1676.35 1677.0 -2.1
|
||||
h 2 2 1121 1065 1000 917 823 728 644 586 528 477 381 291 206 114 25 -68 -200 -306 -373 -413 -458.0 -515.43 -575.73 -642.17 -734.6 -22.4
|
||||
g 3 0 1022 1037 1058 1084 1111 1140 1172 1206 1240 1282 1297 1302 1302 1297 1287 1276 1281 1296 1314 1335 1339.6 1336.30 1339.85 1350.33 1363.2 2.2
|
||||
g 3 1 -1469 -1494 -1524 -1559 -1600 -1645 -1692 -1740 -1790 -1834 -1889 -1944 -1992 -2038 -2091 -2144 -2180 -2208 -2239 -2267 -2288.0 -2305.83 -2326.54 -2352.26 -2381.2 -5.9
|
||||
h 3 1 -330 -357 -389 -421 -445 -462 -480 -494 -499 -499 -476 -462 -414 -404 -366 -333 -336 -310 -284 -262 -227.6 -198.86 -160.40 -115.29 -82.1 6.0
|
||||
g 3 2 1256 1239 1223 1212 1205 1202 1205 1215 1232 1255 1274 1288 1289 1292 1278 1260 1251 1247 1248 1249 1252.1 1246.39 1232.10 1225.85 1236.2 3.1
|
||||
h 3 2 3 34 62 84 103 119 133 146 163 186 206 216 224 240 251 262 271 284 293 302 293.4 269.72 251.75 245.04 241.9 -1.1
|
||||
g 3 3 572 635 705 778 839 881 907 918 916 913 896 882 878 856 838 830 833 829 802 759 714.5 672.51 633.73 581.69 525.7 -12.0
|
||||
h 3 3 523 480 425 360 293 229 166 101 43 -11 -46 -83 -130 -165 -196 -223 -252 -297 -352 -427 -491.1 -524.72 -537.03 -538.70 -543.4 0.5
|
||||
g 4 0 876 880 884 887 889 891 896 903 914 944 954 958 957 957 952 946 938 936 939 940 932.3 920.55 912.66 907.42 903.0 -1.2
|
||||
g 4 1 628 643 660 678 695 711 727 744 762 776 792 796 800 804 800 791 782 780 780 780 786.8 797.96 808.97 813.68 809.5 -1.6
|
||||
h 4 1 195 203 211 218 220 216 205 188 169 144 136 133 135 148 167 191 212 232 247 262 272.6 282.07 286.48 283.54 281.9 -0.1
|
||||
g 4 2 660 653 644 631 616 601 584 565 550 544 528 510 504 479 461 438 398 361 325 290 250.0 210.65 166.58 120.49 86.3 -5.9
|
||||
h 4 2 -69 -77 -90 -109 -134 -163 -195 -226 -252 -276 -278 -274 -278 -269 -266 -265 -257 -249 -240 -236 -231.9 -225.23 -211.03 -188.43 -158.4 6.5
|
||||
g 4 3 -361 -380 -400 -416 -424 -426 -422 -415 -405 -421 -408 -397 -394 -390 -395 -405 -419 -424 -423 -418 -403.0 -379.86 -356.83 -334.85 -309.4 5.2
|
||||
h 4 3 -210 -201 -189 -173 -153 -130 -109 -90 -72 -55 -37 -23 3 13 26 39 53 69 84 97 119.8 145.15 164.46 180.95 199.7 3.6
|
||||
g 4 4 134 146 160 178 199 217 234 249 265 304 303 290 269 252 234 216 199 170 141 122 111.3 100.00 89.40 70.38 48.0 -5.1
|
||||
h 4 4 -75 -65 -55 -51 -57 -70 -90 -114 -141 -178 -210 -230 -255 -269 -279 -288 -297 -297 -299 -306 -303.8 -305.36 -309.72 -329.23 -349.7 -5.0
|
||||
g 5 0 -184 -192 -201 -211 -221 -230 -237 -241 -241 -253 -240 -229 -222 -219 -216 -218 -218 -214 -214 -214 -218.8 -227.00 -230.87 -232.91 -234.3 -0.3
|
||||
g 5 1 328 328 327 327 326 326 327 329 334 346 349 360 362 358 359 356 357 355 353 352 351.4 354.41 357.29 360.14 363.2 0.5
|
||||
h 5 1 -210 -193 -172 -148 -122 -96 -72 -51 -33 -12 3 15 16 19 26 31 46 47 46 46 43.8 42.72 44.58 46.98 47.7 0.0
|
||||
g 5 2 264 259 253 245 236 226 218 211 208 194 211 230 242 254 262 264 261 253 245 235 222.3 208.95 200.26 192.35 187.8 -0.6
|
||||
h 5 2 53 56 57 58 58 58 60 64 71 95 103 110 125 128 139 148 150 150 154 165 171.9 180.25 189.01 196.98 208.3 2.5
|
||||
g 5 3 5 -1 -9 -16 -23 -28 -32 -33 -33 -20 -20 -23 -26 -31 -42 -59 -74 -93 -109 -118 -130.4 -136.54 -141.05 -140.94 -140.7 0.2
|
||||
h 5 3 -33 -32 -33 -34 -38 -44 -53 -64 -75 -67 -87 -98 -117 -126 -139 -152 -151 -154 -153 -143 -133.1 -123.45 -118.06 -119.14 -121.2 -0.6
|
||||
g 5 4 -86 -93 -102 -111 -119 -125 -131 -136 -141 -142 -147 -152 -156 -157 -160 -159 -162 -164 -165 -166 -168.6 -168.05 -163.17 -157.40 -151.2 1.3
|
||||
h 5 4 -124 -125 -126 -126 -125 -122 -118 -115 -113 -119 -122 -121 -114 -97 -91 -83 -78 -75 -69 -55 -39.3 -19.57 -0.01 15.98 32.3 3.0
|
||||
g 5 5 -16 -26 -38 -51 -62 -69 -74 -76 -76 -82 -76 -69 -63 -62 -56 -49 -48 -46 -36 -17 -12.9 -13.55 -8.03 4.30 13.5 0.9
|
||||
h 5 5 3 11 21 32 43 51 58 64 69 82 80 78 81 81 83 88 92 95 97 107 106.3 103.85 101.04 100.12 98.9 0.3
|
||||
g 6 0 63 62 62 61 61 61 60 59 57 59 54 47 46 45 43 45 48 53 61 68 72.3 73.60 72.78 69.55 66.0 -0.5
|
||||
g 6 1 61 60 58 57 55 54 53 53 54 57 57 57 58 61 64 66 66 65 65 67 68.2 69.56 68.69 67.57 65.5 -0.3
|
||||
h 6 1 -9 -7 -5 -2 0 3 4 4 4 6 -1 -9 -10 -11 -12 -13 -15 -16 -16 -17 -17.4 -20.33 -20.90 -20.61 -19.1 0.0
|
||||
g 6 2 -11 -11 -11 -10 -10 -9 -9 -8 -7 6 4 3 1 8 15 28 42 51 59 68 74.2 76.74 75.92 72.79 72.9 0.4
|
||||
h 6 2 83 86 89 93 96 99 102 104 105 100 99 96 99 100 100 99 93 88 82 72 63.7 54.75 44.18 33.30 25.1 -1.6
|
||||
g 6 3 -217 -221 -224 -228 -233 -238 -242 -246 -249 -246 -247 -247 -237 -228 -212 -198 -192 -185 -178 -170 -160.9 -151.34 -141.40 -129.85 -121.5 1.3
|
||||
h 6 3 2 4 5 8 11 14 19 25 33 16 33 48 60 68 72 75 71 69 69 67 65.1 63.63 61.54 58.74 52.8 -1.3
|
||||
g 6 4 -58 -57 -54 -51 -46 -40 -32 -25 -18 -25 -16 -8 -1 4 2 1 4 4 3 -1 -5.9 -14.58 -22.83 -28.93 -36.2 -1.4
|
||||
h 6 4 -35 -32 -29 -26 -22 -18 -16 -15 -15 -9 -12 -16 -20 -32 -37 -41 -43 -48 -52 -58 -61.2 -63.53 -66.26 -66.64 -64.5 0.8
|
||||
g 6 5 59 57 54 49 44 39 32 25 18 21 12 7 -2 1 3 6 14 16 18 19 16.9 14.58 13.10 13.14 13.5 0.0
|
||||
h 6 5 36 32 28 23 18 13 8 4 0 -16 -12 -12 -11 -8 -6 -4 -2 -1 1 1 0.7 0.24 3.02 7.35 8.9 0.0
|
||||
g 6 6 -90 -92 -95 -98 -101 -103 -104 -106 -107 -104 -105 -107 -113 -111 -112 -111 -108 -102 -96 -93 -90.4 -86.36 -78.09 -70.85 -64.7 0.9
|
||||
h 6 6 -69 -67 -65 -62 -57 -52 -46 -40 -33 -39 -30 -24 -17 -7 1 11 17 21 24 36 43.8 50.94 55.40 62.41 68.1 1.0
|
||||
g 7 0 70 70 71 72 73 73 74 74 74 70 65 65 67 75 72 71 72 74 77 77 79.0 79.88 80.44 81.29 80.6 -0.1
|
||||
g 7 1 -55 -54 -54 -54 -54 -54 -54 -53 -53 -40 -55 -56 -56 -57 -57 -56 -59 -62 -64 -72 -74.0 -74.46 -75.00 -75.99 -76.7 -0.2
|
||||
h 7 1 -45 -46 -47 -48 -49 -50 -51 -52 -52 -45 -35 -50 -55 -61 -70 -77 -82 -83 -80 -69 -64.6 -61.14 -57.80 -54.27 -51.5 0.6
|
||||
g 7 2 0 0 1 2 2 3 4 4 4 0 2 2 5 4 1 1 2 3 2 1 0.0 -1.65 -4.55 -6.79 -8.2 0.0
|
||||
h 7 2 -13 -14 -14 -14 -14 -14 -15 -17 -18 -18 -17 -24 -28 -27 -27 -26 -27 -27 -26 -25 -24.2 -22.57 -21.20 -19.53 -16.9 0.6
|
||||
g 7 3 34 33 32 31 29 27 25 23 20 0 1 10 15 13 14 16 21 24 26 28 33.3 38.73 45.24 51.82 56.5 0.7
|
||||
h 7 3 -10 -11 -12 -12 -13 -14 -14 -14 -14 2 0 -4 -6 -2 -4 -5 -5 -2 0 4 6.2 6.82 6.54 5.59 2.2 -0.8
|
||||
g 7 4 -41 -41 -40 -38 -37 -35 -34 -33 -31 -29 -40 -32 -32 -26 -22 -14 -12 -6 -1 5 9.1 12.30 14.00 15.07 15.8 0.1
|
||||
h 7 4 -1 0 1 2 4 5 6 7 7 6 10 8 7 6 8 10 16 20 21 24 24.0 25.35 24.96 24.45 23.5 -0.2
|
||||
g 7 5 -21 -20 -19 -18 -16 -14 -12 -11 -9 -10 -7 -11 -7 -6 -2 0 1 4 5 4 6.9 9.37 10.46 9.32 6.4 -0.5
|
||||
h 7 5 28 28 28 28 28 29 29 29 29 28 36 28 23 26 23 22 18 17 17 17 14.8 10.93 7.03 3.27 -2.2 -1.1
|
||||
g 7 6 18 18 18 19 19 19 18 18 17 15 5 9 17 13 13 12 11 10 9 8 7.3 5.42 1.64 -2.88 -7.2 -0.8
|
||||
h 7 6 -12 -12 -13 -15 -16 -17 -18 -19 -20 -17 -18 -20 -18 -23 -23 -23 -23 -23 -23 -24 -25.4 -26.32 -27.61 -27.50 -27.2 0.1
|
||||
g 7 7 6 6 6 6 6 6 6 6 5 29 19 18 8 1 -2 -5 -2 0 0 -2 -1.2 1.94 4.92 6.61 9.8 0.8
|
||||
h 7 7 -22 -22 -22 -22 -22 -21 -20 -19 -19 -22 -16 -18 -17 -12 -11 -12 -10 -7 -4 -6 -5.8 -4.64 -3.28 -2.32 -1.8 0.3
|
||||
g 8 0 11 11 11 11 11 11 11 11 11 13 22 11 15 13 14 14 18 21 23 25 24.4 24.80 24.41 23.98 23.7 0.0
|
||||
g 8 1 8 8 8 8 7 7 7 7 7 7 15 9 6 5 6 6 6 6 5 6 6.6 7.62 8.21 8.89 9.7 0.1
|
||||
h 8 1 8 8 8 8 8 8 8 8 8 12 5 10 11 7 7 6 7 8 10 11 11.9 11.20 10.84 10.04 8.4 -0.2
|
||||
g 8 2 -4 -4 -4 -4 -3 -3 -3 -3 -3 -8 -4 -6 -4 -4 -2 -1 0 0 -1 -6 -9.2 -11.73 -14.50 -16.78 -17.6 -0.1
|
||||
h 8 2 -14 -15 -15 -15 -15 -15 -15 -15 -14 -21 -22 -15 -14 -12 -15 -16 -18 -19 -19 -21 -21.5 -20.88 -20.03 -18.26 -15.3 0.6
|
||||
g 8 3 -9 -9 -9 -9 -9 -9 -9 -9 -10 -5 -1 -14 -11 -14 -13 -12 -11 -11 -10 -9 -7.9 -6.88 -5.59 -3.16 -0.5 0.4
|
||||
h 8 3 7 7 6 6 6 6 5 5 5 -12 0 5 7 9 6 4 4 5 6 8 8.5 9.83 11.83 13.18 12.8 -0.2
|
||||
g 8 4 1 1 1 2 2 2 2 1 1 9 11 6 2 0 -3 -8 -7 -9 -12 -14 -16.6 -18.11 -19.34 -20.56 -21.1 -0.1
|
||||
h 8 4 -13 -13 -13 -13 -14 -14 -14 -15 -15 -7 -21 -23 -18 -16 -17 -19 -22 -23 -22 -23 -21.5 -19.71 -17.41 -14.60 -11.7 0.5
|
||||
g 8 5 2 2 2 3 4 4 5 6 6 7 15 10 10 8 5 4 4 4 3 9 9.1 10.17 11.61 13.33 15.3 0.4
|
||||
h 8 5 5 5 5 5 5 5 5 5 5 2 -8 3 4 4 6 6 9 11 12 15 15.5 16.22 16.71 16.16 14.9 -0.3
|
||||
g 8 6 -9 -8 -8 -8 -7 -7 -6 -6 -5 -10 -13 -7 -5 -1 0 0 3 4 4 6 7.0 9.36 10.85 11.76 13.7 0.3
|
||||
h 8 6 16 16 16 16 17 17 18 18 19 18 17 23 23 24 21 18 16 14 12 11 8.9 7.61 6.96 5.69 3.6 -0.4
|
||||
g 8 7 5 5 5 6 6 7 8 8 9 7 5 6 10 11 11 10 6 4 2 -5 -7.9 -11.25 -14.05 -15.98 -16.5 -0.1
|
||||
h 8 7 -5 -5 -5 -5 -5 -5 -5 -5 -5 3 -4 -4 1 -3 -6 -10 -13 -15 -16 -16 -14.9 -12.76 -10.74 -9.10 -6.9 0.5
|
||||
g 8 8 8 8 8 8 8 8 8 7 7 2 -1 9 8 4 3 1 -1 -4 -6 -7 -7.0 -4.87 -3.54 -2.02 -0.3 0.4
|
||||
h 8 8 -18 -18 -18 -18 -19 -19 -19 -19 -19 -11 -17 -13 -20 -17 -16 -17 -15 -11 -10 -4 -2.1 -0.06 1.64 2.26 2.8 0.0
|
||||
g 9 0 8 8 8 8 8 8 8 8 8 5 3 4 4 8 8 7 5 5 4 4 5.0 5.58 5.50 5.33 5.0 0.0
|
||||
g 9 1 10 10 10 10 10 10 10 10 10 -21 -7 9 6 10 10 10 10 10 9 9 9.4 9.76 9.45 8.83 8.4 0.0
|
||||
h 9 1 -20 -20 -20 -20 -20 -20 -20 -20 -21 -27 -24 -11 -18 -22 -21 -21 -21 -21 -20 -20 -19.7 -20.11 -20.54 -21.77 -23.4 0.0
|
||||
g 9 2 1 1 1 1 1 1 1 1 1 1 -1 -4 0 2 2 2 1 1 1 3 3.0 3.58 3.45 3.02 2.9 0.0
|
||||
h 9 2 14 14 14 14 14 14 14 15 15 17 19 12 12 15 16 16 16 15 15 15 13.4 12.69 11.51 10.76 11.0 0.0
|
||||
g 9 3 -11 -11 -11 -11 -11 -11 -12 -12 -12 -11 -25 -5 -9 -13 -12 -12 -12 -12 -12 -10 -8.4 -6.94 -5.27 -3.22 -1.5 0.0
|
||||
h 9 3 5 5 5 5 5 5 5 5 5 29 12 7 2 7 6 7 9 9 11 12 12.5 12.67 12.75 11.74 9.8 0.0
|
||||
g 9 4 12 12 12 12 12 12 12 11 11 3 10 2 1 10 10 10 9 9 9 8 6.3 5.01 3.13 0.67 -1.1 0.0
|
||||
h 9 4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -9 2 6 0 -4 -4 -4 -5 -6 -7 -6 -6.2 -6.72 -7.14 -6.74 -5.1 0.0
|
||||
g 9 5 1 1 1 1 1 1 1 1 1 16 5 4 4 -1 -1 -1 -3 -3 -4 -8 -8.9 -10.76 -12.38 -13.20 -13.2 0.0
|
||||
h 9 5 -2 -2 -2 -2 -2 -2 -2 -3 -3 4 2 -2 -3 -5 -5 -5 -6 -6 -7 -8 -8.4 -8.16 -7.42 -6.88 -6.3 0.0
|
||||
g 9 6 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -5 1 -1 -1 0 -1 -1 -1 -2 -1 -1.5 -1.25 -0.76 -0.10 1.1 0.0
|
||||
h 9 6 8 8 8 8 9 9 9 9 9 9 8 10 9 10 10 10 9 9 9 8 8.4 8.10 7.97 7.79 7.8 0.0
|
||||
g 9 7 2 2 2 2 2 2 3 3 3 -4 -2 2 -2 5 3 4 7 7 7 10 9.3 8.76 8.43 8.68 8.8 0.0
|
||||
h 9 7 10 10 10 10 10 10 10 11 11 6 8 7 8 10 11 11 10 9 8 5 3.8 2.92 2.14 1.04 0.4 0.0
|
||||
g 9 8 -1 0 0 0 0 0 0 0 1 -3 3 2 3 1 1 1 2 1 1 -2 -4.3 -6.66 -8.42 -9.06 -9.3 0.0
|
||||
h 9 8 -2 -2 -2 -2 -2 -2 -2 -2 -2 1 -11 -6 0 -4 -2 -3 -6 -7 -7 -8 -8.2 -7.73 -6.08 -3.89 -1.4 0.0
|
||||
g 9 9 -1 -1 -1 -1 -1 -1 -2 -2 -2 -4 8 5 -1 -2 -1 -2 -5 -5 -6 -8 -8.2 -9.22 -10.08 -10.54 -11.9 0.0
|
||||
h 9 9 2 2 2 2 2 2 2 2 2 8 -7 5 5 1 1 1 2 2 2 3 4.8 6.01 7.01 8.44 9.6 0.0
|
||||
g 10 0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -8 -3 1 -2 -3 -3 -4 -4 -3 -3 -2.6 -2.17 -1.94 -2.01 -1.9 0.0
|
||||
g 10 1 -4 -4 -4 -4 -4 -4 -4 -4 -4 11 4 -5 -3 -3 -3 -3 -4 -4 -4 -6 -6.0 -6.12 -6.24 -6.26 -6.2 0.0
|
||||
h 10 1 2 2 2 2 2 2 2 2 2 5 13 -4 4 2 1 1 1 1 2 1 1.7 2.19 2.73 3.28 3.4 0.0
|
||||
g 10 2 2 2 2 2 2 2 2 2 2 1 -1 -1 4 2 2 2 2 3 2 2 1.7 1.42 0.89 0.17 -0.1 0.0
|
||||
h 10 2 1 1 1 1 1 1 1 1 1 1 -2 0 1 1 1 1 0 0 1 0 0.0 0.10 -0.10 -0.40 -0.2 0.0
|
||||
g 10 3 -5 -5 -5 -5 -5 -5 -5 -5 -5 2 13 2 0 -5 -5 -5 -5 -5 -5 -4 -3.1 -2.35 -1.07 0.55 1.7 0.0
|
||||
h 10 3 2 2 2 2 2 2 2 2 2 -20 -10 -8 0 2 3 3 3 3 3 4 4.0 4.46 4.71 4.55 3.6 0.0
|
||||
g 10 4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -5 -4 -3 -1 -2 -1 -2 -2 -2 -2 -1 -0.5 -0.15 -0.16 -0.55 -0.9 0.0
|
||||
h 10 4 6 6 6 6 6 6 6 6 6 -1 2 -2 2 6 4 4 6 6 6 5 4.9 4.76 4.44 4.40 4.8 0.0
|
||||
g 10 5 6 6 6 6 6 6 6 6 6 -1 4 7 4 4 6 5 5 5 4 4 3.7 3.06 2.45 1.70 0.7 0.0
|
||||
h 10 5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -3 -4 -5 -4 -4 -4 -4 -4 -4 -5 -5.9 -6.58 -7.22 -7.92 -8.6 0.0
|
||||
g 10 6 4 4 4 4 4 4 4 4 4 8 12 4 6 4 4 4 3 3 3 2 1.0 0.29 -0.33 -0.67 -0.9 0.0
|
||||
h 10 6 0 0 0 0 0 0 0 0 0 6 6 1 1 0 0 -1 0 0 0 -1 -1.2 -1.01 -0.96 -0.61 -0.1 0.0
|
||||
g 10 7 0 0 0 0 0 0 0 0 0 -1 3 -2 1 0 1 1 1 1 1 2 2.0 2.06 2.13 2.13 1.9 0.0
|
||||
h 10 7 -2 -2 -2 -2 -2 -2 -2 -1 -1 -4 -3 -3 -1 -2 -1 -1 -1 -1 -2 -2 -2.9 -3.47 -3.95 -4.16 -4.3 0.0
|
||||
g 10 8 2 2 2 1 1 1 1 2 2 -3 2 6 -1 2 0 0 2 2 3 5 4.2 3.77 3.09 2.33 1.4 0.0
|
||||
h 10 8 4 4 4 4 4 4 4 4 4 -2 6 7 6 3 3 3 4 4 3 1 0.2 -0.86 -1.99 -2.85 -3.4 0.0
|
||||
g 10 9 2 2 2 2 3 3 3 3 3 5 10 -2 2 2 3 3 3 3 3 1 0.3 -0.21 -1.03 -1.80 -2.4 0.0
|
||||
h 10 9 0 0 0 0 0 0 0 0 0 0 11 -1 0 0 1 1 0 0 -1 -2 -2.2 -2.31 -1.97 -1.12 -0.1 0.0
|
||||
g 10 10 0 0 0 0 0 0 0 0 0 -2 3 0 0 0 -1 -1 0 0 0 0 -1.1 -2.09 -2.80 -3.59 -3.8 0.0
|
||||
h 10 10 -6 -6 -6 -6 -6 -6 -6 -6 -6 -2 8 -3 -7 -6 -4 -5 -6 -6 -6 -7 -7.4 -7.93 -8.31 -8.72 -8.8 0.0
|
||||
g 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7 2.95 3.05 3.00 3.0 0.0
|
||||
g 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.7 -1.60 -1.48 -1.40 -1.4 0.0
|
||||
h 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.26 0.13 0.00 0.0 0.0
|
||||
g 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.88 -2.03 -2.30 -2.5 0.0
|
||||
h 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.44 1.67 2.11 2.5 0.0
|
||||
g 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 1.44 1.65 2.08 2.3 0.0
|
||||
h 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.77 -0.66 -0.60 -0.6 0.0
|
||||
g 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.31 -0.51 -0.79 -0.9 0.0
|
||||
h 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.27 -1.76 -1.05 -0.4 0.0
|
||||
g 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.29 0.54 0.58 0.3 0.0
|
||||
h 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.90 0.85 0.76 0.6 0.0
|
||||
g 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.79 -0.79 -0.70 -0.7 0.0
|
||||
h 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.58 -0.39 -0.20 -0.2 0.0
|
||||
g 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.53 0.37 0.14 -0.1 0.0
|
||||
h 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.8 -2.69 -2.51 -2.12 -1.7 0.0
|
||||
g 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.7 1.80 1.79 1.70 1.4 0.0
|
||||
h 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.08 -1.27 -1.44 -1.6 0.0
|
||||
g 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.16 0.12 -0.22 -0.6 0.0
|
||||
h 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.2 -1.58 -2.11 -2.57 -3.0 0.0
|
||||
g 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0.96 0.75 0.44 0.2 0.0
|
||||
h 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.90 -1.94 -2.01 -2.0 0.0
|
||||
g 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.0 3.99 3.75 3.49 3.1 0.0
|
||||
h 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.39 -1.86 -2.34 -2.6 0.0
|
||||
g 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.2 -2.15 -2.12 -2.09 -2.0 0.0
|
||||
g 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.29 -0.21 -0.16 -0.1 0.0
|
||||
h 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.55 -0.87 -1.08 -1.2 0.0
|
||||
g 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.21 0.30 0.46 0.5 0.0
|
||||
h 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.23 0.27 0.37 0.5 0.0
|
||||
g 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.89 1.04 1.23 1.3 0.0
|
||||
h 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 2.38 2.13 1.75 1.4 0.0
|
||||
g 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.38 -0.63 -0.89 -1.2 0.0
|
||||
h 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.63 -2.49 -2.19 -1.8 0.0
|
||||
g 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.96 0.95 0.85 0.7 0.0
|
||||
h 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.61 0.49 0.27 0.1 0.0
|
||||
g 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.30 -0.11 0.10 0.3 0.0
|
||||
h 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.40 0.59 0.72 0.8 0.0
|
||||
g 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.46 0.52 0.54 0.5 0.0
|
||||
h 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.01 0.00 -0.09 -0.2 0.0
|
||||
g 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.35 -0.39 -0.37 -0.3 0.0
|
||||
h 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.02 0.13 0.29 0.6 0.0
|
||||
g 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.36 -0.37 -0.43 -0.5 0.0
|
||||
h 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.28 0.27 0.23 0.2 0.0
|
||||
g 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 0.08 0.21 0.22 0.1 0.0
|
||||
h 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.87 -0.86 -0.89 -0.9 0.0
|
||||
g 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.49 -0.77 -0.94 -1.1 0.0
|
||||
h 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.34 -0.23 -0.16 0.0 0.0
|
||||
g 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.08 0.04 -0.03 -0.3 0.0
|
||||
h 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.88 0.87 0.72 0.5 0.0
|
||||
g 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.16 -0.09 -0.02 0.1 0.0
|
||||
g 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.88 -0.89 -0.92 -0.9 0.0
|
||||
h 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.76 -0.87 -0.88 -0.9 0.0
|
||||
g 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.30 0.31 0.42 0.5 0.0
|
||||
h 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.33 0.30 0.49 0.6 0.0
|
||||
g 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.28 0.42 0.63 0.7 0.0
|
||||
h 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.8 1.72 1.66 1.56 1.4 0.0
|
||||
g 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.43 -0.45 -0.42 -0.3 0.0
|
||||
h 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.54 -0.59 -0.50 -0.4 0.0
|
||||
g 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.18 1.08 0.96 0.8 0.0
|
||||
h 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0 -1.07 -1.14 -1.24 -1.3 0.0
|
||||
g 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.37 -0.31 -0.19 0.0 0.0
|
||||
h 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.04 -0.07 -0.10 -0.1 0.0
|
||||
g 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.75 0.78 0.81 0.8 0.0
|
||||
h 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.63 0.54 0.42 0.3 0.0
|
||||
g 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.26 -0.18 -0.13 0.0 0.0
|
||||
h 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.21 0.10 -0.04 -0.1 0.0
|
||||
g 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.35 0.38 0.38 0.4 0.0
|
||||
h 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0.53 0.49 0.48 0.5 0.0
|
||||
g 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.05 0.02 0.08 0.1 0.0
|
||||
h 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.38 0.44 0.48 0.5 0.0
|
||||
g 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.41 0.42 0.46 0.5 0.0
|
||||
h 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.22 -0.25 -0.30 -0.4 0.0
|
||||
g 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 -0.10 -0.26 -0.35 -0.5 0.0
|
||||
h 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.57 -0.53 -0.43 -0.4 0.0
|
||||
g 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 -0.18 -0.26 -0.36 -0.4 0.0
|
||||
h 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.82 -0.79 -0.71 -0.6 0.0
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
469
scratch/c_legendrecoefs.c
Normal file
469
scratch/c_legendrecoefs.c
Normal file
@ -0,0 +1,469 @@
|
||||
static const int amslegendre_ndegree = 20;
|
||||
static const int amslegendre_maxporder = 20;
|
||||
static const float amslegendrecoefsf[] = {
|
||||
1.0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
1.0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.50000000,0,1.5000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.7320508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.86602540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-1.5000000,0,2.5000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.61237244,0,3.0618622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.9364917,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.79056942,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.37500000,0,-3.7500000,0,4.3750000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.3717082,0,5.5339859,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.55901699,0,3.9131190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.0916501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.73950997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.8750000,0,-8.7500000,0,7.8750000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.48412292,0,-6.7777209,0,10.166581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.5617377,0,7.6852131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.52291252,0,4.7062126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.2185299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.70156076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.31250000,0,6.5625000,0,-19.687500,0,14.437500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.8641098,0,-17.184659,0,18.903125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.45285552,0,-8.1513994,0,14.944232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.7171331,0,9.9628215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.49607837,0,5.4568621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.3268138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.67169329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.1875000,0,19.687500,0,-43.312500,0,26.812500,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.41339864,0,11.161763,0,-40.926466,0,35.469604,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.0378472,0,-22.277546,0,28.960810,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.42961647,0,-9.4515624,0,20.478385,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.8497533,0,12.348931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.47495888,0,6.1744654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.4218246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.64725985,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.27343750,0,-9.8437500,0,54.140625,0,-93.843750,0,50.273438,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.2812500,0,36.093750,0,-93.843750,0,67.031250,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.39218439,0,12.942085,0,-56.082367,0,56.082367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.1861210,0,-27.613049,0,41.419573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.41132646,0,-10.694488,0,26.736220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.9661173,0,14.830586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.45768183,0,6.8652274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.5068266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.62670665,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.4609375,0,-36.093750,0,140.76562,0,-201.09375,0,94.960938,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.36685490,0,-16.141616,0,104.92050,0,-209.84100,0,127.40347,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.4414040,0,44.738252,0,-134.21476,0,108.65004,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.37548796,0,14.644031,0,-73.220153,0,82.982840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.3162199,0,-33.162199,0,56.375738,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.39636409,0,-11.890923,0,33.690948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.0702230,0,17.397931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.44314853,0,7.5335249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.5839777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.60904939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.24609375,0,13.535156,0,-117.30469,0,351.91406,0,-427.32422,0,180.42578,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.6501602,0,-63.269443,0,284.71250,0,-460.96309,0,243.28607,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.35123683,0,-18.264315,0,136.98236,0,-310.49336,0,210.69192,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.5819269,0,53.728903,0,-182.67827,0,165.28034,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.36182926,0,16.282316,0,-92.266460,0,116.87085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.4326137,0,-38.902955,0,73.915615,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.38377788,0,-13.048448,0,41.320085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.1647135,0,20.043185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.43066296,0,8.1825962,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.6547848,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.59362792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.7070312,0,58.652344,0,-351.91406,0,854.64844,0,-902.12891,0,344.44922,0,0,0,0,0,0,0,0,0,
|
||||
-0.33321251,0,21.658813,0,-216.58813,0,736.39965,0,-999.39953,0,466.38645,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.7992072,0,-75.984144,0,387.51913,0,-701.22510,0,409.04797,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.33846028,0,-20.307617,0,172.61474,0,-437.29068,0,327.96801,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.7076466,0,63.029992,0,-239.51397,0,239.51397,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.35033967,0,17.867323,0,-113.15971,0,158.42360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.5382572,0,-44.817925,0,94.117642,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.37296506,0,-14.172672,0,49.604353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.2514340,0,22.760038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.41975833,0,8.8149248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.7203449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.57997947,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.22558594,0,-17.595703,0,219.94629,0,-997.08984,0,2029.7900,0,-1894.4707,0,660.19434,0,0,0,0,0,0,0,0,
|
||||
0,-3.9846421,0,99.616053,0,-677.38916,0,1838.6277,0,-2145.0657,0,897.02746,0,0,0,0,0,0,0,0,0,
|
||||
-0.32109161,0,24.081871,0,-272.92787,0,1037.1259,0,-1555.6889,0,795.12986,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.9325530,0,-89.137869,0,508.08585,0,-1016.1717,0,649.22081,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.32771275,0,-22.284467,0,211.70244,0,-592.76683,0,486.91561,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.8217546,0,72.613337,0,-304.97602,0,334.02135,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.34046896,0,19.406731,0,-135.84712,0,208.29891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.6352137,0,-50.892992,0,117.05388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.36352137,0,-15.267898,0,58.526941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.3317284,0,25.543251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.41010742,0,9.4324706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.7814838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.56776801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.9326172,0,-87.978516,0,747.81738,0,-2706.3867,0,4736.1768,0,-3961.1660,0,1269.6045,0,0,0,0,0,0,0,
|
||||
0.30742181,0,-27.667963,0,391.96281,0,-1985.9449,0,4468.3761,0,-4567.6733,0,1730.1793,0,0,0,0,0,0,0,0,
|
||||
0,-4.1244964,0,116.86073,0,-888.14156,0,2664.4247,0,-3404.5427,0,1547.5194,0,0,0,0,0,0,0,0,0,
|
||||
-0.31089562,0,26.426127,0,-334.73095,0,1405.8700,0,-2309.6435,0,1283.1353,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.0535829,0,-102.69077,0,646.95183,0,-1417.1326,0,984.11985,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31847955,0,-24.204446,0,254.14668,0,-779.38316,0,695.87782,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.9264796,0,82.456072,0,-379.29793,0,451.54515,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.33184809,0,20.906430,0,-160.28263,0,267.13772,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.7249856,0,-57.116446,0,142.79112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.35516344,0,-16.337518,0,68.072993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.4066081,0,28.388401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.40147261,0,10.036815,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.8388401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.55674234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.20947266,0,21.994629,0,-373.90869,0,2368.0884,0,-7104.2651,0,10893.207,0,-8252.4292,0,2448.5229,0,0,0,0,0,0,
|
||||
0,4.2929120,0,-145.95901,0,1386.6106,0,-5546.4423,0,10630.681,0,-9664.2555,0,3345.3192,0,0,0,0,0,0,0,
|
||||
0.29765989,0,-30.361309,0,480.72072,0,-2692.0360,0,6633.9460,0,-7371.0511,0,3015.4300,0,0,0,0,0,0,0,0,
|
||||
0,-4.2514336,0,134.62873,0,-1130.8813,0,3715.7530,0,-5160.7680,0,2533.4679,0,0,0,0,0,0,0,0,0,
|
||||
-0.30213623,0,28.702942,0,-401.84119,0,1848.4695,0,-3300.8383,0,1980.5030,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.1646605,0,-116.61049,0,804.61241,0,-1915.7438,0,1436.8079,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31041547,0,-26.074899,0,299.86134,0,-999.53781,0,963.84003,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.0234443,0,92.539219,0,-462.69610,0,594.89498,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.32421838,0,22.371068,0,-186.42557,0,335.56603,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.8087036,0,-63.478394,0,171.39166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.34768548,0,-17.384274,0,78.229233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.4768548,0,31.291693,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.39367628,0,10.629260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.8929181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.54671013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.1420898,0,124.63623,0,-1420.8530,0,7104.2651,0,-18155.344,0,24757.288,0,-17139.661,0,4733.8110,0,0,0,0,0,
|
||||
-0.28683225,0,34.133037,0,-648.52771,0,4539.6940,0,-14916.137,0,24860.229,0,-20340.187,0,6482.0377,0,0,0,0,0,0,
|
||||
0,4.4250324,0,-168.15123,0,1765.5879,0,-7734.9566,0,16114.493,0,-15821.502,0,5882.3534,0,0,0,0,0,0,0,
|
||||
0.28927342,0,-32.977170,0,577.10047,0,-3539.5495,0,9480.9362,0,-11377.123,0,4999.0391,0,0,0,0,0,0,0,0,
|
||||
0,-4.3679328,0,152.87765,0,-1406.4744,0,5023.1227,0,-7534.6841,0,3972.8334,0,0,0,0,0,0,0,0,0,
|
||||
-0.29448597,0,30.921027,0,-474.12241,0,2370.6121,0,-4571.8947,0,2946.3321,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.2675071,0,-130.87022,0,981.52664,0,-2523.9257,0,2033.1623,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.30327853,0,-27.901624,0,348.77031,0,-1255.5731,0,1300.4150,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.1138701,0,102.84675,0,-555.37246,0,766.94292,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.31739197,0,23.804398,0,-214.23958,0,414.19652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.8872418,0,-69.970353,0,202.91402,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.34093366,0,-18.410418,0,88.983686,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.5430866,0,34.249837,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.38658244,0,11.210891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.9441241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.53752107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.19638062,0,-26.707764,0,592.02209,0,-4972.9856,0,20424.762,0,-45388.361,0,55703.897,0,-35503.583,0,9171.7589,0,0,0,0,
|
||||
0,-4.5803437,0,203.06190,0,-2558.5800,0,14011.271,0,-38920.198,0,57318.837,0,-42621.699,0,12583.549,0,0,0,0,0,
|
||||
-0.27875084,0,37.073862,0,-778.55109,0,5968.8917,0,-21317.470,0,38371.447,0,-33720.362,0,11487.156,0,0,0,0,0,0,
|
||||
0,4.5462886,0,-190.94412,0,2195.8574,0,-10456.464,0,23527.044,0,-24810.337,0,9860.5185,0,0,0,0,0,0,0,
|
||||
0.28194885,0,-35.525555,0,680.90647,0,-4539.3765,0,13131.768,0,-16925.389,0,7949.8042,0,0,0,0,0,0,0,0,
|
||||
0,-4.4757992,0,171.57230,0,-1715.7230,0,6617.7889,0,-10661.993,0,6009.4871,0,0,0,0,0,0,0,0,0,
|
||||
-0.28771527,0,33.087256,0,-551.45427,0,2977.8531,0,-6168.4099,0,4249.3491,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.3634182,0,-145.44727,0,1178.1229,0,-3253.8632,0,2801.9378,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.29689300,0,-29.689300,0,400.80555,0,-1549.7815,0,1715.8295,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.1987011,0,113.36493,0,-657.51659,0,970.61973,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.31122843,0,25.209503,0,-243.69186,0,503.62985,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.9612912,0,-76.584963,0,237.41339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.33479021,0,-19.417832,0,100.32547,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.6058009,0,37.259943,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.38008479,0,11.782629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.9927906,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.52905564,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.3384705,0,-169.14917,0,2486.4928,0,-16339.810,0,56735.451,0,-111407.79,0,124262.54,0,-73374.071,0,17804.003,0,0,0,
|
||||
0.26989934,0,-41.024700,0,1005.1051,0,-9246.9673,0,41281.104,0,-99074.650,0,130598.40,0,-88979.131,0,24469.261,0,0,0,0,
|
||||
0,-4.7058558,0,230.58693,0,-3182.0997,0,18941.070,0,-56823.209,0,89883.985,0,-71446.244,0,22454.534,0,0,0,0,0,
|
||||
-0.27169271,0,39.938828,0,-918.59305,0,7654.9421,0,-29526.205,0,57083.997,0,-53624.361,0,19446.197,0,0,0,0,0,0,
|
||||
0,4.6585596,0,-214.29374,0,2678.6717,0,-13776.026,0,33292.063,0,-37529.235,0,15877.753,0,0,0,0,0,0,0,
|
||||
0.27546640,0,-38.014363,0,791.96590,0,-5702.1545,0,17717.409,0,-24410.652,0,12205.326,0,0,0,0,0,0,0,0,
|
||||
0,-4.5763916,0,190.68298,0,-2059.3762,0,8531.7014,0,-14693.486,0,8816.0915,0,0,0,0,0,0,0,0,0,
|
||||
-0.28165743,0,35.207179,0,-633.72922,0,3675.6295,0,-8138.8938,0,5968.5221,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.4533950,0,-160.32222,0,1394.8033,0,-4117.9907,0,3774.8248,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.29112754,0,-31.441774,0,455.90573,0,-1884.4103,0,2220.9122,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.2786835,0,124.08182,0,-769.30730,0,1208.9115,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.30562025,0,26.588962,0,-274.75261,0,604.45573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.0314080,0,-83.315765,0,274.94203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.32916308,0,-20.408111,0,112.24461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.6654050,0,40.319455,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.37409883,0,12.345261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.0391933,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.52121734,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.18547058,0,31.715469,0,-888.03314,0,9531.5557,0,-51061.906,0,153185.72,0,-269235.50,0,275152.77,0,-151334.02,0,34618.894,0,0,
|
||||
0,4.8506851,0,-271.63837,0,4373.3777,0,-31238.412,0,117144.05,0,-247067.44,0,294580.41,0,-185164.83,0,47652.714,0,0,0,
|
||||
0.26306534,0,-44.194976,0,1185.8985,0,-11858.985,0,57177.251,0,-147390.25,0,207686.26,0,-150629.59,0,43933.631,0,0,0,0,
|
||||
0,-4.8220673,0,258.78428,0,-3881.7641,0,24954.198,0,-80407.972,0,135962.57,0,-115045.25,0,38348.417,0,0,0,0,0,
|
||||
-0.26544607,0,42.736817,0,-1068.4204,0,9615.7837,0,-39836.818,0,82329.425,0,-82329.425,0,31665.163,0,0,0,0,0,0,
|
||||
0,4.7632594,0,-238.16297,0,3215.2001,0,-17760.153,0,45880.395,0,-55056.474,0,24704.828,0,0,0,0,0,0,0,
|
||||
0.26966646,0,-40.449969,0,910.12430,0,-7038.2946,0,23377.193,0,-34286.549,0,18182.261,0,0,0,0,0,0,0,0,
|
||||
0,-4.6707601,0,210.18420,0,-2438.1368,0,10797.463,0,-19795.348,0,12597.040,0,0,0,0,0,0,0,0,0,
|
||||
-0.27618783,0,37.285358,0,-720.85025,0,4469.2715,0,-10534.711,0,8193.6645,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.5382292,0,-175.47820,0,1631.9472,0,-5128.9770,0,4986.5054,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.28588157,0,-33.162262,0,514.01506,0,-2261.6663,0,2827.0828,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.3544183,0,134.98697,0,-890.91399,0,1484.8566,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.30048341,0,27.944957,0,-307.39453,0,717.25390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.0980474,0,-90.157042,0,315.54965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.32397909,0,-21.382620,0,124.73195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.7222364,0,43.426091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.36855632,0,12.899471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.0835634,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.51392723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.5239410,0,222.00829,0,-4084.9525,0,34041.270,0,-153185.72,0,403853.25,0,-642023.12,0,605336.09,0,-311570.04,0,67415.741,0,
|
||||
-0.25565355,0,48.318522,0,-1481.7680,0,17287.293,0,-100019.34,0,322284.54,0,-605504.28,0,658735.43,0,-384262.33,0,92926.185,0,0,
|
||||
0,4.9704732,0,-304.85569,0,5334.9745,0,-41155.518,0,165765.28,0,-373725.36,0,474343.72,0,-316229.15,0,86032.930,0,0,0,
|
||||
0.25701705,0,-47.291137,0,1379.3248,0,-14896.708,0,77143.667,0,-212573.66,0,318860.49,0,-245277.30,0,75627.168,0,0,0,0,
|
||||
0,-4.9304419,0,287.60911,0,-4659.2675,0,32171.133,0,-110811.68,0,199461.03,0,-179003.48,0,63077.418,0,0,0,0,0,
|
||||
-0.25985710,0,45.474993,0,-1227.8248,0,11868.973,0,-52562.595,0,115637.71,0,-122646.06,0,49867.078,0,0,0,0,0,0,
|
||||
0,4.8614812,0,-262.51999,0,3806.5398,0,-22476.711,0,61810.956,0,-78668.489,0,37317.104,0,0,0,0,0,0,0,
|
||||
0.26442972,0,-42.837614,0,1035.2423,0,-8558.0034,0,30258.655,0,-47069.019,0,26387.177,0,0,0,0,0,0,0,0,
|
||||
0,-4.7597349,0,230.05386,0,-2852.6678,0,13448.291,0,-26149.455,0,17591.451,0,0,0,0,0,0,0,0,0,
|
||||
-0.27121107,0,39.325605,0,-812.72917,0,5364.0125,0,-13410.031,0,11026.026,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.6185581,0,-190.90040,0,1889.9140,0,-6299.7132,0,6474.7052,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.28107649,0,-34.853485,0,575.08251,0,-2683.7184,0,3546.3421,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.4263970,0,146.07110,0,-1022.4977,0,1801.5436,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.29575109,0,29.279358,0,-341.59251,0,842.59486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.1615868,0,-97.103691,0,359.28366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31917913,0,-22.342539,0,137.77899,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.7765784,0,46.577801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.36340143,0,13.445853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.1260973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.50711995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.17619705,0,-37.001381,0,1276.5476,0,-17020.635,0,114889.29,0,-444238.58,0,1043287.6,0,-1513340.2,0,1324172.7,0,-640449.54,0,131460.69,
|
||||
0,-5.1066757,0,352.36062,0,-7047.2125,0,63424.912,0,-306553.74,0,863924.19,0,-1462025.5,0,1462025.5,0,-795513.90,0,181432.99,0,
|
||||
-0.24977567,0,51.703565,0,-1723.4522,0,21715.497,0,-134946.30,0,464815.05,0,-929630.09,0,1072650.1,0,-661467.56,0,168609.38,0,0,
|
||||
0,5.0821831,0,-338.81221,0,6403.5507,0,-53057.992,0,228444.13,0,-548265.92,0,738050.27,0,-520149.72,0,149160.58,0,0,0,
|
||||
0.25160556,0,-50.321111,0,1585.1150,0,-18387.334,0,101787.03,0,-298575.28,0,475006.13,0,-386268.72,0,125537.33,0,0,0,0,
|
||||
0,-5.0321111,0,317.02300,0,-5516.2002,0,40714.811,0,-149287.64,0,285003.68,0,-270388.11,0,100429.87,0,0,0,0,0,
|
||||
-0.25481085,0,48.159251,0,-1396.6183,0,14431.722,0,-68035.262,0,158748.94,0,-177991.24,0,76281.961,0,0,0,0,0,0,
|
||||
0,4.9540892,0,-287.33717,0,4453.7262,0,-27994.850,0,81651.647,0,-109858.58,0,54929.290,0,0,0,0,0,0,0,
|
||||
0.25966483,0,-45.181680,0,1167.1934,0,-10271.302,0,38517.382,0,-63339.695,0,37428.002,0,0,0,0,0,0,0,0,
|
||||
0,-4.8439846,0,250.27254,0,-3303.5975,0,16517.987,0,-33953.641,0,24076.218,0,0,0,0,0,0,0,0,0,
|
||||
-0.26665257,0,41.331149,0,-909.28528,0,6364.9970,0,-16821.778,0,14578.874,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.6949030,0,-206.57573,0,2169.0452,0,-7643.3022,0,8280.2440,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.27664982,0,-36.517776,0,639.06107,0,-3152.7013,0,4391.2625,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.4950274,0,157.32596,0,-1164.2121,0,2162.1082,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.29136935,0,30.593782,0,-377.32331,0,981.04061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.2223431,0,-104.15113,0,406.18940,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31471487,0,-23.288900,0,151.37785,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.8286716,0,49.772731,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.35858795,0,13.984930,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.1669631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.50074083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
};
|
||||
|
||||
static const double amslegendrecoefs[] = {
|
||||
1.0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
1.0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.50000000,0,1.5000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.7320508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.86602540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-1.5000000,0,2.5000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.61237244,0,3.0618622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.9364917,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.79056942,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.37500000,0,-3.7500000,0,4.3750000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.3717082,0,5.5339859,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.55901699,0,3.9131190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.0916501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.73950997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,1.8750000,0,-8.7500000,0,7.8750000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.48412292,0,-6.7777209,0,10.166581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.5617377,0,7.6852131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.52291252,0,4.7062126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.2185299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.70156076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.31250000,0,6.5625000,0,-19.687500,0,14.437500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.8641098,0,-17.184659,0,18.903125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.45285552,0,-8.1513994,0,14.944232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.7171331,0,9.9628215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.49607837,0,5.4568621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.3268138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.67169329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.1875000,0,19.687500,0,-43.312500,0,26.812500,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.41339864,0,11.161763,0,-40.926466,0,35.469604,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.0378472,0,-22.277546,0,28.960810,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.42961647,0,-9.4515624,0,20.478385,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.8497533,0,12.348931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.47495888,0,6.1744654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.4218246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.64725985,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.27343750,0,-9.8437500,0,54.140625,0,-93.843750,0,50.273438,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.2812500,0,36.093750,0,-93.843750,0,67.031250,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.39218439,0,12.942085,0,-56.082367,0,56.082367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.1861210,0,-27.613049,0,41.419573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.41132646,0,-10.694488,0,26.736220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.9661173,0,14.830586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.45768183,0,6.8652274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.5068266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.62670665,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.4609375,0,-36.093750,0,140.76562,0,-201.09375,0,94.960938,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.36685490,0,-16.141616,0,104.92050,0,-209.84100,0,127.40347,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.4414040,0,44.738252,0,-134.21476,0,108.65004,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.37548796,0,14.644031,0,-73.220153,0,82.982840,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.3162199,0,-33.162199,0,56.375738,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.39636409,0,-11.890923,0,33.690948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.0702230,0,17.397931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.44314853,0,7.5335249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.5839777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.60904939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.24609375,0,13.535156,0,-117.30469,0,351.91406,0,-427.32422,0,180.42578,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.6501602,0,-63.269443,0,284.71250,0,-460.96309,0,243.28607,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.35123683,0,-18.264315,0,136.98236,0,-310.49336,0,210.69192,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.5819269,0,53.728903,0,-182.67827,0,165.28034,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.36182926,0,16.282316,0,-92.266460,0,116.87085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.4326137,0,-38.902955,0,73.915615,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.38377788,0,-13.048448,0,41.320085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.1647135,0,20.043185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.43066296,0,8.1825962,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.6547848,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.59362792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-2.7070312,0,58.652344,0,-351.91406,0,854.64844,0,-902.12891,0,344.44922,0,0,0,0,0,0,0,0,0,
|
||||
-0.33321251,0,21.658813,0,-216.58813,0,736.39965,0,-999.39953,0,466.38645,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.7992072,0,-75.984144,0,387.51913,0,-701.22510,0,409.04797,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.33846028,0,-20.307617,0,172.61474,0,-437.29068,0,327.96801,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.7076466,0,63.029992,0,-239.51397,0,239.51397,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.35033967,0,17.867323,0,-113.15971,0,158.42360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.5382572,0,-44.817925,0,94.117642,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.37296506,0,-14.172672,0,49.604353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.2514340,0,22.760038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.41975833,0,8.8149248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.7203449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.57997947,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.22558594,0,-17.595703,0,219.94629,0,-997.08984,0,2029.7900,0,-1894.4707,0,660.19434,0,0,0,0,0,0,0,0,
|
||||
0,-3.9846421,0,99.616053,0,-677.38916,0,1838.6277,0,-2145.0657,0,897.02746,0,0,0,0,0,0,0,0,0,
|
||||
-0.32109161,0,24.081871,0,-272.92787,0,1037.1259,0,-1555.6889,0,795.12986,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.9325530,0,-89.137869,0,508.08585,0,-1016.1717,0,649.22081,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.32771275,0,-22.284467,0,211.70244,0,-592.76683,0,486.91561,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.8217546,0,72.613337,0,-304.97602,0,334.02135,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.34046896,0,19.406731,0,-135.84712,0,208.29891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.6352137,0,-50.892992,0,117.05388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.36352137,0,-15.267898,0,58.526941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.3317284,0,25.543251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.41010742,0,9.4324706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.7814838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.56776801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.9326172,0,-87.978516,0,747.81738,0,-2706.3867,0,4736.1768,0,-3961.1660,0,1269.6045,0,0,0,0,0,0,0,
|
||||
0.30742181,0,-27.667963,0,391.96281,0,-1985.9449,0,4468.3761,0,-4567.6733,0,1730.1793,0,0,0,0,0,0,0,0,
|
||||
0,-4.1244964,0,116.86073,0,-888.14156,0,2664.4247,0,-3404.5427,0,1547.5194,0,0,0,0,0,0,0,0,0,
|
||||
-0.31089562,0,26.426127,0,-334.73095,0,1405.8700,0,-2309.6435,0,1283.1353,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.0535829,0,-102.69077,0,646.95183,0,-1417.1326,0,984.11985,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31847955,0,-24.204446,0,254.14668,0,-779.38316,0,695.87782,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.9264796,0,82.456072,0,-379.29793,0,451.54515,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.33184809,0,20.906430,0,-160.28263,0,267.13772,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.7249856,0,-57.116446,0,142.79112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.35516344,0,-16.337518,0,68.072993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.4066081,0,28.388401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.40147261,0,10.036815,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.8388401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.55674234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.20947266,0,21.994629,0,-373.90869,0,2368.0884,0,-7104.2651,0,10893.207,0,-8252.4292,0,2448.5229,0,0,0,0,0,0,
|
||||
0,4.2929120,0,-145.95901,0,1386.6106,0,-5546.4423,0,10630.681,0,-9664.2555,0,3345.3192,0,0,0,0,0,0,0,
|
||||
0.29765989,0,-30.361309,0,480.72072,0,-2692.0360,0,6633.9460,0,-7371.0511,0,3015.4300,0,0,0,0,0,0,0,0,
|
||||
0,-4.2514336,0,134.62873,0,-1130.8813,0,3715.7530,0,-5160.7680,0,2533.4679,0,0,0,0,0,0,0,0,0,
|
||||
-0.30213623,0,28.702942,0,-401.84119,0,1848.4695,0,-3300.8383,0,1980.5030,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.1646605,0,-116.61049,0,804.61241,0,-1915.7438,0,1436.8079,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31041547,0,-26.074899,0,299.86134,0,-999.53781,0,963.84003,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.0234443,0,92.539219,0,-462.69610,0,594.89498,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.32421838,0,22.371068,0,-186.42557,0,335.56603,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.8087036,0,-63.478394,0,171.39166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.34768548,0,-17.384274,0,78.229233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.4768548,0,31.291693,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.39367628,0,10.629260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.8929181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.54671013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.1420898,0,124.63623,0,-1420.8530,0,7104.2651,0,-18155.344,0,24757.288,0,-17139.661,0,4733.8110,0,0,0,0,0,
|
||||
-0.28683225,0,34.133037,0,-648.52771,0,4539.6940,0,-14916.137,0,24860.229,0,-20340.187,0,6482.0377,0,0,0,0,0,0,
|
||||
0,4.4250324,0,-168.15123,0,1765.5879,0,-7734.9566,0,16114.493,0,-15821.502,0,5882.3534,0,0,0,0,0,0,0,
|
||||
0.28927342,0,-32.977170,0,577.10047,0,-3539.5495,0,9480.9362,0,-11377.123,0,4999.0391,0,0,0,0,0,0,0,0,
|
||||
0,-4.3679328,0,152.87765,0,-1406.4744,0,5023.1227,0,-7534.6841,0,3972.8334,0,0,0,0,0,0,0,0,0,
|
||||
-0.29448597,0,30.921027,0,-474.12241,0,2370.6121,0,-4571.8947,0,2946.3321,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.2675071,0,-130.87022,0,981.52664,0,-2523.9257,0,2033.1623,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.30327853,0,-27.901624,0,348.77031,0,-1255.5731,0,1300.4150,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.1138701,0,102.84675,0,-555.37246,0,766.94292,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.31739197,0,23.804398,0,-214.23958,0,414.19652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.8872418,0,-69.970353,0,202.91402,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.34093366,0,-18.410418,0,88.983686,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.5430866,0,34.249837,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.38658244,0,11.210891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.9441241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.53752107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.19638062,0,-26.707764,0,592.02209,0,-4972.9856,0,20424.762,0,-45388.361,0,55703.897,0,-35503.583,0,9171.7589,0,0,0,0,
|
||||
0,-4.5803437,0,203.06190,0,-2558.5800,0,14011.271,0,-38920.198,0,57318.837,0,-42621.699,0,12583.549,0,0,0,0,0,
|
||||
-0.27875084,0,37.073862,0,-778.55109,0,5968.8917,0,-21317.470,0,38371.447,0,-33720.362,0,11487.156,0,0,0,0,0,0,
|
||||
0,4.5462886,0,-190.94412,0,2195.8574,0,-10456.464,0,23527.044,0,-24810.337,0,9860.5185,0,0,0,0,0,0,0,
|
||||
0.28194885,0,-35.525555,0,680.90647,0,-4539.3765,0,13131.768,0,-16925.389,0,7949.8042,0,0,0,0,0,0,0,0,
|
||||
0,-4.4757992,0,171.57230,0,-1715.7230,0,6617.7889,0,-10661.993,0,6009.4871,0,0,0,0,0,0,0,0,0,
|
||||
-0.28771527,0,33.087256,0,-551.45427,0,2977.8531,0,-6168.4099,0,4249.3491,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.3634182,0,-145.44727,0,1178.1229,0,-3253.8632,0,2801.9378,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.29689300,0,-29.689300,0,400.80555,0,-1549.7815,0,1715.8295,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.1987011,0,113.36493,0,-657.51659,0,970.61973,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.31122843,0,25.209503,0,-243.69186,0,503.62985,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.9612912,0,-76.584963,0,237.41339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.33479021,0,-19.417832,0,100.32547,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.6058009,0,37.259943,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.38008479,0,11.782629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,2.9927906,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.52905564,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.3384705,0,-169.14917,0,2486.4928,0,-16339.810,0,56735.451,0,-111407.79,0,124262.54,0,-73374.071,0,17804.003,0,0,0,
|
||||
0.26989934,0,-41.024700,0,1005.1051,0,-9246.9673,0,41281.104,0,-99074.650,0,130598.40,0,-88979.131,0,24469.261,0,0,0,0,
|
||||
0,-4.7058558,0,230.58693,0,-3182.0997,0,18941.070,0,-56823.209,0,89883.985,0,-71446.244,0,22454.534,0,0,0,0,0,
|
||||
-0.27169271,0,39.938828,0,-918.59305,0,7654.9421,0,-29526.205,0,57083.997,0,-53624.361,0,19446.197,0,0,0,0,0,0,
|
||||
0,4.6585596,0,-214.29374,0,2678.6717,0,-13776.026,0,33292.063,0,-37529.235,0,15877.753,0,0,0,0,0,0,0,
|
||||
0.27546640,0,-38.014363,0,791.96590,0,-5702.1545,0,17717.409,0,-24410.652,0,12205.326,0,0,0,0,0,0,0,0,
|
||||
0,-4.5763916,0,190.68298,0,-2059.3762,0,8531.7014,0,-14693.486,0,8816.0915,0,0,0,0,0,0,0,0,0,
|
||||
-0.28165743,0,35.207179,0,-633.72922,0,3675.6295,0,-8138.8938,0,5968.5221,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.4533950,0,-160.32222,0,1394.8033,0,-4117.9907,0,3774.8248,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.29112754,0,-31.441774,0,455.90573,0,-1884.4103,0,2220.9122,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.2786835,0,124.08182,0,-769.30730,0,1208.9115,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.30562025,0,26.588962,0,-274.75261,0,604.45573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.0314080,0,-83.315765,0,274.94203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.32916308,0,-20.408111,0,112.24461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.6654050,0,40.319455,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.37409883,0,12.345261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.0391933,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.52121734,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.18547058,0,31.715469,0,-888.03314,0,9531.5557,0,-51061.906,0,153185.72,0,-269235.50,0,275152.77,0,-151334.02,0,34618.894,0,0,
|
||||
0,4.8506851,0,-271.63837,0,4373.3777,0,-31238.412,0,117144.05,0,-247067.44,0,294580.41,0,-185164.83,0,47652.714,0,0,0,
|
||||
0.26306534,0,-44.194976,0,1185.8985,0,-11858.985,0,57177.251,0,-147390.25,0,207686.26,0,-150629.59,0,43933.631,0,0,0,0,
|
||||
0,-4.8220673,0,258.78428,0,-3881.7641,0,24954.198,0,-80407.972,0,135962.57,0,-115045.25,0,38348.417,0,0,0,0,0,
|
||||
-0.26544607,0,42.736817,0,-1068.4204,0,9615.7837,0,-39836.818,0,82329.425,0,-82329.425,0,31665.163,0,0,0,0,0,0,
|
||||
0,4.7632594,0,-238.16297,0,3215.2001,0,-17760.153,0,45880.395,0,-55056.474,0,24704.828,0,0,0,0,0,0,0,
|
||||
0.26966646,0,-40.449969,0,910.12430,0,-7038.2946,0,23377.193,0,-34286.549,0,18182.261,0,0,0,0,0,0,0,0,
|
||||
0,-4.6707601,0,210.18420,0,-2438.1368,0,10797.463,0,-19795.348,0,12597.040,0,0,0,0,0,0,0,0,0,
|
||||
-0.27618783,0,37.285358,0,-720.85025,0,4469.2715,0,-10534.711,0,8193.6645,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.5382292,0,-175.47820,0,1631.9472,0,-5128.9770,0,4986.5054,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.28588157,0,-33.162262,0,514.01506,0,-2261.6663,0,2827.0828,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.3544183,0,134.98697,0,-890.91399,0,1484.8566,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.30048341,0,27.944957,0,-307.39453,0,717.25390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.0980474,0,-90.157042,0,315.54965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.32397909,0,-21.382620,0,124.73195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.7222364,0,43.426091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.36855632,0,12.899471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.0835634,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.51392723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.5239410,0,222.00829,0,-4084.9525,0,34041.270,0,-153185.72,0,403853.25,0,-642023.12,0,605336.09,0,-311570.04,0,67415.741,0,
|
||||
-0.25565355,0,48.318522,0,-1481.7680,0,17287.293,0,-100019.34,0,322284.54,0,-605504.28,0,658735.43,0,-384262.33,0,92926.185,0,0,
|
||||
0,4.9704732,0,-304.85569,0,5334.9745,0,-41155.518,0,165765.28,0,-373725.36,0,474343.72,0,-316229.15,0,86032.930,0,0,0,
|
||||
0.25701705,0,-47.291137,0,1379.3248,0,-14896.708,0,77143.667,0,-212573.66,0,318860.49,0,-245277.30,0,75627.168,0,0,0,0,
|
||||
0,-4.9304419,0,287.60911,0,-4659.2675,0,32171.133,0,-110811.68,0,199461.03,0,-179003.48,0,63077.418,0,0,0,0,0,
|
||||
-0.25985710,0,45.474993,0,-1227.8248,0,11868.973,0,-52562.595,0,115637.71,0,-122646.06,0,49867.078,0,0,0,0,0,0,
|
||||
0,4.8614812,0,-262.51999,0,3806.5398,0,-22476.711,0,61810.956,0,-78668.489,0,37317.104,0,0,0,0,0,0,0,
|
||||
0.26442972,0,-42.837614,0,1035.2423,0,-8558.0034,0,30258.655,0,-47069.019,0,26387.177,0,0,0,0,0,0,0,0,
|
||||
0,-4.7597349,0,230.05386,0,-2852.6678,0,13448.291,0,-26149.455,0,17591.451,0,0,0,0,0,0,0,0,0,
|
||||
-0.27121107,0,39.325605,0,-812.72917,0,5364.0125,0,-13410.031,0,11026.026,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.6185581,0,-190.90040,0,1889.9140,0,-6299.7132,0,6474.7052,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.28107649,0,-34.853485,0,575.08251,0,-2683.7184,0,3546.3421,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.4263970,0,146.07110,0,-1022.4977,0,1801.5436,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.29575109,0,29.279358,0,-341.59251,0,842.59486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.1615868,0,-97.103691,0,359.28366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31917913,0,-22.342539,0,137.77899,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.7765784,0,46.577801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.36340143,0,13.445853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.1260973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.50711995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.17619705,0,-37.001381,0,1276.5476,0,-17020.635,0,114889.29,0,-444238.58,0,1043287.6,0,-1513340.2,0,1324172.7,0,-640449.54,0,131460.69,
|
||||
0,-5.1066757,0,352.36062,0,-7047.2125,0,63424.912,0,-306553.74,0,863924.19,0,-1462025.5,0,1462025.5,0,-795513.90,0,181432.99,0,
|
||||
-0.24977567,0,51.703565,0,-1723.4522,0,21715.497,0,-134946.30,0,464815.05,0,-929630.09,0,1072650.1,0,-661467.56,0,168609.38,0,0,
|
||||
0,5.0821831,0,-338.81221,0,6403.5507,0,-53057.992,0,228444.13,0,-548265.92,0,738050.27,0,-520149.72,0,149160.58,0,0,0,
|
||||
0.25160556,0,-50.321111,0,1585.1150,0,-18387.334,0,101787.03,0,-298575.28,0,475006.13,0,-386268.72,0,125537.33,0,0,0,0,
|
||||
0,-5.0321111,0,317.02300,0,-5516.2002,0,40714.811,0,-149287.64,0,285003.68,0,-270388.11,0,100429.87,0,0,0,0,0,
|
||||
-0.25481085,0,48.159251,0,-1396.6183,0,14431.722,0,-68035.262,0,158748.94,0,-177991.24,0,76281.961,0,0,0,0,0,0,
|
||||
0,4.9540892,0,-287.33717,0,4453.7262,0,-27994.850,0,81651.647,0,-109858.58,0,54929.290,0,0,0,0,0,0,0,
|
||||
0.25966483,0,-45.181680,0,1167.1934,0,-10271.302,0,38517.382,0,-63339.695,0,37428.002,0,0,0,0,0,0,0,0,
|
||||
0,-4.8439846,0,250.27254,0,-3303.5975,0,16517.987,0,-33953.641,0,24076.218,0,0,0,0,0,0,0,0,0,
|
||||
-0.26665257,0,41.331149,0,-909.28528,0,6364.9970,0,-16821.778,0,14578.874,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.6949030,0,-206.57573,0,2169.0452,0,-7643.3022,0,8280.2440,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.27664982,0,-36.517776,0,639.06107,0,-3152.7013,0,4391.2625,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-4.4950274,0,157.32596,0,-1164.2121,0,2162.1082,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.29136935,0,30.593782,0,-377.32331,0,981.04061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,4.2223431,0,-104.15113,0,406.18940,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.31471487,0,-23.288900,0,151.37785,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,-3.8286716,0,49.772731,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
-0.35858795,0,13.984930,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,3.1669631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0.50074083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
};
|
267
scratch/c_legendrefn.c
Normal file
267
scratch/c_legendrefn.c
Normal file
@ -0,0 +1,267 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "c_legendrecoefs.c"
|
||||
|
||||
static const float amsleg_pif = 3.14159265359;
|
||||
static const double amsleg_pi = 3.14159265359;
|
||||
|
||||
|
||||
float amsleg_polyvalf(float x, const float *coefs, int polyorder)
|
||||
{
|
||||
float ret = 0.0f;
|
||||
float xv = 1.0f;
|
||||
int I;
|
||||
|
||||
for(I=0;I<=polyorder;I++)
|
||||
{
|
||||
//printf("debug: %d %1.6g\n",I,coefs[I]);
|
||||
ret = ret + coefs[I]*xv;
|
||||
xv = xv * x;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
double amsleg_polyval(double x, const double *coefs, int polyorder)
|
||||
{
|
||||
double ret = 0.0;
|
||||
double xv = 1.0;
|
||||
int I;
|
||||
|
||||
for(I=0;I<=polyorder;I++)
|
||||
{
|
||||
ret = ret + coefs[I]*xv;
|
||||
xv = xv * x;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//Schmidt Quasi-Normalized Legendre Function P^n_m(x)
|
||||
//for degree n, and order m, m<=n
|
||||
//n from 0 to 20
|
||||
//m from 0 to n
|
||||
float amsleg_legendref(float x, int n, int m)
|
||||
{
|
||||
float ret = 0.0f;
|
||||
int I, mo2, mr, ind;
|
||||
|
||||
float mpart = 1.0f;
|
||||
float ppart = 0.0f;
|
||||
|
||||
const float *coefptr = NULL;
|
||||
|
||||
if(x<-1.0f) x=-1.0f;
|
||||
if(x>1.0f) x = 1.0f;
|
||||
|
||||
if(m<0)
|
||||
{
|
||||
m = -m;
|
||||
}
|
||||
if(m>n || n<0 || n>20)
|
||||
{
|
||||
ret = 0.0f;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if(m>0)
|
||||
{
|
||||
mo2 = m/2;
|
||||
mr = (m%2==1);
|
||||
for(I=0;I<mo2;I++)
|
||||
{
|
||||
mpart = mpart*(1.0f-x*x);
|
||||
}
|
||||
if(mr==1)
|
||||
{
|
||||
mpart = mpart*sqrt(1.0f-x*x);
|
||||
}
|
||||
}
|
||||
|
||||
ind = n*(n+1)/2 + m;
|
||||
//printf("debug: ind=%d\n",ind);
|
||||
coefptr = &(amslegendrecoefsf[ind*(amslegendre_maxporder+1)]);
|
||||
|
||||
// printf("debug ");
|
||||
// for(I=0;I<amslegendre_maxporder+1;I++)
|
||||
// {
|
||||
// printf("%1.6g,",coefptr[I]);
|
||||
// }
|
||||
// printf("\n");
|
||||
|
||||
ppart = amsleg_polyvalf(x,coefptr,amslegendre_maxporder);
|
||||
|
||||
|
||||
ret = ppart*mpart;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//Schmidt Quasi-Normalized Legendre Function P^n_m(x)
|
||||
//for degree n, and order m, m<=n
|
||||
//n from 0 to 20
|
||||
//m from 0 to n
|
||||
double amsleg_legendre(double x, int n, int m)
|
||||
{
|
||||
double ret = 0.0;
|
||||
int I, mo2, mr, ind;
|
||||
|
||||
double mpart = 1.0;
|
||||
double ppart = 0.0;
|
||||
|
||||
const double *coefptr = NULL;
|
||||
|
||||
if(x<-1.0f) x=-1.0f;
|
||||
if(x>1.0f) x = 1.0f;
|
||||
|
||||
if(m<0)
|
||||
{
|
||||
m = -m;
|
||||
}
|
||||
if(m>n || n<0 || n>20)
|
||||
{
|
||||
ret = 0.0f;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if(m>0)
|
||||
{
|
||||
mo2 = m/2;
|
||||
mr = (m%2==1);
|
||||
for(I=0;I<mo2;I++)
|
||||
{
|
||||
mpart = mpart*(1.0f-x*x);
|
||||
}
|
||||
if(mr==1)
|
||||
{
|
||||
mpart = mpart*sqrt(1.0f-x*x);
|
||||
}
|
||||
}
|
||||
|
||||
ind = n*(n+1)/2 + m;
|
||||
coefptr = &(amslegendrecoefs[ind*(amslegendre_maxporder+1)]);
|
||||
ppart = amsleg_polyval(x,coefptr,amslegendre_maxporder);
|
||||
|
||||
|
||||
ret = ppart*mpart;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
float amsleg_rsphcosf(float theta,float phi,int n,int m)
|
||||
{
|
||||
float ret = 0.0f;
|
||||
float p;
|
||||
|
||||
ret = amsleg_legendref(cosf(theta),n,m)*cosf(m*phi);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
float amsleg_rsphsinf(float theta,float phi,int n,int m)
|
||||
{
|
||||
float ret = 0.0f;
|
||||
float p;
|
||||
|
||||
ret = amsleg_legendref(cosf(theta),n,m)*sinf(m*phi);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
float amsleg_dotprodf(int n1, int m1, int sc1, int n2, int m2, int sc2)
|
||||
{
|
||||
float ret = 0.0f;
|
||||
float p1,p2;
|
||||
int Ntheta = 360;
|
||||
int Nphi = 720;
|
||||
int I,J;
|
||||
float dtheta,dphi,theta,phi;
|
||||
float domega = 0.0f;
|
||||
|
||||
dtheta = amsleg_pif/(Ntheta);
|
||||
dphi = 2.0f*amsleg_pif/(Nphi);
|
||||
for(I=0;I<Ntheta;I++)
|
||||
{
|
||||
for(J=0;J<Nphi;J++)
|
||||
{
|
||||
theta = dtheta*I;
|
||||
phi = dphi*J;
|
||||
domega = dtheta*dphi*sin(theta);
|
||||
|
||||
if(sc1==0)
|
||||
p1 = amsleg_rsphcosf(theta,phi,n1,m1);
|
||||
else
|
||||
p1 = amsleg_rsphsinf(theta,phi,n1,m1);
|
||||
|
||||
if(sc2==0)
|
||||
p2 = amsleg_rsphcosf(theta,phi,n2,m2);
|
||||
else
|
||||
p2 = amsleg_rsphsinf(theta,phi,n2,m2);
|
||||
|
||||
ret = ret + p1*p2*domega;
|
||||
//ret = ret + domega;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void amsleg_test1()
|
||||
{
|
||||
int n = 20;
|
||||
int m = 20;
|
||||
float p;
|
||||
float x;
|
||||
|
||||
printf("Test legendre fn %d %d \n",n,m);
|
||||
for(x=-1.0f; x<=1.005f; x = x + 0.01f)
|
||||
{
|
||||
p = amsleg_legendref(x,n,m);
|
||||
printf("%1.4g\t\t%1.4g\n",x,p);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void amsleg_test2()
|
||||
{
|
||||
int n1 = 3;
|
||||
int m1 = 1;
|
||||
|
||||
int n2;
|
||||
int m2;
|
||||
|
||||
float dp;
|
||||
|
||||
//for Schmidt quasi normalized spherical harmonics:
|
||||
// 1/4pi * integral( C_mn C_MN sin(th)dthdphi ) = 1/(2n+1) del_nN del_mM
|
||||
// there is a factor of 1/(2n+1)
|
||||
|
||||
printf("dot products with (%d,%d).\n",n1,m1);
|
||||
|
||||
for(n2 = 0; n2<5; n2++)
|
||||
{
|
||||
for(m2 = 0; m2<=n2; m2++)
|
||||
{
|
||||
dp = amsleg_dotprodf(n2,m2,1,n2,m2,1);
|
||||
if(dp<1E-4) dp = 0;
|
||||
dp = dp/4.0f/amsleg_pif;
|
||||
dp = dp * (2*n2+1);
|
||||
printf("(%d,%d): %1.6g\n",n2,m2,dp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
printf("Legendre Function Tests\n");
|
||||
|
||||
amsleg_test2();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
90
scratch/legendre.sage
Normal file
90
scratch/legendre.sage
Normal file
@ -0,0 +1,90 @@
|
||||
#!/usr/bin/sage
|
||||
|
||||
# Schmidt Quasi-Normalized Legendre Functions for Spherical Harmonics
|
||||
|
||||
x = var('x');
|
||||
|
||||
def polypart(n,m):
|
||||
pol = (x^2-1)^n
|
||||
for I in range(1,n+1):
|
||||
pol = diff(pol,x)
|
||||
for I in range(1,m+1):
|
||||
pol = diff(pol,x)
|
||||
return pol
|
||||
|
||||
def normpart(n,m):
|
||||
if(m==0):
|
||||
nrm = 1/2^n/factorial(n)
|
||||
else:
|
||||
nrm = (1/2^n/factorial(n)) * sqrt(2*factorial(n-m)/factorial(n+m))
|
||||
return nrm
|
||||
|
||||
NN = 20
|
||||
|
||||
|
||||
lns = []
|
||||
coefs = []
|
||||
nmaxcoefs = 0
|
||||
for I in range(0,NN+1):
|
||||
for J in range(0,I+1):
|
||||
pol = polypart(I,J)
|
||||
nrm = normpart(I,J)
|
||||
pol2 = expand(pol)
|
||||
p2c = pol2.coefficients(sparse=False)
|
||||
|
||||
pol3 = nrm*pol2
|
||||
p3c = pol3.coefficients(sparse=False)
|
||||
for K in range(0,len(p3c)):
|
||||
p3c[K] = p3c[K].n()
|
||||
|
||||
coefs.append(p3c)
|
||||
if(nmaxcoefs<len(p3c)):
|
||||
nmaxcoefs = len(p3c)
|
||||
|
||||
#print("{:d}\t{:d}\t{}\t\t{}".format(I,J,nrm,p2c))
|
||||
|
||||
s = ""
|
||||
s = s + "{:d}\t{:d}\t".format(I,J)
|
||||
for K in range(0,len(p3c)):
|
||||
nn = p3c[K]
|
||||
if(abs(nn)<1E-14):
|
||||
nn = 0
|
||||
s = s + "{:1.8g}\t".format(nn)
|
||||
s = s + "\n"
|
||||
print(s)
|
||||
lns.append(s)
|
||||
|
||||
##C style coefficient output
|
||||
|
||||
fout = "c_legendrecoefs2.c"
|
||||
fp = open(fout,"w+")
|
||||
|
||||
|
||||
pref1 = "static const int amslegendre_ndegree = {:d};\n".format(NN)
|
||||
pref2 = "static const int amslegendre_maxporder = {:d};\n".format(nmaxcoefs-1)
|
||||
pref = pref1 + pref2 + "static const float amslegendrecoefs[] = { \n"
|
||||
|
||||
for I in range(0,NN+1):
|
||||
for J in range(0,I+1):
|
||||
ind = I*(I+1)/2+J
|
||||
for K in range(0,nmaxcoefs):
|
||||
if(K<len(coefs[ind])):
|
||||
nn = coefs[ind][K]
|
||||
if(abs(nn)<1E-14):
|
||||
nn = 0
|
||||
else:
|
||||
nn = 0
|
||||
|
||||
if(ind<len(coefs)-1):
|
||||
if(K<nmaxcoefs-1):
|
||||
pref = pref + "{:1.8g},".format(nn)
|
||||
else:
|
||||
pref = pref + "{:1.8g},\n".format(nn)
|
||||
else:
|
||||
if(K<nmaxcoefs-1):
|
||||
pref = pref + "{:1.8g},".format(nn)
|
||||
else:
|
||||
pref = pref + "{:1.8g}".format(nn) + "\n};\n\n"
|
||||
|
||||
fp.writelines(pref)
|
||||
fp.close()
|
96
scratch/legendre.sage.py
Normal file
96
scratch/legendre.sage.py
Normal file
@ -0,0 +1,96 @@
|
||||
|
||||
|
||||
# This file was *autogenerated* from the file ./legendre.sage
|
||||
from sage.all_cmdline import * # import sage library
|
||||
|
||||
_sage_const_2 = Integer(2); _sage_const_1 = Integer(1); _sage_const_0 = Integer(0); _sage_const_20 = Integer(20); _sage_const_1En14 = RealNumber('1E-14')#!/usr/bin/sage
|
||||
|
||||
# Schmidt Quasi-Normalized Legendre Functions for Spherical Harmonics
|
||||
|
||||
x = var('x');
|
||||
|
||||
def polypart(n,m):
|
||||
pol = (x**_sage_const_2 -_sage_const_1 )**n
|
||||
for I in range(_sage_const_1 ,n+_sage_const_1 ):
|
||||
pol = diff(pol,x)
|
||||
for I in range(_sage_const_1 ,m+_sage_const_1 ):
|
||||
pol = diff(pol,x)
|
||||
return pol
|
||||
|
||||
def normpart(n,m):
|
||||
if(m==_sage_const_0 ):
|
||||
nrm = _sage_const_1 /_sage_const_2 **n/factorial(n)
|
||||
else:
|
||||
nrm = (_sage_const_1 /_sage_const_2 **n/factorial(n)) * sqrt(_sage_const_2 *factorial(n-m)/factorial(n+m))
|
||||
return nrm
|
||||
|
||||
NN = _sage_const_20
|
||||
|
||||
|
||||
lns = []
|
||||
coefs = []
|
||||
nmaxcoefs = _sage_const_0
|
||||
for I in range(_sage_const_0 ,NN+_sage_const_1 ):
|
||||
for J in range(_sage_const_0 ,I+_sage_const_1 ):
|
||||
pol = polypart(I,J)
|
||||
nrm = normpart(I,J)
|
||||
pol2 = expand(pol)
|
||||
p2c = pol2.coefficients(sparse=False)
|
||||
|
||||
pol3 = nrm*pol2
|
||||
p3c = pol3.coefficients(sparse=False)
|
||||
for K in range(_sage_const_0 ,len(p3c)):
|
||||
p3c[K] = p3c[K].n()
|
||||
|
||||
coefs.append(p3c)
|
||||
if(nmaxcoefs<len(p3c)):
|
||||
nmaxcoefs = len(p3c)
|
||||
|
||||
#print("{:d}\t{:d}\t{}\t\t{}".format(I,J,nrm,p2c))
|
||||
|
||||
s = ""
|
||||
s = s + "{:d}\t{:d}\t".format(I,J)
|
||||
for K in range(_sage_const_0 ,len(p3c)):
|
||||
nn = p3c[K]
|
||||
if(abs(nn)<_sage_const_1En14 ):
|
||||
nn = _sage_const_0
|
||||
s = s + "{:1.8g}\t".format(nn)
|
||||
s = s + "\n"
|
||||
print(s)
|
||||
lns.append(s)
|
||||
|
||||
##C style coefficient output
|
||||
|
||||
fout = "c_legendrecoefs.c"
|
||||
fp = open(fout,"w+")
|
||||
|
||||
|
||||
pref1 = "static const int amslegendre_ndegree = {:d};\n".format(NN)
|
||||
pref2 = "static const int amslegendre_maxporder = {:d};\n".format(nmaxcoefs-_sage_const_1 )
|
||||
pref = pref1 + pref2 + "static const float amslegendrecoefs[] = { \n"
|
||||
|
||||
for I in range(_sage_const_0 ,NN+_sage_const_1 ):
|
||||
for J in range(_sage_const_0 ,I+_sage_const_1 ):
|
||||
ind = I*(I+_sage_const_1 )/_sage_const_2 +J
|
||||
for K in range(_sage_const_0 ,nmaxcoefs):
|
||||
if(K<len(coefs[ind])):
|
||||
nn = coefs[ind][K]
|
||||
if(abs(nn)<_sage_const_1En14 ):
|
||||
nn = _sage_const_0
|
||||
else:
|
||||
nn = _sage_const_0
|
||||
|
||||
if(ind<len(coefs)-_sage_const_1 ):
|
||||
if(K<nmaxcoefs-_sage_const_1 ):
|
||||
pref = pref + "{:1.8g},".format(nn)
|
||||
else:
|
||||
pref = pref + "{:1.8g},\n".format(nn)
|
||||
else:
|
||||
if(K<nmaxcoefs-_sage_const_1 ):
|
||||
pref = pref + "{:1.8g},".format(nn)
|
||||
else:
|
||||
pref = pref + "{:1.8g}".format(nn) + "\n};\n\n"
|
||||
|
||||
fp.writelines(pref)
|
||||
fp.close()
|
||||
|
0
scratch/legendre_equations.tex
Normal file
0
scratch/legendre_equations.tex
Normal file
0
scratch/new file
Normal file
0
scratch/new file
Normal file
BIN
scratch/testcl
Normal file
BIN
scratch/testcl
Normal file
Binary file not shown.
5
scratch/testcl.sh
Normal file
5
scratch/testcl.sh
Normal file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
gcc c_legendrefn.c -o testcl -lm
|
||||
|
||||
./testcl
|
210
test_ams_pythonigrf.py
Normal file
210
test_ams_pythonigrf.py
Normal file
@ -0,0 +1,210 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import os,sys,math
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from amspyigrf13 import *
|
||||
|
||||
pi = np.pi
|
||||
|
||||
def test_loading_igrfdata():
|
||||
q = load_igrfdata()
|
||||
print(q)
|
||||
|
||||
def test_getcomponents():
|
||||
|
||||
igrfdata = load_igrfdata()
|
||||
yrs = np.linspace(1895,2035,1000)
|
||||
q = []
|
||||
for I in range(0,len(yrs)):
|
||||
a = igrf_getcomponents(yrs[I],igrfdata)
|
||||
q.append(a)
|
||||
|
||||
q = np.array(q)
|
||||
|
||||
for I in range(0,q.shape[1]):
|
||||
plt.plot(yrs,q[:,I])
|
||||
|
||||
plt.show()
|
||||
|
||||
return
|
||||
|
||||
def test_gsosph_normalization(n1,m1,n2,m2):
|
||||
|
||||
Ntheta = 50
|
||||
Nphi = 100
|
||||
|
||||
sum1 = 0.0
|
||||
sum2 = 0.0
|
||||
sum3 = 0.0
|
||||
|
||||
for I in range(0,Ntheta):
|
||||
for J in range(0,Nphi):
|
||||
theta = I/Ntheta*pi
|
||||
phi = J/Nphi*2*pi
|
||||
dtheta = pi/Ntheta
|
||||
dphi = 2*pi/Nphi
|
||||
dA = np.sin(theta)*dtheta*dphi
|
||||
|
||||
sum1 = sum1 + gso_cosharmonic(theta,phi,n1,m1)*gso_cosharmonic(theta,phi,n2,m2)*dA
|
||||
sum2 = sum2 + gso_sinharmonic(theta,phi,n1,m1)*gso_sinharmonic(theta,phi,n2,m2)*dA
|
||||
sum3 = sum3 + gso_cosharmonic(theta,phi,n1,m1)*gso_sinharmonic(theta,phi,n2,m2)*dA
|
||||
|
||||
return [sum1,sum2,sum3]
|
||||
|
||||
def test_norm2():
|
||||
|
||||
for I in range(0,5):
|
||||
for J in range(0,5):
|
||||
[a,b,c] = test_gsosph_normalization(I,J,I,J)
|
||||
a2 = a*(2*I+1)/(4*pi)
|
||||
b2 = b*(2*I+1)/(4*pi)
|
||||
c2 = c*(2*I+1)/(4*pi)
|
||||
print("{} {}: {} {} {}".format(I,J,a2,b2,c2))
|
||||
#print("{} {}".format(I,J))
|
||||
|
||||
return
|
||||
|
||||
def test_igrf_potential():
|
||||
|
||||
coefstruct = load_igrfdata()
|
||||
coefstruct = igrf_getcompstruct(2024,coefstruct)
|
||||
|
||||
xyz = [6371,0,0]
|
||||
V1 = igrf_potential(xyz,coefstruct)
|
||||
B1 = igrf_bfield(xyz,coefstruct)
|
||||
print("Potential at {} = {} [nT-km], B = {} [nT]".format(xyz,V1,B1))
|
||||
|
||||
xyz = [-6371,0,0]
|
||||
V1 = igrf_potential(xyz,coefstruct)
|
||||
B1 = igrf_bfield(xyz,coefstruct)
|
||||
print("Potential at {} = {} [nT-km], B = {} [nT]".format(xyz,V1,B1))
|
||||
|
||||
xyz = [6371+100,0,0]
|
||||
V1 = igrf_potential(xyz,coefstruct)
|
||||
B1 = igrf_bfield(xyz,coefstruct)
|
||||
print("Potential at {} = {} [nT-km], B = {} [nT]".format(xyz,V1,B1))
|
||||
|
||||
xyz = [0,0,-6371]
|
||||
V1 = igrf_potential(xyz,coefstruct)
|
||||
B1 = igrf_bfield(xyz,coefstruct)
|
||||
print("Potential at {} = {} [nT-km], B = {} [nT]".format(xyz,V1,B1))
|
||||
|
||||
xyz = [0,0,6371]
|
||||
V1 = igrf_potential(xyz,coefstruct)
|
||||
B1 = igrf_bfield(xyz,coefstruct)
|
||||
print("Potential at {} = {} [nT-km], B = {} [nT]".format(xyz,V1,B1))
|
||||
|
||||
return
|
||||
|
||||
def mycontourf(x,y,s,N=100):
|
||||
|
||||
s = np.copy(s)
|
||||
s[np.isinf(s)] = 0
|
||||
s[np.isnan(s)] = 0
|
||||
|
||||
# s[s<smin] = smin
|
||||
# s[s>smax] = smax
|
||||
smin = np.min(s)
|
||||
smax = np.max(s)
|
||||
if(np.abs(smax-smin)<1E-15):
|
||||
smax = smin + 1
|
||||
s[1,0] = smax
|
||||
lvls = np.linspace(smin,smax,N)
|
||||
|
||||
plt.contourf(x,y,s,cmap="jet",levels=lvls)
|
||||
plt.colorbar()
|
||||
|
||||
return
|
||||
|
||||
def getuvw(xyz):
|
||||
|
||||
|
||||
|
||||
return [u,v,w]
|
||||
|
||||
|
||||
def test_igrf_plotsurfaceB():
|
||||
|
||||
coefstruct = load_igrfdata()
|
||||
coefstruct = igrf_getcompstruct(2020,coefstruct)
|
||||
|
||||
Nlats = 25
|
||||
Nlons = 50
|
||||
lats = np.linspace(-pi/2,pi/2,Nlats)
|
||||
lons = np.linspace(-pi,pi,Nlons)
|
||||
[lons2,lats2] = np.meshgrid(lons,lats)
|
||||
lons2 = lons2.transpose(); lats2=lats2.transpose()
|
||||
lons2 = np.array(lons2,order="F")
|
||||
lats2 = np.array(lats2,order="F")
|
||||
lons3 = np.reshape(lons2,[Nlons*Nlats],order="F")
|
||||
lats3 = np.reshape(lats2,[Nlons*Nlats],order="F")
|
||||
|
||||
|
||||
Re = 6378
|
||||
|
||||
x = np.cos(lats3)*np.cos(lons3)*Re
|
||||
y = np.cos(lats3)*np.sin(lons3)*Re
|
||||
z = np.sin(lats3)*Re
|
||||
# xyz = np.zeros([3,Nlons*Nlats],order="F")
|
||||
# xyz[0,:] = x
|
||||
# xyz[1,:] = y
|
||||
# xyz[2,:] = z
|
||||
xyz = np.stack([x,y,z],axis=0)
|
||||
|
||||
B = igrf_bfield(xyz,coefstruct)
|
||||
[lonlatalt,Buvw] = grs80_xyzvectors_to_uvw(xyz,B)
|
||||
|
||||
print(Buvw.shape)
|
||||
Bmag = np.squeeze(np.sqrt(np.sum(B**2,axis=0)))
|
||||
|
||||
lats2 = lats2*180/pi
|
||||
lons2 = lons2*180/pi
|
||||
Bmag2 = np.reshape(Bmag,[Nlons,Nlats],order="F")
|
||||
|
||||
fig = plt.figure(1)
|
||||
mycontourf(lons2,lats2,Bmag2)
|
||||
ax = plt.gca()
|
||||
ax.set_aspect("equal")
|
||||
plt.title("IGRF-13 Surface B magnitude [nT]")
|
||||
plt.xlabel("Longitude [deg]")
|
||||
plt.ylabel("Latitude [deg]")
|
||||
|
||||
|
||||
# fig = plt.figure(2).add_subplot(projection="3d")
|
||||
# sc = 1/60
|
||||
# plt.quiver(xyz[0,:],xyz[1,:],xyz[2,:],B[0,:]*sc,B[1,:]*sc,B[2,:]*sc,color=[0,0,0])
|
||||
# ax = plt.gca()
|
||||
# ax.set_aspect("equal")
|
||||
|
||||
print(np.max(lonlatalt[0,:]),np.min(lonlatalt[0,:]))
|
||||
print(np.max(lonlatalt[1,:]),np.min(lonlatalt[1,:]))
|
||||
print(np.max(lonlatalt[2,:]),np.min(lonlatalt[2,:]))
|
||||
|
||||
|
||||
|
||||
fig = plt.figure(2)
|
||||
sc = 1/60
|
||||
plt.quiver(lonlatalt[0,:],lonlatalt[1,:],Buvw[0,:]*sc,Buvw[1,:]*sc,color=[0,0,0])
|
||||
ax = plt.gca()
|
||||
ax.set_aspect("equal")
|
||||
plt.title("IGRF-13 Surface B Heading")
|
||||
plt.xlabel("Longitude [deg]")
|
||||
plt.ylabel("Latitude [deg]")
|
||||
|
||||
plt.show()
|
||||
|
||||
return
|
||||
|
||||
|
||||
if(__name__=="__main__"):
|
||||
|
||||
#test_loading_igrfdata()
|
||||
#test_getcomponents()
|
||||
#test_norm2()
|
||||
#test_igrf_potential()
|
||||
test_igrf_plotsurfaceB()
|
||||
|
||||
|
||||
pass
|
Reference in New Issue
Block a user