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 "SundanceFieldBase.hpp"
00032 #include "PlayaExceptions.hpp"
00033 #include "SundanceCellFilter.hpp"
00034 #include "SundanceMaximalCellFilter.hpp"
00035 #include "SundanceMesh.hpp"
00036
00037 using namespace Sundance;
00038 using namespace Sundance;
00039 using namespace Sundance;
00040 using namespace Teuchos;
00041
00042 using Sundance::CellSet;
00043 using Sundance::CellIterator;
00044 using Sundance::CellFilter;
00045 using Sundance::MaximalCellFilter;
00046
00047
00048 void FieldBase::getDataBatch(
00049 int cellDim,
00050 const Array<int>& cellID,
00051 const Array<int>& funcElem,
00052 Array<double>& batch) const
00053 {
00054
00055
00056 int nFunc = funcElem.size();
00057 batch.resize(cellID.size() * funcElem.size());
00058
00059 for (int c=0; c<cellID.size(); c++)
00060 {
00061 for (int f=0; f<funcElem.size(); f++)
00062 {
00063 batch[c*nFunc + f] = getData(cellDim, cellID[c], f);
00064 }
00065 }
00066 }
00067
00068 const CellFilter& FieldBase::domain() const
00069 {
00070 static CellFilter dum = new MaximalCellFilter();
00071 return dum;
00072 }
00073
00074
00075 namespace Sundance
00076 {
00077
00078 using Sundance::CellSet;
00079
00080 CellSet connectedNodeSet(const CellFilter& f, const Mesh& mesh)
00081 {
00082 CellSet cells = f.getCells(mesh);
00083 int dim = cells.dimension();
00084 if (dim==0) return cells;
00085
00086
00087 Array<int> cellLID;
00088
00089 for (CellIterator i=cells.begin(); i!=cells.end(); i++)
00090 {
00091 cellLID.append(*i);
00092 }
00093
00094 Array<int> nodes;
00095 Array<int> fo;
00096
00097 mesh.getFacetLIDs(dim, cellLID, 0, nodes, fo);
00098
00099 Set<int> nodeSet;
00100
00101 for (int i=0; i<nodes.size(); i++)
00102 {
00103 nodeSet.put(nodes[i]);
00104 }
00105
00106 return CellSet(mesh, 0, PointCell, nodeSet);
00107 }
00108
00109
00110 RCP<Array<int> > cellSetToLIDArray(const CellSet& cs)
00111 {
00112 RCP<Array<int> > cellLID = rcp(new Array<int>());
00113
00114 for (CellIterator i=cs.begin(); i!=cs.end(); i++)
00115 {
00116 cellLID->append(*i);
00117 }
00118
00119 return cellLID;
00120 }
00121
00122 }