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::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; }