Go to the documentation of this file.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
00043 #ifndef PDEOPT_PDECONSTRAINEDOBJBASE_H
00044 #define PDEOPT_PDECONSTRAINEDOBJBASE_H
00045
00046 #include "PlayaObjectiveBase.hpp"
00047 #include "SundanceExpr.hpp"
00048 #include "SundanceFunctional.hpp"
00049 #include "PDEOptIterCallbackBase.hpp"
00050
00051 namespace Sundance
00052 {
00053 using namespace Playa;
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 class PDEConstrainedObjBase : public ObjectiveBase
00067 {
00068 public:
00069
00070
00071 PDEConstrainedObjBase(
00072 const Functional& lagrangian,
00073 const Array<Expr>& stateVarVals,
00074 const Array<Expr>& adjointVarVals,
00075 const Expr& designVarVal,
00076 const RCP<IterCallbackBase>& iterCallback,
00077 int verb = 0);
00078
00079
00080 PDEConstrainedObjBase(
00081 const Functional& lagrangian,
00082 const Array<Expr>& stateVarVals,
00083 const Array<Expr>& adjointVarVals,
00084 const Expr& designVarVal,
00085 int verb = 0);
00086
00087
00088 virtual ~PDEConstrainedObjBase(){;}
00089
00090
00091 void evalGrad(const Vector<double>& x, double& f,
00092 Vector<double>& grad) const ;
00093
00094
00095 void eval(const Vector<double>& x, double& f) const ;
00096
00097
00098 Vector<double> getInit() const ;
00099
00100
00101
00102
00103
00104
00105 virtual void statePostprocCallback() const {;}
00106
00107
00108 virtual void iterationCallback(const Vector<double>& x, int iter) const ;
00109
00110
00111 const Mesh& mesh() const {return Lagrangian_.mesh();}
00112
00113
00114 int numFuncEvals() const {return numFuncEvals_;}
00115
00116
00117
00118
00119 virtual void solveState(const Vector<double>& x) const = 0 ;
00120
00121
00122
00123
00124
00125 virtual void solveStateAndAdjoint(const Vector<double>& x) const = 0 ;
00126
00127
00128
00129
00130 virtual void initEquations(
00131 const Array<Expr>& stateVars,
00132 const Array<Expr>& adjointVars,
00133 const Array<Array<Expr> >& fixedVarsInStateEqns,
00134 const Array<Array<Expr> >& fixedVarsInStateEqnsVals,
00135 const Array<Array<Expr> >& fixedVarsInAdjointEqns,
00136 const Array<Array<Expr> >& fixedVarsInAdjointEqnsVals
00137 ) = 0 ;
00138
00139
00140 void setHScale(const double& H) {invHScale_ = 1.0/H;}
00141
00142
00143
00144 double getInvHScale() const {return invHScale_;}
00145
00146
00147
00148 const Expr& designVar() const
00149 {return designVarVal_;}
00150
00151
00152 const Array<Expr>& stateVars() const
00153 {return stateVarVals_;}
00154
00155
00156 const Array<Expr>& adjointVars() const
00157 {return adjointVarVals_;}
00158
00159 protected:
00160
00161 void init(
00162 const Array<Expr>& stateVars,
00163 const Array<Expr>& adjointVars,
00164 const Expr& designVar);
00165
00166
00167 Expr& designVarVal() const
00168 {return designVarVal_;}
00169
00170
00171 Expr& stateVarVals(int i) const
00172 {return stateVarVals_[i];}
00173
00174
00175 Expr& adjointVarVals(int i) const
00176 {return adjointVarVals_[i];}
00177
00178 const Functional& Lagrangian() const {return Lagrangian_;}
00179
00180 private:
00181
00182 Functional Lagrangian_;
00183
00184 mutable Expr designVarVal_;
00185
00186 mutable Array<Expr> stateVarVals_;
00187
00188 mutable Array<Expr> adjointVarVals_;
00189
00190 FunctionalEvaluator fEval_;
00191
00192 mutable int numFuncEvals_;
00193
00194 mutable int numGradEvals_;
00195
00196 double invHScale_;
00197
00198 RCP<IterCallbackBase> iterCallback_;
00199 };
00200
00201 }
00202
00203 #endif