00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include "NOX.H"
00043 #include "NOX_Petsc_Options.H"
00044
00045 using namespace NOX::Petsc;
00046
00047 Options::Options()
00048 {
00049 }
00050
00051 Options::Options(Teuchos::ParameterList& params, int rank_) :
00052 rank(rank_)
00053 {
00054 setOptions(params);
00055 }
00056
00057 Options::~Options()
00058 {
00059 }
00060
00061
00062 bool Options::setOptions(Teuchos::ParameterList& nlParams)
00063 {
00064
00065
00066 if( Teuchos::is_null(testCombo) )
00067 {
00068
00069 int maxIters;
00070 PetscTruth lflg;
00071 ierr = PetscOptionsGetInt(PETSC_NULL,"-snes_max_it", &maxIters, &flg);CHKERRQ(ierr);
00072 ierr = PetscOptionsGetInt(PETSC_NULL,"-nox_conv_maxiters", &maxIters, &lflg);CHKERRQ(ierr);
00073 if(flg || lflg)
00074 {
00075 testMaxIters = Teuchos::rcp( new NOX::StatusTest::MaxIters(maxIters) );
00076 if( Teuchos::is_null(testCombo) )
00077 testCombo = Teuchos::rcp( new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, testMaxIters) );
00078 else
00079 testCombo->addStatusTest(testMaxIters);
00080 }
00081
00082
00083 double absResNorm;
00084 PetscReal petscVal;
00085 ierr = PetscOptionsGetReal(PETSC_NULL,"-snes_atol", &petscVal, &flg);CHKERRQ(ierr);
00086 ierr = PetscOptionsGetReal(PETSC_NULL,"-nox_conv_abs_res", &petscVal, &lflg);CHKERRQ(ierr);
00087 if(flg || lflg)
00088 {
00089 absResNorm = (double) petscVal;
00090 testNormF = Teuchos::rcp( new NOX::StatusTest::NormF(absResNorm) );
00091 if( Teuchos::is_null(testCombo) )
00092 testCombo = Teuchos::rcp( new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, testNormF) );
00093 else
00094 testCombo->addStatusTest(testNormF);
00095 }
00096
00097
00098 double absUpdateNorm;
00099 ierr = PetscOptionsGetReal(PETSC_NULL,"-snes_stol", &petscVal, &flg);CHKERRQ(ierr);
00100 ierr = PetscOptionsGetReal(PETSC_NULL,"-nox_conv_update", &petscVal, &lflg);CHKERRQ(ierr);
00101 if(flg || lflg)
00102 {
00103 absUpdateNorm = (double) petscVal;
00104 testNormUpdate = Teuchos::rcp( new NOX::StatusTest::NormUpdate(absUpdateNorm) );
00105 if( Teuchos::is_null(testCombo) )
00106 testCombo = Teuchos::rcp( new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, testNormUpdate) );
00107 else
00108 testCombo->addStatusTest(testNormUpdate);
00109 }
00110
00111
00112 if( Teuchos::is_null(testCombo) )
00113 {
00114 assert( Teuchos::is_null(testMaxIters) );
00115 testMaxIters = Teuchos::rcp( new NOX::StatusTest::MaxIters(20) );
00116 assert( Teuchos::is_null(testNormF) );
00117 testNormF = Teuchos::rcp( new NOX::StatusTest::NormF(1.e-12) );
00118 testCombo = Teuchos::rcp( new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR, testMaxIters, testNormF) );
00119 }
00120
00121
00122 }
00123
00124
00125
00126 ierr = PetscOptionsHasName(PETSC_NULL,"-nox_trustregion_based",&flg);
00127 CHKERRQ(ierr);
00128 if(flg)
00129 nlParams.set("Nonlinear Solver", "Trust Region Based");
00130 else
00131
00132 ierr = PetscOptionsHasName(PETSC_NULL,"-nox_linesearch_based",&flg);
00133 CHKERRQ(ierr);
00134 nlParams.set("Nonlinear Solver", "Line Search Based");
00135
00136
00137 Teuchos::ParameterList& searchParams = nlParams.sublist("Line Search");
00138 ierr = PetscOptionsGetString(PETSC_NULL,"-nox_linesearch_type",
00139 optionString, maxStringLength, &flg);CHKERRQ(ierr);
00140 if(flg)
00141 {
00142 if( !strcmp(optionString, "full_step") )
00143 searchParams.set("Method", "Full Step");
00144 if( !strcmp(optionString, "polynomial") )
00145 searchParams.set("Method", "Polynomial");
00146 if( !strcmp(optionString, "backtrack") )
00147 searchParams.set("Method", "Backtrack");
00148 if( !strcmp(optionString, "more_thuente") )
00149 searchParams.set("Method", "More'-Thuente");
00150 #ifdef WITH_PRERELEASE
00151 if( !strcmp(optionString, "nonlinearcg") )
00152 searchParams.set("Method", "NonlinearCG");
00153 #endif
00154 }
00155 else
00156 searchParams.set("Method", "Full Step");
00157
00158
00159 Teuchos::ParameterList& dirParams = nlParams.sublist("Direction");
00160 ierr = PetscOptionsGetString(PETSC_NULL,"-nox_direction_type",
00161 optionString, maxStringLength, &flg);CHKERRQ(ierr);
00162 if(flg)
00163 {
00164 if( !strcmp(optionString, "newton") )
00165 dirParams.set("Method", "Newton");
00166 if( !strcmp(optionString, "steepest_descent") )
00167 {
00168 dirParams.set("Method", "Steepest Descent");
00169
00170
00171 PetscTruth lflg;
00172 ierr = PetscOptionsGetString(PETSC_NULL,"-nox_sd_scaling_type",
00173 optionString, maxStringLength, &lflg);CHKERRQ(ierr);
00174 if(lflg)
00175 {
00176 Teuchos::ParameterList& sdParams = dirParams.sublist("Steepest Descent");
00177 if( !strcmp(optionString, "none") )
00178 sdParams.set("Scaling Type", "None");
00179 else if( !strcmp(optionString, "2norm") )
00180 sdParams.set("Scaling Type", "2-Norm");
00181 else if( !strcmp(optionString, "quadratic_model_min") )
00182 sdParams.set("Scaling Type", "Quadratic Model Min");
00183 else
00184 {
00185 if(rank == 0) cout << "WARNING: Unsupported Steepest Descent "
00186 << "Scaling Type --> " << optionString << endl;
00187 sdParams.set("Scaling Type", "None");
00188 }
00189 }
00190 }
00191 #ifdef WITH_PRERELEASE
00192 if( !strcmp(optionString, "nonlinearcg") )
00193 dirParams.set("Method", "Nonlinear CG");
00194
00195
00196
00197
00198
00199
00200 #endif
00201 }
00202 else
00203 dirParams.set("Method", "Newton");
00204
00205
00206
00207 Teuchos::ParameterList& printParams = nlParams.sublist("Printing");
00208 printParams.set("MyPID", rank);
00209 printParams.set("Output Precision", 3);
00210 printParams.set("Output Processor", 0);
00211 printParams.set("Output Information",
00212 NOX::Utils::OuterIteration +
00213 NOX::Utils::OuterIterationStatusTest +
00214 NOX::Utils::InnerIteration +
00215 NOX::Utils::Parameters +
00216 NOX::Utils::Details +
00217 NOX::Utils::Warning);
00218
00219 return true;
00220 }
00221
00222 Teuchos::RCP<NOX::StatusTest::Combo> &
00223 Options::getStatusTest()
00224 {
00225 return testCombo;
00226 }