Files
amspyigrf13/test_ams_pythonigrf.py
2025-07-18 11:25:48 -04:00

210 lines
5.0 KiB
Python

#!/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