예제 #1
0
void
ADIntegratedBCTempl<T, compute_stage>::computeJacobianBlock(MooseVariableFEBase & jvar)
{
  auto jvar_num = jvar.number();

  if (jvar_num == _var.number())
    computeJacobian();
  else
  {
    DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar_num);
    if (jvar.phiFaceSize() != ke.n())
      return;

    size_t ad_offset = jvar_num * _sys.getMaxVarNDofsPerElem();

    for (_i = 0; _i < _test.size(); _i++)
      for (_qp = 0; _qp < _qrule->n_points(); _qp++)
      {
        DualReal residual = _ad_JxW[_qp] * _coord[_qp] * computeQpResidual();

        for (_j = 0; _j < jvar.phiFaceSize(); _j++)
          ke(_i, _j) += residual.derivatives()[ad_offset + _j];
      }
  }
}
예제 #2
0
DualReal
SinglePhaseFluidProperties::vaporTemperature(const DualReal & p) const
{
  Real T = 0.0;
  Real pressure = p.value();
  Real dTdp = 0.0;

  vaporTemperature(pressure, T, dTdp);

  DualReal result = T;
  for (std::size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * dTdp;

  return result;
}
예제 #3
0
DualReal
SinglePhaseFluidProperties::vaporPressure(const DualReal & T) const
{
  Real p = 0.0;
  Real temperature = T.value();
  Real dpdT = 0.0;

  vaporPressure(temperature, p, dpdT);

  DualReal result = p;
  for (std::size_t i = 0; i < T.derivatives().size(); ++i)
    result.derivatives()[i] = T.derivatives()[i] * dpdT;

  return result;
}
예제 #4
0
DualReal
SinglePhaseFluidProperties::v_from_p_T(const DualReal & p, const DualReal & T) const
{
  Real rawv = 0;
  Real rawp = p.value();
  Real rawT = T.value();
  Real dvdp = 0;
  Real dvdT = 0;
  v_from_p_T(rawp, rawT, rawv, dvdp, dvdT);

  DualReal result = rawv;
  for (size_t i = 0; i < p.derivatives().size(); i++)
    result.derivatives()[i] = p.derivatives()[i] * dvdp + T.derivatives()[i] * dvdT;
  return result;
}
예제 #5
0
DualReal
SinglePhaseFluidProperties::T_from_p_h(const DualReal & p, const DualReal & h) const
{
  Real T = 0.0;
  Real pressure = p.value();
  Real enthalpy = h.value();
  Real dT_dp = 0.0;
  Real dT_dh = 0.0;
  T_from_p_h(pressure, enthalpy, T, dT_dp, dT_dh);

  DualReal result = T;
  for (size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * dT_dp + h.derivatives()[i] * dT_dh;

  return result;
}
예제 #6
0
DualReal
SinglePhaseFluidProperties::e_from_p_T(const DualReal & p, const DualReal & T) const
{
  Real e = 0.0;
  Real pressure = p.value();
  Real temperature = T.value();
  Real de_dp = 0.0;
  Real de_dT = 0.0;
  e_from_p_T(pressure, temperature, e, de_dp, de_dT);

  DualReal result = e;
  for (size_t i = 0; i < p.derivatives().size(); ++i)
    result.derivatives()[i] = p.derivatives()[i] * de_dp + T.derivatives()[i] * de_dT;

  return result;
}