00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <FunctionExpressionDG.hpp>
00021
00022 #include <MeshExpression.hpp>
00023 #include <Information.hpp>
00024
00025 #include <DGFunctionBuilder.hpp>
00026 #include <DGFunctionBase.hpp>
00027
00028 #include <ScalarFunctionBase.hpp>
00029
00030 #include <Mesh.hpp>
00031
00032 #include <ScalarDiscretizationTypeDG.hpp>
00033
00034 void
00035 FunctionExpressionDG::
00036 execute()
00037 {
00038 __mesh->execute();
00039
00040 Information::instance().setMesh(__mesh->mesh());
00041
00042 DGFunctionBuilder builder;
00043
00044 if (__functionExpression != 0) {
00045 __functionExpression->execute();
00046
00047 builder.build(ScalarDiscretizationTypeDG(__discretizationType),
00048 __mesh->mesh(),
00049 *(__functionExpression->function()));
00050 } else {
00051 builder.build(ScalarDiscretizationTypeDG(__discretizationType),
00052 __mesh->mesh());
00053 }
00054
00055 __scalarFunction = builder.getBuiltScalarFunction();
00056
00057
00058 __functionExpression = 0;
00059 Information::instance().unsetMesh();
00060 }
00061
00062 ScalarDiscretizationTypeBase::Type
00063 FunctionExpressionDG::
00064 __DGTypeFromFEMType(const ScalarDiscretizationTypeBase::Type& d)
00065 {
00066 switch(d) {
00067 case ScalarDiscretizationTypeBase::lagrangianFEM0: {
00068 return ScalarDiscretizationTypeBase::DGFEM0;
00069 }
00070 case ScalarDiscretizationTypeBase::lagrangianFEM1: {
00071 return ScalarDiscretizationTypeBase::DGFEM1;
00072 }
00073 case ScalarDiscretizationTypeBase::lagrangianFEM2: {
00074 return ScalarDiscretizationTypeBase::DGFEM2;
00075 }
00076 default: {
00077 throw ErrorHandler(__FILE__,__LINE__,
00078 "cannot convert '"+ScalarDiscretizationTypeBase::name(d)
00079 +"' to a Discontinuous Galerkin type",
00080 ErrorHandler::unexpected);
00081 }
00082 }
00083 }
00084
00085 FunctionExpressionDG::
00086 FunctionExpressionDG(ReferenceCounting<MeshExpression> mesh,
00087 ReferenceCounting<FunctionExpression> function,
00088 const ScalarDiscretizationTypeBase::Type& discretizationType)
00089 : FunctionExpression(FunctionExpression::dg),
00090 __discretizationType(__DGTypeFromFEMType(discretizationType)),
00091 __mesh(mesh),
00092 __functionExpression(function)
00093 {
00094 ;
00095 }
00096
00097 FunctionExpressionDG::
00098 FunctionExpressionDG(const FunctionExpressionDG& dgFunction)
00099 : FunctionExpression(dgFunction),
00100 __discretizationType(dgFunction.__discretizationType),
00101 __mesh(dgFunction.__mesh),
00102 __functionExpression(dgFunction.__functionExpression)
00103 {
00104 ;
00105 }
00106
00107 FunctionExpressionDG::~FunctionExpressionDG()
00108 {
00109 ;
00110 }