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