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 #include "SundanceFunctional.hpp"
00032 #include "SundanceOut.hpp"
00033 #include "SundanceTabs.hpp"
00034 #include "SundanceTestFunction.hpp"
00035 #include "SundanceUnknownFunction.hpp"
00036 #include "SundanceEssentialBC.hpp"
00037 #include "SundanceIntegral.hpp"
00038 #include "SundanceListExpr.hpp"
00039 #include "SundanceZeroExpr.hpp"
00040 #include "SundanceEquationSet.hpp"
00041 #include "SundanceAssembler.hpp"
00042
00043
00044 using namespace Sundance;
00045 using namespace Teuchos;
00046 using namespace TSFExtended;
00047
00048
00049 Functional::Functional(const Mesh& mesh, const Expr& integral,
00050 const TSFExtended::VectorType<double>& vecType)
00051 : mesh_(mesh),
00052 integral_(integral),
00053 bc_(),
00054 vecType_(vecType)
00055 {
00056
00057 }
00058
00059 Functional::Functional(
00060 const Mesh& mesh,
00061 const Expr& integral,
00062 const Expr& essentialBC,
00063 const TSFExtended::VectorType<double>& vecType)
00064 : mesh_(mesh),
00065 integral_(integral),
00066 bc_(essentialBC),
00067 vecType_(vecType)
00068 {
00069
00070 }
00071
00072
00073 LinearProblem Functional::linearVariationalProb(
00074 const Expr& var,
00075 const Expr& varEvalPts,
00076 const Expr& unk,
00077 const Expr& fixed,
00078 const Expr& fixedEvalPts) const
00079 {
00080
00081 Array<Expr> zero(unk.size());
00082 for (int i=0; i<unk.size(); i++)
00083 {
00084 Expr z = new ZeroExpr();
00085 zero[i] = z;
00086 }
00087
00088 Expr unkEvalPts = new ListExpr(zero);
00089
00090 Expr unkParams;
00091 Expr fixedParams;
00092 Expr unkParamValues;
00093 Expr fixedParamValues;
00094
00095 RCP<EquationSet> eqn
00096 = rcp(new EquationSet(integral_, bc_,
00097 tuple(var), tuple(varEvalPts),
00098 tuple(unk), tuple(unkEvalPts),
00099 unkParams, unkParamValues,
00100 tuple(fixed), tuple(fixedEvalPts)));
00101
00102 RCP<Assembler> assembler
00103 = rcp(new Assembler(mesh_, eqn, tuple(vecType_), tuple(vecType_), false));
00104
00105 return LinearProblem(assembler);
00106 }
00107
00108 NonlinearProblem Functional
00109 ::nonlinearVariationalProb(const Expr& var,
00110 const Expr& varEvalPts,
00111 const Expr& unk,
00112 const Expr& unkEvalPts,
00113 const Expr& fixed,
00114 const Expr& fixedEvalPts) const
00115 {
00116
00117 Expr unkParams;
00118 Expr fixedParams;
00119 Expr unkParamValues;
00120 Expr fixedParamValues;
00121
00122 RCP<EquationSet> eqn
00123 = rcp(new EquationSet(integral_, bc_,
00124 tuple(var), tuple(varEvalPts),
00125 tuple(unk), tuple(unkEvalPts),
00126 fixedParams, fixedParamValues,
00127 tuple(fixed), tuple(fixedEvalPts)));
00128
00129 RCP<Assembler> assembler
00130 = rcp(new Assembler(mesh_, eqn, tuple(vecType_), tuple(vecType_), false));
00131
00132 return NonlinearProblem(assembler, unkEvalPts);
00133 }
00134
00135 FunctionalEvaluator Functional::evaluator(const Expr& var,
00136 const Expr& varEvalPts,
00137 const Expr& fixed,
00138 const Expr& fixedEvalPts) const
00139 {
00140
00141 Expr unkParams;
00142 Expr fixedParams;
00143 Expr unkParamValues;
00144 Expr fixedParamValues;
00145
00146 return FunctionalEvaluator(mesh_, integral_, bc_,
00147 var,
00148 varEvalPts,
00149 fixed, fixedEvalPts,
00150 vecType_);
00151 }
00152
00153
00154 FunctionalEvaluator Functional::evaluator(const Expr& var,
00155 const Expr& varEvalPts) const
00156 {
00157 return FunctionalEvaluator(mesh_, integral_, bc_,
00158 var,
00159 varEvalPts,
00160 vecType_);
00161 }
00162
00163
00164 namespace Sundance
00165 {
00166
00167 double L2Norm(const Mesh& mesh, const CellFilter& domain,
00168 const Expr& f, const QuadratureFamily& quad)
00169 {
00170 Expr I2 = Integral(domain, f*f, quad);
00171
00172 return sqrt(evaluateIntegral(mesh, I2));
00173 }
00174
00175
00176 double H1Seminorm(
00177 const Mesh& mesh,
00178 const CellFilter& filter,
00179 const Expr& f,
00180 const QuadratureFamily& quad)
00181 {
00182 Expr grad = gradient(mesh.spatialDim());
00183 return L2Norm(mesh, filter, grad*f, quad);
00184 }
00185
00186 double H1Norm(
00187 const Mesh& mesh,
00188 const CellFilter& filter,
00189 const Expr& f,
00190 const QuadratureFamily& quad)
00191 {
00192 Expr grad = gradient(mesh.spatialDim());
00193 Expr g = grad*f;
00194 Expr I2 = Integral(filter, f*f + g*g, quad);
00195
00196 return sqrt(evaluateIntegral(mesh, I2));
00197 }
00198 }