Ejemplo n.º 1
0
    def coefficients_from_boxes(self,
                                discr,
                                inner_bbox,
                                outer_bbox=None,
                                magnitude=None,
                                tau_magnitude=None,
                                exponent=None,
                                dtype=None):
        if outer_bbox is None:
            outer_bbox = discr.mesh.bounding_box()

        if exponent is None:
            exponent = 2

        if magnitude is None:
            magnitude = 20

        if tau_magnitude is None:
            tau_magnitude = 0.4

        # scale by free space conductivity
        from math import sqrt
        magnitude = magnitude * sqrt(self.epsilon / self.mu)
        tau_magnitude = tau_magnitude * sqrt(self.epsilon / self.mu)

        i_min, i_max = inner_bbox
        o_min, o_max = outer_bbox

        from grudge.tools import make_obj_array

        nodes = discr.nodes
        if dtype is not None:
            nodes = nodes.astype(dtype)

        sigma, sigma_prime, tau = list(
            zip(*[
                self._construct_scalar_coefficients(
                    discr, nodes[:, i], i_min[i], i_max[i], o_min[i], o_max[i],
                    exponent) for i in range(discr.dimensions)
            ]))

        def conv(f):
            return discr.convert_volume(f,
                                        kind=discr.compute_kind,
                                        dtype=discr.default_scalar_type)

        return self.PMLCoefficients(
            sigma=conv(magnitude * make_obj_array(sigma)),
            sigma_prime=conv(magnitude * make_obj_array(sigma_prime)),
            tau=conv(tau_magnitude * make_obj_array(tau)))
Ejemplo n.º 2
0
        def volume_interpolant(self, t, discr):
            from grudge.tools import make_obj_array

            result = discr.volume_zeros(kind="numpy", dtype=np.float64)

            omega = 6*c
            if omega*t > 2*pi:
                return make_obj_array([result, result, result])

            x = make_obj_array(discr.nodes.T)
            r = np.sqrt(np.dot(x, x))

            idx = r<0.3
            result[idx] = (1+np.cos(pi*r/0.3))[idx] \
                    *np.sin(omega*t)**3

            result = discr.convert_volume(result, kind=discr.compute_kind,
                    dtype=discr.default_scalar_type)
            return make_obj_array([-result, result, result])
Ejemplo n.º 3
0
    def initial_val(discr):
        # the initial solution for the TE_10-like mode
        def initial_Hz(x, el):
            from math import cos, sin
            if el in material_elements["vacuum"]:
                return h * cos(h * x[0])
            else:
                return -l * sin(h * d) / sin(l * (a - d)) * cos(l * (a - x[0]))

        from grudge.tools import make_obj_array
        result_zero = discr.volume_zeros(kind="numpy", dtype=numpy.float64)
        H_z = make_tdep_given(initial_Hz).volume_interpolant(0, discr)
        return make_obj_array([result_zero, result_zero, H_z])
Ejemplo n.º 4
0
    def __call__(self, t, x_vec):
        ones = numpy.ones_like(x_vec[0])
        rho_field = ones*self.rho

        if self.gaussian_pulse_at is not None:
            rel_to_pulse = [x_vec[i] - self.gaussian_pulse_at[i]
                    for i in range(len(x_vec))]
            rho_field +=  self.pulse_magnitude * self.rho * numpy.exp(
                - sum(rtp_i**2 for rtp_i in rel_to_pulse)/2)

        direction = self.direction_vector(x_vec.shape[0])

        from grudge.tools import make_obj_array
        u_field = make_obj_array([ones*self.velocity*dir_i
            for dir_i in direction])

        from grudge.tools import join_fields
        return join_fields(rho_field, self.e*ones, self.rho*u_field)
Ejemplo n.º 5
0
 def volume_interpolant(self, t, discr):
     from grudge.tools import make_obj_array
     return make_obj_array([
         self.vol_0, self.vol_0,
         sph_dipole.source_modulation(t) * self.num_sf
     ])