def _eval_masked(self, mask, time, location, input_coordinate_system, output_coordinate_system, **options): lat_ngp, lon_ngp = self.north_pole scale = options.pop('scale', None) result = full(location.shape, nan) if ndim(time): eval_model = self._eval_multi_time time = time[mask] else: eval_model = self._eval_single_time location = location[mask] location_dipole = convert_to_dipole(location, lat_ngp, lon_ngp, input_coordinate_system) result[mask] = rotate_vectors_from_dipole( eval_model(time, location_dipole, GEOCENTRIC_SPHERICAL, GEOCENTRIC_SPHERICAL, **options), lat_ngp, lon_ngp, location_dipole, location, input_coordinate_system, output_coordinate_system) if scale is not None: result[mask] *= scale return result
def reference_vrot_from_dipole(cls, vectors, coords, latitude, longitude): coords = asarray(coords) rotation_matrix = get_dipole_rotation_matrix(latitude, longitude) coords_dipole = convert_to_dipole(coords, latitude, longitude) lat_dipole = coords_dipole[..., 0] lon_dipole = coords_dipole[..., 1] vectors = vrot_sph2cart(vectors, lat_dipole, lon_dipole) vectors = dot(vectors, rotation_matrix.transpose()) if cls.target_coords_type != GEOCENTRIC_CARTESIAN: coords_out = convert(coords, GEOCENTRIC_SPHERICAL, cls.target_coords_type) lat_out = coords_out[..., 0] lon_out = coords_out[..., 1] vectors = vrot_cart2sph(vectors, lat_out, lon_out) return vectors
def eval_vrot_from_dipole(cls, vectors, coords, latitude, longitude): coords = asarray(coords) coords_dipole = convert_to_dipole(coords, latitude, longitude) lat_dipole = coords_dipole[..., 0] lon_dipole = coords_dipole[..., 1] if cls.target_coords_type != GEOCENTRIC_CARTESIAN: coords_out = convert(coords, GEOCENTRIC_SPHERICAL, cls.target_coords_type) lat_out = coords_out[..., 0] lon_out = coords_out[..., 1] else: lat_out, lon_out = None, None return vrot_from_dipole(vectors, latitude, longitude, lat_dipole, lon_dipole, lat_out, lon_out, cls.target_coords_type)
def reference_sheval(cls, coords): coords_dipole = convert_to_dipole(coords, cls.lat_ngp, cls.lon_ngp, cls.source_coordinate_system) potential = empty(coords_dipole.shape[:-1]) gradient = empty(coords_dipole.shape) iterator = nditer( [ potential, gradient[..., 0], gradient[..., 1], gradient[..., 2], coords_dipole[..., 0], coords_dipole[..., 1], coords_dipole[..., 2], ], op_flags=[ ['writeonly'], ['writeonly'], ['writeonly'], ['writeonly'], ['readonly'], ['readonly'], ['readonly'], ], ) for pot, grd_n, grd_e, grd_r, lat, lon, rad in iterator: pot[...], grd_n[...], grd_e[...], grd_r[...] = ( cls._spherical_harmonics(lat, lon, rad)) gradient = cls._rotate_gradient(gradient, coords_dipole, coords) potential *= cls.scale_potential for idx, scale in enumerate(cls.scale_gradient): gradient[..., idx] *= scale return potential, gradient
def eval_convert_to_dipole(coords, latitude, longitude): # to avoid pole longitude ambiguity compare Cartesian coordinates return convert(convert_to_dipole(coords, latitude, longitude), GEOCENTRIC_SPHERICAL, GEOCENTRIC_CARTESIAN)
def ref_mjd2000_to_magnetic_universal_time(cls, time, lat_ngp, lon_ngp): lat_sol, lon_sol = cls.sunpos(time) _, subsol_dip_lon, _ = convert_to_dipole( [lat_sol, lon_sol, 1.0], lat_ngp, lon_ngp ) return (180.0 - subsol_dip_lon) / 15.0