void
LOCA::BorderedSolver::HouseholderQR::applyCompactWY(
             const NOX::Abstract::MultiVector::DenseMatrix& Y1,
             const NOX::Abstract::MultiVector& Y2,
             const NOX::Abstract::MultiVector::DenseMatrix& T,
             const NOX::Abstract::MultiVector::DenseMatrix* input1,
             const NOX::Abstract::MultiVector* input2,
             NOX::Abstract::MultiVector::DenseMatrix& result1,
             NOX::Abstract::MultiVector& result2,
             bool useTranspose) const
{
  bool isZeroX1 = (input1 == NULL);
  bool isZeroX2 = (input2 == NULL);

  if (!isZeroX1)
    result1.assign(*input1);
  if (!isZeroX2)
    result2 = *input2;

  applyCompactWY(Y1, Y2, T, result1, result2, isZeroX1, isZeroX2,
         useTranspose);
}
예제 #2
0
int 
LOCA::Epetra::CompactWYOp::Apply(const Epetra_MultiVector& Input, 
				 Epetra_MultiVector& Result) const
{
  if (tmpMat1 == NULL || tmpMV == NULL) {
    globalData->locaErrorCheck->throwError(
				 "LOCA::Epetra::CompactWYOp::Apply()",
				 "Must call init() before Apply()!");
    return -1;
  }
  
  // Apply Householder transformation using temporary vector
  applyCompactWY(Input, *tmpMV, *tmpMat1);
  
  // Compute J*tmpMV
  J->Apply(*tmpMV, Result);

  // Compute J*tmpMV + A*tmpMat1
  if (A.get() != NULL)
    Result.Multiply('N', 'N', 1.0, *A, *tmpMat1, 1.0);

  return 0;
}