00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <FunctionExpressionMeshReferences.hpp>
00021 #include <MeshExpression.hpp>
00022
00023 #include <FEMFunctionBuilder.hpp>
00024 #include <Mesh.hpp>
00025
00026 #include <ScalarFunctionMeshElementsReferences.hpp>
00027 #include <ScalarDiscretizationTypeFEM.hpp>
00028
00029 FunctionExpressionMeshReferences::ItemType
00030 FunctionExpressionMeshReferences::
00031 __getItemType()
00032 {
00033 if (__itemName == "elements") {
00034 return FunctionExpressionMeshReferences::element;
00035 }
00036 if (__itemName == "vertices") {
00037 return FunctionExpressionMeshReferences::vertex;
00038 }
00039 return FunctionExpressionMeshReferences::undefined;
00040 }
00041
00042
00043 std::ostream&
00044 FunctionExpressionMeshReferences::
00045 put(std::ostream& os) const
00046 {
00047 os << "reference(" << __itemName << ',' << *__mesh << ',' << *__referenceSet << ')';
00048 return os;
00049 }
00050
00051 void FunctionExpressionMeshReferences::
00052 execute()
00053 {
00054 __referenceSet->execute();
00055 __mesh->execute();
00056
00057 ScalarFunctionMeshElementsReferences::FunctionMap functionMap;
00058
00059 for (ReferencesSet::FunctionReferences::const_iterator
00060 i = __referenceSet->functionReferences().begin();
00061 i != __referenceSet->functionReferences().end(); ++i) {
00062 size_t referenceNumber = size_t(i->first->realValue());
00063 if (functionMap.find(referenceNumber) != functionMap.end()) {
00064 throw ErrorHandler(__FILE__,__LINE__,
00065 "reference "+
00066 stringify(referenceNumber)+
00067 " multiply defined in '"+
00068 stringify(*this)+
00069 "'",
00070 ErrorHandler::normal);
00071 }
00072 functionMap[referenceNumber] = i->second->function();
00073 }
00074
00075 switch (this->__getItemType()) {
00076 case FunctionExpressionMeshReferences::element: {
00077 __scalarFunction = new ScalarFunctionMeshElementsReferences(functionMap,__mesh->mesh());
00078 break;
00079 }
00080 case FunctionExpressionMeshReferences::vertex: {
00081 const Mesh* m = __mesh->mesh();
00082
00083 Vector<real_t> values(m->numberOfVertices());
00084 for (size_t i=0; i<values.size(); ++i) {
00085 const Vertex& x = m->vertex(i);
00086 ScalarFunctionMeshElementsReferences::FunctionMap::const_iterator
00087 f = functionMap.find(x.reference());
00088 if (f != functionMap.end()) {
00089 values[i] = (*f->second)(x);
00090 } else {
00091 values[i] = 0;
00092 }
00093 }
00094
00095 FEMFunctionBuilder builder;
00096 ScalarDiscretizationTypeFEM d(ScalarDiscretizationTypeBase::lagrangianFEM1);
00097 builder.build(d,m,values);
00098 __scalarFunction = builder.getBuiltScalarFunction();
00099 break;
00100 }
00101 default: {
00102 throw ErrorHandler(__FILE__,__LINE__,
00103 "unknown item type",
00104 ErrorHandler::unexpected);
00105 }
00106 }
00107 }
00108
00109
00110 FunctionExpressionMeshReferences::
00111 FunctionExpressionMeshReferences(const std::string itemName,
00112 ReferenceCounting<MeshExpression> mesh,
00113 ReferenceCounting<ReferencesSet> ref)
00114 : FunctionExpression(FunctionExpression::meshReferences),
00115 __itemName(itemName),
00116 __mesh(mesh),
00117 __referenceSet(ref)
00118 {
00119 ;
00120 }
00121
00122 FunctionExpressionMeshReferences::
00123 FunctionExpressionMeshReferences(const FunctionExpressionMeshReferences& f)
00124 : FunctionExpression(f),
00125 __itemName(f.__itemName),
00126 __mesh(f.__mesh),
00127 __referenceSet(f.__referenceSet)
00128 {
00129 ;
00130 }
00131
00132 FunctionExpressionMeshReferences::
00133 ~FunctionExpressionMeshReferences()
00134 {
00135 ;
00136 }