17 #include <stk_mesh/base/Entity.hpp> 44 const MeshA &FromElem,
47 static void apply (MeshB &ToPoints,
48 const MeshA &FromElem,
49 const EntityKeyMap &RangeToDomain) ;
54 const MeshA &FromElem,
57 const stk::mesh::BulkData &fromBulkData = FromElem.fromBulkData_;
58 stk::mesh::BulkData &toBulkData = ToPoints.toBulkData_;
64 const unsigned nDim = FromElem.fromMetaData_.spatial_dimension();
66 typedef typename EntityKeyMap::iterator iterator;
67 typedef typename EntityKeyMap::const_iterator const_iterator;
70 double maxBestX = -std::numeric_limits<double>::max();
71 size_t maxCandidateBoundingBox = 0;
73 for (const_iterator current_key=RangeToDomain.begin(); current_key!=RangeToDomain.end(); ) {
75 double bestX_ = std::numeric_limits<double>::max();
77 const stk::mesh::EntityKey thePt = current_key->first;
78 stk::mesh::Entity theNode = toBulkData.get_entity(thePt);
80 const double * tocoords = stk::mesh::field_data(*tocoordinates, theNode );
82 std::pair<iterator, iterator> keys=RangeToDomain.equal_range(current_key->first);
83 iterator nearest = keys.second;
85 size_t candidateBoundingBoxSize = 0;
86 for (iterator ii=keys.first; ii != keys.second; ++ii) {
87 candidateBoundingBoxSize++;
89 const stk::mesh::EntityKey theBox = ii->second;
90 stk::mesh::Entity theElem = fromBulkData.get_entity(theBox);
93 const stk::mesh::Bucket &theBucket = fromBulkData.bucket(theElem);
94 const stk::topology &theElemTopo = theBucket.topology();
98 stk::mesh::Entity
const* elem_node_rels = fromBulkData.begin_nodes(theElem);
99 const int num_nodes = fromBulkData.num_nodes(theElem);
102 std::vector<double> theElementCoords(nDim*nodesPerElement);
104 for (
int ni = 0; ni < num_nodes; ++ni ) {
105 stk::mesh::Entity node = elem_node_rels[ni];
108 const double * fromcoords = stk::mesh::field_data(*fromcoordinates, node );
109 for (
unsigned j = 0; j < nDim; ++j ) {
110 const int offSet = j*nodesPerElement + ni;
111 theElementCoords[offSet] = fromcoords[j];
115 std::vector<double> isoParCoords(nDim);
116 const double nearestDistance = meSCS->
isInElement(&theElementCoords[0],
119 if ( nearestDistance < bestX_ ) {
120 bestX_ = nearestDistance;
121 ToPoints.TransferInfo_[thePt] = isoParCoords;
123 maxBestX = std::max(maxBestX, bestX_);
126 maxCandidateBoundingBox = std::max(maxCandidateBoundingBox, candidateBoundingBoxSize);
128 current_key = keys.second;
129 if (nearest != keys.first ) RangeToDomain.erase(keys.first, nearest);
130 if (nearest != keys.second) RangeToDomain.erase(++nearest, keys.second);
134 double g_maxBestX = 0.0;
135 size_t g_maxCandidateBoundngBox = 0;
136 stk::all_reduce_max(FromElem.comm(), &maxBestX, &g_maxBestX, 1);
137 stk::all_reduce_max(FromElem.comm(), &maxCandidateBoundingBox, &g_maxCandidateBoundngBox, 1);
141 NaluEnv::self().
naluOutputP0() <<
" Maximum normalized distance found is: " << g_maxBestX <<
" (should be unity or less)" << std::endl;
142 NaluEnv::self().
naluOutputP0() <<
" Maximum number of candidate bounding boxes found for a single point is: " << g_maxCandidateBoundngBox << std::endl;
143 NaluEnv::self().
naluOutputP0() <<
" Should max normalized distance and/or candidate bounding box size be too large, please check setup" << std::endl;
148 const MeshA &FromElem,
151 const stk::mesh::BulkData &fromBulkData = FromElem.fromBulkData_;
152 stk::mesh::BulkData &toBulkData = ToPoints.toBulkData_;
154 typename EntityKeyMap::const_iterator ii;
155 for(ii=RangeToDomain.begin(); ii!=RangeToDomain.end(); ++ii ) {
157 const stk::mesh::EntityKey thePt = ii->first;
158 const stk::mesh::EntityKey theBox = ii->second;
160 if (1 != ToPoints.TransferInfo_.count(thePt)) {
161 if (0 == ToPoints.TransferInfo_.count(thePt))
162 throw std::runtime_error(
"Key not found in database");
164 throw std::runtime_error(
"Too many Keys found in database");
166 const std::vector<double> &isoParCoords_ = ToPoints.TransferInfo_[thePt];
167 stk::mesh::Entity theNode = toBulkData.get_entity(thePt);
168 stk::mesh::Entity theElem = fromBulkData.get_entity(theBox);
170 const stk::mesh::Bucket &theBucket = fromBulkData.bucket(theElem);
171 const stk::topology &theElemTopo = theBucket.topology();
174 stk::mesh::Entity
const* elem_node_rels = fromBulkData.begin_nodes(theElem);
175 const int num_nodes = fromBulkData.num_nodes(theElem);
178 for (
unsigned n=0; n!=FromElem.fromFieldVec_.size(); ++n) {
181 const stk::mesh::FieldBase *toFieldBaseField = ToPoints.toFieldVec_[n];
184 const size_t sizeOfField = field_bytes_per_entity(*toFieldBaseField, theNode) /
sizeof(double);
185 std::vector <double > Coeff(nodesPerElement*sizeOfField);
188 for (
int ni = 0; ni < num_nodes; ++ni ) {
189 stk::mesh::Entity node = elem_node_rels[ni];
191 const stk::mesh::FieldBase *fromFieldBaseField = FromElem.fromFieldVec_[n];
192 const double *theField = (
double*)stk::mesh::field_data(*fromFieldBaseField, node );
194 for (
size_t j = 0; j < sizeOfField; ++j) {
195 const int offSet = j*nodesPerElement + ni;
196 Coeff[offSet] = theField[j];
200 double * toField = (
double*)stk::mesh::field_data(*toFieldBaseField, theNode);
201 if (!toField)
throw std::runtime_error(
"Receiving field undefined on mesh object.");
virtual void interpolatePoint(const int &nComp, const double *isoParCoord, const double *field, double *result)
Definition: MasterElement.h:202
Definition: ABLForcingAlgorithm.C:26
Definition: MasterElement.h:53
FROM MeshA
Definition: LinInterp.h:29
MeshB::EntityProc EntityProcB
Definition: LinInterp.h:34
static MasterElement * get_surface_master_element(const stk::topology &theTopo, int dimension=0, std::string quadType="GaussLegendre")
Definition: MasterElementFactory.C:208
int nodesPerElement_
Definition: MasterElement.h:246
static void apply(MeshB &ToPoints, const MeshA &FromElem, const EntityKeyMap &RangeToDomain)
Definition: LinInterp.h:147
virtual double isInElement(const double *elemNodalCoord, const double *pointCoord, double *isoParCoord)
Definition: MasterElement.h:195
stk::mesh::Field< double, stk::mesh::Cartesian > VectorFieldType
Definition: FieldTypeDef.h:24
TO MeshB
Definition: LinInterp.h:30
std::vector< EntityProcRelation > EntityProcRelationVec
Definition: LinInterp.h:37
MeshB::EntityKey EntityKeyB
Definition: LinInterp.h:32
std::pair< EntityProcB, EntityProcA > EntityProcRelation
Definition: LinInterp.h:36
static NaluEnv & self()
Definition: NaluEnv.C:48
Definition: LinInterp.h:25
MeshA::EntityKey EntityKeyA
Definition: LinInterp.h:31
MeshA::EntityProc EntityProcA
Definition: LinInterp.h:33
Definition: LinInterp.h:41
std::multimap< EntityKeyB, EntityKeyA > EntityKeyMap
Definition: LinInterp.h:39
std::ostream & naluOutputP0()
Definition: NaluEnv.C:58
static void filter_to_nearest(EntityKeyMap &RangeToDomain, const MeshA &FromElem, MeshB &ToPoints)
Definition: LinInterp.h:52