def drift(lat, lon, gcomps, order=10): theta = numpy.deg2rad(90 - lat) phi = numpy.deg2rad(lon) declinations = numpy.empty_like(data.years) inclinations = numpy.empty_like(data.years) for i, y in enumerate(data.years): dec, inc, f, h = xyzfield.xyz2difh(*xyzfield.xyzfieldv2(gcomps[i, :], phi, theta, order)) declinations[i] = dec inclinations[i] = inc intensities[i] = f return declinations, inclinations, intensities
def invert_dif(thetav, phiv, data, order=13, g0=-30000, steps=5): g=numpy.zeros(order*(order+2)); g[0]=g0 Ax,Ay,Az = condition_array_xyz(thetav,phiv,order) dec0, inc0, int0 = data dec0_f = dec0[~numpy.isnan(dec0)] inc0_f = inc0[~numpy.isnan(inc0)] int0_f = int0[~numpy.isnan(int0)] dif0=numpy.concatenate((dec0_f,inc0_f,int0_f)) dif=dif0.copy() for iteration in range(steps): x,y,z=xyzfield.xyzfieldv2(g,phiv,thetav, rparam=1.0, order=order) #pyplot.show(xyzfield.xyzcontour(thetav,phiv,x,y,z,regular=False)) dec,inc,intensity,horizontal=xyzfield.xyz2difh(x,y,z) Ad, Ai, Af = condition_array_dif(x,y,z,intensity,horizontal, Ax, Ay, Az, order) #remove emptys Ad=Ad[:,~numpy.isnan(dec0)] Ai=Ai[:,~numpy.isnan(inc0)] Af=Af[:,~numpy.isnan(int0)] dec=dec[~numpy.isnan(dec0)] inc=inc[~numpy.isnan(inc0)] intensity=intensity[~numpy.isnan(int0)] Adif=numpy.concatenate((Ad,Ai,Af), axis=1) dif = numpy.concatenate((dec,inc,intensity)) #get delta delta=dif0-dif #g = numpy.linalg.inv(Adif @ Adif.transpose()) @ Adif @ dif0 g = g + numpy.linalg.inv(Adif @ Adif.transpose()) @ Adif @ delta #print(g[:5], sum(abs(delta))) if (sum(abs(delta)) > 1000): warnings.warn("inversion might not have converged (╯°□°)╯︵ ┻━┻") return g