def condition_array_xyz(thetav, phiv, order=13): mv,lv=newleg.degrees(order, start=1) leg,dleg=newleg.legendre(scipy.cos(thetav), order) cossin = numpy.zeros((len(phiv),order*(order+2))) cossin[:, mv >= 0] = numpy.cos(phiv[:, numpy.newaxis] @ abs(mv[numpy.newaxis, :]))[:, mv >= 0] cossin[:, mv < 0] = numpy.sin(phiv[:, numpy.newaxis] @ abs(mv[numpy.newaxis, :]))[:, mv < 0] sinmcos=numpy.zeros((len(phiv),order*(order+2))) sinmcos[:, mv >= 0] = numpy.sin(phiv[:, numpy.newaxis] @ abs(mv[numpy.newaxis, :]))[:, mv >= 0] sinmcos[:, mv < 0] = -numpy.cos(phiv[:, numpy.newaxis] @ abs(mv[numpy.newaxis, :]))[:, mv < 0] costhetav = numpy.cos(thetav) sinthetav = numpy.sin(thetav) Ax = cossin.transpose() * dleg * (-sinthetav) Ay = abs(mv[:, numpy.newaxis]) * leg * sinmcos.transpose() / sinthetav Az = -(lv + 1)[:, numpy.newaxis] * leg * cossin.transpose() return Ax, Ay, Az
def xyzfieldv2(gcoefs, phi, theta, rparam=1.0, order=13, regular=False): mv, lv = newleg.degrees(order, start=1) legv, dlegv = newleg.legendre(scipy.cos(theta), order) x = numpy.zeros_like(theta) y = x.copy() z = x.copy() for m, l, g, leg, dleg in zip(mv, lv, gcoefs, legv, dlegv): rparamexp = rparam ** (l + 2) m_abs = abs(m) cossin = scipy.cos(m_abs * phi) if m >= 0 else scipy.sin(m_abs * phi) sinmcos = scipy.sin(m_abs * phi) if m >= 0 else -scipy.cos(m_abs * phi) x += rparamexp * (g * cossin) * dleg * (-scipy.sin(theta)) y += rparamexp * (g * sinmcos) * m_abs * leg / (scipy.sin(theta)) z -= rparamexp * (l + 1) * (g * cossin) * leg return x, y, z