11#ifndef __Panzer_STK_PeriodicBC_Matcher_hpp__
12#define __Panzer_STK_PeriodicBC_Matcher_hpp__
14#include "Teuchos_Tuple.hpp"
15#include "Teuchos_RCP.hpp"
18#include "PanzerAdaptersSTK_config.hpp"
21#ifdef PANZER_HAVE_STKSEARCH
22#include "stk_search/CoarseSearch.hpp"
31namespace periodic_helpers {
33#ifdef PANZER_HAVE_STKSEARCH
35 typedef stk::search::IdentProc<stk::mesh::EntityKey> SearchId;
36 typedef stk::search::Sphere<double> Sphere;
37 typedef std::vector< std::pair<Sphere,SearchId> > SphereIdVector;
38 typedef std::vector<std::pair<SearchId,SearchId> > SearchPairVector;
39 typedef std::vector<std::pair<stk::mesh::EntityKey,stk::mesh::EntityKey> > SearchPairSet;
46 template <
typename Matcher>
47 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
49 const STK_Interface & mesh,
50 const Matcher & matcher,
const std::string type_ =
"coord");
53 template <
typename Matcher>
54 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
56 const STK_Interface & mesh,
57 const Matcher & matcher,
58 const std::vector<std::pair<std::size_t,std::size_t> > & current,
const std::string type_ =
"coord");
63 std::pair<Teuchos::RCP<std::vector<std::size_t> >,
64 Teuchos::RCP<std::vector<Teuchos::Tuple<double,3> > > >
66 const std::string & sideName,
const std::string type_ =
"coord");
71 std::pair<Teuchos::RCP<std::vector<std::size_t> >,
72 Teuchos::RCP<std::vector<Teuchos::Tuple<double,3> > > >
74 const std::string & sideName,
const std::string type_ =
"coord");
79 Teuchos::RCP<std::vector<std::size_t> >
81 const std::string & sideName,
const std::string type_ =
"coord");
87 template <
typename Matcher>
88 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
90 const std::vector<Teuchos::Tuple<double,3> > & side_coords,
91 const STK_Interface & mesh,
92 const std::string & sideName,
const Matcher & matcher,
const std::string type_ =
"coord");
103 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
105 const std::vector<std::pair<std::size_t,std::size_t> > & locallyMatchedIds,
106 const STK_Interface & mesh,
bool failure);
108#ifdef PANZER_HAVE_STKSEARCH
123 void fillLocalSearchVector(
const STK_Interface & mesh, SphereIdVector & searchVector,
const double & error,
124 const std::string & sideName,
const std::string & type_,
const bool & getGhostedIDs,
125 const std::vector<std::string> & matchedSides, std::vector<SearchId> & potentialIDsToRemap);
127 void fillLocalSearchVector(
const STK_Interface & mesh, SphereIdVector & searchVector,
const double & error,
128 const std::string & sideName,
const std::string & type_,
const bool & getGhostedIDs =
false);
136 const std::vector<double> computeGlobalCentroid(
const STK_Interface & mesh,
const std::string & sideName);
144 template<
typename Matcher>
void
145 transformLocalSearchVector(SphereIdVector & searchVectorSideA,
const Matcher & matcher,
const std::vector<double> & centroidSideB );
161 template <
typename Matcher>
162 Teuchos::RCP<std::vector<std::pair<size_t,size_t> > >
164 const STK_Interface & mesh,
165 const Matcher & matcher,
const std::vector<std::string> & matchedSides,
166 const std::vector<std::pair<size_t,size_t> > & previousMatches,
167 const std::string type_ =
"coord");
169 template <
typename Matcher>
170 Teuchos::RCP<std::vector<std::pair<size_t,size_t> > >
172 const STK_Interface & mesh,
173 const Matcher & matcher,
const std::string type_ =
"coord");
184 void updateMapping(Teuchos::RCP<std::vector<std::pair<size_t,size_t> > > & currentMatches,
185 const std::vector<std::pair<size_t,size_t> > & previousMatches,
186 const std::vector<SearchId> & IDsToRemap,
const STK_Interface & mesh);
195 void appendMapping(Teuchos::RCP<std::vector<std::pair<size_t,size_t> > > & currentMatches,
196 const std::vector<std::pair<size_t,size_t> > & previousMatches);
223 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
225 const Teuchos::RCP<
const std::vector<std::pair<std::size_t,std::size_t> > > & currentState = Teuchos::null
228#ifdef PANZER_HAVE_STKSEARCH
246 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
248 const Teuchos::RCP<
const std::vector<std::pair<std::size_t,std::size_t> > > & currentState = Teuchos::null
270 const T*
getAs()
const {
return dynamic_cast<const T*
>(
this);}
278template <
typename Matcher>
282 PeriodicBC_Matcher(
const std::string & left,
const std::string & right,
const Matcher & matcher,
const std::string type =
"coord")
298 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
300 const Teuchos::RCP<
const std::vector<std::pair<std::size_t,std::size_t> > > & currentState = Teuchos::null
303 if(currentState==Teuchos::null)
309#ifdef PANZER_HAVE_STKSEARCH
326 Teuchos::RCP<std::vector<std::pair<std::size_t,std::size_t> > >
328 const Teuchos::RCP<
const std::vector<std::pair<std::size_t,std::size_t> > > & currentState = Teuchos::null
331 if(currentState==Teuchos::null)
340 std::stringstream ss;
341 ss <<
"condition: " <<
matcher_.getString() <<
", sides = [ "
342 <<
"\"" <<
left_ <<
"\", "
343 <<
"\"" <<
right_ <<
"\" ]";
376template <
typename Matcher>
377Teuchos::RCP<PeriodicBC_MatcherBase>
378buildPeriodicBC_Matcher(
const std::string & left,
const std::string & right,
const Matcher & matcher,
const std::string type =
"coord")
385#ifdef PANZER_HAVE_STKSEARCH
virtual std::string getRightSidesetName() const =0
Returns the sideset name for the right side.
virtual std::string getString() const =0
virtual std::string getLeftSidesetName() const =0
Returns the sideset name for the left side.
const T * getAs() const
Attempts to cast the underlying matcher to type T. Returns nullptr if cast fails.
virtual ~PeriodicBC_MatcherBase()
virtual Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > > getMatchedPair(const STK_Interface &mesh, const Teuchos::RCP< const std::vector< std::pair< std::size_t, std::size_t > > > ¤tState=Teuchos::null) const =0
virtual std::string getType() const =0
std::string getString() const
std::string getRightSidesetName() const
Returns the sideset name for the right side.
std::string getType() const
PeriodicBC_Matcher(const PeriodicBC_Matcher &src)
Copy constructor.
Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > > getMatchedPair(const STK_Interface &mesh, const Teuchos::RCP< const std::vector< std::pair< std::size_t, std::size_t > > > ¤tState=Teuchos::null) const
PeriodicBC_Matcher(const std::string &left, const std::string &right, const Matcher &matcher, const std::string type="coord")
Construct from the two sideset names to match and the matcher object defining how coordinates on them...
const Matcher & getMatcher() const
Returns the underlying matcher object.
std::string getLeftSidesetName() const
Returns the sideset name for the left side.
Teuchos::RCP< std::vector< std::pair< size_t, size_t > > > matchPeriodicSidesSearch(const std::string &sideA, const std::string &sideB, const STK_Interface &mesh, const Matcher &matcher, const std::string type_)
Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > > getGlobalPairing(const std::vector< std::size_t > &locallyRequiredIds, const std::vector< std::pair< std::size_t, std::size_t > > &locallyMatchedIds, const STK_Interface &mesh, bool failure)
std::pair< Teuchos::RCP< std::vector< std::size_t > >, Teuchos::RCP< std::vector< Teuchos::Tuple< double, 3 > > > > getSideIdsAndCoords(const STK_Interface &mesh, const std::string &sideName, const std::string type_)
std::pair< Teuchos::RCP< std::vector< std::size_t > >, Teuchos::RCP< std::vector< Teuchos::Tuple< double, 3 > > > > getLocalSideIdsAndCoords(const STK_Interface &mesh, const std::string &sideName, const std::string type_)
Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > > getLocallyMatchedSideIds(const std::vector< std::size_t > &side_ids, const std::vector< Teuchos::Tuple< double, 3 > > &side_coords, const STK_Interface &mesh, const std::string &sideName, const Matcher &matcher, const std::string type_="coord")
Teuchos::RCP< std::vector< std::pair< std::size_t, std::size_t > > > matchPeriodicSides(const std::string &left, const std::string &right, const STK_Interface &mesh, const Matcher &matcher, const std::string type_="coord")
void transformLocalSearchVector(SphereIdVector &searchVectorSideA, const Matcher &matcher, const std::vector< double > ¢roidSideB)
Teuchos::RCP< std::vector< std::size_t > > getLocalSideIds(const STK_Interface &mesh, const std::string &sideName, const std::string type_)
Teuchos::RCP< PeriodicBC_MatcherBase > buildPeriodicBC_Matcher(const std::string &left, const std::string &right, const Matcher &matcher, const std::string type="coord")