MueLu  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MueLu_BlockedCoarseMapFactory_def.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // MueLu: A package for multigrid based preconditioning
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact
39 // Jonathan Hu (jhu@sandia.gov)
40 // Andrey Prokopenko (aprokop@sandia.gov)
41 // Ray Tuminaro (rstumin@sandia.gov)
42 //
43 // ***********************************************************************
44 //
45 // @HEADER
46 /*
47  * MueLu_BlockedCoarseMapFactory_def.hpp
48  *
49  * Created on: Oct 16, 2012
50  * Author: tobias
51  */
52 
53 #ifndef MUELU_BLOCKEDCOARSEMAPFACTORY_DEF_HPP_
54 #define MUELU_BLOCKEDCOARSEMAPFACTORY_DEF_HPP_
55 
56 #include <Xpetra_MultiVector.hpp>
57 #include <Xpetra_StridedMapFactory.hpp>
58 #include <Xpetra_Matrix.hpp>
59 
61 #include "MueLu_Level.hpp"
62 #include "MueLu_Aggregates.hpp"
63 #include "MueLu_Monitor.hpp"
64 
65 #include "MueLu_Factory.hpp"
66 
67 namespace MueLu {
68 
69  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
71  { }
72 
73  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
75 
76  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
78  RCP<ParameterList> validParamList = rcp(new ParameterList());
79 
80  validParamList->set< RCP<const FactoryBase> >("Aggregates", Teuchos::null, "Generating factory for aggregates.");
81  validParamList->set< RCP<const FactoryBase> >("Nullspace", Teuchos::null, "Generating factory for null space.");
82  validParamList->set< RCP<const FactoryBase> >("CoarseMap", Teuchos::null, "Generating factory of previous coarse map. (must be set by user!).");
83 
84  // do we need this?
85  validParamList->set< std::string >("Striding info", "{}", "Striding information");
86  validParamList->set< LocalOrdinal >("Strided block id", -1, "Strided block id");
87 
88  return validParamList;
89  }
90 
91  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
93  this->Input(currentLevel, "Aggregates");
94  this->Input(currentLevel, "Nullspace");
95 
96  // Get CoarseMap from previously defined block
97  RCP<const FactoryBase> prevCoarseMapFact = this->GetFactory("CoarseMap");
98  TEUCHOS_TEST_FOR_EXCEPTION(prevCoarseMapFact==Teuchos::null, Exceptions::RuntimeError, "MueLu::BlockedCoarseMapFactory::getDomainMapOffset: user did not specify CoarseMap of previous block. Do not forget to set the CoarseMap factory.");
99  currentLevel.DeclareInput("CoarseMap", prevCoarseMapFact.get(), this); // --
100  }
101 
102  template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
104  FactoryMonitor m(*this, "BlockedCoarseMap factory", currentLevel);
105 
106  RCP<const FactoryBase> prevCoarseMapFact = this->GetFactory("CoarseMap");
107  RCP<const Map> subPDomainMap = currentLevel.Get<RCP<const Map> >("CoarseMap", prevCoarseMapFact.get() /*prevCoarseMapFact_.get()*/);
108 
109  GlobalOrdinal maxGlobalIndex = subPDomainMap->getMaxAllGlobalIndex();
110 
111  RCP<Aggregates> aggregates = Factory::Get< RCP<Aggregates> >(currentLevel, "Aggregates");
112  GlobalOrdinal numAggs = aggregates->GetNumAggregates();
113 
114  // extract communicator
115  RCP<const Teuchos::Comm<int> > comm = aggregates->GetMap()->getComm();
116 
117  // determine nullspace dimension
118  RCP<MultiVector> nullspace = Factory::Get< RCP<MultiVector> >(currentLevel, "Nullspace");
119  const size_t NSDim = nullspace->getNumVectors();
120 
122 
123  // check for consistency of striding information with NSDim and nCoarseDofs
124  if( stridedBlockId== -1 ) {
125  // this means we have no real strided map but only a block map with constant blockSize "NSDim"
126  TEUCHOS_TEST_FOR_EXCEPTION(CoarseMapFactory::stridingInfo_.size() > 1, Exceptions::RuntimeError, "MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
128  CoarseMapFactory::stridingInfo_.push_back(NSDim);
129  TEUCHOS_TEST_FOR_EXCEPTION(CoarseMapFactory::stridingInfo_.size() != 1, Exceptions::RuntimeError, "MueLu::CoarseMapFactory::Build(): stridingInfo_.size() but must be one");
130  } else {
131  // stridedBlockId_ > -1, set by user
132  TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockId > Teuchos::as<LO>(CoarseMapFactory::stridingInfo_.size() - 1) , Exceptions::RuntimeError, "MueLu::CoarseMapFactory::Build(): it is stridingInfo_.size() <= stridedBlockId_. error.");
133  size_t stridedBlockSize = CoarseMapFactory::stridingInfo_[stridedBlockId];
134  TEUCHOS_TEST_FOR_EXCEPTION(stridedBlockSize != NSDim , Exceptions::RuntimeError, "MueLu::CoarseMapFactory::Build(): dimension of strided block != NSDim. error.");
135  }
136 
137  CoarseMapFactory::GetOStream(Statistics2) << "domainGIDOffset: " << maxGlobalIndex + 1 << " block size: " << CoarseMapFactory::getFixedBlockSize() << " stridedBlockId: " << stridedBlockId << std::endl;
138 
139  // number of coarse level dofs (fixed by number of aggregates and blocksize data)
140  GlobalOrdinal nCoarseDofs = numAggs * CoarseMapFactory::getFixedBlockSize();
141  GlobalOrdinal indexBase = aggregates->GetMap()->getIndexBase();
142 
143  RCP<const Map> coarseMap = StridedMapFactory::Build(aggregates->GetMap()->lib(),
145  nCoarseDofs,
146  indexBase,
148  comm,
149  stridedBlockId,
150  maxGlobalIndex + 1);
151 
152  this->Set(currentLevel, "CoarseMap", coarseMap);
153  } // Build
154 
155 } //namespace MueLu
156 
157 #endif /* MUELU_BLOCKEDCOARSEMAPFACTORY_DEF_HPP_ */
MueLu::DefaultLocalOrdinal LocalOrdinal
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access). Usage: Level-&gt;Get&lt; RCP&lt;Matrix&gt; &gt;(&quot;A&quot;, factory) if factory == NULL =&gt; use default factory.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void Build(Level &currentLevel) const
Build an object with this factory.
const RCP< const Map > GetMap() const
returns (overlapping) map of aggregate/node distribution
T * get() const
Print even more statistics.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Class that holds all level-specific information.
Definition: MueLu_Level.hpp:99
LO GetNumAggregates() const
returns the number of aggregates of the current processor. Note: could/should be renamed to GetNumLoc...
void DeclareInput(Level &currentLevel) const
Specifies the data that this class needs, and the factories that generate that data.
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
virtual LocalOrdinal getStridedBlockId() const
getStridedBlockId returns strided block id for the domain DOF map of Ptent (= coarse map) or -1 if fu...
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
Exception throws to report errors in the internal logical of the program.
virtual size_t getFixedBlockSize() const
getFixedBlockSize returns the full block size (number of DOFs per node) of the domain DOF map (= coar...
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()