Exemple #1
0
    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
Exemple #2
0
 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
Exemple #3
0
    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)
Exemple #4
0
    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
Exemple #5
0
 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)
Exemple #6
0
 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