コード例 #1
0
void
MechanicalContactConstraint::computeOffDiagJacobian(unsigned int jvar)
{
  getConnectedDofIndices(jvar);

  _Kee.resize(_test_slave.size(), _connected_dof_indices.size());

  DenseMatrix<Number> & Knn = _assembly.jacobianBlockNeighbor(Moose::NeighborNeighbor, _master_var.number(), jvar);

  for (_i=0; _i<_test_slave.size(); _i++)
    // Loop over the connected dof indices so we can get all the jacobian contributions
    for (_j=0; _j<_connected_dof_indices.size(); _j++)
      _Kee(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveSlave, jvar);

  if (_master_slave_jacobian)
  {
    DenseMatrix<Number> & Ken = _assembly.jacobianBlockNeighbor(Moose::ElementNeighbor, _var.number(), jvar);
    for (_i=0; _i<_test_slave.size(); _i++)
      for (_j=0; _j<_phi_master.size(); _j++)
        Ken(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveMaster, jvar);

    _Kne.resize(_test_master.size(), _connected_dof_indices.size());
    if (_Kne.m() && _Kne.n())
      for (_i=0; _i<_test_master.size(); _i++)
        // Loop over the connected dof indices so we can get all the jacobian contributions
        for (_j=0; _j<_connected_dof_indices.size(); _j++)
          _Kne(_i,_j) += computeQpOffDiagJacobian(Moose::MasterSlave, jvar);
  }

  for (_i=0; _i<_test_master.size(); _i++)
    for (_j=0; _j<_phi_master.size(); _j++)
      Knn(_i,_j) += computeQpOffDiagJacobian(Moose::MasterMaster, jvar);
}
コード例 #2
0
ファイル: KernelValue.C プロジェクト: kun-liu/moose
void
KernelValue::computeOffDiagJacobian(unsigned int jvar)
{
//  Moose::perf_log.push("computeOffDiagJacobian()",_name);

  DenseMatrix<Number> & Ke = _assembly.jacobianBlock(_var.number(), jvar);

  for (_j=0; _j<_phi.size(); _j++)
    for (_qp=0; _qp<_qrule->n_points(); _qp++)
    {
      if (jvar == _var.number())
      {
        _value = _coord[_qp]*precomputeQpJacobian();
        for (_i=0; _i<_test.size(); _i++)
          Ke(_i,_j) += _JxW[_qp]*_coord[_qp]*_value*_test[_i][_qp];
      }
      else
      {
        for (_i=0; _i<_test.size(); _i++)
        {
          _value = _coord[_qp]*computeQpOffDiagJacobian(jvar);
          Ke(_i,_j) += _JxW[_qp]*_coord[_qp]*_value;
        }
      }
    }

//  Moose::perf_log.pop("computeOffDiagJacobian()",_name);
}
コード例 #3
0
ファイル: DiracKernel.C プロジェクト: tophmatthews/moose
void
DiracKernel::computeOffDiagJacobian(unsigned int jvar)
{
    if (jvar == _var.number())
    {
        computeJacobian();
    }
    else
    {
        DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar);

        const std::vector<unsigned int> * multiplicities = _drop_duplicate_points ? NULL : &_local_dirac_kernel_info.getPoints()[_current_elem].second;
        unsigned int local_qp = 0;
        Real multiplicity = 1.0;

        for (_qp = 0; _qp < _qrule->n_points(); _qp++)
        {
            _current_point = _physical_point[_qp];
            if (isActiveAtPoint(_current_elem, _current_point))
            {
                if (!_drop_duplicate_points)
                    multiplicity = (*multiplicities)[local_qp++];

                for (_i=0; _i<_test.size(); _i++)
                    for (_j=0; _j<_phi.size(); _j++)
                        ke(_i, _j) += multiplicity * computeQpOffDiagJacobian(jvar);
            }
        }
    }
}
コード例 #4
0
ファイル: NodeFaceConstraint.C プロジェクト: ChaliZhg/moose
void
NodeFaceConstraint::computeOffDiagJacobian(unsigned int jvar)
{
  getConnectedDofIndices(jvar);

  _Kee.resize(_test_slave.size(), _connected_dof_indices.size());
  _Kne.resize(_test_master.size(), _connected_dof_indices.size());

  DenseMatrix<Number> & Ken = _assembly.jacobianBlockNeighbor(Moose::ElementNeighbor, _var.number(), jvar);
  DenseMatrix<Number> & Knn = _assembly.jacobianBlockNeighbor(Moose::NeighborNeighbor, _master_var.number(), jvar);

  _phi_slave.resize(_connected_dof_indices.size());

  _qp = 0;

  // Fill up _phi_slave so that it is 1 when j corresponds to this dof and 0 for every other dof
  // This corresponds to evaluating all of the connected shape functions at _this_ node
  for (unsigned int j=0; j<_connected_dof_indices.size(); j++)
  {
    _phi_slave[j].resize(1);

    if (_connected_dof_indices[j] == _var.nodalDofIndex())
      _phi_slave[j][_qp] = 1.0;
    else
      _phi_slave[j][_qp] = 0.0;
  }

  for (_i=0; _i<_test_slave.size(); _i++)
    // Loop over the connected dof indices so we can get all the jacobian contributions
    for (_j=0; _j<_connected_dof_indices.size(); _j++)
      _Kee(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveSlave, jvar);

  for (_i=0; _i<_test_slave.size(); _i++)
    for (_j=0; _j<_phi_master.size(); _j++)
      Ken(_i,_j) += computeQpOffDiagJacobian(Moose::SlaveMaster, jvar);

  if (_Kne.m() && _Kne.n())
    for (_i=0; _i<_test_master.size(); _i++)
      // Loop over the connected dof indices so we can get all the jacobian contributions
      for (_j=0; _j<_connected_dof_indices.size(); _j++)
        _Kne(_i,_j) += computeQpOffDiagJacobian(Moose::MasterSlave, jvar);

  for (_i=0; _i<_test_master.size(); _i++)
    for (_j=0; _j<_phi_master.size(); _j++)
      Knn(_i,_j) += computeQpOffDiagJacobian(Moose::MasterMaster, jvar);
}
コード例 #5
0
ファイル: StressDivergenceRZ.C プロジェクト: garvct/Moose
void
StressDivergenceRZ::computeOffDiagJacobian(unsigned int jvar)
{
  if (jvar == _var.number())
    computeJacobian();
  else
  {
    if (_volumetric_locking_correction)
    {
      // calculate volume averaged value of shape function derivative
      _avg_grad_test.resize(_test.size());
      for (_i = 0; _i < _test.size(); _i++)
      {
        _avg_grad_test[_i].resize(2);
        _avg_grad_test[_i][_component] = 0.0;
        for (_qp = 0; _qp < _qrule->n_points(); _qp++)
        {
          if (_component == 0)
            _avg_grad_test[_i][_component] += (_grad_test[_i][_qp](_component) + _test[_i][_qp] / _q_point[_qp](0)) * _JxW[_qp] * _coord[_qp];
          else
            _avg_grad_test[_i][_component] += _grad_test[_i][_qp](_component) * _JxW[_qp] * _coord[_qp];

        }
        _avg_grad_test[_i][_component] /= _current_elem_volume;
      }

      _avg_grad_phi.resize(_phi.size());
      for (_i = 0; _i < _phi.size(); _i++)
      {
        _avg_grad_phi[_i].resize(3);
        for (unsigned int component = 0; component < 2; component++)
        {
          _avg_grad_phi[_i][component] = 0.0;
          for (_qp = 0; _qp < _qrule->n_points(); _qp++)
          {
            if (component == 0)
              _avg_grad_phi[_i][component] += (_grad_phi[_i][_qp](component) + _phi[_i][_qp] / _q_point[_qp](0)) * _JxW[_qp] * _coord[_qp];
            else
              _avg_grad_phi[_i][component] += _grad_phi[_i][_qp](component) * _JxW[_qp] * _coord[_qp];
          }

          _avg_grad_phi[_i][component] /= _current_elem_volume;
        }
      }
    }

    DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar);

    for (_i = 0; _i < _test.size(); _i++)
      for (_j = 0; _j < _phi.size(); _j++)
        for (_qp = 0; _qp < _qrule->n_points(); _qp++)
          ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar);
  }
}
コード例 #6
0
ファイル: IntegratedBC.C プロジェクト: IoannisSt/moose
void
IntegratedBC::computeJacobianBlockScalar(unsigned int jvar)
{
  DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar);

  MooseVariableScalar & jv = _sys.getScalarVariable(_tid, jvar);
  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
    for (_i = 0; _i < _test.size(); _i++)
      for (_j = 0; _j < jv.order(); _j++)
        ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar);
}
コード例 #7
0
ファイル: IntegratedBC.C プロジェクト: aashiquear/moose
void
IntegratedBC::computeJacobianBlockScalar(unsigned int jvar)
{
  prepareMatrixTag(_assembly, _var.number(), jvar);

  MooseVariableScalar & jv = _sys.getScalarVariable(_tid, jvar);
  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
    for (_i = 0; _i < _test.size(); _i++)
      for (_j = 0; _j < jv.order(); _j++)
        _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar);

  accumulateTaggedLocalMatrix();
}
コード例 #8
0
ファイル: KernelGrad.C プロジェクト: mellis13/moose
void
KernelGrad::computeOffDiagJacobian(unsigned int jvar)
{
  if (jvar == _var.number())
    computeJacobian();
  else
  {
    DenseMatrix<Number> & Ke = _assembly.jacobianBlock(_var.number(), jvar);

    for (_j = 0; _j < _phi.size(); _j++)
      for (_qp = 0; _qp < _qrule->n_points(); _qp++)
        for (_i = 0; _i < _test.size(); _i++)
          Ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar);
  }
}
コード例 #9
0
ファイル: ODEKernel.C プロジェクト: AhmedAly83/moose
void
ODEKernel::computeOffDiagJacobian(unsigned int jvar)
{
  if (_sys.isScalarVariable(jvar))
  {
    DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar);
    MooseVariableScalar & var_j = _sys.getScalarVariable(_tid, jvar);
    for (_i = 0; _i < _var.order(); _i++)
      for (_j = 0; _j < var_j.order(); _j++)
      {
        if (jvar != _var.number())
          ke(_i, _j) += computeQpOffDiagJacobian(jvar);
      }
  }
}
コード例 #10
0
ファイル: NodalKernel.C プロジェクト: hanjialuna/moose
void
NodalKernel::computeOffDiagJacobian(unsigned int jvar)
{
  if (jvar == _var.number())
    computeJacobian();
  else
  {
    _qp = 0;
    Real cached_val = computeQpOffDiagJacobian(jvar);
    dof_id_type cached_row = _var.nodalDofIndex();
    // Note: this only works for Lagrange variables...
    dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar, 0);

    _assembly.cacheJacobianContribution(cached_row, cached_col, cached_val);
  }
}
コード例 #11
0
ファイル: DGKernel.C プロジェクト: hanjialuna/moose
void
DGKernel::computeOffDiagElemNeighJacobian(Moose::DGJacobianType type,unsigned int jvar)
{
    const VariableTestValue & test_space = ( type == Moose::ElementElement || type == Moose::ElementNeighbor ) ?
                                           _test : _test_neighbor;
    const VariableTestValue & loc_phi = ( type == Moose::ElementElement || type == Moose::NeighborElement ) ?
                                        _phi : _phi_neighbor;
    DenseMatrix<Number> & Kxx = type == Moose::ElementElement ? _assembly.jacobianBlock(_var.number(), jvar) :
                                type == Moose::ElementNeighbor ? _assembly.jacobianBlockNeighbor(Moose::ElementNeighbor, _var.number(), jvar) :
                                type == Moose::NeighborElement ? _assembly.jacobianBlockNeighbor(Moose::NeighborElement, _var.number(), jvar) :
                                _assembly.jacobianBlockNeighbor(Moose::NeighborNeighbor, _var.number(), jvar);

    for (_qp=0; _qp<_qrule->n_points(); _qp++)
        for (_i=0; _i<test_space.size(); _i++)
            for (_j=0; _j<loc_phi.size(); _j++)
                Kxx(_i,_j) += _JxW[_qp]*_coord[_qp]*computeQpOffDiagJacobian(type, jvar);
}
コード例 #12
0
ファイル: NodalBC.C プロジェクト: raghavaggarwal/moose
void
NodalBC::computeOffDiagJacobian(unsigned int jvar)
{
    if (jvar == _var.number())
        computeJacobian();
    else
    {
        _qp = 0;
        Real cached_val = computeQpOffDiagJacobian(jvar);
        dof_id_type cached_row = _var.nodalDofIndex();
        // Note: this only works for Lagrange variables...
        dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar, 0);

        // Cache the user's computeQpJacobian() value for later use.
        _fe_problem.assembly(0).cacheNodalBCJacobianEntry(cached_row, cached_col, cached_val);
    }
}
コード例 #13
0
ファイル: StressDivergence.C プロジェクト: FHilty/moose
void
StressDivergence::computeOffDiagJacobian(MooseVariableFEBase & jvar)
{
  size_t jvar_num = jvar.number();
  if (jvar_num == _var.number())
    computeJacobian();
  else
  {
    if (_volumetric_locking_correction)
    {
      // calculate volume averaged value of shape function derivative
      _avg_grad_test.resize(_test.size());
      for (_i = 0; _i < _test.size(); _i++)
      {
        _avg_grad_test[_i].resize(3);
        _avg_grad_test[_i][_component] = 0.0;
        for (_qp = 0; _qp < _qrule->n_points(); _qp++)
          _avg_grad_test[_i][_component] +=
              _grad_test[_i][_qp](_component) * _JxW[_qp] * _coord[_qp];

        _avg_grad_test[_i][_component] /= _current_elem_volume;
      }

      _avg_grad_phi.resize(jvar.phiSize());
      for (_i = 0; _i < jvar.phiSize(); _i++)
      {
        _avg_grad_phi[_i].resize(3);
        for (unsigned int component = 0; component < _mesh.dimension(); component++)
        {
          _avg_grad_phi[_i][component] = 0.0;
          for (_qp = 0; _qp < _qrule->n_points(); _qp++)
            _avg_grad_phi[_i][component] += _grad_phi[_i][_qp](component) * _JxW[_qp] * _coord[_qp];

          _avg_grad_phi[_i][component] /= _current_elem_volume;
        }
      }
    }

    DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar_num);

    for (_i = 0; _i < _test.size(); _i++)
      for (_j = 0; _j < jvar.phiSize(); _j++)
        for (_qp = 0; _qp < _qrule->n_points(); _qp++)
          ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar_num);
  }
}
コード例 #14
0
ファイル: IntegratedBC.C プロジェクト: aashiquear/moose
void
IntegratedBC::computeJacobianBlock(MooseVariableFEBase & jvar)
{
  size_t jvar_num = jvar.number();
  prepareMatrixTag(_assembly, _var.number(), jvar_num);

  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
    for (_i = 0; _i < _test.size(); _i++)
      for (_j = 0; _j < jvar.phiFaceSize(); _j++)
      {
        if (_var.number() == jvar_num)
          _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian();
        else
          _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar_num);
      }

  accumulateTaggedLocalMatrix();
}
コード例 #15
0
ファイル: ODEKernel.C プロジェクト: FHilty/moose
void
ODEKernel::computeOffDiagJacobian(unsigned int jvar)
{
  if (_sys.isScalarVariable(jvar))
  {
    prepareMatrixTag(_assembly, _var.number(), jvar);

    MooseVariableScalar & var_j = _sys.getScalarVariable(_tid, jvar);
    for (_i = 0; _i < _var.order(); _i++)
      for (_j = 0; _j < var_j.order(); _j++)
      {
        if (jvar != _var.number())
          _local_ke(_i, _j) += computeQpOffDiagJacobian(jvar);
      }

    accumulateTaggedLocalMatrix();
  }
}
コード例 #16
0
ファイル: IntegratedBC.C プロジェクト: IoannisSt/moose
void
IntegratedBC::computeJacobianBlock(unsigned int jvar)
{
//  Moose::perf_log.push("computeJacobianBlock()","IntegratedBC");

  DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar);

  for (_qp=0; _qp<_qrule->n_points(); _qp++)
    for (_i=0; _i<_test.size(); _i++)
      for (_j=0; _j<_phi.size(); _j++)
      {
        if (_var.number() == jvar)
          ke(_i,_j) += _JxW[_qp]*_coord[_qp]*computeQpJacobian();
        else
          ke(_i,_j) += _JxW[_qp]*_coord[_qp]*computeQpOffDiagJacobian(jvar);
      }

