00001 #ifndef PDEOPT_NONLINEARPDECONSTRAINEDOBJ_H
00002 #define PDEOPT_NONLINEARPDECONSTRAINEDOBJ_H
00003 
00004 #include "PDEOptPDEConstrainedObjBase.hpp"
00005 #include "SundanceExpr.hpp"
00006 #include "PlayaNOXSolver.hpp"
00007 #include "SundanceFunctional.hpp"
00008 #include "SundanceNonlinearProblem.hpp"
00009 
00010 namespace Sundance
00011 {
00012 using namespace Playa;
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 class NonlinearPDEConstrainedObj : public PDEConstrainedObjBase
00021 {
00022 public:
00023 
00024   NonlinearPDEConstrainedObj(
00025     const Functional& lagrangian,
00026     const Expr& stateVars,
00027     const Expr& stateVarVals,
00028     const Expr& adjointVars,
00029     const Expr& adjointVarVals,
00030     const Expr& designVars,
00031     const Expr& designVarVals,
00032     const NOXSolver& solver,
00033     const LinearSolver<double>& adjSolver,
00034     int verb=0);
00035 
00036 
00037   NonlinearPDEConstrainedObj(
00038     const Functional& lagrangian,
00039     const Array<Expr>& stateVars,
00040     const Array<Expr>& stateVarVals,
00041     const Array<Expr>& adjointVars,
00042     const Array<Expr>& adjointVarVals,
00043     const Expr& designVars,
00044     const Expr& designVarVals,
00045     const NOXSolver& solver,
00046     const LinearSolver<double>& adjSolver,
00047     int verb=0);
00048 
00049 
00050   NonlinearPDEConstrainedObj(
00051     const Functional& lagrangian,
00052     const Expr& stateVars,
00053     const Expr& stateVarVals,
00054     const Expr& adjointVars,
00055     const Expr& adjointVarVals,
00056     const Expr& designVars,
00057     const Expr& designVarVals,
00058     const NOXSolver& solver,
00059     const LinearSolver<double>& adjSolver,
00060     const RCP<IterCallbackBase>& iterCallback,
00061     int verb=0);
00062 
00063 
00064   NonlinearPDEConstrainedObj(
00065     const Functional& lagrangian,
00066     const Array<Expr>& stateVars,
00067     const Array<Expr>& stateVarVals,
00068     const Array<Expr>& adjointVars,
00069     const Array<Expr>& adjointVarVals,
00070     const Expr& designVars,
00071     const Expr& designVarVals,
00072     const NOXSolver& solver,
00073     const LinearSolver<double>& adjSolver,
00074     const RCP<IterCallbackBase>& iterCallback,
00075     int verb=0);
00076 
00077 
00078   virtual ~NonlinearPDEConstrainedObj(){;}
00079 
00080 
00081 
00082 
00083 
00084 
00085   void solveState(const Vector<double>& x) const;
00086 
00087 
00088 
00089 
00090 
00091   void solveStateAndAdjoint(const Vector<double>& x) const;
00092 
00093 
00094   void initEquations(
00095     const Array<Expr>& stateVars,
00096     const Array<Expr>& adjointVars,
00097     const Array<Array<Expr> >& fixedVarsInStateEqns,
00098     const Array<Array<Expr> >& fixedVarsInStateEqnsVals,
00099     const Array<Array<Expr> >& fixedVarsInAdjointEqns,
00100     const Array<Array<Expr> >& fixedVarsInAdjointEqnsVals
00101     );
00102 
00103 
00104 private:
00105 
00106   Array<NonlinearProblem> stateProbs_;
00107 
00108   Array<LinearProblem> adjointProbs_;
00109 
00110   NOXSolver solver_;
00111 
00112   LinearSolver<double> adjSolver_;
00113 };
00114 
00115 }
00116 
00117 #endif