NOX::Abstract::Group::ReturnType LOCA::SingularJacobianSolve::ItRef::computeMulti( Teuchos::ParameterList& params, LOCA::Continuation::AbstractGroup& grp, const NOX::Abstract::Vector*const* inputs, const NOX::Abstract::Vector& approxNullVec, const NOX::Abstract::Vector& jacApproxNullVec, NOX::Abstract::Vector** results, int nVecs) { std::string callingFunction = "LOCA::SingularJacobianSolve::ItRef::computeMulti()"; NOX::Abstract::Group::ReturnType status, finalStatus; NOX::Abstract::Vector** remainders = new NOX::Abstract::Vector*[nVecs]; NOX::Abstract::Vector** refinements = new NOX::Abstract::Vector*[nVecs]; finalStatus = grp.applyJacobianInverseMulti(params, inputs, results, nVecs); LOCA::ErrorCheck::checkReturnType(finalStatus, callingFunction); for (int i=0; i<nVecs; i++) { remainders[i] = inputs[i]->clone(NOX::ShapeCopy); refinements[i] = inputs[i]->clone(NOX::ShapeCopy); status = grp.applyJacobian(*(results[i]), *(remainders[i])); finalStatus = LOCA::ErrorCheck::combineAndCheckReturnTypes(status, finalStatus, callingFunction); // r = b-Ax remainders[i]->update(1.0, *(inputs[i]), -1.0); } // Ay=r status = grp.applyJacobianInverseMulti(params, remainders, refinements, nVecs); finalStatus = LOCA::ErrorCheck::combineAndCheckReturnTypes(status, finalStatus, callingFunction); // x+=y for (int i=0; i<nVecs; i++) { results[i]->update(1.0, *(refinements[i]), 1.0); delete remainders[i]; delete refinements[i]; } delete [] remainders; delete [] refinements; return finalStatus; }
NOX::Abstract::Group::ReturnType LOCA::SingularJacobianSolve::Nic::compute( Teuchos::ParameterList& params, LOCA::Continuation::AbstractGroup& grp, const NOX::Abstract::Vector& input, const NOX::Abstract::Vector& approxNullVec, const NOX::Abstract::Vector& jacApproxNullVec, NOX::Abstract::Vector& result) { string callingFunction = "LOCA::SingularJacobianSolve::Nic::compute()"; NOX::Abstract::Group::ReturnType finalStatus; double alpha = approxNullVec.innerProduct(input) / approxNullVec.innerProduct(jacApproxNullVec); NOX::Abstract::Vector* tmpInput = input.clone(NOX::DeepCopy); tmpInput->update(-alpha, jacApproxNullVec, 1.0); finalStatus = grp.applyJacobianInverse(params, *tmpInput, result); LOCA::ErrorCheck::checkReturnType(finalStatus, callingFunction); delete tmpInput; result.update(alpha, approxNullVec, 1.0); return finalStatus; }
NOX::Abstract::Group::ReturnType LOCA::SingularJacobianSolve::ItRef::compute( Teuchos::ParameterList& params, LOCA::Continuation::AbstractGroup& grp, const NOX::Abstract::Vector& input, const NOX::Abstract::Vector& approxNullVec, const NOX::Abstract::Vector& jacApproxNullVec, NOX::Abstract::Vector& result) { std::string callingFunction = "LOCA::SingularJacobianSolve::ItRef::compute()"; NOX::Abstract::Group::ReturnType status, finalStatus; finalStatus = grp.applyJacobianInverse(params, input, result); LOCA::ErrorCheck::checkReturnType(finalStatus, callingFunction); NOX::Abstract::Vector* remainder = input.clone(NOX::ShapeCopy); status = grp.applyJacobian(result, *remainder); finalStatus = LOCA::ErrorCheck::combineAndCheckReturnTypes(status, finalStatus, callingFunction); // r = b-Ax remainder->update(1.0, input, -1.0); NOX::Abstract::Vector* refinement = input.clone(NOX::ShapeCopy); // Ay=r status = grp.applyJacobianInverse(params, *remainder, *refinement); finalStatus = LOCA::ErrorCheck::combineAndCheckReturnTypes(status, finalStatus, callingFunction); // x+=y result.update(1.0, *refinement, 1.0); delete remainder; delete refinement; return finalStatus; }
NOX::Abstract::Group::ReturnType LOCA::SingularJacobianSolve::Nic::computeMulti( Teuchos::ParameterList& params, LOCA::Continuation::AbstractGroup& grp, const NOX::Abstract::Vector*const* inputs, const NOX::Abstract::Vector& approxNullVec, const NOX::Abstract::Vector& jacApproxNullVec, NOX::Abstract::Vector** results, int nVecs) { string callingFunction = "LOCA::SingularJacobianSolve::Nic::computeMulti()"; NOX::Abstract::Group::ReturnType status, finalStatus; finalStatus = NOX::Abstract::Group::Ok; double denom = approxNullVec.innerProduct(jacApproxNullVec); double* alphas = new double[nVecs]; NOX::Abstract::Vector** tmpInputs = new NOX::Abstract::Vector*[nVecs]; for (int i=0; i<nVecs; i++) { alphas[i] = approxNullVec.innerProduct(*(inputs[i])) / denom; tmpInputs[i] = inputs[i]->clone(NOX::DeepCopy); tmpInputs[i]->update(-alphas[i], jacApproxNullVec, 1.0); } status = grp.applyJacobianInverseMulti(params, tmpInputs, results, nVecs); finalStatus = LOCA::ErrorCheck::combineAndCheckReturnTypes(status, finalStatus, callingFunction); for (int i=0; i<nVecs; i++) { results[i]->update(alphas[i], approxNullVec, 1.0); delete tmpInputs[i]; } delete [] tmpInputs; delete [] alphas; return finalStatus; }