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 "SundanceOut.hpp"
00032 #include "PlayaTabs.hpp"
00033 #include "SundanceDOFMapBase.hpp"
00034 #include "SundanceLocalDOFMap.hpp"
00035
00036
00037 using namespace Sundance;
00038 using namespace Sundance;
00039 using namespace Sundance;
00040 using namespace Teuchos;
00041
00042
00043 using std::endl;
00044 using std::setw;
00045
00046
00047 LocalDOFMap::LocalDOFMap(int numBlocks, int verb)
00048 : verb_(verb),
00049 isUsed_(numBlocks),
00050 hasCells_(false),
00051 nLocalNodesPerChunk_(rcp(new Array<Array<int> >(numBlocks))),
00052 mapStruct_(rcp(new Array<RCP<const MapStructure> >(numBlocks))),
00053 localDOFs_(rcp(new Array<Array<Array<int> > >(numBlocks))),
00054 cellLID_(),
00055 activeCellDim_(-1),
00056 maxCellDim_(-1)
00057 {}
00058
00059 int LocalDOFMap::nCells() const
00060 {
00061 TEUCHOS_TEST_FOR_EXCEPTION(!hasCells(), std::runtime_error,
00062 "cells not valid when LocalDOFMap::nCells() called");
00063 return cellLID_->size();
00064 }
00065
00066 void LocalDOFMap::markAsUnused()
00067 {
00068 for (int b=0; b<numBlocks(); b++)
00069 {
00070 isUsed_[b] = 0;
00071 }
00072 hasCells_ = false;
00073 }
00074
00075
00076 bool LocalDOFMap::isUnused() const
00077 {
00078 for (int b=0; b<numBlocks(); b++)
00079 {
00080 if (isUsed_[b]) return false;
00081 }
00082 return true;
00083 }
00084
00085 void LocalDOFMap::verifyValidBlock(int b) const
00086 {
00087 TEUCHOS_TEST_FOR_EXCEPTION(b < 0 || b>=numBlocks(), std::runtime_error,
00088 "block index " << b << " out of range [0," << numBlocks() << ")");
00089 }
00090
00091 void LocalDOFMap::setCells(
00092 int activeCellDim,
00093 int maxCellDim,
00094 const RCP<const Array<int> >& cellLID)
00095 {
00096 activeCellDim_ = activeCellDim;
00097 maxCellDim_ = maxCellDim_;
00098 cellLID_ = cellLID;
00099 hasCells_=true;
00100 }
00101
00102
00103 void LocalDOFMap::fillBlock(int b, const RCP<DOFMapBase>& globalMap,
00104 const Array<Set<int> >& requiredFuncs)
00105 {
00106 Tabs tab;
00107 verifyValidBlock(b);
00108
00109 SUNDANCE_MSG2(verb_, tab << "getting local DOFs for block=" << b
00110 << ", active cell dim="
00111 << activeCellDim_);
00112
00113 mapStruct(b) = globalMap->getDOFsForCellBatch(
00114 activeCellDim_,
00115 *cellLID_,
00116 requiredFuncs[b],
00117 localDOFs(b),
00118 nLocalNodesPerChunk(b),
00119 verb_);
00120 }
00121
00122 std::ostream& LocalDOFMap::print(std::ostream& os) const
00123 {
00124 Tabs tab0;
00125 bool noneAreUsed=true;
00126 for (int b=0; b<numBlocks(); b++)
00127 {
00128 if (isUsed(b)) {noneAreUsed = false; break;}
00129 }
00130 if (noneAreUsed)
00131 {
00132 os << std::endl << tab0 << "[empty local DOF map]";
00133 }
00134 else
00135 {
00136 os << std::endl << tab0 << "LocalDOFMap[" << std::endl;
00137 Tabs tab;
00138 os << tab << "num cells=" << cellLID_->size() << ", active cellDim="
00139 << activeCellDim_ << ", maxCellDim=" << maxCellDim_ << std::endl;
00140 os << tab << "num blocks=" << numBlocks() << std::endl << std::endl;
00141
00142 for (int b=0; b<numBlocks(); b++)
00143 {
00144 Tabs tab1;
00145 os << tab1 << "block " << b << " of " << numBlocks()
00146 << *mapStruct(b) << std::endl;
00147 const Array<Array<int> >& dofs = localDOFs(b);
00148 int nChunks = mapStruct(b)->numBasisChunks();
00149
00150 for (int c=0; c<cellLID_->size(); c++)
00151 {
00152 Tabs tab2;
00153 os << tab2 << "cell LID=" << (*cellLID_)[c] << std::endl;
00154 for (int chunk=0; chunk<nChunks; chunk++)
00155 {
00156 Tabs tab3;
00157 int nFuncs = mapStruct(b)->numFuncs(chunk);
00158 const Array<int>& funcs = mapStruct(b)->funcs(chunk);
00159 int nNodes = nLocalNodesPerChunk(b)[chunk];
00160 for (int f=0; f<nFuncs; f++)
00161 {
00162 os << tab3 << "fid=" << funcs[f] << " dofs=";
00163 int funcOffset = mapStruct(b)->indexForFuncID(funcs[f]);
00164 for (int n=0; n<nNodes; n++)
00165 {
00166 int dof = dofs[chunk][(c*nFuncs+funcOffset)*nNodes+n];
00167 os << setw(6) << dof;
00168 if (n < nNodes-1) os << ", ";
00169 }
00170 os << std::endl;
00171 }
00172 }
00173 }
00174
00175 }
00176 os << tab0 << "] ### End LocalDOFMap" << std::endl;
00177 }
00178 return os;
00179 }