def op_template(self): from hedge.optemplate import ( Field, BoundaryPair, get_flux_operator, make_stiffness_t, InverseMassOperator, BoundarizeOperator, QuadratureGridUpsampler, QuadratureInteriorFacesGridUpsampler) u = Field("u") to_quad = QuadratureGridUpsampler("quad") to_int_face_quad = QuadratureInteriorFacesGridUpsampler("quad") # boundary conditions ------------------------------------------------- bc_in = Field("bc_in") bc_out = BoundarizeOperator(self.outflow_tag)*u stiff_t = make_stiffness_t(self.dimensions) m_inv = InverseMassOperator() flux_op = get_flux_operator(self.flux()) return m_inv(numpy.dot(self.v, stiff_t*u) - ( flux_op(u) + flux_op(BoundaryPair(u, bc_in, self.inflow_tag)) + flux_op(BoundaryPair(u, bc_out, self.outflow_tag)) ))
def op_template(self): from hedge.optemplate import (Field, BoundaryPair, get_flux_operator, make_stiffness_t, InverseMassOperator, BoundarizeOperator, QuadratureGridUpsampler, QuadratureInteriorFacesGridUpsampler) u = Field("u") to_quad = QuadratureGridUpsampler("quad") to_int_face_quad = QuadratureInteriorFacesGridUpsampler("quad") # boundary conditions ------------------------------------------------- bc_in = Field("bc_in") bc_out = BoundarizeOperator(self.outflow_tag) * u stiff_t = make_stiffness_t(self.dimensions) m_inv = InverseMassOperator() flux_op = get_flux_operator(self.flux()) return m_inv( numpy.dot(self.v, stiff_t * u) - (flux_op(u) + flux_op(BoundaryPair(u, bc_in, self.inflow_tag)) + flux_op(BoundaryPair(u, bc_out, self.outflow_tag))))
def _local_nabla(self): if self.strong_form: from hedge.optemplate import make_stiffness return make_stiffness(self.dimensions) else: from hedge.optemplate import make_stiffness_t return make_stiffness_t(self.dimensions)
def local_derivatives(self, w=None): """Template for the volume terms of the time derivatives for U and V. dU/dt = V, and dV/dt = div P. Body forces not yet implemented""" u, v, F = self.split_grad_vars(w) dim = self.dimensions from hedge.optemplate import make_stiffness_t, make_vector_field from hedge.tools import join_fields P = self.material.stress(F, self.dimensions) stiffness = make_stiffness_t(dim) Dv = [0,]*3 for i in range(dim): for j in range(dim): Dv[i] = Dv[i] - stiffness[j](P[3*j+i]) # in conservation form: u_t + A u_x = 0 return join_fields( # time derivative of u is v v[0], v[1], v[2], # time derivative of v is div P Dv[0], Dv[1], Dv[2] )
def make_optemplate(): from hedge.optemplate.operators import QuadratureGridUpsampler from hedge.optemplate import Field, make_stiffness_t u = Field("u") qu = QuadratureGridUpsampler("quad")(u) return make_stiffness_t(2)[0](Field("intercept")(qu))
def get_advection_op(self, q, velocity): from hedge.optemplate import (BoundaryPair, get_flux_operator, make_stiffness_t, InverseMassOperator) stiff_t = make_stiffness_t(self.method.dimensions) flux_op = get_flux_operator(self.get_advection_flux(velocity)) return InverseMassOperator()(np.dot(velocity, stiff_t * q) - flux_op(q))
def get_advection_op(self, q, velocity): from hedge.optemplate import ( BoundaryPair, get_flux_operator, make_stiffness_t, InverseMassOperator) stiff_t = make_stiffness_t(self.method.dimensions) flux_op = get_flux_operator(self.get_advection_flux(velocity)) return InverseMassOperator()( np.dot(velocity, stiff_t*q) - flux_op(q))
def op_template(self, with_sensor=False): # {{{ operator preliminaries ------------------------------------------ from hedge.optemplate import (Field, BoundaryPair, get_flux_operator, make_stiffness_t, InverseMassOperator, make_sym_vector, ElementwiseMaxOperator, BoundarizeOperator) from hedge.optemplate.primitives import make_common_subexpression as cse from hedge.optemplate.operators import ( QuadratureGridUpsampler, QuadratureInteriorFacesGridUpsampler) to_quad = QuadratureGridUpsampler("quad") to_if_quad = QuadratureInteriorFacesGridUpsampler("quad") from hedge.tools import join_fields, \ ptwise_dot u = Field("u") v = make_sym_vector("v", self.dimensions) c = ElementwiseMaxOperator()(ptwise_dot(1, 1, v, v)) quad_u = cse(to_quad(u)) quad_v = cse(to_quad(v)) w = join_fields(u, v, c) quad_face_w = to_if_quad(w) # }}} # {{{ boundary conditions --------------------------------------------- from hedge.mesh import TAG_ALL bc_c = to_quad(BoundarizeOperator(TAG_ALL)(c)) bc_u = to_quad(Field("bc_u")) bc_v = to_quad(BoundarizeOperator(TAG_ALL)(v)) if self.bc_u_f is "None": bc_w = join_fields(0, bc_v, bc_c) else: bc_w = join_fields(bc_u, bc_v, bc_c) minv_st = make_stiffness_t(self.dimensions) m_inv = InverseMassOperator() flux_op = get_flux_operator(self.flux()) # }}} # {{{ diffusion ------------------------------------------------------- if with_sensor or ( self.diffusion_coeff is not None and self.diffusion_coeff != 0): if self.diffusion_coeff is None: diffusion_coeff = 0 else: diffusion_coeff = self.diffusion_coeff if with_sensor: diffusion_coeff += Field("sensor") from hedge.second_order import SecondDerivativeTarget # strong_form here allows IPDG to reuse the value of grad u. grad_tgt = SecondDerivativeTarget( self.dimensions, strong_form=True, operand=u) self.diffusion_scheme.grad(grad_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) div_tgt = SecondDerivativeTarget( self.dimensions, strong_form=False, operand=diffusion_coeff*grad_tgt.minv_all) self.diffusion_scheme.div(div_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) diffusion_part = div_tgt.minv_all else: diffusion_part = 0 # }}} to_quad = QuadratureGridUpsampler("quad") quad_u = cse(to_quad(u)) quad_v = cse(to_quad(v)) return m_inv(numpy.dot(minv_st, cse(quad_v*quad_u)) - (flux_op(quad_face_w) + flux_op(BoundaryPair(quad_face_w, bc_w, TAG_ALL)))) \ + diffusion_part
def op_template(self, with_sensor=False): # {{{ operator preliminaries ------------------------------------------ from hedge.optemplate import (Field, BoundaryPair, get_flux_operator, make_stiffness_t, InverseMassOperator, make_sym_vector, ElementwiseMaxOperator, BoundarizeOperator) from hedge.optemplate.primitives import make_common_subexpression as cse from hedge.optemplate.operators import ( QuadratureGridUpsampler, QuadratureInteriorFacesGridUpsampler) to_quad = QuadratureGridUpsampler("quad") to_if_quad = QuadratureInteriorFacesGridUpsampler("quad") from hedge.tools import join_fields, \ ptwise_dot u = Field("u") v = make_sym_vector("v", self.dimensions) c = ElementwiseMaxOperator()(ptwise_dot(1, 1, v, v)) quad_u = cse(to_quad(u)) quad_v = cse(to_quad(v)) w = join_fields(u, v, c) quad_face_w = to_if_quad(w) # }}} # {{{ boundary conditions --------------------------------------------- from hedge.mesh import TAG_ALL bc_c = to_quad(BoundarizeOperator(TAG_ALL)(c)) bc_u = to_quad(Field("bc_u")) bc_v = to_quad(BoundarizeOperator(TAG_ALL)(v)) if self.bc_u_f is "None": bc_w = join_fields(0, bc_v, bc_c) else: bc_w = join_fields(bc_u, bc_v, bc_c) minv_st = make_stiffness_t(self.dimensions) m_inv = InverseMassOperator() flux_op = get_flux_operator(self.flux()) # }}} # {{{ diffusion ------------------------------------------------------- if with_sensor or (self.diffusion_coeff is not None and self.diffusion_coeff != 0): if self.diffusion_coeff is None: diffusion_coeff = 0 else: diffusion_coeff = self.diffusion_coeff if with_sensor: diffusion_coeff += Field("sensor") from hedge.second_order import SecondDerivativeTarget # strong_form here allows IPDG to reuse the value of grad u. grad_tgt = SecondDerivativeTarget(self.dimensions, strong_form=True, operand=u) self.diffusion_scheme.grad(grad_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) div_tgt = SecondDerivativeTarget(self.dimensions, strong_form=False, operand=diffusion_coeff * grad_tgt.minv_all) self.diffusion_scheme.div(div_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) diffusion_part = div_tgt.minv_all else: diffusion_part = 0 # }}} to_quad = QuadratureGridUpsampler("quad") quad_u = cse(to_quad(u)) quad_v = cse(to_quad(v)) return m_inv(numpy.dot(minv_st, cse(quad_v*quad_u)) - (flux_op(quad_face_w) + flux_op(BoundaryPair(quad_face_w, bc_w, TAG_ALL)))) \ + diffusion_part
def op_template(self, with_sensor): from hedge.optemplate import ( Field, make_stiffness_t, make_nabla, InverseMassOperator, ElementwiseMaxOperator, get_flux_operator) from hedge.optemplate.operators import ( QuadratureGridUpsampler, QuadratureInteriorFacesGridUpsampler) to_quad = QuadratureGridUpsampler("quad") to_if_quad = QuadratureInteriorFacesGridUpsampler("quad") u = Field("u") u0 = Field("u0") # boundary conditions ------------------------------------------------- minv_st = make_stiffness_t(self.dimensions) nabla = make_nabla(self.dimensions) m_inv = InverseMassOperator() def flux(u): return u**2/2 #return u0*u emax_u = self.characteristic_velocity_optemplate(u) from hedge.flux.tools import make_lax_friedrichs_flux from pytools.obj_array import make_obj_array num_flux = make_lax_friedrichs_flux( #u0, to_if_quad(emax_u), make_obj_array([to_if_quad(u)]), [make_obj_array([flux(to_if_quad(u))])], [], strong=False)[0] from hedge.second_order import SecondDerivativeTarget if self.viscosity is not None or with_sensor: viscosity_coeff = 0 if with_sensor: viscosity_coeff += Field("sensor") if isinstance(self.viscosity, float): viscosity_coeff += self.viscosity elif self.viscosity is None: pass else: raise TypeError("unsupported type of viscosity coefficient") # strong_form here allows IPDG to reuse the value of grad u. grad_tgt = SecondDerivativeTarget( self.dimensions, strong_form=True, operand=u) self.viscosity_scheme.grad(grad_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) div_tgt = SecondDerivativeTarget( self.dimensions, strong_form=False, operand=viscosity_coeff*grad_tgt.minv_all) self.viscosity_scheme.div(div_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) viscosity_bit = div_tgt.minv_all else: viscosity_bit = 0 return m_inv((minv_st[0](flux(to_quad(u)))) - num_flux) \ + viscosity_bit
def op_template(self, with_sensor): from hedge.optemplate import (Field, make_stiffness_t, make_nabla, InverseMassOperator, ElementwiseMaxOperator, get_flux_operator) from hedge.optemplate.operators import ( QuadratureGridUpsampler, QuadratureInteriorFacesGridUpsampler) to_quad = QuadratureGridUpsampler("quad") to_if_quad = QuadratureInteriorFacesGridUpsampler("quad") u = Field("u") u0 = Field("u0") # boundary conditions ------------------------------------------------- minv_st = make_stiffness_t(self.dimensions) nabla = make_nabla(self.dimensions) m_inv = InverseMassOperator() def flux(u): return u**2 / 2 #return u0*u emax_u = self.characteristic_velocity_optemplate(u) from hedge.flux.tools import make_lax_friedrichs_flux from pytools.obj_array import make_obj_array num_flux = make_lax_friedrichs_flux( #u0, to_if_quad(emax_u), make_obj_array([to_if_quad(u)]), [make_obj_array([flux(to_if_quad(u))])], [], strong=False)[0] from hedge.second_order import SecondDerivativeTarget if self.viscosity is not None or with_sensor: viscosity_coeff = 0 if with_sensor: viscosity_coeff += Field("sensor") if isinstance(self.viscosity, float): viscosity_coeff += self.viscosity elif self.viscosity is None: pass else: raise TypeError("unsupported type of viscosity coefficient") # strong_form here allows IPDG to reuse the value of grad u. grad_tgt = SecondDerivativeTarget(self.dimensions, strong_form=True, operand=u) self.viscosity_scheme.grad(grad_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) div_tgt = SecondDerivativeTarget(self.dimensions, strong_form=False, operand=viscosity_coeff * grad_tgt.minv_all) self.viscosity_scheme.div(div_tgt, bc_getter=None, dirichlet_tags=[], neumann_tags=[]) viscosity_bit = div_tgt.minv_all else: viscosity_bit = 0 return m_inv((minv_st[0](flux(to_quad(u)))) - num_flux) \ + viscosity_bit