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 }