int main(int argc, char *argv[]) { int n = 100; double alpha = 0.0; double beta = 0.0; double scale = 1.0; int maxNewtonIters = 20; int ierr = 0; alpha = alpha / scale; try { bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Parameter", "alpha"); stepperList.set("Initial Value", alpha); stepperList.set("Max Value", 5.0/scale); stepperList.set("Min Value", 0.0/scale); stepperList.set("Max Steps", 50); stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Initial Step Size", 0.1/scale); stepSizeList.set("Min Step Size", 1.0e-3/scale); stepSizeList.set("Max Step Size", 10.0/scale); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> normF = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxIters = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Generic> comboOR = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, normF, maxIters)); // Create the stepper LOCA::Stepper stepper(globalData, grp, comboOR, paramList); // Perform continuation run LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); // Check for convergence if (status != LOCA::Abstract::Iterator::Finished) { ierr = 1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::LAPACK::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::LAPACK::Group>(stepper.getSolutionGroup()); const NOX::LAPACK::Vector& finalSolution = dynamic_cast<const NOX::LAPACK::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check number of steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 32; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 0; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double alpha_final = finalGroup->getParam("alpha"); double alpha_expected = 5.0; ierr += testCompare.testValue(alpha_final, alpha_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check norm of solution double norm_x = finalSolution.norm(); double norm_x_expected = 203.1991024; ierr += testCompare.testValue(norm_x, norm_x_expected, 1.0e-7, "norm of final solution", NOX::TestCompare::Relative); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { cout << e.what() << endl; ierr = 1; } catch (const char *s) { cout << s << endl; ierr = 1; } catch (...) { cout << "Caught unknown exception!" << endl; ierr = 1; } if (ierr == 0) cout << "All tests passed!" << endl; else cout << ierr << " test(s) failed!" << endl; return ierr; }
int main() { double pi = 4.0*atan(1.0); int n = 100; double alpha = 0.25; double D1 = 1.0/40.0; double D2 = 1.0/40.0; double beta = 2.0*pi*pi*D1 + 1.0 + alpha*alpha; int maxNewtonIters = 10; try { // Create output file to save solutions ofstream outFile("BrusselatorHopfContinuation.dat"); outFile.setf(ios::scientific, ios::floatfield); outFile.precision(14); // Save size of discretizations outFile << n << endl; // Create initial guess for the real and imaginary eigenvectors NOX::LAPACK::Vector y(2*n), z(2*n); double h = 1.0 / double(n-1); double lambda_real = (beta - 1.0 - alpha*alpha)/2.0; double lambda_imag = sqrt(alpha*alpha - lambda_real*lambda_real); double v1_real = -alpha*alpha; double v1_imag = 0.0; double v2_real = beta - 1.0 - lambda_real; double v2_imag = -lambda_imag; double x; for (int i=0; i<n; i++) { x = sin(pi*h*i); y(i) = v1_real*x; z(i) = v1_imag*x; y(i+n) = v2_real*x; z(i+n) = v2_imag*x; } // Initial guess for frequency (valid for |alpha| > (pi^2)*|D1|) double w = lambda_imag; // Create length scaling vector (phi) NOX::LAPACK::Vector phi(2*n); phi.init(1.0); Teuchos::RCP<NOX::Abstract::Vector> y_vec = Teuchos::rcp(&y,false); Teuchos::RCP<NOX::Abstract::Vector> z_vec = Teuchos::rcp(&z,false); Teuchos::RCP<NOX::Abstract::Vector> phi_vec = Teuchos::rcp(&phi,false); // Create initial values for a and b for minimally augmented method Teuchos::RCP<NOX::Abstract::Vector> a_vec_real = Teuchos::rcp(new NOX::LAPACK::Vector(2*n)); Teuchos::RCP<NOX::Abstract::Vector> a_vec_imag = Teuchos::rcp(new NOX::LAPACK::Vector(2*n)); Teuchos::RCP<NOX::Abstract::Vector> b_vec_real = Teuchos::rcp(new NOX::LAPACK::Vector(2*n)); Teuchos::RCP<NOX::Abstract::Vector> b_vec_imag = Teuchos::rcp(new NOX::LAPACK::Vector(2*n)); *a_vec_real = *y_vec; *a_vec_imag = *z_vec; *b_vec_real = *y_vec; *b_vec_imag = *z_vec; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Method", "Arc Length"); // Default //stepperList.set("Continuation Method", "Natural"); // Default stepperList.set("Continuation Parameter", "alpha"); stepperList.set("Initial Value", alpha); stepperList.set("Max Value", 1.0); stepperList.set("Min Value", 0.24); stepperList.set("Max Steps", 100); stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "Hopf"); bifurcationList.set("Bifurcation Parameter", "beta"); // Must set bifurcationList.set("Initial Frequency", w); // Must set // // For Moore-Spence Formulation // bifurcationList.set("Formulation", "Moore-Spence"); // Default // bifurcationList.set("Solver Method", "Salinger Bordering"); // Default // bifurcationList.set("Length Normalization Vector", phi_vec); // Must set // bifurcationList.set("Initial Real Eigenvector", y_vec); // Must set // bifurcationList.set("Initial Imaginary Eigenvector", z_vec); // Must set // For minimally augmented formulation bifurcationList.set("Formulation", "Minimally Augmented"); bifurcationList.set("Initial Real A Vector", a_vec_real); // Must set bifurcationList.set("Initial Imaginary A Vector", a_vec_imag); // Must set bifurcationList.set("Initial Real B Vector", b_vec_real); // Must set bifurcationList.set("Initial Imaginary B Vector", b_vec_imag); // Must set bifurcationList.set("Update Null Vectors Every Continuation Step", true); // For minimally augmented method, should set these for good performance // Direct solve of bordered equations bifurcationList.set("Bordered Solver Method", "LAPACK Direct Solve"); // Combine arc-length and turning point bordered rows & columns stepperList.set("Bordered Solver Method", "Nested"); Teuchos::ParameterList& nestedList = stepperList.sublist("Nested Bordered Solver"); // Direct solve of combined bordered system nestedList.set("Bordered Solver Method", "LAPACK Direct Solve"); // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Default // // Should use w/Secant predictor & Moore-Spence formulation // Teuchos::ParameterList& firstStepPredictor // = predictorList.sublist("First Step Predictor"); // firstStepPredictor.set("Method", "Random"); // firstStepPredictor.set("Epsilon", 1.0e-3); // // Should use w/Secant predictor & Moore-Spence fomulation // Teuchos::ParameterList& lastStepPredictor // = predictorList.sublist("Last Step Predictor"); // lastStepPredictor.set("Method", "Random"); // lastStepPredictor.set("Epsilon", 1.0e-3); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Default stepSizeList.set("Initial Step Size", 0.02); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 0.1); stepSizeList.set("Aggressiveness", 0.5); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("Output Precision", 3); nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Create the "Line Search" sublist for the "Line Search Based" solver Teuchos::ParameterList& searchParams = nlParams.sublist("Line Search"); searchParams.set("Method", "Full Step"); // Create LAPACK Factory Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface BrusselatorProblemInterface brus(globalData, n, alpha, beta, D1, D2, outFile); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("D1",D1); p.addParameter("D2",D2); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::LAPACK::Group> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, brus)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-10, NOX::StatusTest::NormF::Scaled)); Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, statusTestA, statusTestB)); // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); // Solve the nonlinear system LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status == LOCA::Abstract::Iterator::Finished) cout << "All examples passed" << endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } outFile.close(); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { cout << e.what() << endl; } catch (const char *s) { cout << s << endl; } catch (...) { cout << "Caught unknown exception!" << endl; } return 0; }
int main( int argc, char **argv ) { // check for parallel computation #ifdef HAVE_MPI MPI_Init(&argc, &argv); Epetra_MpiComm Comm(MPI_COMM_WORLD); #else Epetra_SerialComm Comm; #endif // define main parameters double c = 0.25; // continuation parameter int N = 50; // number of grid points int maxNewtonIters = 20; // max number of Newton iterations int maxSteps = 75; // max number of continuation steps taken // Set flag for whether the computations will be Matrix-free (true) or will use a computed // Jacobian (false) bool doMatFree = false; // Create output file to save solutions ofstream outFile("Heq4.dat"); outFile.setf(ios::scientific, ios::floatfield); outFile.precision(10); // Define the problem class HeqProblem Problem(N,&Comm,outFile); // Create the initial guess vector and set it to all ones Epetra_Vector InitialGuess(Problem.GetMap()); InitialGuess.PutScalar(1.0); // Create the top level parameter list Teuchos::RCP<Teuchos::ParameterList> ParamList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = ParamList->sublist("LOCA"); // Create the sublist for continuation and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Method", "Arc Length");// Default // stepperList.set("Continuation Method", "Natural"); stepperList.set("Continuation Parameter", "c"); // Must set stepperList.set("Initial Value", c); // Must set stepperList.set("Max Value", 100.0); // Must set stepperList.set("Min Value", 0.0); // Must set stepperList.set("Max Steps", maxSteps); // Should set stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Should set // Set up parameters to compute Eigenvalues #ifdef HAVE_LOCA_ANASAZI // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) stepperList.set("Compute Eigenvalues",true); Teuchos::ParameterList& aList = stepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); aList.set("Block Size", 1); // Size of blocks aList.set("Num Blocks", 20); // Size of Arnoldi factorization aList.set("Num Eigenvalues", 5); // Number of eigenvalues // aList.set("Sorting Order", "SR"); aList.set("Convergence Tolerance", 2.0e-7); // Tolerance aList.set("Step Size", 1); // How often to check convergence aList.set("Maximum Restarts",2); // Maximum number of restarts aList.set("Verbosity", Anasazi::Errors + Anasazi::Warnings + Anasazi::FinalSummary); // Verbosity #else stepperList.set("Compute Eigenvalues",false); #endif stepperList.set("Bordered Solver Method", "Householder"); // stepperList.set("Bordered Solver Method", "Bordering"); // Teuchos::ParameterList& nestedList = // stepperList.sublist("Nested Bordered Solver"); // nestedList.set("Bordered Solver Method", "Householder"); // nestedList.set("Include UV In Preconditioner", true); // //nestedList.set("Use P For Preconditioner", true); // nestedList.set("Preconditioner Method", "SMW"); // Create bifurcation sublist -- use if not doing turning point Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "None"); // Default // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Default // predictorList.set("Method", "Constant"); // Other options // predictorList.set("Method", "Tangent"); // Other options // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Default stepSizeList.set("Initial Step Size", 0.1); // Should set stepSizeList.set("Min Step Size", 1.0e-4); // Should set stepSizeList.set("Max Step Size", 1.0); // Should set stepSizeList.set("Aggressiveness", 0.1); // Set up NOX info Teuchos::ParameterList& nlParams = ParamList->sublist("NOX"); // Set the nonlinear solver method nlParams.set("Nonlinear Solver", "Line Search Based"); // Set the printing parameters in the "Printing" sublist Teuchos::ParameterList& printParams = nlParams.sublist("Printing"); printParams.set("MyPID", Comm.MyPID()); printParams.set("Output Precision", 5); printParams.set("Output Processor", 0); printParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::LinearSolverDetails + NOX::Utils::Parameters + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // NOX parameters - Sublist for line search Teuchos::ParameterList& searchParams = nlParams.sublist("Line Search"); searchParams.set("Method", "Full Step"); // searchParams.set("Method", "Backtrack"); // Sublist for direction Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); dirParams.set("Method", "Newton"); Teuchos::ParameterList& newtonParams = dirParams.sublist("Newton"); newtonParams.set("Forcing Term Method", "Constant"); // Sublist for linear solver for the Newton method Teuchos::ParameterList& lsParams = newtonParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 800); lsParams.set("Tolerance", 1e-8); lsParams.set("Output Frequency", 1); lsParams.set("Preconditioner", "None"); // lsParams.set("Preconditioner", "AztecOO"); // lsParams.set("Aztec Preconditioner", "ilu"); // lsParams.set("Preconditioner", "Ifpack"); // lsParams.set("Ifpack Preconditioner", "ILU"); // lsParams.set("Preconditioner", "New Ifpack"); // Teuchos::ParameterList& ifpackParams = lsParams.sublist("Ifpack"); // ifpackParams.set("fact: level-of-fill", 1); // set up the continuation parameter vector LOCA::ParameterVector p; p.addParameter("c",c); // Set up the problem interface Teuchos::RCP<SimpleProblemInterface> interface = Teuchos::rcp(new SimpleProblemInterface(&Problem,c) ); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; // Create the operator to hold either the Jacobian matrix or the Matrix-free operator Teuchos::RCP<Epetra_Operator> A; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac; // Need a NOX::Epetra::Vector for constructor // This becomes the initial guess vector that is used for the nonlinear solves NOX::Epetra::Vector noxInitGuess(InitialGuess, NOX::DeepCopy); if (doMatFree) { // Matrix Free application (Epetra Operator): Teuchos::RCP<NOX::Epetra::MatrixFree> MF = Teuchos::rcp(new NOX::Epetra::MatrixFree(printParams, interface, noxInitGuess)); A = MF; iJac = MF; } else { // Computed Jacobian application A = Teuchos::rcp( Problem.GetMatrix(), false ); iJac = interface; } // Build the linear system solver Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, A, noxInitGuess)); // Create the Loca (continuation) vector NOX::Epetra::Vector locaSoln(noxInitGuess); // Create Epetra Factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(ParamList, epetraFactory); // Create the Group - must be LOCA group Teuchos::RCP<LOCA::Epetra::Group> grpPtr = Teuchos::rcp(new LOCA::Epetra::Group(globalData, printParams, iReq, locaSoln, linSys, p)); // Calculate the first F(x0) as a starting point. This is only needed for // certain status tests, to ensure that an initial residual (|r0|) is calculated grpPtr->computeF(); // Set up the status tests to check for convergence // Determines the error tolerance for the Newton solves Teuchos::RCP<NOX::StatusTest::NormF> testNormF = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-4)); // Sets the max number of nonlinear (Newton) iterations that will be taken. If this is not // already set, it will default to the '20' given Teuchos::RCP<NOX::StatusTest::MaxIters> testMaxIters = Teuchos::rcp(new NOX::StatusTest::MaxIters(stepperList.get("Max Nonlinear Iterations", 20))); // This combination of tests will be used by NOX to determine whether the step converged Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, testNormF, testMaxIters)); // This is sample code to write and read parameters to/from a file. Currently not activated! // To use, change the 'XXXHAVE_TEUCHOS_EXTENDED' TO 'HAVE_TEUCHOS_EXTENDED' #ifdef XXXHAVE_TEUCHOS_EXTENDED // Write the parameter list to a file cout << "Writing parameter list to \"input.xml\"" << endl; Teuchos::writeParameterListToXmlFile(*ParamList, "input.xml"); // Read in the parameter list from a file cout << "Reading parameter list from \"input.xml\"" << endl; Teuchos::RCP<Teuchos::ParameterList> paramList2 = Teuchos::rcp(new Teuchos::ParameterList); Teuchos::updateParametersFromXmlFile("input.xml", paramList2.get()); ParamList = paramList2; #endif // Create the stepper LOCA::Stepper stepper(globalData, grpPtr, combo, ParamList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); // Check if the stepper completed if (status == LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "\nAll tests passed!" << endl; else if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "\nStepper failed to converge!" << endl; // Output the stepper parameter list info if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << endl << "Final Parameters" << endl << "*******************" << endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << endl; } // Make sure all processors are done and close the output file Comm.Barrier(); outFile.close(); // Deallocate memory LOCA::destroyGlobalData(globalData); #ifdef HAVE_MPI MPI_Finalize(); #endif return(EXIT_SUCCESS); } // DONE!!
int main(int argc, char *argv[]) { // Initialize MPI Teuchos::GlobalMPISession mpiSession(&argc,&argv); // Get the number of elements from the command line int NumGlobalNodes = 100 + 1; #ifdef DO_XYZT // MPI MANIPULATION FOR XYZT PROBLEMS int spatialProcs = 1; // default if (argc>2) { spatialProcs = atoi(argv[2]);} int numTimeSteps= 1; // default if (argc>3) { numTimeSteps = atoi(argv[3]);} Teuchos::RCP<EpetraExt::MultiMpiComm> globalComm = Teuchos::rcp(new EpetraExt::MultiMpiComm(MPI_COMM_WORLD, spatialProcs, numTimeSteps)); Epetra_Comm& Comm = globalComm->SubDomainComm(); #else // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm(); #endif #endif // Create and reset the Timer Epetra_Time myTimer(Comm); double startWallTime = myTimer.WallTime(); // Get the process ID and the total number of processors int MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalNodes < NumProc) { std::cout << "numGlobalNodes = " << NumGlobalNodes << " cannot be < number of processors = " << NumProc << std::endl; exit(1); } // Create the Brusselator problem class. This creates all required // Epetra objects for the problem and allows calls to the // function (F) and Jacobian evaluation routines. Brusselator::OverlapType OType = Brusselator::ELEMENTS; Brusselator Problem(NumGlobalNodes, Comm, OType); double dt = 0.5; // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); Epetra_Vector& initCond = soln; // Begin Nonlinear Solver ************************************ // Create the top level parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Continuation Method", "Natural"); //locaStepperList.set("Continuation Method", "Arc Length"); //locaStepperList.set("Continuation Method", "Householder Arc Length"); locaStepperList.set("Continuation Parameter", "alpha"); locaStepperList.set("Initial Value", 0.6); locaStepperList.set("Max Value", 100.0); locaStepperList.set("Min Value", 0.05); #ifdef DO_XYZT locaStepperList.set("Max Steps", 7); #else locaStepperList.set("Max Steps", 0);// must be 0 so just a nonlinear solver #endif locaStepperList.set("Max Nonlinear Iterations", 15); locaStepperList.set("Enable Arc Length Scaling", true); locaStepperList.set("Goal Arc Length Parameter Contribution", 0.5); locaStepperList.set("Max Arc Length Parameter Contribution", 0.7); locaStepperList.set("Initial Scale Factor", 1.0); locaStepperList.set("Min Scale Factor", 1.0e-8); locaStepperList.set("Enable Tangent Factor Step Size Scaling",false); locaStepperList.set("Min Tangent Factor", 0.8); locaStepperList.set("Tangent Factor Exponent",1.5); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Constant"); // stepSizeList.set("Method", "Adaptive"); stepSizeList.set("Initial Step Size", -0.1); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 2000.0); stepSizeList.set("Aggressiveness", 0.1); stepSizeList.set("Failed Step Reduction Factor", 0.5); stepSizeList.set("Successful Step Increase Factor", 1.00); // for constant // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); //predictorList.set("Method", "Constant"); //predictorList.set("Method", "Tangent"); predictorList.set("Method", "Secant"); // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "None"); // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) locaStepperList.set("Compute Eigenvalues",false); #ifdef HAVE_LOCA_ANASAZI Teuchos::ParameterList& aList = locaStepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); aList.set("Block Size", 1); aList.set("Num Blocks", 10); aList.set("Num Eigenvalues", 3); aList.set("Convergence Tolerance", 2.0e-7); aList.set("Convergence Check", 1); aList.set("Maximum Restarts",2); aList.set("Step Size",1); aList.set("Verbosity", Anasazi::Errors + Anasazi::Warnings + Anasazi::FinalSummary); #endif // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Set the nonlinear solver method nlParams.set("Nonlinear Solver", "Line Search Based"); //nlParams.set("Nonlinear Solver", "Trust Region Based"); // Set the printing parameters in the "Printing" sublist Teuchos::ParameterList& printParams = nlParams.sublist("Printing"); printParams.set("MyPID", MyPID); printParams.set("Output Precision", 3); printParams.set("Output Processor", 0); printParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Parameters + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails); // Sublist for line search Teuchos::ParameterList& searchParams = nlParams.sublist("Line Search"); searchParams.set("Method", "Full Step"); //searchParams.set("Method", "Interval Halving"); //searchParams.set("Method", "Polynomial"); //searchParams.set("Method", "NonlinearCG"); //searchParams.set("Method", "Quadratic"); //searchParams.set("Method", "More'-Thuente"); // Sublist for direction Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); dirParams.set("Method", "Newton"); Teuchos::ParameterList& newtonParams = dirParams.sublist("Newton"); newtonParams.set("Forcing Term Method", "Constant"); //newtonParams.set("Forcing Term Method", "Type 1"); //newtonParams.set("Forcing Term Method", "Type 2"); //newtonParams.set("Forcing Term Minimum Tolerance", 1.0e-4); //newtonParams.set("Forcing Term Maximum Tolerance", 0.1); //dirParams.set("Method", "Steepest Descent"); //Teuchos::ParameterList& sdParams = dirParams.sublist("Steepest Descent"); //sdParams.set("Scaling Type", "None"); //sdParams.set("Scaling Type", "2-Norm"); //sdParams.set("Scaling Type", "Quadratic Model Min"); //dirParams.set("Method", "NonlinearCG"); //Teuchos::ParameterList& nlcgParams = dirParams.sublist("Nonlinear CG"); //nlcgParams.set("Restart Frequency", 2000); //nlcgParams.set("Precondition", "On"); //nlcgParams.set("Orthogonalize", "Polak-Ribiere"); //nlcgParams.set("Orthogonalize", "Fletcher-Reeves"); // Sublist for linear solver for the Newton method Teuchos::ParameterList& lsParams = newtonParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 800); lsParams.set("Tolerance", 1e-6); lsParams.set("Output Frequency", 50); #ifdef DO_XYZT_PREC lsParams.set("Preconditioner", "User Defined"); #else lsParams.set("Preconditioner", "Ifpack"); //lsParams.set("Preconditioner", "AztecOO"); //lsParams.set("Aztec Preconditioner", "ilu"); //lsParams.set("Overlap", 2); //lsParams.set("Graph Fill", 2); //lsParams.set("Aztec Preconditioner", "ilut"); //lsParams.set("Overlap", 2); //lsParams.set("Fill Factor", 2); //lsParams.set("Drop Tolerance", 1.0e-12); //lsParams.set("Aztec Preconditioner", "Polynomial"); //lsParams.set("Polynomial Order", 6); #endif // Create the interface between the test problem and the nonlinear solver Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> A = Teuchos::rcp(&Problem.getJacobian(),false); #ifdef DO_XYZT Epetra_MultiVector initGuess(soln.Map(), globalComm->NumTimeStepsOnDomain()); for (int i=0; i<globalComm->NumTimeStepsOnDomain(); i++) *(initGuess(i)) = soln; #ifdef DO_XYZT_PREC // Sublist for linear solver of the preconditioner Teuchos::RCP<Teuchos::ParameterList> precLSParams = Teuchos::rcp(new Teuchos::ParameterList(lsParams)); precLSParams->set("Aztec Solver", "GMRES"); precLSParams->set("Preconditioner", "Ifpack"); //precLSParams->set("Preconditioner", "AztecOO"); precLSParams->set("Max Iterations", 800); precLSParams->set("Tolerance", 1e-6); precLSParams->set("Output Frequency", 50); //precLSParams->set("XYZTPreconditioner", "None"); precLSParams->set("XYZTPreconditioner", "Global"); //precLSParams->set("XYZTPreconditioner", "Sequential"); //precLSParams->set("XYZTPreconditioner", "Parallel"); //precLSParams->set("XYZTPreconditioner", "Parareal"); //precLSParams->set("XYZTPreconditioner", "BlockDiagonal"); Teuchos::RCP<Teuchos::ParameterList> precPrintParams = Teuchos::rcp(new Teuchos::ParameterList(printParams)); precPrintParams->set("MyPID", MyPID); precPrintParams->set("Output Precision", 3); precPrintParams->set("Output Processor", 0); precPrintParams->set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Parameters + NOX::Utils::Details + NOX::Utils::Warning); Teuchos::RCP<LOCA::Epetra::Interface::xyzt> ixyzt = Teuchos::rcp(new LOCA::Epetra::Interface::xyzt(interface, initGuess, A, globalComm, initCond, dt, precPrintParams.get(), precLSParams.get())); Teuchos::RCP<Epetra_RowMatrix> Axyzt = Teuchos::rcp(&(ixyzt->getJacobian()),false); Epetra_Vector& solnxyzt = ixyzt->getSolution(); Teuchos::RCP<Epetra_Operator> Mxyzt = Teuchos::rcp(&(ixyzt->getPreconditioner()),false); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = ixyzt; // Create the Linear System Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = ixyzt; Teuchos::RCP<NOX::Epetra::Interface::Preconditioner> iPrec = Teuchos::rcp(&(ixyzt->getPreconditioner()),false); Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iJac, Axyzt, iPrec, Mxyzt, solnxyzt)); #else Teuchos::RCP<LOCA::Epetra::Interface::xyzt> ixyzt = Teuchos::rcp(new LOCA::Epetra::Interface::xyzt(interface, initGuess, A, initCond, dt, globalComm)); Teuchos::RCP<Epetra_RowMatrix> Axyzt = Teuchos::rcp(&(ixyzt->getJacobian()),false); Epetra_Vector& solnxyzt = ixyzt->getSolution(); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = ixyzt; // Create the Linear System Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = ixyzt; Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, Axyzt, solnxyzt)); #endif NOX::Epetra::Vector initialGuess(solnxyzt); #else // Use an Epetra Scaling object if desired Teuchos::RCP<Epetra_Vector> scaleVec = Teuchos::rcp(new Epetra_Vector(soln)); NOX::Epetra::Scaling scaling; scaling.addRowSumScaling(NOX::Epetra::Scaling::Left, scaleVec); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; // Create the Linear System Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, A, soln)); //&scaling); // Create the Group NOX::Epetra::Vector initialGuess(Teuchos::rcp(&soln,false), NOX::Epetra::Vector::CreateView, NOX::DeepCopy); #endif // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("alpha",0.6); pVector.addParameter("beta",2.0); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, printParams, iReq, initialGuess, linSys, pVector)); grp->computeF(); // Create the convergence tests Teuchos::RCP<NOX::StatusTest::NormF> absresid = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8, NOX::StatusTest::NormF::Unscaled)); //NOX::StatusTest::NormF relresid(*grp.get(), 1.0e-2); //NOX::StatusTest::NormUpdate update(1.0e-5); //NOX::StatusTest::NormWRMS wrms(1.0e-2, 1.0e-8); //NOX::StatusTest::Combo converged(NOX::StatusTest::Combo::AND); //converged.addStatusTest(absresid); //converged.addStatusTest(relresid); //converged.addStatusTest(wrms); //converged.addStatusTest(update); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(50)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(absresid); combo->addStatusTest(maxiters); // Create the method //NOX::Solver::Manager solver(grp, combo, nlParams); LOCA::Stepper stepper(globalData, grp, combo, paramList); // Initialize time integration parameters #ifdef DO_XYZT int maxTimeSteps = 1; // No longer need a time integration loop #else int maxTimeSteps = 2; #endif int timeStep = 0; double time = 0.; // Time integration loop while(timeStep < maxTimeSteps) { timeStep++; time += dt; globalData->locaUtils->out() << "Time Step: " << timeStep << ",\tTime: " << time << std::endl; // NOX::StatusTest::StatusType status = solver.solve(); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status == LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "All tests passed" << std::endl; else globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; // Get the Epetra_Vector with the final solution from the solver const LOCA::Epetra::Group& finalGroup = dynamic_cast<const LOCA::Epetra::Group&>(*(stepper.getSolutionGroup())); const Epetra_Vector& finalSolution = (dynamic_cast<const NOX::Epetra::Vector&>(finalGroup.getX())).getEpetraVector(); // End Nonlinear Solver ************************************** #ifndef DO_XYZT //Problem.reset(finalSolution); grp->setX(finalSolution); stepper.reset(globalData, grp, combo, paramList); grp->computeF(); #endif } // end time step while loop // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::Parameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Output timing info globalData->locaUtils->out() << "\nTimings :\n\tWallTime --> " << myTimer.WallTime() - startWallTime << " sec." << "\n\tElapsedTime --> " << myTimer.ElapsedTime() << " sec." << std::endl << std::endl; LOCA::destroyGlobalData(globalData); return 0 ; }
int main(int argc, char *argv[]) { int n = 100; double alpha = 10.0; double beta = 0.0; double scale = 1.0; int maxNewtonIters = 20; int ierr = 0; alpha = alpha / scale; try { bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::Details + NOX::Utils::OuterIterationStatusTest + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create LAPACK Factory Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::LAPACK::Group> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Set up the status tests grp->computeF(); double size = sqrt(static_cast<double>(grp->getX().length())); double normF_0 = grp->getNormF() / size; double tolerance = 1.0e-8 / normF_0 / normF_0; Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(*grp, tolerance)); Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, statusTestA, statusTestB)); // Create the homotopy group Teuchos::RCP<LOCA::Homotopy::Group> hGrp = Teuchos::rcp(new LOCA::Homotopy::Group(locaParamsList, globalData, grp)); // Override default parameters stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Create the stepper LOCA::Stepper stepper(globalData, hGrp, combo, paramList); // Solve the nonlinear system LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) { ierr = 1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::LAPACK::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::LAPACK::Group>(stepper.getSolutionGroup()); const NOX::LAPACK::Vector& finalSolution = dynamic_cast<const NOX::LAPACK::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::Utils utils(nlPrintParams); NOX::TestCompare testCompare(cout, utils); if (utils.isPrintType(NOX::Utils::TestDetails)) cout << endl << "***** Checking solutions statistics *****" << endl; // Check number of steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 14; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 3; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double alpha_final = finalGroup->getParam("Homotopy Continuation Parameter"); double alpha_expected = 1.0; ierr += testCompare.testValue(alpha_final, alpha_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check norm of solution double norm_x = finalSolution.norm(); double norm_x_expected = 456.0303417; ierr += testCompare.testValue(norm_x, norm_x_expected, 1.0e-7, "norm of final solution", NOX::TestCompare::Relative); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; return 0; }
int testTransposeSolve( int NumGlobalElements, int nRHS, double reltol, double abstol, Epetra_Comm& Comm, const Teuchos::RCP<LOCA::GlobalData>& globalData, const Teuchos::RCP<Teuchos::ParameterList>& paramList) { int ierr = 0; double left_bc = 0.0; double right_bc = 1.0; double nonlinear_factor = 1.0; // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. Tcubed_FiniteElementProblem Problem(NumGlobalElements, Comm); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(0.0); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Nonlinear Factor",nonlinear_factor); pVector.addParameter("Left BC", left_bc); pVector.addParameter("Right BC", right_bc); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base // class: Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Get sublists Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp_tp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp_lp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp_ep = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); // Change initial guess to a random vector Teuchos::RCP<NOX::Abstract::Vector> xnew = grp_tp->getX().clone(); xnew->random(); grp_tp->setX(*xnew); grp_lp->setX(*xnew); grp_ep->setX(*xnew); // Check some statistics on the solution Teuchos::RCP<NOX::TestCompare> testCompare = Teuchos::rcp(new NOX::TestCompare(globalData->locaUtils->out(), *(globalData->locaUtils))); // Evaluate blocks grp_tp->computeF(); grp_lp->computeF(); grp_ep->computeF(); grp_tp->computeJacobian(); grp_lp->computeJacobian(); grp_ep->computeJacobian(); // Set up left- and right-hand sides Teuchos::RCP<NOX::Abstract::MultiVector> F = grp_tp->getX().createMultiVector(nRHS); F->random(); Teuchos::RCP<NOX::Abstract::MultiVector> X_tp = F->clone(NOX::ShapeCopy); X_tp->init(0.0); Teuchos::RCP<NOX::Abstract::MultiVector> X_lp = F->clone(NOX::ShapeCopy); X_lp->init(0.0); Teuchos::RCP<NOX::Abstract::MultiVector> X_ep = F->clone(NOX::ShapeCopy); X_ep->init(0.0); // Set up residuals Teuchos::RCP<NOX::Abstract::MultiVector> R_tp = F->clone(NOX::ShapeCopy); Teuchos::RCP<NOX::Abstract::MultiVector> R_lp = F->clone(NOX::ShapeCopy); Teuchos::RCP<NOX::Abstract::MultiVector> R_ep = F->clone(NOX::ShapeCopy); // Set up linear solver lists Teuchos::ParameterList lsParams_tp = lsParams; Teuchos::ParameterList lsParams_lp = lsParams; Teuchos::ParameterList lsParams_ep = lsParams; lsParams_tp.set("Transpose Solver Method", "Transpose Preconditioner"); lsParams_lp.set("Transpose Solver Method", "Left Preconditioning"); lsParams_ep.set("Transpose Solver Method", "Explicit Transpose"); NOX::Abstract::Group::ReturnType status; // Test transpose solve with transposed preconditioner if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "\t***** " << "Testing Transposed Preconditioner Residual" << " *****" << std::endl; status = grp_tp->applyJacobianTransposeInverseMultiVector(lsParams_tp, *F, *X_tp); if (status == NOX::Abstract::Group::Failed) ++ierr; status = grp_tp->applyJacobianTransposeMultiVector(*X_tp, *R_tp); ierr += testCompare->testMultiVector(*R_tp, *F, reltol, abstol, "Residual"); // Test transpose solve with transposed left-preconditioner if (lsParams.get("Preconditioner", "None") != "None") { if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "\t***** " << "Testing Transposed Left Preconditioner Residual" << " *****" << std::endl; status = grp_lp->applyJacobianTransposeInverseMultiVector(lsParams_lp, *F, *X_lp); if (status == NOX::Abstract::Group::Failed) ++ierr; status = grp_lp->applyJacobianTransposeMultiVector(*X_lp, *R_lp); ierr += testCompare->testMultiVector(*R_lp, *F, reltol, abstol, "Residual"); } #ifdef HAVE_NOX_EPETRAEXT // Test transpose solve with explicit preconditioner if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "\t***** " << "Testing Explicit Preconditioner Residual" << " *****" << std::endl; status = grp_ep->applyJacobianTransposeInverseMultiVector(lsParams_ep, *F, *X_ep); if (status == NOX::Abstract::Group::Failed) ++ierr; status = grp_ep->applyJacobianTransposeMultiVector(*X_ep, *R_ep); ierr += testCompare->testMultiVector(*R_ep, *F, reltol, abstol, "Residual"); #endif // Compare solutions if (lsParams.get("Preconditioner", "None") != "None") { if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "\t***** " << "Comparing Transposed Preconditioner and Left Preconditioner Solutions" << " *****" << std::endl; ierr += testCompare->testMultiVector(*X_lp, *X_tp, reltol, abstol, "Solution"); } #ifdef HAVE_NOX_EPETRAEXT if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "\t***** " << "Comparing Transposed Preconditioner and Explicit Preconditioner Solutions" << " *****" << std::endl; ierr += testCompare->testMultiVector(*X_ep, *X_tp, reltol, abstol, "Solution"); #endif return ierr; }
int tcubed_test(int NumGlobalElements, bool verbose, Epetra_Comm& Comm, bool includeUV, bool useP, const std::string& prec, const std::string& prec_method) { int ierr = 0; int MyPID = Comm.MyPID(); if (MyPID == 0) { std::cout << "********** " << "Testing includeUV = " << includeUV << " useP = " << useP << " Preconditioner = " << prec << " Preconditioner method = " << prec_method << " **********" << std::endl; } try { double nonlinear_factor = 1.0; double left_bc = 0.0; double right_bc = 2.07; // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. Tcubed_FiniteElementProblem Problem(NumGlobalElements, Comm); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(1.0); // Create initial guess for the null vector of jacobian // Only needed for Moore-Spence Teuchos::RCP<NOX::Abstract::Vector> nullVec = Teuchos::rcp(new NOX::Epetra::Vector(soln)); nullVec->init(1.0); // initial value 1.0 // Begin LOCA Solver ************************************ // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Continuation Method", "Arc Length"); locaStepperList.set("Continuation Parameter", "Nonlinear Factor"); locaStepperList.set("Initial Value", nonlinear_factor); locaStepperList.set("Max Value", 2.0); locaStepperList.set("Min Value", 0.05); locaStepperList.set("Max Steps", 20); locaStepperList.set("Max Nonlinear Iterations", 15); locaStepperList.set("Bordered Solver Method", "Nested"); Teuchos::ParameterList& nestedList = locaStepperList.sublist("Nested Bordered Solver"); nestedList.set("Bordered Solver Method", "Householder"); nestedList.set("Include UV In Preconditioner", includeUV); nestedList.set("Use P For Preconditioner", useP); // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "Turning Point"); bifurcationList.set("Bifurcation Parameter", "Right BC"); bifurcationList.set("Formulation", "Minimally Augmented"); bifurcationList.set("Symmetric Jacobian", false); bifurcationList.set("Update Null Vectors Every Continuation Step", true); bifurcationList.set("Update Null Vectors Every Nonlinear Iteration", false); bifurcationList.set("Transpose Solver Method",prec); bifurcationList.set("Multiply Null Vectors by Mass Matrix", true); // The others don't seem to work with "Solve df/dp" if (prec == "Explicit Transpose") bifurcationList.set("Initial Null Vector Computation", "Solve df/dp"); else { bifurcationList.set("Initial A Vector", nullVec); bifurcationList.set("Initial B Vector", nullVec); } bifurcationList.set("Bordered Solver Method", "Householder"); bifurcationList.set("Include UV In Preconditioner", includeUV); bifurcationList.set("Use P For Preconditioner", useP); bifurcationList.set("Preconditioner Method", prec_method); //bifurcationList.set("Formulation", "Moore-Spence"); //bifurcationList.set("Solver Method", "Phipps Bordering"); //bifurcationList.set("Solver Method", "Salinger Bordering"); //bifurcationList.set("Initial Null Vector", nullVec); //bifurcationList.set("Length Normalization Vector", nullVec); // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); stepSizeList.set("Initial Step Size", 0.1); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 2000.0); stepSizeList.set("Aggressiveness", 0.1); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Create the NOX printing parameter list Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); nlPrintParams.set("Output Precision", 4); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::LinearSolverDetails + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::Error + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create the "Linear Solver" sublist for Newton's method Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 200); lsParams.set("Tolerance", 1e-6); lsParams.set("Output Frequency", 50); //lsParams.set("Scaling", "None"); //lsParams.set("Scaling", "Row Sum"); lsParams.set("Compute Scaling Manually", false); //lsParams.set("Preconditioner", "Ifpack"); lsParams.set("Preconditioner", "New Ifpack"); lsParams.set("Ifpack Preconditioner", "ILU"); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Nonlinear Factor",nonlinear_factor); pVector.addParameter("Left BC", left_bc); pVector.addParameter("Right BC", right_bc); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base class Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::TimeDependent> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Create scaling object Teuchos::RCP<NOX::Epetra::Scaling> scaling = Teuchos::null; // scaling = Teuchos::rcp(new NOX::Epetra::Scaling); // Teuchos::RCP<Epetra_Vector> scalingVector = // Teuchos::rcp(new Epetra_Vector(soln.Map())); // //scaling->addRowSumScaling(NOX::Epetra::Scaling::Left, scalingVector); // scaling->addColSumScaling(NOX::Epetra::Scaling::Right, scalingVector); // Create transpose scaling object // Teuchos::RCP<NOX::Epetra::Scaling> trans_scaling = Teuchos::null; // trans_scaling = Teuchos::rcp(new NOX::Epetra::Scaling); // Teuchos::RCP<Epetra_Vector> transScalingVector = // Teuchos::rcp(new Epetra_Vector(soln.Map())); // trans_scaling->addRowSumScaling(NOX::Epetra::Scaling::Right, // transScalingVector); // trans_scaling->addColSumScaling(NOX::Epetra::Scaling::Left, // transScalingVector); // //bifurcationList.set("Transpose Scaling", trans_scaling); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln, scaling)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, linsys, pVector)); grp->computeF(); // Create the Solver convergence test //NOX::StatusTest::NormWRMS wrms(1.0e-2, 1.0e-8); Teuchos::RCP<NOX::StatusTest::NormF> wrms = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-12)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(locaStepperList.get("Max Nonlinear Iterations", 10))); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(wrms); combo->addStatusTest(maxiters); // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) { ierr = 1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::Epetra::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::Epetra::Group>(stepper.getSolutionGroup()); const NOX::Epetra::Vector& finalSolution = dynamic_cast<const NOX::Epetra::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check number of steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 7; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 0; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double factor_final = finalGroup->getParam("Nonlinear Factor"); double factor_expected = 2.0; ierr += testCompare.testValue(factor_final, factor_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check final value of bifurcation parameter double right_bc_final = finalGroup->getParam("Right BC"); double right_bc_expected = 1.47241293; ierr += testCompare.testValue(right_bc_final, right_bc_expected, 1.0e-7, "final value of bifurcation parameter", NOX::TestCompare::Relative); // Check norm of solution double norm_x = finalSolution.norm(); double norm_x_expected = 12.038464; ierr += testCompare.testValue(norm_x, norm_x_expected, 1.0e-7, "norm of final solution", NOX::TestCompare::Relative); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } return ierr ; }
int main(int argc, char *argv[]) { Teuchos::GlobalMPISession mpi_session(&argc, &argv); int n = 100; double alpha = 0.0; double beta = 0.0; double scale = 1.0; int ierr = 0; int nev = 10; int narn = 20; double arntol = 1.0e-12; alpha = alpha / scale; try { bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) Teuchos::ParameterList& aList = stepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); aList.set("Operator", "Jacobian Inverse"); aList.set("Block Size", 1); aList.set("Num Blocks", narn); aList.set("Num Eigenvalues", nev); aList.set("Convergence Tolerance", arntol); aList.set("Step Size", 1); aList.set("Maximum Restarts",2); aList.set("Sorting Order","LM"); if (verbose) aList.set("Debug Level", Anasazi::Errors + Anasazi::Warnings + Anasazi::FinalSummary); else aList.set("Debug Level", Anasazi::Errors); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create LAPACK factory Teuchos::RCP<LOCA::Abstract::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Create parsed parameter list Teuchos::RCP<LOCA::Parameter::SublistParser> parsedParams = Teuchos::rcp(new LOCA::Parameter::SublistParser(globalData)); parsedParams->parseSublists(paramList); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. LOCA::LAPACK::Group grp(globalData, chan); grp.setParams(p); grp.computeF(); grp.computeJacobian(); // Create Anasazi eigensolver Teuchos::RCP<LOCA::Eigensolver::AbstractStrategy> anasaziStrategy = globalData->locaFactory->createEigensolverStrategy( parsedParams, parsedParams->getSublist("Eigensolver")); Teuchos::RCP< std::vector<double> > anasazi_evals_r; Teuchos::RCP< std::vector<double> > anasazi_evals_i; Teuchos::RCP< NOX::Abstract::MultiVector > anasazi_evecs_r; Teuchos::RCP< NOX::Abstract::MultiVector > anasazi_evecs_i; NOX::Abstract::Group::ReturnType anasaziStatus = anasaziStrategy->computeEigenvalues(grp, anasazi_evals_r, anasazi_evals_i, anasazi_evecs_r, anasazi_evecs_i); if (anasaziStatus != NOX::Abstract::Group::Ok) ++ierr; // Change strategy to DGGEV aList.set("Method", "DGGEV"); aList.set("Sorting Order","SM"); // Create DGGEV eigensolver Teuchos::RCP<LOCA::Eigensolver::AbstractStrategy> dggevStrategy = globalData->locaFactory->createEigensolverStrategy( parsedParams, parsedParams->getSublist("Eigensolver")); Teuchos::RCP< std::vector<double> > dggev_evals_r; Teuchos::RCP< std::vector<double> > dggev_evals_i; Teuchos::RCP< NOX::Abstract::MultiVector > dggev_evecs_r; Teuchos::RCP< NOX::Abstract::MultiVector > dggev_evecs_i; NOX::Abstract::Group::ReturnType dggevStatus = dggevStrategy->computeEigenvalues(grp, dggev_evals_r, dggev_evals_i, dggev_evecs_r, dggev_evecs_i); if (dggevStatus != NOX::Abstract::Group::Ok) ++ierr; // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check eigenvalues for (int i=0; i<nev; i++) { std::stringstream sstr; sstr << "Eigenvalue " << i; ierr += testCompare.testValue((*anasazi_evals_r)[i], (*dggev_evals_r)[i], arntol*1e3, sstr.str(), NOX::TestCompare::Relative); } LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; return ierr; }
int main(int argc, char *argv[]) { int n = 10; int ierr = 0; double reltol = 1.0e-14; double abstol = 1.0e-14; int MyPID = 0; try { // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif MyPID = Comm.MyPID(); // Create the map Epetra_Map map(n, 0, Comm); bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Seed the random number generator in Teuchos. We create random // bordering matrices and it is possible different processors might generate // different matrices. By setting the seed, this shouldn't happen. Teuchos::ScalarTraits<double>::seedrandom(12345); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Param 1", 1.69); pVector.addParameter("Param 2", -9.7); pVector.addParameter("Param 3", 0.35); pVector.addParameter("Param 4", -0.78); pVector.addParameter("Param 5", 2.53); // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList); Epetra_Vector clone_vec(map); NOX::Epetra::Vector nox_clone_vec(clone_vec); Teuchos::RCP<NOX::Abstract::Vector> x = nox_clone_vec.clone(NOX::ShapeCopy); x->random(); Teuchos::RCP<NOX::Abstract::MultiVector> dx1 = nox_clone_vec.createMultiVector(3); Teuchos::RCP<NOX::Abstract::MultiVector> dx2 = nox_clone_vec.createMultiVector(1); Teuchos::RCP<NOX::Abstract::MultiVector> dx3 = nox_clone_vec.createMultiVector(2); Teuchos::RCP<NOX::Abstract::MultiVector> dx4 = nox_clone_vec.createMultiVector(2); dx1->random(); dx2->random(); dx3->init(0.0); dx4->random(); Teuchos::RCP<NOX::Abstract::MultiVector> dx_all = dx1->clone(NOX::DeepCopy); dx_all->augment(*dx2); dx_all->augment(*dx3); dx_all->augment(*dx4); NOX::Abstract::MultiVector::DenseMatrix dp1(dx1->numVectors(), pVector.length()); NOX::Abstract::MultiVector::DenseMatrix dp2(dx2->numVectors(), pVector.length()); NOX::Abstract::MultiVector::DenseMatrix dp3(dx3->numVectors(), pVector.length()); NOX::Abstract::MultiVector::DenseMatrix dp4(dx4->numVectors(), pVector.length()); dp1.random(); dp2.random(); dp3.random(); dp4.random(); NOX::Abstract::MultiVector::DenseMatrix dp_all(dx_all->numVectors(), pVector.length()); for (int j=0; j<dp_all.numCols(); j++) { for (int i=0; i<dp1.numRows(); i++) dp_all(i,j) = dp1(i,j); for (int i=0; i<dp2.numRows(); i++) dp_all(dp1.numRows()+i,j) = dp2(i,j); for (int i=0; i<dp3.numRows(); i++) dp_all(dp1.numRows()+dp2.numRows()+i,j) = dp3(i,j); for (int i=0; i<dp4.numRows(); i++) dp_all(dp1.numRows()+dp2.numRows()+dp3.numRows()+i,j) = dp4(i,j); } std::vector< Teuchos::RCP<LOCA::MultiContinuation::ConstraintInterface> > constraintObjs(4); Teuchos::RCP<LinearConstraint> linear_constraint; linear_constraint = Teuchos::rcp(new LinearConstraint(dx1->numVectors(), pVector, nox_clone_vec)); linear_constraint->setDgDx(*dx1); linear_constraint->setDgDp(dp1); linear_constraint->setIsZeroDX(false); constraintObjs[0] = linear_constraint; linear_constraint = Teuchos::rcp(new LinearConstraint(dx2->numVectors(), pVector, nox_clone_vec)); linear_constraint->setDgDx(*dx2); linear_constraint->setDgDp(dp2); linear_constraint->setIsZeroDX(false); constraintObjs[1] = linear_constraint; linear_constraint = Teuchos::rcp(new LinearConstraint(dx3->numVectors(), pVector, nox_clone_vec)); linear_constraint->setDgDx(*dx3); linear_constraint->setDgDp(dp3); linear_constraint->setIsZeroDX(true); constraintObjs[2] = linear_constraint; linear_constraint = Teuchos::rcp(new LinearConstraint(dx4->numVectors(), pVector, nox_clone_vec)); linear_constraint->setDgDx(*dx4); linear_constraint->setDgDp(dp4); linear_constraint->setIsZeroDX(false); constraintObjs[3] = linear_constraint; // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); LOCA::MultiContinuation::CompositeConstraint composite(globalData, constraintObjs); composite.setX(*x); LinearConstraint combined(dx_all->numVectors(), pVector, nox_clone_vec); combined.setDgDx(*dx_all); combined.setDgDp(dp_all); combined.setX(*x); // // test computeConstraints() // composite.computeConstraints(); combined.computeConstraints(); int numConstraints = dx_all->numVectors(); const NOX::Abstract::MultiVector::DenseMatrix& g_composite = composite.getConstraints(); const NOX::Abstract::MultiVector::DenseMatrix& g_combined = combined.getConstraints(); ierr += testCompare.testMatrix( g_composite, g_combined, reltol, abstol, "CompositeConstraint::computeConstraints()"); // // test computeDP() // std::vector<int> paramIDs(3); paramIDs[0] = 1; paramIDs[1] = 2; paramIDs[2] = 4; NOX::Abstract::MultiVector::DenseMatrix dgdp_composite( numConstraints, paramIDs.size()+1); NOX::Abstract::MultiVector::DenseMatrix dgdp_combined( numConstraints, paramIDs.size()+1); dgdp_composite.putScalar(0.0); dgdp_combined.putScalar(0.0); composite.computeDP(paramIDs, dgdp_composite, false); combined.computeDP(paramIDs, dgdp_combined, false); ierr += testCompare.testMatrix( dgdp_composite, dgdp_combined, reltol, abstol, "CompositeConstraint::computeDP()"); // // test multiplyDX() // composite.computeDX(); combined.computeDX(); int numMultiply = 5; Teuchos::RCP<NOX::Abstract::MultiVector> A = nox_clone_vec.createMultiVector(numMultiply); A->random(); NOX::Abstract::MultiVector::DenseMatrix composite_multiply(numConstraints, numMultiply); NOX::Abstract::MultiVector::DenseMatrix combined_multiply(numConstraints, numMultiply); composite.multiplyDX(2.65, *A, composite_multiply); combined.multiplyDX(2.65, *A, combined_multiply); ierr += testCompare.testMatrix(composite_multiply, combined_multiply, reltol, abstol, "CompositeConstraint::multiplyDX()"); // // test addDX() (No Trans) // int numAdd = 5; NOX::Abstract::MultiVector::DenseMatrix B1(numConstraints, numAdd); B1.random(); NOX::Abstract::MultiVector::DenseMatrix B2(numAdd, numConstraints); B2.random(); Teuchos::RCP<NOX::Abstract::MultiVector> composite_add1 = nox_clone_vec.createMultiVector(numAdd); composite_add1->random(); Teuchos::RCP<NOX::Abstract::MultiVector> composite_add2 = nox_clone_vec.createMultiVector(numAdd); composite_add2->random(); Teuchos::RCP<NOX::Abstract::MultiVector> combined_add1 = composite_add1->clone(NOX::DeepCopy); Teuchos::RCP<NOX::Abstract::MultiVector> combined_add2 = composite_add2->clone(NOX::DeepCopy); composite.addDX(Teuchos::NO_TRANS, 1.45, B1, 2.78, *composite_add1); combined.addDX(Teuchos::NO_TRANS, 1.45, B1, 2.78, *combined_add1); ierr += testCompare.testMultiVector( *composite_add1, *combined_add1, reltol, abstol, "CompositeConstraint::addDX() (No Trans)"); // // test addDX() (Trans) // composite.addDX(Teuchos::TRANS, 1.45, B2, 2.78, *composite_add2); combined.addDX(Teuchos::TRANS, 1.45, B2, 2.78, *combined_add2); ierr += testCompare.testMultiVector( *composite_add2, *combined_add2, reltol, abstol, "CompositeConstraint::addDX() (Trans)"); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (MyPID == 0) { if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; } #ifdef HAVE_MPI MPI_Finalize() ; #endif return ierr; }
int main(int argc, char *argv[]) { int nConstraints = 10; int nRHS = 7; double left_bc = 0.0; double right_bc = 1.0; double nonlinear_factor = 1.0; int ierr = 0; double reltol = 1.0e-8; double abstol = 1.0e-8; double lstol = 1.0e-11; int MyPID = 0; try { // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif // Get the total number of processors MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Get the number of elements from the command line int NumGlobalElements = 0; if ((argc > 2) && (verbose)) NumGlobalElements = atoi(argv[2]) + 1; else if ((argc > 1) && (!verbose)) NumGlobalElements = atoi(argv[1]) + 1; else NumGlobalElements = 101; // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalElements < NumProc) { std::cout << "numGlobalBlocks = " << NumGlobalElements << " cannot be < number of processors = " << NumProc << std::endl; exit(1); } // Seed the random number generator in Teuchos. We create random // bordering matrices and it is possible different processors might generate // different matrices. By setting the seed, this shouldn't happen. Teuchos::ScalarTraits<double>::seedrandom(12345); // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the constraints list Teuchos::ParameterList& constraintsList = locaParamsList.sublist("Constraints"); constraintsList.set("Bordered Solver Method", "Bordering"); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::Details + NOX::Utils::LinearSolverDetails + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create the "Direction" sublist for the "Line Search Based" solver Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 100); lsParams.set("Tolerance", lstol); if (verbose) lsParams.set("Output Frequency", 1); else lsParams.set("Output Frequency", 0); lsParams.set("Scaling", "None"); lsParams.set("Preconditioner", "Ifpack"); //lsParams.set("Preconditioner", "AztecOO"); //lsParams.set("Jacobian Operator", "Matrix-Free"); //lsParams.set("Preconditioner Operator", "Finite Difference"); lsParams.set("Aztec Preconditioner", "ilut"); //lsParams.set("Overlap", 2); //lsParams.set("Fill Factor", 2.0); //lsParams.set("Drop Tolerance", 1.0e-12); lsParams.set("Max Age Of Prec", -2); // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. Tcubed_FiniteElementProblem Problem(NumGlobalElements, Comm); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(0.0); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Nonlinear Factor",nonlinear_factor); pVector.addParameter("Left BC", left_bc); pVector.addParameter("Right BC", right_bc); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base // class: Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create parsed parameter list parsedParams = Teuchos::rcp(new LOCA::Parameter::SublistParser(globalData)); parsedParams->parseSublists(paramList); // Create the Group grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); // Create Jacobian operator op = Teuchos::rcp(new LOCA::BorderedSolver::JacobianOperator(grp)); // Change initial guess to a random vector Teuchos::RCP<NOX::Abstract::Vector> xnew = grp->getX().clone(); xnew->random(); grp->setX(*xnew); // Create the constraints object & constraint param IDs list constraints = Teuchos::rcp(new LinearConstraint(nConstraints, LOCA::ParameterVector(), locaSoln)); // Create bordering solver bordering = globalData->locaFactory->createBorderedSolverStrategy( parsedParams, parsedParams->getSublist("Constraints")); // Change strategy to Householder constraintsList.set("Bordered Solver Method", "Householder"); // Create householder solver householder = globalData->locaFactory->createBorderedSolverStrategy( parsedParams, parsedParams->getSublist("Constraints")); // Check some statistics on the solution testCompare = Teuchos::rcp(new NOX::TestCompare( globalData->locaUtils->out(), *(globalData->locaUtils))); // Evaluate blocks grp->computeF(); grp->computeJacobian(); // A A = grp->getX().createMultiVector(nConstraints); A->random(); // B constraints->setX(grp->getX()); B = grp->getX().createMultiVector(nConstraints); B->random(); constraints->setDgDx(*B); constraints->computeConstraints(); constraints->computeDX(); // C C = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nConstraints)); C->random(); // Set up left- and right-hand sides F = grp->getX().createMultiVector(nRHS); F->random(); G = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nRHS)); G->random(); X_bordering = F->clone(NOX::ShapeCopy); Y_bordering = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nRHS)); X_householder = F->clone(NOX::ShapeCopy); Y_householder = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nRHS)); std::string testName; // Test all nonzero testName = "Testing all nonzero"; ierr += testSolve(false, false, false, false, false, reltol, abstol, testName); // Test A = 0 testName = "Testing A=0"; ierr += testSolve(true, false, false, false, false, reltol, abstol, testName); // Test B = 0 testName = "Testing B=0"; ierr += testSolve(false, true, false, false, false, reltol, abstol, testName); // Test C = 0 testName = "Testing C=0"; ierr += testSolve(false, false, true, false, false, reltol, abstol, testName); // Test F = 0 testName = "Testing F=0"; ierr += testSolve(false, false, false, true, false, reltol, abstol, testName); // Test G = 0 testName = "Testing G=0"; ierr += testSolve(false, false, false, false, true, reltol, abstol, testName); // Test A,B = 0 testName = "Testing A,B=0"; ierr += testSolve(true, true, false, false, false, reltol, abstol, testName); // Test A,F = 0 testName = "Testing A,F=0"; ierr += testSolve(true, false, false, true, false, reltol, abstol, testName); // Test A,G = 0 testName = "Testing A,G=0"; ierr += testSolve(true, false, false, false, true, reltol, abstol, testName); // Test B,F = 0 testName = "Testing B,F=0"; ierr += testSolve(false, true, false, true, false, reltol, abstol, testName); // Test B,G = 0 testName = "Testing B,G=0"; ierr += testSolve(false, true, false, false, true, reltol, abstol, testName); // Test C,F = 0 testName = "Testing C,F=0"; ierr += testSolve(false, false, true, true, false, reltol, abstol, testName); // Test C,G = 0 testName = "Testing C,G=0"; ierr += testSolve(false, false, true, false, true, reltol, abstol, testName); // Test F,G = 0 testName = "Testing F,G=0"; ierr += testSolve(false, false, false, true, true, reltol, abstol, testName); // Test A,B,F = 0 testName = "Testing A,B,F=0"; ierr += testSolve(true, true, false, true, false, reltol, abstol, testName); // Test A,B,G = 0 testName = "Testing A,B,G=0"; ierr += testSolve(true, true, false, false, true, reltol, abstol, testName); // Test A,F,G = 0 testName = "Testing A,F,G=0"; ierr += testSolve(true, false, false, true, true, reltol, abstol, testName); // Test B,F,G = 0 testName = "Testing B,F,G=0"; ierr += testSolve(false, true, false, true, true, reltol, abstol, testName); // Test C,F,G = 0 testName = "Testing C,F,G=0"; ierr += testSolve(false, false, true, true, true, reltol, abstol, testName); // Test A,B,F,G = 0 testName = "Testing A,B,F,G=0"; ierr += testSolve(true, true, false, true, true, reltol, abstol, testName); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (MyPID == 0) { if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; } #ifdef HAVE_MPI MPI_Finalize() ; #endif return ierr; }
int main() { int n = 100; double alpha = 0.25; double beta = 0.0; double D1 = 1.0/40.0; double D2 = 1.0/40.0; int maxNewtonIters = 10; try { // Create output file to save solutions ofstream outFile("BrusselatorContinuation.dat"); outFile.setf(ios::scientific, ios::floatfield); outFile.precision(14); // Save size of discretizations outFile << n << endl; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Method", "Arc Length"); // Default stepperList.set("Continuation Parameter", "beta"); stepperList.set("Initial Value", beta); stepperList.set("Max Value", 2.0); stepperList.set("Min Value", 0.0); stepperList.set("Max Steps", 100); stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Use LAPACK solver for arclength bordered solves for efficiency stepperList.set("Bordered Solver Method", "LAPACK Direct Solve"); // Create Eigensolver list using LAPACK eigensolver stepperList.set("Compute Eigenvalues",true); Teuchos::ParameterList& eigenList = stepperList.sublist("Eigensolver"); eigenList.set("Method", "DGGEV"); // LAPACK eigensolver eigenList.set("NEV", 10); // Show 10 eigenvalues eigenList.set("Sorting Order", "LR"); // Sort by largest real component // Create predictor sublist. We use the constant predictor because the // solution is linear in the continuation parameter. Using Secant or // Tangent is not very interesting, but are perfectly valid Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Constant"); //predictorList.set("Method", "Tangent"); //predictorList.set("Method", "Secant"); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Default stepSizeList.set("Initial Step Size", 0.1); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 10.0); stepSizeList.set("Aggressiveness", 0.1); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("Output Information", NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Create LAPACK Factory (necessary for LAPACK eigensolver) Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface BrusselatorProblemInterface brus(globalData, n, alpha, beta, D1, D2, outFile); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("D1",D1); p.addParameter("D2",D2); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, brus)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> normF = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxIters = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Generic> comboOR = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, normF, maxIters)); // Create the stepper LOCA::Stepper stepper(globalData, grp, comboOR, paramList); // Perform continuation run LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); // Check for convergence if (status == LOCA::Abstract::Iterator::Finished) cout << "All examples passed" << endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } outFile.close(); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { cout << e.what() << endl; } catch (const char *s) { cout << s << endl; } catch (...) { cout << "Caught unknown exception!" << endl; } return 0; }
int main(int argc, char *argv[]) { // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif bool verbose = false; bool success = false; try { // scale factor to test arc-length scaling double scale = 1.0; // Create output file to save solutions std::ofstream outFile("t3.dat"); outFile.setf(ios::scientific, ios::floatfield); outFile.precision(14); int ierr = 0; // Get the process ID and the total number of processors int MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); // Get the number of elements from the command line int NumGlobalElements = 100 + 1; // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalElements < NumProc) { std::cout << "numGlobalBlocks = " << NumGlobalElements << " cannot be < number of processors = " << NumProc << std::endl; exit(1); } // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. FiniteElementProblem Problem(NumGlobalElements, Comm, scale, &outFile); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(1.0); // Begin LOCA Solver ************************************ // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Continuation Method", "Arc Length"); // Default locaStepperList.set("Continuation Parameter", "Right BC"); locaStepperList.set("Initial Value", 0.1/scale); locaStepperList.set("Max Value", 100.0/scale); locaStepperList.set("Min Value", 0.05/scale); locaStepperList.set("Max Steps", 30); locaStepperList.set("Max Nonlinear Iterations", 15); // Use Housholder method for solving bordered arclength equations locaStepperList.set("Bordered Solver Method", "Householder"); #ifdef HAVE_LOCA_ANASAZI // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) locaStepperList.set("Compute Eigenvalues",true); Teuchos::ParameterList& aList = locaStepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); aList.set("Block Size", 1); // Size of blocks aList.set("Num Blocks", 10); // Size of Arnoldi factorization aList.set("Num Eigenvalues", 3); // Number of eigenvalues aList.set("Convergence Tolerance", 2.0e-7); // Tolerance aList.set("Step Size", 1); // How often to check convergence aList.set("Maximum Restarts",2); // Maximum number of restarts aList.set("Verbosity", Anasazi::Errors + Anasazi::Warnings + Anasazi::FinalSummary); // Verbosity #else locaStepperList.set("Compute Eigenvalues",false); #endif // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Default // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Dfault stepSizeList.set("Initial Step Size", 0.1/scale); stepSizeList.set("Min Step Size", 1.0e-3/scale); stepSizeList.set("Max Step Size", 2000.0/scale); stepSizeList.set("Aggressiveness", 0.1); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Create the NOX printing parameter list Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Create the "Linear Solver" sublist for Newton's method Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 100); lsParams.set("Tolerance", 1e-4); lsParams.set("Output Frequency", 1); lsParams.set("Scaling", "None"); lsParams.set("Preconditioner", "Ifpack"); //lsParams.set("Preconditioner", "AztecOO"); //lsParams.set("Jacobian Operator", "Matrix-Free"); //lsParams.set("Preconditioner Operator", "Finite Difference"); //lsParams.set("Aztec Preconditioner", "ilut"); //lsParams.set("Overlap", 2); //lsParams.set("Fill Factor", 2.0); //lsParams.set("Drop Tolerance", 1.0e-12); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Nonlinear Factor",1.0); pVector.addParameter("Left BC", 0.0); pVector.addParameter("Right BC", 0.1); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base class: Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); grp->computeF(); // Create the Solver convergence test Teuchos::RCP<NOX::StatusTest::NormF> wrms = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(locaStepperList.get("Max Nonlinear Iterations", 10))); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(wrms); combo->addStatusTest(maxiters); #ifdef HAVE_TEUCHOS_EXTENDED // Write the parameter list to a file std::cout << "Writing parameter list to \"input.xml\"" << std::endl; Teuchos::writeParameterListToXmlFile(*paramList, "input.xml"); // Read in the parameter list from a file std::cout << "Reading parameter list from \"input.xml\"" << std::endl; Teuchos::RCP<Teuchos::ParameterList> paramList2 = Teuchos::rcp(new Teuchos::ParameterList); Teuchos::updateParametersFromXmlFile("input.xml", paramList2.ptr()); paramList = paramList2; #endif // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status == LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "\nAll tests passed" << std::endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } LOCA::destroyGlobalData(globalData); success = ierr==0; } TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success); #ifdef HAVE_MPI MPI_Finalize() ; #endif return ( success ? EXIT_SUCCESS : EXIT_FAILURE ); }
void cnoxinit(int* nelems, double* statevector, int* mpi_comm_ignored, void* blackbox_res, void* blackbox_prec, void (*residualFunction)(double *, double *, int, void *), void (*precFunction)(double *, double *, int, double*, void *)) { try { TEST_FOR_EXCEPTION(!is_null(solver), logic_error, "Exception: cnoxinit() called with solver!=null: " << "did not cnoxfinish() since last cnoxinit() call!!"); // Create a communicator for Epetra objects Epetra_MpiComm Comm( MPI_COMM_WORLD ); // Get the process ID and the total number of processors int MyPID = Comm.MyPID(); // Begin LOCA Solver ************************************ // // Create and initialize the continuation/bifurcation parameter vector LOCA::ParameterVector pVector; pVector.addParameter("ContinuationParam", 0.0); // Create parameter (options) list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Read in the parameter list from a file cout << "Reading parameter list from \"input.xml\"" << endl; Teuchos::updateParametersFromXmlFile("input.xml", paramList.get()); // Set some default parameters Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Continuation Parameter", "ContinuationParam"); Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlDir = nlParams.sublist("Direction"); Teuchos::ParameterList& nlNewton = nlDir.sublist("Newton"); Teuchos::ParameterList& lsParams = nlNewton.sublist("Linear Solver"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); if (!nlPrintParams.isParameter("Output Information")) nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + // NOX::Utils::OuterIterationStatusTest + // NOX::Utils::InnerIteration + // NOX::Utils::Details + NOX::Utils::LinearSolverDetails // NOX::Utils::Warning + // NOX::Utils::StepperIteration + // NOX::Utils::StepperDetails + // NOX::Utils::StepperParameters ); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base class: interface = Teuchos::rcp(new CNOX_Interface(nelems, statevector, pVector, Comm, blackbox_res, blackbox_prec, residualFunction, precFunction)); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; // Interface is inherited from these 2 classes as well for user prec Teuchos::RCP<NOX::Epetra::Interface::Preconditioner> iPrec = interface; Teuchos::RCP<Epetra_Operator> precOperator = interface; // Create the Epetra_Vector for the state vector Teuchos::RCP<Epetra_Vector> soln = interface->getVector(); // The next 2 statements need to be changed if your interface can // supply a Jacobian matrix!!! See nox examples epetra ..... Teuchos::RCP<NOX::Epetra::MatrixFree> FD = Teuchos::rcp(new NOX::Epetra::MatrixFree(nlPrintParams, interface, soln)); Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = FD; // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iJac, FD, iPrec, precOperator, soln)); /* With a Jacobian, and no user-define preconditioner the previous 3 calls should be: Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(interface->getJacobian(),false) Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln)) */ // Create the loca vector initialGuess = Teuchos::RCP<NOX::Epetra::Vector>(new NOX::Epetra::Vector(soln)); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, *initialGuess, linsys, pVector)); grp->computeF(); // Create the Solver convergence test Teuchos::RCP<NOX::StatusTest::NormF> wrms = Teuchos::rcp(new NOX::StatusTest::NormF(nlParams.get("Convergence Tolerance",1.0e-8))); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(10)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(wrms); combo->addStatusTest(maxiters); Teuchos::RCP<Teuchos::ParameterList> nlParamsRCP = Teuchos::rcp(&nlParams, false); solver = NOX::Solver::buildSolver(grp, combo, nlParamsRCP); } //end try block catch (std::exception& e) { cout << e.what() << endl; } catch (const char *s) { cout << s << endl; } catch (...) { cout << "Caught unknown exception!" << endl; } }
int main(int argc, char *argv[]) { int ierr = 0; try { int n = 100; double alpha = 4.0; double beta = 0.0; double scale = 1.0; int maxNewtonIters = 10; NOX::Random::setSeed(1); bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Create initial guess for the null vector of jacobian Teuchos::RCP<NOX::Abstract::Vector> nullVec = Teuchos::rcp(new NOX::LAPACK::Vector(n)); nullVec->init(1.0); // initial value 1.0 // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Parameter", "beta"); stepperList.set("Initial Value", beta); stepperList.set("Max Value", 1.0); stepperList.set("Min Value", 0.0); stepperList.set("Max Steps", 20); stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "Turning Point"); bifurcationList.set("Bifurcation Parameter", "alpha"); bifurcationList.set("Length Normalization Vector", nullVec); bifurcationList.set("Initial Null Vector", nullVec); // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); Teuchos::ParameterList& firstStepPredictor = predictorList.sublist("First Step Predictor"); firstStepPredictor.set("Method", "Random"); firstStepPredictor.set("Epsilon", 1.0e-3); Teuchos::ParameterList& lastStepPredictor = predictorList.sublist("Last Step Predictor"); lastStepPredictor.set("Method", "Random"); lastStepPredictor.set("Epsilon", 1.0e-3); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Initial Step Size", 0.1); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 1.0); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create LAPACK Factory Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-5, NOX::StatusTest::NormF::Scaled)); Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, statusTestA, statusTestB)); // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); // Solve the nonlinear system LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) { ierr = 1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::LAPACK::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::LAPACK::Group>(stepper.getSolutionGroup()); const NOX::LAPACK::Vector& finalSolution = dynamic_cast<const NOX::LAPACK::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check number of steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 10; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 0; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double beta_final = finalGroup->getParam("beta"); double beta_expected = 0.0; ierr += testCompare.testValue(beta_final, beta_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check final value of turning point parameter double alpha_final = finalGroup->getParam("alpha"); double alpha_expected = 3.1601952; ierr += testCompare.testValue(alpha_final, alpha_expected, 1.0e-5, "final value of turning point parameter", NOX::TestCompare::Relative); // Check norm of solution double norm_x = finalSolution.norm(); double norm_x_expected = 63.1872045; ierr += testCompare.testValue(norm_x, norm_x_expected, 1.0e-4, "norm of final solution", NOX::TestCompare::Relative); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; return ierr; }
int main() { try { int n = 100; double alpha = 4.0; double beta = 0.0; double scale = 1.0; int maxNewtonIters = 10; // Create output file to save solutions std::ofstream outFile("ChanTPContinuation.dat"); outFile.setf(std::ios::scientific, std::ios::floatfield); outFile.precision(14); // Save size of discretizations outFile << n << std::endl; // Create initial guess for the null vector of jacobian Teuchos::RCP<NOX::Abstract::Vector> nullVec = Teuchos::rcp(new NOX::LAPACK::Vector(n)); nullVec->init(1.0); // initial value 1.0 // Create initial values for a and b for minimally augmented method Teuchos::RCP<NOX::Abstract::Vector> a_vec = Teuchos::rcp(new NOX::LAPACK::Vector(n)); a_vec->init(1.0); Teuchos::RCP<NOX::Abstract::Vector> b_vec = Teuchos::rcp(new NOX::LAPACK::Vector(n)); b_vec->init(1.0); // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Method", "Arc Length"); // Default stepperList.set("Continuation Parameter", "beta"); // Must set stepperList.set("Initial Value", beta); // Must set stepperList.set("Max Value", 1.0); // Must set stepperList.set("Min Value", 0.0); // Must set stepperList.set("Max Steps", 20); // Should set stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Should set // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "Turning Point"); // For turning point bifurcationList.set("Bifurcation Parameter", "alpha"); // Must set // For Moore-Spence formulation w/bordering //bifurcationList.set("Formulation", "Moore-Spence"); // Default //bifurcationList.set("Solver Method", "Salinger Bordering"); // Default //bifurcationList.set("Solver Method", "Phipps Bordering"); //bifurcationList.set("Bordered Solver Method", // "LAPACK Direct Solve"); // For Phipps Bordering //bifurcationList.set("Length Normalization Vector", nullVec); // Must set //bifurcationList.set("Initial Null Vector", nullVec); // Must set // For minimally augmented formulation bifurcationList.set("Formulation", "Minimally Augmented"); bifurcationList.set("Initial A Vector", a_vec); // Must set bifurcationList.set("Initial B Vector", b_vec); // Must set // For minimally augmented method, should set these for good performance // Direct solve of bordered equations bifurcationList.set("Bordered Solver Method", "LAPACK Direct Solve"); // Combine arc-length and turning point bordered rows & columns stepperList.set("Bordered Solver Method", "Nested"); Teuchos::ParameterList& nestedList = stepperList.sublist("Nested Bordered Solver"); // Direct solve of combined bordered system nestedList.set("Bordered Solver Method", "LAPACK Direct Solve"); // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Default // Should use for Moore-Spence w/Salinger Bordering & Secant predictor //Teuchos::ParameterList& firstStepPredictor // = predictorList.sublist("First Step Predictor"); //firstStepPredictor.set("Method", "Random"); //firstStepPredictor.set("Epsilon", 1.0e-3); // Should use for Moore-Spence w/Salinger Bordering & Secant predictor //Teuchos::ParameterList& lastStepPredictor // = predictorList.sublist("Last Step Predictor"); //lastStepPredictor.set("Method", "Random"); //lastStepPredictor.set("Epsilon", 1.0e-3); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Default stepSizeList.set("Initial Step Size", 0.1); // Should set stepSizeList.set("Min Step Size", 1.0e-3); // Should set stepSizeList.set("Max Step Size", 1.0); // Should set // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Should set // Create LAPACK Factory Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale, outFile); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-10, NOX::StatusTest::NormF::Scaled)); Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, statusTestA, statusTestB)); // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); // Solve the nonlinear system LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status == LOCA::Abstract::Iterator::Finished) std::cout << "All examples passed" << std::endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } outFile.close(); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; } catch (const char *s) { std::cout << s << std::endl; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; } return 0; }
int main(int argc, char *argv[]) { int nConstraints = 10; int nRHS = 7; int n = 100; double alpha = 1.0; double beta = 0.0; double gamma = 2.0; double scale = 1.0; int ierr = 0; double reltol = 1.0e-9; double abstol = 1.0e-9; alpha = alpha / scale; try { bool verbose = false; // Check for verbose output if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the constraints list Teuchos::ParameterList& constraintsList = locaParamsList.sublist("Constraints"); constraintsList.set("Bordered Solver Method", "Bordering"); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::Error + NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create LAPACK factory Teuchos::RCP<LOCA::Abstract::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object globalData = LOCA::createGlobalData(paramList, lapackFactory); // Create parsed parameter list parsedParams = Teuchos::rcp(new LOCA::Parameter::SublistParser(globalData)); parsedParams->parseSublists(paramList); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("gamma",gamma); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Create Jacobian operator op = Teuchos::rcp(new LOCA::BorderedSolver::JacobianOperator(grp)); // Change initial guess to a random vector Teuchos::RCP<NOX::Abstract::Vector> xnew = grp->getX().clone(); xnew->random(); grp->setX(*xnew); // Create the constraints object & constraint param IDs list constraints = Teuchos::rcp(new LinearConstraint(nConstraints, p, *xnew)); Teuchos::RCP< std::vector<int> > constraintParamIDs = Teuchos::rcp(new std::vector<int>(1)); (*constraintParamIDs)[0] = p.getIndex("alpha"); // Create bordering solver bordering = globalData->locaFactory->createBorderedSolverStrategy( parsedParams, parsedParams->getSublist("Constraints")); // Change strategy to LAPACK Direct Solve constraintsList.set("Bordered Solver Method", "LAPACK Direct Solve"); // Create direct solver direct = globalData->locaFactory->createBorderedSolverStrategy( parsedParams, parsedParams->getSublist("Constraints")); // Check some statistics on the solution testCompare = Teuchos::rcp(new NOX::TestCompare( globalData->locaUtils->out(), *(globalData->locaUtils))); // Evaluate blocks grp->computeF(); grp->computeJacobian(); // A A = grp->getX().createMultiVector(nConstraints); A->random(); // B constraints->setX(grp->getX()); B = grp->getX().createMultiVector(nConstraints); B->random(); constraints->setDgDx(*B); constraints->computeConstraints(); constraints->computeDX(); // C C = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nConstraints)); C->random(); // Set up left- and right-hand sides F = grp->getX().createMultiVector(nRHS); F->random(); G = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nRHS)); G->random(); X_bordering = F->clone(NOX::ShapeCopy); Y_bordering = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nRHS)); X_direct = F->clone(NOX::ShapeCopy); Y_direct = Teuchos::rcp(new NOX::Abstract::MultiVector::DenseMatrix(nConstraints, nRHS)); std::string testName; // Test all nonzero testName = "Testing all nonzero"; ierr += testSolve(false, false, false, false, false, reltol, abstol, testName); // Test A = 0 testName = "Testing A=0"; ierr += testSolve(true, false, false, false, false, reltol, abstol, testName); // Test B = 0 testName = "Testing B=0"; ierr += testSolve(false, true, false, false, false, reltol, abstol, testName); // Test C = 0 testName = "Testing C=0"; ierr += testSolve(false, false, true, false, false, reltol, abstol, testName); // Test F = 0 testName = "Testing F=0"; ierr += testSolve(false, false, false, true, false, reltol, abstol, testName); // Test G = 0 testName = "Testing G=0"; ierr += testSolve(false, false, false, false, true, reltol, abstol, testName); // Test A,B = 0 testName = "Testing A,B=0"; ierr += testSolve(true, true, false, false, false, reltol, abstol, testName); // Test A,F = 0 testName = "Testing A,F=0"; ierr += testSolve(true, false, false, true, false, reltol, abstol, testName); // Test A,G = 0 testName = "Testing A,G=0"; ierr += testSolve(true, false, false, false, true, reltol, abstol, testName); // Test B,F = 0 testName = "Testing B,F=0"; ierr += testSolve(false, true, false, true, false, reltol, abstol, testName); // Test B,G = 0 testName = "Testing B,G=0"; ierr += testSolve(false, true, false, false, true, reltol, abstol, testName); // Test C,F = 0 testName = "Testing C,F=0"; ierr += testSolve(false, false, true, true, false, reltol, abstol, testName); // Test C,G = 0 testName = "Testing C,G=0"; ierr += testSolve(false, false, true, false, true, reltol, abstol, testName); // Test F,G = 0 testName = "Testing F,G=0"; ierr += testSolve(false, false, false, true, true, reltol, abstol, testName); // Test A,B,F = 0 testName = "Testing A,B,F=0"; ierr += testSolve(true, true, false, true, false, reltol, abstol, testName); // Test A,B,G = 0 testName = "Testing A,B,G=0"; ierr += testSolve(true, true, false, false, true, reltol, abstol, testName); // Test A,F,G = 0 testName = "Testing A,F,G=0"; ierr += testSolve(true, false, false, true, true, reltol, abstol, testName); // Test B,F,G = 0 testName = "Testing B,F,G=0"; ierr += testSolve(false, true, false, true, true, reltol, abstol, testName); // Test C,F,G = 0 testName = "Testing C,F,G=0"; ierr += testSolve(false, false, true, true, true, reltol, abstol, testName); // Test A,B,F,G = 0 testName = "Testing A,B,F,G=0"; ierr += testSolve(true, true, false, true, true, reltol, abstol, testName); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; return ierr; }
int main(int argc, char *argv[]) { int ierr = 0; double nonlinear_factor = 1.0; double left_bc = 0.0; double right_bc = 0.40; // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif // Get the process ID and the total number of processors int MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); // Get the number of elements from the command line int NumGlobalElements = 100 + 1; // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalElements < NumProc) { cout << "numGlobalBlocks = " << NumGlobalElements << " cannot be < number of processors = " << NumProc << endl; exit(1); } // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. FiniteElementProblem Problem(NumGlobalElements, Comm); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(0.1); // Create initial guess for the null vector of jacobian Teuchos::RCP<NOX::Abstract::Vector> solnTwo = Teuchos::rcp(new NOX::Epetra::Vector(soln)); solnTwo->init(2.5); // initial value 1.0 // Begin LOCA Solver ************************************ // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Continuation Method", "Natural"); //locaStepperList.set("Bordered Solver Method", "Nested"); //locaStepperList.set("Bordered Solver Method", "Householder"); locaStepperList.set("Continuation Parameter", "Nonlinear Factor"); locaStepperList.set("Initial Value", nonlinear_factor); locaStepperList.set("Max Value", 1.6); locaStepperList.set("Min Value", 0.00); locaStepperList.set("Max Steps", 20); locaStepperList.set("Max Nonlinear Iterations", 15); // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "Phase Transition"); bifurcationList.set("Bifurcation Parameter", "Right BC"); bifurcationList.set("Second Solution Vector", solnTwo); // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Constant"); stepSizeList.set("Initial Step Size", 0.1); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 2000.0); stepSizeList.set("Aggressiveness", 0.1); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Create the NOX printing parameter list Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); nlPrintParams.set("Output Precision", 6); nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::LinearSolverDetails + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Create the "Linear Solver" sublist for Newton's method Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 200); lsParams.set("Tolerance", 1e-6); lsParams.set("Output Frequency", 50); //lsParams.set("Scaling", "None"); //lsParams.set("Scaling", "Row Sum"); lsParams.set("Compute Scaling Manually", false); lsParams.set("Preconditioner", "Ifpack"); lsParams.set("Ifpack Preconditioner", "ILU"); //lsParams.set("Preconditioner", "New Ifpack"); //Teuchos::ParameterList& ifpackParams = lsParams.sublist("Ifpack"); //ifpackParams.set("fact: level-of-fill", 1); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Nonlinear Factor",nonlinear_factor); pVector.addParameter("Left BC", left_bc); pVector.addParameter("Right BC", right_bc); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base class: Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::TimeDependent> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Create scaling object Teuchos::RCP<NOX::Epetra::Scaling> scaling = Teuchos::null; // scaling = Teuchos::rcp(new NOX::Epetra::Scaling); // Teuchos::RCP<Epetra_Vector> scalingVector = // Teuchos::rcp(new Epetra_Vector(soln.Map())); // //scaling->addRowSumScaling(NOX::Epetra::Scaling::Left, scalingVector); // scaling->addColSumScaling(NOX::Epetra::Scaling::Right, scalingVector); // Create transpose scaling object Teuchos::RCP<NOX::Epetra::Scaling> trans_scaling = Teuchos::null; // trans_scaling = Teuchos::rcp(new NOX::Epetra::Scaling); // Teuchos::RCP<Epetra_Vector> transScalingVector = // Teuchos::rcp(new Epetra_Vector(soln.Map())); // trans_scaling->addRowSumScaling(NOX::Epetra::Scaling::Right, // transScalingVector); // trans_scaling->addColSumScaling(NOX::Epetra::Scaling::Left, // transScalingVector); //bifurcationList.set("Transpose Scaling", trans_scaling); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln, scaling)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, linsys, pVector)); // Inject FreeEnergy interface into the group Teuchos::RCP<LOCA::Epetra::Interface::FreeEnergy> iFE = interface; grp->setFreeEnergyInterface(iFE); grp->computeF(); // Create the Solver convergence test //NOX::StatusTest::NormWRMS wrms(1.0e-2, 1.0e-8); Teuchos::RCP<NOX::StatusTest::NormF> wrms = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-12)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(locaStepperList.get("Max Nonlinear Iterations", 10))); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(wrms); combo->addStatusTest(maxiters); // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status == LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "All tests passed" << endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } LOCA::destroyGlobalData(globalData); #ifdef HAVE_MPI MPI_Finalize() ; #endif /* end main */ return ierr ; }
int main(int argc, char *argv[]) { int ierr = 0; int MyPID = 0; double alpha = 0.25; double beta = 1.5; double D1 = 1.0/40.0; double D2 = 1.0/40.0; int maxNewtonIters = 10; try { // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif // Get the process ID and the total number of processors MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); // Check for verbose output bool verbose = false; if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Get the number of elements from the command line int NumGlobalNodes = 0; if ((argc > 2) && (verbose)) NumGlobalNodes = atoi(argv[2]) + 1; else if ((argc > 1) && (!verbose)) NumGlobalNodes = atoi(argv[1]) + 1; else NumGlobalNodes = 101; // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalNodes < NumProc) { std::cout << "numGlobalNodes = " << NumGlobalNodes << " cannot be < number of processors = " << NumProc << std::endl; exit(1); } // Create the Brusselator problem class. This creates all required // Epetra objects for the problem and allows calls to the // function (F) and Jacobian evaluation routines. Brusselator Problem(NumGlobalNodes, Comm); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Begin LOCA Solver ************************************ // Create the top level parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Bordered Solver Method", "Householder"); stepperList.set("Continuation Parameter", "beta"); stepperList.set("Initial Value", beta); stepperList.set("Max Value", 1.6); stepperList.set("Min Value", 0.0); stepperList.set("Max Steps", 100); stepperList.set("Max Nonlinear Iterations", maxNewtonIters); #ifdef HAVE_LOCA_ANASAZI // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) stepperList.set("Compute Eigenvalues",true); Teuchos::ParameterList& aList = stepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); if (!verbose) aList.set("Verbosity", Anasazi::Errors); aList.set("Block Size", 1); // Size of blocks aList.set("Num Blocks", 50); // Size of Arnoldi factorization aList.set("Num Eigenvalues", 3); // Number of eigenvalues aList.set("Convergence Tolerance", 1.0e-7); // Tolerance aList.set("Step Size", 1); // How often to check convergence aList.set("Maximum Restarts",1); // Maximum number of restarts aList.set("Operator", "Cayley"); aList.set("Cayley Pole", 0.1); aList.set("Cayley Zero", -0.1); aList.set("Sorting Order", "CA"); #else stepperList.set("Compute Eigenvalues",false); #endif // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Constant"); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Initial Step Size", 0.01); stepSizeList.set("Min Step Size", 1.0e-3); stepSizeList.set("Max Step Size", 0.01); stepSizeList.set("Aggressiveness", 0.1); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Set the printing parameters in the "Printing" sublist Teuchos::ParameterList& printParams = nlParams.sublist("Printing"); printParams.set("MyPID", MyPID); printParams.set("Output Precision", 3); printParams.set("Output Processor", 0); if (verbose) printParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::Error + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); else printParams.set("Output Information", NOX::Utils::Error); // Sublist for "Linear Solver" Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newtonParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newtonParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 800); lsParams.set("Tolerance", 1e-6); lsParams.set("Output Frequency", 50); lsParams.set("Preconditioner", "Ifpack"); // Create the interface between the test problem and the nonlinear solver Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> A = Teuchos::rcp(&Problem.getJacobian(),false); // Use an Epetra Scaling object if desired Teuchos::RCP<Epetra_Vector> scaleVec = Teuchos::rcp(new Epetra_Vector(soln)); NOX::Epetra::Scaling scaling; scaling.addRowSumScaling(NOX::Epetra::Scaling::Left, scaleVec); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; // Create the Linear System Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, A, soln)); //&scaling); Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> shiftedLinSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, A, soln)); // Create initial guess NOX::Epetra::Vector initialGuess(Teuchos::rcp(&soln,false), NOX::Epetra::Vector::CreateView, NOX::DeepCopy); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("alpha",alpha); pVector.addParameter("beta",beta); pVector.addParameter("D1",D1); pVector.addParameter("D2",D2); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Interface::TimeDependent> iTime = interface; Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, printParams, iTime, initialGuess, linSys, shiftedLinSys, pVector)); grp->computeF(); // Create the convergence tests Teuchos::RCP<NOX::StatusTest::NormF> absresid = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8, NOX::StatusTest::NormF::Unscaled)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(absresid); combo->addStatusTest(maxiters); // Create stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) { ierr = 1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::Epetra::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::Epetra::Group>(stepper.getSolutionGroup()); const NOX::Epetra::Vector& finalSolution = dynamic_cast<const NOX::Epetra::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check number of continuation steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 11; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 0; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double beta_final = finalGroup->getParam("beta"); double beta_expected = 1.6; ierr += testCompare.testValue(beta_final, beta_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check final of solution NOX::Epetra::Vector final_x_expected(finalSolution); int n = final_x_expected.getEpetraVector().MyLength()/2; for (int i=0; i<n; i++) { final_x_expected.getEpetraVector()[2*i] = alpha; final_x_expected.getEpetraVector()[2*i+1] = beta_final/alpha; } ierr += testCompare.testVector(finalSolution, final_x_expected, 1.0e-6, 1.0e-6, "value of final solution"); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (MyPID == 0) { if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; } #ifdef HAVE_MPI MPI_Finalize() ; #endif return ierr; }
int main(int argc, char *argv[]) { // Initialize MPI Teuchos::GlobalMPISession mpiSession(&argc,&argv); int ierr = 0; int MyPID = 0; double alpha = 1.00; // stable steady state double beta = BETA_INIT; double D1 = 1.0/40.0; double D2 = 1.0/40.0; int NumGlobalNodes = 10; // default int spatialProcs = 1; // default int numTimeSteps = 100; // default try { // Check for verbose output bool verbose = false; if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Get the number of elements from the command line if ((argc > 2) && (verbose)) NumGlobalNodes = atoi(argv[2]) + 1; else if ((argc > 1) && (!verbose)) NumGlobalNodes = atoi(argv[1]) + 1; // Get the number of processors to use for the spatial problem if ((argc > 3) && (verbose)) spatialProcs = atoi(argv[3]); else if ((argc > 2) && (!verbose)) spatialProcs = atoi(argv[2]); // Get the number of processors to use for the spatial problem if ((argc > 4) && (verbose)) numTimeSteps = atoi(argv[4]); else if ((argc > 3) && (!verbose)) numTimeSteps = atoi(argv[3]); // MPI MANIPULATION FOR XYZT PROBLEMS #ifdef HAVE_MPI Teuchos::RCP<EpetraExt::MultiMpiComm> globalComm = Teuchos::rcp(new EpetraExt::MultiMpiComm(MPI_COMM_WORLD, spatialProcs, numTimeSteps)); #else Teuchos::RCP<EpetraExt::MultiSerialComm> globalComm = Teuchos::rcp(new EpetraExt::MultiSerialComm(numTimeSteps)); #endif Epetra_Comm& Comm = globalComm->SubDomainComm(); MyPID = globalComm->MyPID(); // Get the total number of processors int NumProc = Comm.NumProc(); // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalNodes < NumProc) { std::cout << "numGlobalNodes = " << NumGlobalNodes << " cannot be < number of processors = " << NumProc << std::endl; exit(1); } // Create the Brusselator problem class. This creates all required // Epetra objects for the problem and allows calls to the // function (F) and Jacobian evaluation routines. Brusselator::OverlapType OType = Brusselator::ELEMENTS; Brusselator Problem(NumGlobalNodes, Comm, OType); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Begin Nonlinear Solver ************************************ // Create the top level parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); getParamList(&(*paramList), MyPID); // Sublist for "Linear Solver" Teuchos::ParameterList& lsParams = paramList->sublist("NOX").sublist("Direction").sublist("Newton").sublist("Linear Solver"); // Sublist for "Printing" Teuchos::ParameterList& printParams = paramList->sublist("NOX").sublist("Printing"); // Change NOX priting settings if "-verbose" not requested if (!verbose) printParams.set("Output Information", NOX::Utils::Error); // Create the interface between the test problem and the nonlinear solver Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> A = Teuchos::rcp(&Problem.getJacobian(),false); // Create initial guess Epetra_MultiVector initGuess(soln.Map(), globalComm->NumTimeStepsOnDomain()); for (int i=0; i<globalComm->NumTimeStepsOnDomain(); i++) *(initGuess(i)) = soln; // Get XYZT preconditioner linear solver parameters Teuchos::RCP<Teuchos::ParameterList> precLSParams = Teuchos::rcp(new Teuchos::ParameterList); getPrecLSParams(&(*precLSParams), MyPID); // Get XYZT preconditioner print parameters Teuchos::RCP<Teuchos::ParameterList> precPrintParams = Teuchos::rcp(new Teuchos::ParameterList); getPrecPrintParams(&(*precPrintParams), MyPID); // Change xyztPrec priting settings if "-verbose" not requested if (!verbose) precPrintParams->set("Output Information", NOX::Utils::Error); // Create the XYZT object Teuchos::RCP<LOCA::Epetra::Interface::xyzt> ixyzt = Teuchos::rcp(new LOCA::Epetra::Interface::xyzt(interface, initGuess, A, globalComm, soln, 0.5, precPrintParams.get(), precLSParams.get())); // Create the XYZT operator, solution, and preconditioner Teuchos::RCP<Epetra_RowMatrix> Axyzt = Teuchos::rcp(&(ixyzt->getJacobian()),false); Epetra_Vector& solnxyzt = ixyzt->getSolution(); Teuchos::RCP<Epetra_Operator> Mxyzt = Teuchos::rcp(&(ixyzt->getPreconditioner()),false); // Create the Linear System Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = ixyzt; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = ixyzt; Teuchos::RCP<NOX::Epetra::Interface::Preconditioner> iPrec = Teuchos::rcp(&(ixyzt->getPreconditioner()),false); Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iJac, Axyzt, iPrec, Mxyzt, solnxyzt)); // Create full xyzt initial guess NOX::Epetra::Vector initialGuess(solnxyzt); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("alpha",alpha); pVector.addParameter("beta",beta); pVector.addParameter("D1",D1); pVector.addParameter("D2",D2); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, printParams, iReq, initialGuess, linSys, pVector)); grp->computeF(); // Create the convergence tests Teuchos::RCP<NOX::StatusTest::NormF> absresid = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8, NOX::StatusTest::NormF::Unscaled)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(MAX_NEWTON_ITERS)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(absresid); combo->addStatusTest(maxiters); // Create stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) { ierr =1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::Epetra::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::Epetra::Group>(stepper.getSolutionGroup()); const NOX::Epetra::Vector& finalSolution = dynamic_cast<const NOX::Epetra::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check number of continuation steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 3; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 0; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double beta_final = finalGroup->getParam("beta"); double beta_expected = 2.0; ierr += testCompare.testValue(beta_final, beta_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check final value of ||F|| double Fnorm_final = (const_cast<Teuchos::ParameterList&>(*stepper.getList()).sublist("NOX").sublist("Output").get("2-Norm of Residual",1.0e+10)); double Fnorm_expected = 0.0; ierr += testCompare.testValue(Fnorm_final, Fnorm_expected, 1.0e-8, "final value of ||F||", NOX::TestCompare::Absolute); // Check number of nonlinear iterations on last continuation step int nonlin_final = (const_cast<Teuchos::ParameterList&>(*stepper.getList()).sublist("NOX"). sublist("Output").get("Nonlinear Iterations",MAX_NEWTON_ITERS)); int nonlin_expected = 4; ierr += testCompare.testValue(nonlin_final, nonlin_expected, 0.0, "number of nonlinear iterations on last continuation step", NOX::TestCompare::Absolute); // initialize solution comparison norm on all procs double solution_diff_norm = 0.0; // Compute norm of difference of computed solution - expected solution if (globalComm->MyPID() == (globalComm->NumProc()-1)) { // Get solution at last time step ixyzt->getSolution().ExtractBlockValues(soln, (globalComm->NumTimeStepsOnDomain() + globalComm->FirstTimeStepOnDomain() - 1)); // Check final solution at final time step NOX::Epetra::Vector final_solution(soln); NOX::Epetra::Vector final_x_expected(final_solution); for (int i=0; i<NumGlobalNodes; i++) { final_x_expected.getEpetraVector()[2*i] = alpha; final_x_expected.getEpetraVector()[2*i+1] = beta_final/alpha; } solution_diff_norm = testCompare.computeVectorNorm(final_solution, final_x_expected, 1.0e-4, 1.0e-4); } // Check final solution at final time step on all procs globalComm->Broadcast(&solution_diff_norm, 1, globalComm->NumProc()-1); double solution_diff_norm_expected = 0.0; ierr += testCompare.testValue(solution_diff_norm, solution_diff_norm_expected, 1.0e-4, "inf norm of (solution_final - solution_expected) at last time step", NOX::TestCompare::Absolute); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; ierr = 1; } catch (const char *s) { std::cout << s << std::endl; ierr = 1; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; ierr = 1; } if (MyPID == 0) { if (ierr == 0) std::cout << "All tests passed!" << std::endl; else std::cout << ierr << " test(s) failed!" << std::endl; } return ierr; }
int main( int argc, char **argv ) { // check for parallel computation #ifdef HAVE_MPI MPI_Init(&argc, &argv); Epetra_MpiComm Comm(MPI_COMM_WORLD); #else Epetra_SerialComm Comm; #endif // define main parameters double c = 0.9999; // continuation parameter int N = 50; // number of grid points int maxNewtonIters = 20; // max number of Newton iterations int maxSteps = 50; // max number of continuation steps taken int ilocal, iglobal; // counter variables used for loops: // ilocal = counter for local elements on this processor; // iglobal = counter to signify global position across all procs int Myele; // holds the number of elements on the processor // Set flag for whether the computations will be Matrix-free (true) or will use a computed // Jacobian (false) bool doMatFree = false; // Create output file to save solutions ofstream outFile("Heq5.dat"); outFile.setf(ios::scientific, ios::floatfield); outFile.precision(10); // Define the problem class HeqProblem Problem(N,&Comm,outFile); // Build initial guess. The initial guess should be a solution vector x close to the // bifurcation point. // Create the initial guess vector Epetra_Vector InitialGuess(Problem.GetMap()); // Get the number of elements on this processor Myele = Problem.GetMap().NumMyElements(); // Compute the initial guess. For this example, it is a line from (0,1) to (1,8/3) for (ilocal=0; ilocal<Myele; ilocal++) { iglobal=Problem.GetMap().GID(ilocal); InitialGuess[ilocal]= 1.0 + (5.0*iglobal)/(3.0*(N-1)); } // Create the null vector for the Jacobian (ie, J*v=0, used to solve the system of equations // f(x,p)=0; J*v=0; v0*v=1. The solution of the system is [x*,v*,p*]. ) Teuchos::RCP<NOX::Abstract::Vector> nullVec = Teuchos::rcp(new NOX::Epetra::Vector(InitialGuess)); // Initialize to all ones nullVec->init(1.0); // NOTE: init is a function within the NOX::Abstract:Vector class which initializes every // value of the vector to the value within the parentheses (must be in 'double' format) // Create the top level parameter list Teuchos::RCP<Teuchos::ParameterList> ParamList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = ParamList->sublist("LOCA"); // Create the sublist for continuation and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); //stepperList.set("Continuation Method", "Arc Length");// Default stepperList.set("Continuation Method", "Natural"); stepperList.set("Continuation Parameter", "dummy"); // Must set stepperList.set("Initial Value", 999.0); // Must set stepperList.set("Max Value", 50.0e4); // Must set stepperList.set("Min Value", 0.0); // Must set stepperList.set("Max Steps", maxSteps); // Should set stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Should set stepperList.set("Bordered Solver Method", "Bordering"); // Teuchos::ParameterList& nestedList = // stepperList.sublist("Nested Bordered Solver"); // nestedList.set("Bordered Solver Method", "Householder"); // nestedList.set("Include UV In Preconditioner", true); // //nestedList.set("Use P For Preconditioner", true); // nestedList.set("Preconditioner Method", "SMW"); // Set up parameters to compute Eigenvalues #ifdef HAVE_LOCA_ANASAZI // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) stepperList.set("Compute Eigenvalues",true); Teuchos::ParameterList& aList = stepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); aList.set("Block Size", 1); // Size of blocks aList.set("Num Blocks", 20); // Size of Arnoldi factorization aList.set("Num Eigenvalues", 5); // Number of eigenvalues // aList.set("Sorting Order", "SR"); aList.set("Convergence Tolerance", 2.0e-7); // Tolerance aList.set("Step Size", 1); // How often to check convergence aList.set("Maximum Restarts",2); // Maximum number of restarts aList.set("Verbosity", Anasazi::Errors + Anasazi::Warnings + Anasazi::FinalSummary); // Verbosity #else stepperList.set("Compute Eigenvalues",false); #endif // Create bifurcation sublist. Note that for turning point continuation, the "type" // is set to "Turning Point". If not doing TP, type should be "None". Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "Turning Point"); bifurcationList.set("Bifurcation Parameter", "c"); // bifurcationList.set("Formulation", "Minimally Augmented"); bifurcationList.set("Symmetric Jacobian", false); bifurcationList.set("Update Null Vectors Every Continuation Step", true); bifurcationList.set("Update Null Vectors Every Nonlinear Iteration", false); bifurcationList.set("Transpose Solver Method","Explicit Transpose"); // bifurcationList.set("Transpose Solver Method","Transpose Preconditioner"); // bifurcationList.set("Transpose Solver Method","Left Preconditioning"); bifurcationList.set("Initial Null Vector Computation", "Solve df/dp"); // bifurcationList.set("Initial A Vector", nullVec); // minimally augmented // bifurcationList.set("Initial B Vector", nullVec); //minimally augmented // bifurcationList.set("Bordered Solver Method", "Householder"); // bifurcationList.set("Include UV In Preconditioner", true); // //bifurcationList.set("Use P For Preconditioner", true); // bifurcationList.set("Preconditioner Method", "SMW"); bifurcationList.set("Formulation", "Moore-Spence"); bifurcationList.set("Solver Method", "Phipps Bordering"); // better for nearly singular matrices // bifurcationList.set("Solver Method", "Salinger Bordering"); bifurcationList.set("Initial Null Vector", nullVec); bifurcationList.set("Length Normalization Vector", nullVec); // Create the sublist for the predictor Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Default // predictorList.set("Method", "Constant"); // Other options // predictorList.set("Method", "Tangent"); // Other options // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Default stepSizeList.set("Initial Step Size", 0.1); // Should set stepSizeList.set("Min Step Size", 1.0e-6); // Should set stepSizeList.set("Max Step Size", 1.0); // Should set stepSizeList.set("Aggressiveness", 0.1); // Set up NOX info Teuchos::ParameterList& nlParams = ParamList->sublist("NOX"); // Set the nonlinear solver method nlParams.set("Nonlinear Solver", "Line Search Based"); // Set the printing parameters in the "Printing" sublist. This list determines how much // of the NOX information is output Teuchos::ParameterList& printParams = nlParams.sublist("Printing"); printParams.set("MyPID", Comm.MyPID()); printParams.set("Output Precision", 5); printParams.set("Output Processor", 0); printParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::LinearSolverDetails + NOX::Utils::Parameters + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // NOX parameters - Sublist for line search Teuchos::ParameterList& searchParams = nlParams.sublist("Line Search"); searchParams.set("Method", "Backtrack"); // searchParams.set("Method", "Full Step"); // Sublist for direction Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); dirParams.set("Method", "Newton"); Teuchos::ParameterList& newtonParams = dirParams.sublist("Newton"); newtonParams.set("Forcing Term Method", "Constant"); // Sublist for linear solver for the Newton method Teuchos::ParameterList& lsParams = newtonParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 800); lsParams.set("Tolerance", 1e-8); lsParams.set("Output Frequency", 1); lsParams.set("Preconditioner", "None"); // lsParams.set("Preconditioner", "AztecOO"); // lsParams.set("Aztec Preconditioner", "ilu"); // lsParams.set("Scaling", "None"); // lsParams.set("Scaling", "Row Sum"); lsParams.set("Compute Scaling Manually", false); // lsParams.set("Preconditioner", "Ifpack"); // lsParams.set("Ifpack Preconditioner", "ILU"); // lsParams.set("Preconditioner", "New Ifpack"); // Teuchos::ParameterList& ifpackParams = lsParams.sublist("Ifpack"); // ifpackParams.set("fact: level-of-fill", 1); // Set up the continuation parameter vector LOCA::ParameterVector p; p.addParameter("c",c); p.addParameter("dummy",999.0); // Create the problem interface Teuchos::RCP<SimpleProblemInterface> interface = Teuchos::rcp(new SimpleProblemInterface(&Problem,c) ); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; // Create the operator to hold either the Jacobian matrix or the Matrix-free operator Teuchos::RCP<Epetra_Operator> A; // Teuchos::RCP<Epetra_RowMatrix> A; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac; // Need a NOX::Epetra::Vector for constructor // This becomes the initial guess vector that is used for the nonlinear solves NOX::Epetra::Vector noxInitGuess(InitialGuess, NOX::DeepCopy); if (doMatFree) { // Matrix Free application (Epetra Operator): Teuchos::RCP<NOX::Epetra::MatrixFree> MF = Teuchos::rcp(new NOX::Epetra::MatrixFree(printParams, interface, noxInitGuess)); A = MF; iJac = MF; } else { // Computed Jacobian application A = Teuchos::rcp( Problem.GetMatrix(), false ); iJac = interface; } // Create scaling object Teuchos::RCP<NOX::Epetra::Scaling> scaling = Teuchos::null; // scaling = Teuchos::rcp(new NOX::Epetra::Scaling); // Teuchos::RCP<Epetra_Vector> scalingVector = // Teuchos::rcp(new Epetra_Vector(soln.Map())); // //scaling->addRowSumScaling(NOX::Epetra::Scaling::Left, scalingVector); // scaling->addColSumScaling(NOX::Epetra::Scaling::Right, scalingVector); // Create transpose scaling object Teuchos::RCP<NOX::Epetra::Scaling> trans_scaling = Teuchos::null; // trans_scaling = Teuchos::rcp(new NOX::Epetra::Scaling); // Teuchos::RCP<Epetra_Vector> transScalingVector = // Teuchos::rcp(new Epetra_Vector(soln.Map())); // trans_scaling->addRowSumScaling(NOX::Epetra::Scaling::Right, // transScalingVector); // trans_scaling->addColSumScaling(NOX::Epetra::Scaling::Left, // transScalingVector); //bifurcationList.set("Transpose Scaling", trans_scaling); // Build the linear system solver Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, A, noxInitGuess, scaling)); // use if scaling // noxInitGuess)); // use if no scaling // Create the Loca (continuation) vector NOX::Epetra::Vector locaSoln(noxInitGuess); // Create Epetra Factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(ParamList, epetraFactory); // Create the Group - must be LOCA group Teuchos::RCP<LOCA::Epetra::Group> grpPtr = Teuchos::rcp(new LOCA::Epetra::Group(globalData, printParams, iReq, locaSoln, linSys, p)); // Calculate the first F(x0) as a starting point. This is only needed for // certain status tests, to ensure that an initial residual (|r0|) is calculated grpPtr->computeF(); // Set up the status tests to check for convergence // Determines the error tolerance for the Newton solves Teuchos::RCP<NOX::StatusTest::NormF> testNormF = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-4)); // Sets the max number of nonlinear (Newton) iterations that will be taken. If this is not // already set, it will default to the '20' given Teuchos::RCP<NOX::StatusTest::MaxIters> testMaxIters = Teuchos::rcp(new NOX::StatusTest::MaxIters(stepperList.get("Max Nonlinear Iterations", 20))); // This combination of tests will be used by NOX to determine whether the step converged Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, testNormF, testMaxIters)); // This is sample code to write and read parameters to/from a file. Currently not activated! // To use, change the 'XXXHAVE_TEUCHOS_EXTENDED' TO 'HAVE_TEUCHOS_EXTENDED' #ifdef XXXHAVE_TEUCHOS_EXTENDED // Write the parameter list to a file cout << "Writing parameter list to \"input.xml\"" << endl; Teuchos::writeParameterListToXmlFile(*ParamList, "input.xml"); // Read in the parameter list from a file cout << "Reading parameter list from \"input.xml\"" << endl; Teuchos::RCP<Teuchos::ParameterList> paramList2 = Teuchos::rcp(new Teuchos::ParameterList); Teuchos::updateParametersFromXmlFile("input.xml", paramList2.get()); ParamList = paramList2; #endif // Create the stepper LOCA::Stepper stepper(globalData, grpPtr, combo, ParamList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); // Check if the stepper completed if (status == LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "\nAll tests passed!" << endl; else if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "\nStepper failed to converge!" << endl; // Output the stepper parameter list info if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << endl << "Final Parameters" << endl << "*******************" << endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << endl; } // Make sure all processors are done and close the output file Comm.Barrier(); outFile.close(); // Deallocate memory LOCA::destroyGlobalData(globalData); #ifdef HAVE_MPI MPI_Finalize(); #endif return(EXIT_SUCCESS); } // DONE!!
int main() { int n = 100; double alpha = 3.5; double beta = 0.0; double scale = 1.0; int maxNewtonIters = 10; alpha = alpha / scale; // These seeds were found to work -- not the first try int seed1 = 3; int seed2 = 4; //Subsequent seeds keep incrementing by seed2-seed1 double homScale = -1.0; /* Uncomment for interactive mode std::cout << "Input first seed" << endl; std::cin >> seed1; std::cout << "Input second seed" << endl; std::cin >> seed2; std::cout << "Input identity-scale" << endl; std::cin >> homScale; */ try { // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("Output Information", NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::Error + NOX::Utils::Parameters + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Create LAPACK Factory Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::LAPACK::Group> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> statusTestA = Teuchos::rcp(new NOX::StatusTest::NormF(*grp, 1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> statusTestB = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, statusTestA, statusTestB)); // Create the homotopy group // Teuchos::RCP<LOCA::Homotopy::Group> hGrp = // Teuchos::rcp(new LOCA::Homotopy::Group(locaParamsList, globalData, grp)); Teuchos::RCP<Teuchos::ParameterList> hParams = Teuchos::rcp(&locaParamsList.sublist("Homotopy"),false); hParams->set("Bordered Solver Method", "LAPACK Direct Solve"); Teuchos::RCP<NOX::Abstract::Vector> startVec = grp->getX().clone(NOX::ShapeCopy); startVec->random(true, seed1); /* Always use same seed for testing */ startVec->abs(*startVec); std::vector< Teuchos::RCP<const NOX::Abstract::Vector> > solns; LOCA::Abstract::Iterator::IteratorStatus status = LOCA::Abstract::Iterator::Finished; int deflationIter = 0; const int maxDeflationIters = 4; while (deflationIter < maxDeflationIters && status==LOCA::Abstract::Iterator::Finished) { // ToDo: Add deflateAndReset(vec) to Homotopy group, // including option to perturb startVec Teuchos::RCP<LOCA::Homotopy::DeflatedGroup> hGrp = Teuchos::rcp(new LOCA::Homotopy::DeflatedGroup(globalData, paramList, hParams, grp, startVec, solns,homScale)); // Override default parameters stepperList.set("Max Nonlinear Iterations", maxNewtonIters); stepperList.set("Continuation Method", "Arc Length"); stepperList.set("Max Steps", 100); stepSizeList.set("Min Step Size", 1.0e-5); // Create the stepper LOCA::Stepper stepper(globalData, hGrp, combo, paramList); // Solve the nonlinear system status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; else { // Deflate with soln vector just solved for solns.push_back(grp->getX().clone(NOX::DeepCopy)); // If seed1=seed2, then all seeds the same. Otherwise, keep incrementing seed startVec->random(true, seed2 + deflationIter*(seed2-seed1)); } deflationIter++; // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters for deflation iter " << deflationIter << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } } //End While loop over delfation iters LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; } catch (const char *s) { std::cout << s << std::endl; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; } cout << "All examples passed" << endl; return 0; }
int main() { int n = 100; double alpha = 0.0; double beta = 0.0; double scale = 1.0; int maxNewtonIters = 20; alpha = alpha / scale; try { // Create output file to save solutions std::ofstream outFile("ChanContinuation.dat"); outFile.setf(std::ios::scientific, std::ios::floatfield); outFile.precision(14); // Save size of discretizations outFile << n << std::endl; // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& stepperList = locaParamsList.sublist("Stepper"); stepperList.set("Continuation Method", "Arc Length");// Default //stepperList.set("Continuation Method", "Natural"); stepperList.set("Continuation Parameter", "alpha"); // Must set stepperList.set("Initial Value", alpha); // Must set stepperList.set("Max Value", 5.0/scale); // Must set stepperList.set("Min Value", 0.0/scale); // Must set stepperList.set("Max Steps", 50); // Should set stepperList.set("Max Nonlinear Iterations", maxNewtonIters); // Should set stepperList.set("Compute Eigenvalues",false); // Default // Create bifurcation sublist Teuchos::ParameterList& bifurcationList = locaParamsList.sublist("Bifurcation"); bifurcationList.set("Type", "None"); // Default // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Secant"); // Default //predictorList.set("Method", "Constant"); //predictorList.set("Method", "Tangent"); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Method", "Adaptive"); // Default stepSizeList.set("Initial Step Size", 0.1/scale); // Should set stepSizeList.set("Min Step Size", 1.0e-3/scale); // Should set stepSizeList.set("Max Step Size", 10.0/scale); // Should set // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("Output Information", NOX::Utils::Details + NOX::Utils::OuterIteration + NOX::Utils::InnerIteration + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Should set // Create LAPACK Factory Teuchos::RCP<LOCA::LAPACK::Factory> lapackFactory = Teuchos::rcp(new LOCA::LAPACK::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, lapackFactory); // Set up the problem interface ChanProblemInterface chan(globalData, n, alpha, beta, scale, outFile); LOCA::ParameterVector p; p.addParameter("alpha",alpha); p.addParameter("beta",beta); p.addParameter("scale",scale); // Create a group which uses that problem interface. The group will // be initialized to contain the default initial guess for the // specified problem. Teuchos::RCP<LOCA::MultiContinuation::AbstractGroup> grp = Teuchos::rcp(new LOCA::LAPACK::Group(globalData, chan)); grp->setParams(p); // Set up the status tests Teuchos::RCP<NOX::StatusTest::NormF> normF = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxIters = Teuchos::rcp(new NOX::StatusTest::MaxIters(maxNewtonIters)); Teuchos::RCP<NOX::StatusTest::Generic> comboOR = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, normF, maxIters)); // Create the stepper LOCA::Stepper stepper(globalData, grp, comboOR, paramList); // Perform continuation run LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); // Check for convergence if (status == LOCA::Abstract::Iterator::Finished) std::cout << "All examples passed" << std::endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::LAPACK::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::LAPACK::Group>(stepper.getSolutionGroup()); const NOX::LAPACK::Vector& finalSolution = dynamic_cast<const NOX::LAPACK::Vector&>(finalGroup->getX()); // Print final solution globalData->locaUtils->out() << std::endl << "Final solution is " << std::endl; finalGroup->printSolution(finalSolution, finalGroup->getParam("alpha")); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } outFile.close(); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { std::cout << e.what() << std::endl; } catch (const char *s) { std::cout << s << std::endl; } catch (...) { std::cout << "Caught unknown exception!" << std::endl; } return 0; }
int main(int argc, char *argv[]) { int ierr = 0; int MyPID = 0; try { // scale factor to test arc-length scaling double scale = 1.0; // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif // Get the process ID and the total number of processors MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); // Check for verbose output bool verbose = false; if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true; // Get the number of elements from the command line int NumGlobalElements = 0; if ((argc > 2) && (verbose)) NumGlobalElements = atoi(argv[2]) + 1; else if ((argc > 1) && (!verbose)) NumGlobalElements = atoi(argv[1]) + 1; else NumGlobalElements = 101; // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalElements < NumProc) { cout << "numGlobalBlocks = " << NumGlobalElements << " cannot be < number of processors = " << NumProc << endl; exit(1); } // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. Tcubed_FiniteElementProblem Problem(NumGlobalElements, Comm, scale); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(1.0); // Begin LOCA Solver ************************************ // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Bordered Solver Method", "Householder"); locaStepperList.set("Continuation Parameter", "Right BC"); locaStepperList.set("Initial Value", 0.1/scale); locaStepperList.set("Max Value", 100.0/scale); locaStepperList.set("Min Value", 0.05/scale); locaStepperList.set("Max Steps", 30); locaStepperList.set("Max Nonlinear Iterations", 15); #ifdef HAVE_LOCA_ANASAZI // Create Anasazi Eigensolver sublist (needs --with-loca-anasazi) locaStepperList.set("Compute Eigenvalues",true); Teuchos::ParameterList& aList = locaStepperList.sublist("Eigensolver"); aList.set("Method", "Anasazi"); if (!verbose) aList.set("Verbosity", Anasazi::Errors); #else locaStepperList.set("Compute Eigenvalues",false); #endif // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Tangent"); // Create step size sublist Teuchos::ParameterList& stepSizeList = locaParamsList.sublist("Step Size"); stepSizeList.set("Initial Step Size", 0.1/scale); stepSizeList.set("Min Step Size", 1.0e-3/scale); stepSizeList.set("Max Step Size", 2000.0/scale); stepSizeList.set("Aggressiveness", 0.1); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Create the NOX printing parameter list Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); if (verbose) nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + //NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::TestDetails + NOX::Utils::Error + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); else nlPrintParams.set("Output Information", NOX::Utils::Error); // Create the "Linear Solver" sublist Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 100); lsParams.set("Tolerance", 1e-4); if (verbose) lsParams.set("Output Frequency", 1); else lsParams.set("Output Frequency", 0); lsParams.set("Scaling", "None"); lsParams.set("Preconditioner", "Ifpack"); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Nonlinear Factor",1.0); pVector.addParameter("Left BC", 0.0); pVector.addParameter("Right BC", 0.1); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base // class: Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); grp->computeF(); // Create the Solver convergence test Teuchos::RCP<NOX::StatusTest::NormF> wrms = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(15)); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(wrms); combo->addStatusTest(maxiters); // Create the stepper LOCA::Stepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status != LOCA::Abstract::Iterator::Finished) { ierr = 1; if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Get the final solution from the stepper Teuchos::RCP<const LOCA::Epetra::Group> finalGroup = Teuchos::rcp_dynamic_cast<const LOCA::Epetra::Group>(stepper.getSolutionGroup()); const NOX::Epetra::Vector& finalSolution = dynamic_cast<const NOX::Epetra::Vector&>(finalGroup->getX()); // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } // Check some statistics on the solution NOX::TestCompare testCompare(globalData->locaUtils->out(), *(globalData->locaUtils)); if (globalData->locaUtils->isPrintType(NOX::Utils::TestDetails)) globalData->locaUtils->out() << std::endl << "***** Checking solution statistics *****" << std::endl; // Check number of steps int numSteps = stepper.getStepNumber(); int numSteps_expected = 23; ierr += testCompare.testValue(numSteps, numSteps_expected, 0.0, "number of continuation steps", NOX::TestCompare::Absolute); // Check number of failed steps int numFailedSteps = stepper.getNumFailedSteps(); int numFailedSteps_expected = 0; ierr += testCompare.testValue(numFailedSteps, numFailedSteps_expected, 0.0, "number of failed continuation steps", NOX::TestCompare::Absolute); // Check final value of continuation parameter double right_bc_final = finalGroup->getParam("Right BC"); double right_bc_expected = 0.05; ierr += testCompare.testValue(right_bc_final, right_bc_expected, 1.0e-14, "final value of continuation parameter", NOX::TestCompare::Relative); // Check norm of solution double norm_x = finalSolution.norm(); double norm_x_expected = 25.00498021; ierr += testCompare.testValue(norm_x, norm_x_expected, 1.0e-7, "norm of final solution", NOX::TestCompare::Relative); LOCA::destroyGlobalData(globalData); } catch (std::exception& e) { cout << e.what() << endl; ierr = 1; } catch (const char *s) { cout << s << endl; ierr = 1; } catch (...) { cout << "Caught unknown exception!" << endl; ierr = 1; } if (MyPID == 0) { if (ierr == 0) cout << "All tests passed!" << endl; else cout << ierr << " test(s) failed!" << endl; } #ifdef HAVE_MPI MPI_Finalize() ; #endif /* end main */ return ierr ; }
int main(int argc, char *argv[]) { int ierr = 0; // scale factor to test arc-length scaling double scale = 1.0; // Initialize MPI #ifdef HAVE_MPI MPI_Init(&argc,&argv); #endif // Create a communicator for Epetra objects #ifdef HAVE_MPI Epetra_MpiComm Comm( MPI_COMM_WORLD ); #else Epetra_SerialComm Comm; #endif // Get the process ID and the total number of processors int MyPID = Comm.MyPID(); int NumProc = Comm.NumProc(); // Get the number of elements from the command line int NumGlobalElements = 100 + 1; // The number of unknowns must be at least equal to the // number of processors. if (NumGlobalElements < NumProc) { cout << "numGlobalBlocks = " << NumGlobalElements << " cannot be < number of processors = " << NumProc << endl; exit(1); } // Create the FiniteElementProblem class. This creates all required // Epetra objects for the problem and allows calls to the // function (RHS) and Jacobian evaluation routines. FiniteElementProblem Problem(NumGlobalElements, Comm, scale); // Get the vector from the Problem Epetra_Vector& soln = Problem.getSolution(); // Initialize Solution soln.PutScalar(1.0); // Begin LOCA Solver ************************************ // Create parameter list Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList); // Create LOCA sublist Teuchos::ParameterList& locaParamsList = paramList->sublist("LOCA"); // Create the stepper sublist and set the stepper parameters Teuchos::ParameterList& locaStepperList = locaParamsList.sublist("Stepper"); locaStepperList.set("Continuation Method", "Arc Length"); locaStepperList.set("Bordered Solver Method", "Householder"); locaStepperList.set("Number of Continuation Parameters", 2); locaStepperList.set("Epsilon", 0.1); locaStepperList.set("Max Charts", 10000); locaStepperList.set("Verbosity", 1); locaStepperList.set("Page Charts", 1); locaStepperList.set("Dump Polyhedra", true); locaStepperList.set("Dump Centers", false); locaStepperList.set("Filename", "MFresults"); locaStepperList.set("Enable Arc Length Scaling", false); locaStepperList.set("Max Nonlinear Iterations", 15); locaStepperList.set("Aggressiveness", 0.0); locaStepperList.set("Max Solution Component", 6.0); // Create sublist for each continuation parameter Teuchos::ParameterList& paramList1 = locaStepperList.sublist("Continuation Parameter 1"); paramList1.set("Parameter Name", "Right BC"); paramList1.set("Initial Value", 0.1); paramList1.set("Max Value", 4.0); paramList1.set("Min Value", 0.0); paramList1.set("Initial Step Size", 0.1); paramList1.set("Max Step Size", 0.2); paramList1.set("Min Step Size", 1.0e-3); Teuchos::ParameterList& paramList2 = locaStepperList.sublist("Continuation Parameter 2"); paramList2.set("Parameter Name", "Nonlinear Factor"); paramList2.set("Initial Value", 1.0); paramList2.set("Max Value", 4.0); paramList2.set("Min Value", 0.0); paramList2.set("Initial Step Size", 0.1); paramList2.set("Max Step Size", 0.2); paramList2.set("Min Step Size", 1.0e-3); // Create predictor sublist Teuchos::ParameterList& predictorList = locaParamsList.sublist("Predictor"); predictorList.set("Method", "Tangent"); // Create the "Solver" parameters sublist to be used with NOX Solvers Teuchos::ParameterList& nlParams = paramList->sublist("NOX"); // Create the NOX printing parameter list Teuchos::ParameterList& nlPrintParams = nlParams.sublist("Printing"); nlPrintParams.set("MyPID", MyPID); nlPrintParams.set("Output Information", NOX::Utils::OuterIteration + NOX::Utils::OuterIterationStatusTest + NOX::Utils::InnerIteration + NOX::Utils::LinearSolverDetails + NOX::Utils::Details + NOX::Utils::Warning + NOX::Utils::StepperIteration + NOX::Utils::StepperDetails + NOX::Utils::StepperParameters); // Create the "Linear Solver" sublist for Newton's method Teuchos::ParameterList& dirParams = nlParams.sublist("Direction"); Teuchos::ParameterList& newParams = dirParams.sublist("Newton"); Teuchos::ParameterList& lsParams = newParams.sublist("Linear Solver"); lsParams.set("Aztec Solver", "GMRES"); lsParams.set("Max Iterations", 100); lsParams.set("Tolerance", 1e-4); lsParams.set("Output Frequency", 50); lsParams.set("Scaling", "None"); lsParams.set("Preconditioner", "Ifpack"); // Create and initialize the parameter vector LOCA::ParameterVector pVector; pVector.addParameter("Right BC", 0.1); pVector.addParameter("Nonlinear Factor",1.0); pVector.addParameter("Left BC", 0.0); // Create the interface between the test problem and the nonlinear solver // This is created by the user using inheritance of the abstract base class: Teuchos::RCP<Problem_Interface> interface = Teuchos::rcp(new Problem_Interface(Problem)); Teuchos::RCP<LOCA::Epetra::Interface::Required> iReq = interface; Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac = interface; // Create the Epetra_RowMatrixfor the Jacobian/Preconditioner Teuchos::RCP<Epetra_RowMatrix> Amat = Teuchos::rcp(&Problem.getJacobian(),false); // Create the linear systems Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linsys = Teuchos::rcp(new NOX::Epetra::LinearSystemAztecOO(nlPrintParams, lsParams, iReq, iJac, Amat, soln)); // Create the loca vector NOX::Epetra::Vector locaSoln(soln); // Create Epetra factory Teuchos::RCP<LOCA::Abstract::Factory> epetraFactory = Teuchos::rcp(new LOCA::Epetra::Factory); // Create global data object Teuchos::RCP<LOCA::GlobalData> globalData = LOCA::createGlobalData(paramList, epetraFactory); // Create the Group Teuchos::RCP<LOCA::Epetra::Group> grp = Teuchos::rcp(new LOCA::Epetra::Group(globalData, nlPrintParams, iReq, locaSoln, linsys, pVector)); grp->computeF(); // Create the Solver convergence test //NOX::StatusTest::NormWRMS wrms(1.0e-2, 1.0e-8); Teuchos::RCP<NOX::StatusTest::NormF> wrms = Teuchos::rcp(new NOX::StatusTest::NormF(1.0e-8)); Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters = Teuchos::rcp(new NOX::StatusTest::MaxIters(locaStepperList.get("Max Nonlinear Iterations", 10))); Teuchos::RCP<NOX::StatusTest::Combo> combo = Teuchos::rcp(new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR)); combo->addStatusTest(wrms); combo->addStatusTest(maxiters); // Create the stepper LOCA::MultiStepper stepper(globalData, grp, combo, paramList); LOCA::Abstract::Iterator::IteratorStatus status = stepper.run(); if (status == LOCA::Abstract::Iterator::Finished) globalData->locaUtils->out() << "All tests passed" << endl; else { if (globalData->locaUtils->isPrintType(NOX::Utils::Error)) globalData->locaUtils->out() << "Stepper failed to converge!" << std::endl; } // Output the parameter list if (globalData->locaUtils->isPrintType(NOX::Utils::StepperParameters)) { globalData->locaUtils->out() << std::endl << "Final Parameters" << std::endl << "****************" << std::endl; stepper.getList()->print(globalData->locaUtils->out()); globalData->locaUtils->out() << std::endl; } LOCA::destroyGlobalData(globalData); #ifdef HAVE_MPI MPI_Finalize() ; #endif /* end main */ return ierr ; }