22 params.
addClassDescription(
"First order Robin-style Absorbing/Port BC for vector variables.");
23 params.
addParam<FunctionName>(
"beta", 1.0,
"Scalar wave number.");
26 "component", component,
"Variable field component (real or imaginary).");
28 params.
addParam<FunctionName>(
"real_incoming", 0.0,
"Real incoming field vector.");
29 params.
addParam<FunctionName>(
"imag_incoming", 0.0,
"Imaginary incoming field vector.");
31 params.
addParam<
MooseEnum>(
"mode", mode,
"Mode of operation for VectorEMRobinBC.");
38 _beta(getFunction(
"beta")),
40 _component(getParam<
MooseEnum>(
"component")),
42 _coupled_val(coupledVectorValue(
"coupled_field")),
43 _coupled_var_num(coupled(
"coupled_field")),
45 _inc_real(getFunction(
"real_incoming")),
46 _inc_imag(getFunction(
"imag_incoming")),
50 _real_incoming_was_set(parameters.isParamSetByUser(
"real_incoming")),
51 _imag_incoming_was_set(parameters.isParamSetByUser(
"imag_incoming"))
58 ", mode was set to Absorbing, while an incoming profile function (used for Port BCs) was "
59 "defined. Either remove the profile function parameters, or set your BC to Port mode!");
67 std::complex<double> field_0(0, 0);
68 std::complex<double> field_1(0, 0);
69 std::complex<double> field_2(0, 0);
74 field_0.real(
_u[
_qp](0));
77 field_1.real(
_u[
_qp](1));
80 field_2.real(
_u[
_qp](2));
86 field_0.imag(
_u[
_qp](0));
89 field_1.imag(
_u[
_qp](1));
92 field_2.imag(
_u[
_qp](2));
94 VectorValue<std::complex<double>> field(field_0, field_1, field_2);
97 VectorValue<std::complex<double>> field_inc(std::complex<double>(0.0, 0.0),
98 std::complex<double>(0.0, 0.0),
99 std::complex<double>(0.0, 0.0));
100 VectorValue<std::complex<double>> curl_inc(std::complex<double>(0.0, 0.0),
101 std::complex<double>(0.0, 0.0),
102 std::complex<double>(0.0, 0.0));
117 std::complex<double> field_inc_0(inc_real_value(0), inc_imag_value(0));
118 std::complex<double> field_inc_1(inc_real_value(1), inc_imag_value(1));
119 std::complex<double> field_inc_2(inc_real_value(2), inc_imag_value(2));
120 field_inc = VectorValue<std::complex<double>>(field_inc_0, field_inc_1, field_inc_2);
122 std::complex<double> curl_inc_0(inc_real_curl(0), inc_imag_curl(0));
123 std::complex<double> curl_inc_1(inc_real_curl(1), inc_imag_curl(1));
124 std::complex<double> curl_inc_2(inc_real_curl(2), inc_imag_curl(2));
125 curl_inc = VectorValue<std::complex<double>>(curl_inc_0, curl_inc_1, curl_inc_2);
130 "Wave number expected to be positive, calculated to be "
133 std::complex<double> u_inc_dot_test = 0.0;
151 std::complex<double> diff = u_inc_dot_test - p_dot_test;
180 return -off_diag_jac;
registerMooseObject("ElectromagneticsApp", VectorEMRobinBC)
virtual RealVectorValue curl(Real t, const Point &p) const
virtual Real value(Real t, const Point &p) const
virtual RealVectorValue vectorValue(Real t, const Point &p) const
const MooseArray< Point > & _q_point
void mooseError(Args &&... args) const
const std::string & _name
First order Robin-style Absorbing/Port boundary condition for vector nonlinear variables.
VectorEMRobinBC(const InputParameters ¶meters)
const MooseEnum _mode
Mode of operation (absorbing or port)
static InputParameters validParams()
const Function & _inc_real
Real incoming field vector.
virtual Real computeQpResidual() override
const Function & _inc_imag
Imaginary incoming field vector.
const VectorVariableValue & _coupled_val
Coupled field vector variable.
virtual Real computeQpJacobian() override
unsigned int _coupled_var_num
Coupled field vector variable id.
const bool _real_incoming_was_set
Boolean marking whether real component of the incoming wave was set by the user.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
const MooseEnum _component
Variable field component (real or imaginary)
const Function & _beta
Scalar waveguide propagation constant.
const bool _imag_incoming_was_set
Boolean marking whether imaginary component of the incoming wave was set by the user.
static InputParameters validParams()
const MooseArray< Point > & _normals
const VectorVariablePhiValue & _phi
const VectorVariableTestValue & _test
const VectorVariableValue & _u
@ ABSORBING
Case when the boundary is configured to absorb impinging electromagnetic radiation.
@ PORT
Case when the boundary is configured to both absorb impinging electromagnetic radiation and launch an...
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")