SundanceBasisFamily.cpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                              Sundance
00005 //                 Copyright (2005) Sandia Corporation
00006 // 
00007 // Copyright (year first published) Sandia Corporation.  Under the terms 
00008 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 
00009 // retains certain rights in this software.
00010 // 
00011 // This library is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Lesser General Public License as
00013 // published by the Free Software Foundation; either version 2.1 of the
00014 // License, or (at your option) any later version.
00015 //  
00016 // This library is distributed in the hope that it will be useful, but
00017 // WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019 // Lesser General Public License for more details.
00020 //                                                                                 
00021 // You should have received a copy of the GNU Lesser General Public
00022 // License along with this library; if not, write to the Free Software
00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00024 // USA                                                                                
00025 // Questions? Contact Kevin Long (krlong@sandia.gov), 
00026 // Sandia National Laboratories, Livermore, California, USA
00027 // 
00028 // ************************************************************************
00029 /* @HEADER@ */
00030 
00031 #include "SundanceBasisFamily.hpp"
00032 #include "SundanceUnknownFunction.hpp"
00033 #include "SundanceTestFunction.hpp"
00034 #include "SundanceDiscreteFunction.hpp"
00035 #include "SundanceUnknownFunctionData.hpp"
00036 #include "SundanceTestFunctionData.hpp"
00037 #include "SundanceDiscreteFunctionData.hpp"
00038 #include "SundanceLagrange.hpp"
00039 #include "SundanceEdgeLocalizedBasis.hpp"
00040 
00041 
00042 using namespace Sundance;
00043 using namespace Teuchos;
00044 using Playa::Handle;
00045 using Playa::Handleable;
00046 
00047 
00048 
00049 
00050 
00051 int BasisFamily::order() const 
00052 {
00053   return ptr()->order();
00054 }
00055 
00056 int BasisFamily::dim() const 
00057 {
00058   return ptr()->dim();
00059 }
00060 
00061 bool BasisFamily::operator==(const BasisFamily& other) const
00062 {
00063   return !(*this < other || other < *this);
00064 }
00065 
00066 int BasisFamily::size(const Array<BasisFamily>& b)
00067 {
00068   int rtn = 0;
00069   for (int i=0; i<b.size(); i++) rtn += b[i].dim();
00070   return rtn;
00071 }
00072 
00073 int BasisFamily::nReferenceDOFsWithFacets(const CellType& maximalCellType,
00074             const CellType& cellType) const 
00075 {
00076   return ptr()->nReferenceDOFsWithFacets(maximalCellType, cellType);
00077 }
00078 
00079 int BasisFamily::nReferenceDOFsWithoutFacets(const CellType& maximalCellType,
00080                const CellType& cellType) const 
00081 {
00082   return ptr()->nReferenceDOFsWithoutFacets(maximalCellType, cellType);
00083 }
00084 
00085 BasisFamily BasisFamily::getBasis(const RCP<const CommonFuncDataStub>& funcData)
00086 {
00087   /* First try to process assuming the input is an unknown function */
00088   const UnknownFunctionData* u 
00089     = dynamic_cast<const UnknownFunctionData*>(funcData.get());
00090   if (u != 0)
00091     {
00092       return u->basis()[0];
00093     }
00094 
00095   /* Next try to process assuming the input is a test function */
00096   const TestFunctionData* t 
00097     = dynamic_cast<const TestFunctionData*>(funcData.get());
00098   if (t != 0)
00099     {
00100       return t->basis()[0];
00101     }
00102 
00103 
00104   /* Next try to process assuming the input is a discrete function */
00105   const DiscreteFunctionData* d
00106     = dynamic_cast<const DiscreteFunctionData*>(funcData.get());
00107   if (d != 0)
00108     {
00109       return d->discreteSpace().basis()[0];
00110     }
00111 
00112   TEUCHOS_TEST_FOR_EXCEPTION(u==0 && t==0 && d==0, std::runtime_error,
00113          "BasisFamily::getBasis() argument is not a recognized "
00114          "type of function data");
00115   return BasisFamily();
00116   
00117 }
00118 
00119 
00120 
00121 RCP<BasisDOFTopologyBase> BasisFamily::getBasisTopology(const RCP<const CommonFuncDataStub>& funcData)
00122 {
00123   BasisFamily b = getBasis(funcData);
00124   TEUCHOS_TEST_FOR_EXCEPT(b.ptr().get()==0);
00125 
00126   return rcp_dynamic_cast<BasisDOFTopologyBase>(b.ptr());
00127 }
00128 
00129 
00130 void BasisFamily::getConstrainsForHNDoF( const int indexInParent,
00131            const int maxCellDim,
00132            const int maxNrChild,
00133            const int facetDim,
00134            const int facetIndex,
00135            const int nodeIndex,
00136            Array<int>& localDoFs,
00137            Array<int>& parentFacetDim,
00138            Array<int>& parentFacetIndex,
00139            Array<int>& parentFacetNode,
00140            Array<double>& coefs
00141            ) const
00142 {
00143   Tabs tab;
00144   int verb = 4;
00145   SUNDANCE_MSG3( verb ,tab << "BasisFamily::getConstrainsForHNDoF IN: indexInParent:" << indexInParent
00146      << "  maxCellDim:" << maxCellDim << " maxNrChild:" << maxNrChild
00147      << " facetDim:" << facetDim << "  facetIndex:" << facetIndex << " nodeIndex:" << nodeIndex);
00148   ptr()->getConstrainsForHNDoF( indexInParent, maxCellDim ,
00149         maxNrChild , facetDim, facetIndex, nodeIndex, localDoFs, parentFacetDim ,
00150         parentFacetIndex , parentFacetNode , coefs );
00151   SUNDANCE_MSG3( verb , tab << "BasisFamily::getConstrainsForHNDoF OUT: localDoFs:" << localDoFs
00152      << " coefs:" << coefs);
00153   SUNDANCE_MSG3( verb , tab << "BasisFamily::getConstrainsForHNDoF OUT: parentFacetDim:" << parentFacetDim );
00154   SUNDANCE_MSG3( verb , tab << "BasisFamily::getConstrainsForHNDoF OUT: parentFacetIndex:" << parentFacetIndex );
00155   SUNDANCE_MSG3( verb , tab << "BasisFamily::getConstrainsForHNDoF OUT: parentFacetNode:" << parentFacetNode );
00156 }
00157 
00158 
00159 void BasisFamily::refEval(
00160         const CellType& cellType,
00161         const Array<Point>& pts,
00162         const SpatialDerivSpecifier& deriv,
00163         Array<Array<Array<double> > >& result,
00164         int verbosity) const
00165 {
00166   using std::setw;
00167   Tabs tab;
00168   SUNDANCE_MSG3(verbosity, tab << "evaluating basis " << *this 
00169     << " with spatial derivative " << deriv);
00170   ptr()->refEval(cellType, pts, deriv, result, verbosity);
00171   std::string f = deriv.toString()+ "[phi_n]";
00172 
00173   if (verbosity >= 4)
00174     {
00175       Tabs tab1;
00176       for (int q=0; q<pts.size(); q++)
00177   {
00178     Tabs tab2;
00179     Out::os() << tab1 << "evaluation point = " << pts[q] << std::endl;
00180     Out::os() << tab2 << setw(5) << "n";
00181     int nComps = result.size();
00182     if (nComps == 1)
00183       {
00184         Out::os() << setw(20) <<  f << std::endl;
00185       }
00186     else
00187       {
00188         for (int d=0; d<nComps; d++)
00189     {
00190       std::string fd = f + "[" + Teuchos::toString(d) + "]";
00191       Out::os() << setw(20) <<  fd;
00192     }
00193         Out::os() << std::endl;
00194       }
00195     for (int n=0; n<result[0][q].size(); n++)
00196       {
00197         Out::os() << tab2 << setw(5) << n;
00198         for (int d=0; d<nComps; d++)
00199     {
00200       Out::os() << setw(20) <<  result[d][q][n];
00201     }
00202         Out::os() << std::endl;
00203       }
00204   }
00205     }
00206 }
00207 
00208 
00209 namespace Sundance
00210 {
00211 
00212   Array<std::pair<int, int> > 
00213   vectorDimStructure(const Array<BasisFamily>& basis)
00214   {
00215     Array<std::pair<int, int> > rtn;
00216     for (int i=0; i<basis.size(); i++) 
00217       {
00218   rtn.append(std::pair<int, int>(basis[i].tensorOrder(), basis[i].dim()));
00219       }
00220     return rtn;
00221   }
00222 
00223 
00224   Array<std::pair<int, int> > vectorDimStructure(const BasisFamily& basis)
00225   {
00226     return vectorDimStructure(tuple(basis));
00227   }
00228 
00229   bool basisRestrictableToBoundary(const BasisFamily& b)
00230   {
00231     const Lagrange* lag = dynamic_cast<const Lagrange*>(b.ptr().get());
00232     const EdgeLocalizedBasis* elb = dynamic_cast<const EdgeLocalizedBasis*>(b.ptr().get());
00233     return lag != 0 || elb != 0;
00234   }
00235 
00236 }

Site Contact