예제 #1
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);
}
예제 #2
0
파일: KernelGrad.C 프로젝트: mellis13/moose
void
KernelGrad::computeJacobian()
{
  DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), _var.number());
  _local_ke.resize(ke.m(), ke.n());
  _local_ke.zero();

  const unsigned int n_test = _test.size();
  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
    for (_j = 0; _j < _phi.size(); _j++)
    {
      RealGradient value = precomputeQpJacobian() * _JxW[_qp] * _coord[_qp];
      for (_i = 0; _i < n_test; _i++) // target for auto vectorization
        _local_ke(_i, _j) += value * _grad_test[_i][_qp];
    }

  ke += _local_ke;

  if (_has_diag_save_in)
  {
    const unsigned int rows = ke.m();
    DenseVector<Number> diag(rows);
    for (unsigned int i = 0; i < rows; i++) // target for auto vectorization
      diag(i) = _local_ke(i,i);

    Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
    for (unsigned int i = 0; i < _diag_save_in.size(); i++)
      _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
  }
}
예제 #3
0
파일: KernelValue.C 프로젝트: kun-liu/moose
void
KernelValue::computeJacobian()
{
  DenseMatrix<Number> & ke = _assembly.jacobianBlock(_var.number(), _var.number());
  _local_ke.resize(ke.m(), ke.n());
  _local_ke.zero();

  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
  {
    for (_j = 0; _j < _phi.size(); _j++)
    {
      // NOTE: is it possible to move this out of the for-loop and multiply the _value by _phi[_j][_qp]
      _value = precomputeQpJacobian();
      for (_i = 0; _i < _test.size(); _i++)
        _local_ke(_i, _j) += _JxW[_qp]*_coord[_qp]*_value*_test[_i][_qp];
    }
  }

  ke += _local_ke;

  if (_has_diag_save_in)
  {
    unsigned int rows = ke.m();
    DenseVector<Number> diag(rows);
    for(unsigned int i=0; i<rows; i++)
      diag(i) = _local_ke(i,i);

    Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
    for(unsigned int i=0; i<_diag_save_in.size(); i++)
      _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
  }
}