RCP<OptConvergenceTestBase> OptConvergenceTestBuilder::createConvTest(const ParameterList& params, int verb) { Tabs tab(0); PLAYA_MSG1(verb, tab << "OptConvergenceTestBuilder::createConvTest()"); Tabs tab1; PLAYA_MSG2(verb, tab1 << "params=" << params); TEUCHOS_TEST_FOR_EXCEPTION(params.name() != "Convergence Test", std::runtime_error, "OptConvTestBuilder::createConvTest() expected parameter list named " "\"Convergence Test\", got name [" << params.name() << "]"); const std::string& ctType = getParameter<string>(params, "Type"); RCP<OptConvergenceTestBase> ct; if (ctType=="Default") { PLAYA_MSG2(verb, tab1 << "found Default convergence test"); ct = rcp(new DefaultOptConvergenceTest(params)); } TEUCHOS_TEST_FOR_EXCEPTION(ct.get()==0, std::runtime_error, "OptConvTestBuilder::createConvTest() could not construct a valid " "convergence test object from parameter list " << params); return ct; }
void NonlinearPDEConstrainedObj::initEquations( const Array<Expr>& stateVars, const Array<Expr>& adjointVars, const Array<Array<Expr> >& fixedVarsInStateEqns, const Array<Array<Expr> >& fixedVarsInStateEqnsVals, const Array<Array<Expr> >& fixedVarsInAdjointEqns, const Array<Array<Expr> >& fixedVarsInAdjointEqnsVals ) { Tabs tab(0); PLAYA_MSG2(verb(), tab << "setting up nonlinear equations"); for (int i=0; i<stateVars.size(); i++) { Tabs tab1; PLAYA_MSG3(verb(), tab1 << "setting up state equation #" << i); Expr fixedVars = new ListExpr(fixedVarsInStateEqns[i]); Expr fixedVarVals = new ListExpr(fixedVarsInStateEqnsVals[i]); PLAYA_MSG3(verb(), tab1 << "Fixed vars are: " << fixedVars); NonlinearProblem stateProb = Lagrangian().nonlinearVariationalProb(adjointVars[i], adjointVarVals(i), stateVars[i], stateVarVals(i), fixedVars, fixedVarVals); stateProbs_.append(stateProb); } for (int i=0; i<adjointVars.size(); i++) { Tabs tab1; PLAYA_MSG3(verb(), tab1 << "setting up adjoint equation #" << i); Expr fixedVars = new ListExpr(fixedVarsInAdjointEqns[i]); Expr fixedVarVals = new ListExpr(fixedVarsInAdjointEqnsVals[i]); PLAYA_MSG3(verb(), tab1 << "Fixed vars are: " << fixedVars); LinearProblem adjointProb = Lagrangian().linearVariationalProb(stateVars[i], stateVarVals(i), adjointVars[i], fixedVars, fixedVarVals); adjointProbs_.append(adjointProb); } PLAYA_MSG2(verb(), tab << "done setting up nonlinear equations"); }
void LinearPDEConstrainedObj::solveState(const Vector<double>& x) const { Tabs tab(0); PLAYA_MSG2(verb(), tab << "solving state"); PLAYA_MSG3(verb(), tab << "|x|=" << x.norm2()); PLAYA_MSG5(verb(), tab << "x=" << endl << tab << x.norm2()); setDiscreteFunctionVector(designVarVal(), x); /* solve the state equations in order */ for (int i=0; i<stateProbs_.size(); i++) { SolverState<double> status = stateProbs_[i].solve(solvers_[i], stateVarVals(i)); TEUCHOS_TEST_FOR_EXCEPTION(status.finalState() != SolveConverged, std::runtime_error, "state equation could not be solved: status=" << status.stateDescription()); } PLAYA_MSG2(verb(), tab << "done state solve"); /* do postprocessing */ statePostprocCallback(); }
void LinearPDEConstrainedObj ::solveStateAndAdjoint(const Vector<double>& x) const { Tabs tab(0); PLAYA_MSG2(verb(), tab << "solving state and adjoint"); PLAYA_MSG3(verb(), tab << "|x|=" << x.norm2()); PLAYA_MSG5(verb(), tab << "x=" << endl << tab << x.norm2()); Tabs tab1; setDiscreteFunctionVector(designVarVal(), x); PLAYA_MSG3(verb(), tab1 << "solving state eqns"); /* solve the state equations in order */ for (int i=0; i<stateProbs_.size(); i++) { SolverState<double> status = stateProbs_[i].solve(solvers_[i], stateVarVals(i)); /* if the solve failed, write out the design var and known state * variables */ if (status.finalState() != SolveConverged) { FieldWriter w = new VTKWriter("badSolve"); w.addMesh(Lagrangian().mesh()); w.addField("designVar", new ExprFieldWrapper(designVarVal())); for (int j=0; j<i; j++) { Expr tmp = stateVarVals(j).flatten(); for (int k=0; k<tmp.size(); k++) { w.addField("stateVar-"+Teuchos::toString(j)+"-"+Teuchos::toString(k), new ExprFieldWrapper(tmp[k])); } } w.write(); } TEUCHOS_TEST_FOR_EXCEPTION(status.finalState() != SolveConverged, std::runtime_error, "state equation " << i << " could not be solved: status=" << status.stateDescription()); } PLAYA_MSG3(verb(), tab1 << "done solving state eqns"); /* do postprocessing */ statePostprocCallback(); PLAYA_MSG3(verb(), tab1 << "solving adjoint eqns"); /* solve the adjoint equations in reverse order */ for (int i=adjointProbs_.size()-1; i>=0; i--) { SolverState<double> status = adjointProbs_[i].solve(solvers_[i], adjointVarVals(i)); /* if the solve failed, write out the design var and known state * and adjoint variables */ if (status.finalState() != SolveConverged) { FieldWriter w = new VTKWriter("badSolve"); w.addMesh(Lagrangian().mesh()); w.addField("designVar", new ExprFieldWrapper(designVarVal())); for (int j=0; j<stateProbs_.size(); j++) { Expr tmp = stateVarVals(j).flatten(); for (int k=0; k<tmp.size(); k++) { w.addField("stateVar-"+Teuchos::toString(j)+"-"+Teuchos::toString(k), new ExprFieldWrapper(tmp[k])); } } for (int j=adjointProbs_.size()-1; j>i; j--) { Expr tmp = adjointVarVals(j).flatten(); for (int k=0; k<tmp.size(); k++) { w.addField("adjointVar-"+Teuchos::toString(j)+"-"+Teuchos::toString(k), new ExprFieldWrapper(tmp[k])); } } w.write(); } TEUCHOS_TEST_FOR_EXCEPTION(status.finalState() != SolveConverged, std::runtime_error, "adjoint equation " << i << " could not be solved: status=" << status.stateDescription()); } PLAYA_MSG3(verb(), tab1 << "done solving adjoint eqns"); PLAYA_MSG2(verb(), tab1 << "done solving state and adjoint eqns"); }