//  Moose::perf_log.pop("computeJacobianBlock()","IntegratedBC");
}
コード例 #17
0
ファイル: IntegratedBC.C プロジェクト: aashiquear/moose
void
IntegratedBC::computeJacobianBlock(unsigned int jvar)
{
  mooseDeprecated("The computeJacobianBlock method signature has changed. Developers, please "
                  "pass in a MooseVariableFEBase reference instead of the variable number");
  prepareMatrixTag(_assembly, _var.number(), jvar);

  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
    for (_i = 0; _i < _test.size(); _i++)
      for (_j = 0; _j < _phi.size(); _j++)
      {
        if (_var.number() == jvar)
          _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian();
        else
          _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar);
      }

  accumulateTaggedLocalMatrix();
}
コード例 #18
0
ファイル: DiracKernel.C プロジェクト: Biyss/moose
void
DiracKernel::computeOffDiagJacobian(unsigned int jvar)
{
  if (jvar == _var.number())
  {
    computeJacobian();
  }
  else
  {
    DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), jvar);

    for (_qp = 0; _qp < _qrule->n_points(); _qp++)
    {
      _current_point = _physical_point[_qp];
      if (isActiveAtPoint(_current_elem, _current_point))
        for (_i=0; _i<_test.size(); _i++)
          for (_j=0; _j<_phi.size(); _j++)
            ke(_i, _j) += computeQpOffDiagJacobian(jvar);
    }
  }
}
コード例 #19
0
ファイル: NodalBC.C プロジェクト: FHilty/moose
void
NodalBC::computeOffDiagJacobian(unsigned int jvar)
{
  if (jvar == _var.number())
    computeJacobian();
  else
  {
    _qp = 0;
    Real cached_val = 0.0;
    cached_val = computeQpOffDiagJacobian(jvar);

    dof_id_type cached_row = _var.nodalDofIndex();
    // Note: this only works for Lagrange variables...
    dof_id_type cached_col = _current_node->dof_number(_sys.number(), jvar, 0);

    // Cache the user's computeQpJacobian() value for later use.
    for (auto tag : _matrix_tags)
      if (_sys.hasMatrix(tag))
        _fe_problem.assembly(0).cacheJacobianContribution(cached_row, cached_col, cached_val, tag);
  }
}
コード例 #20
0
Real
PorousFlowHeatConduction::computeQpJacobian()
{
  return computeQpOffDiagJacobian(_var.number());
}
コード例 #21
0
Real
PlasticHeatEnergy::computeQpJacobian()
{
  return computeQpOffDiagJacobian(_var.number());
}