本文整理汇总了C++中SpatialLocalizer::giveElementContainingPoint方法的典型用法代码示例。如果您正苦于以下问题:C++ SpatialLocalizer::giveElementContainingPoint方法的具体用法?C++ SpatialLocalizer::giveElementContainingPoint怎么用?C++ SpatialLocalizer::giveElementContainingPoint使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SpatialLocalizer
的用法示例。
在下文中一共展示了SpatialLocalizer::giveElementContainingPoint方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: tipIsTouchingEI
bool EnrichmentItem :: tipIsTouchingEI(const TipInfo &iTipInfo)
{
double tol = 1.0e-9;
SpatialLocalizer *localizer = giveDomain()->giveSpatialLocalizer();
Element *tipEl = localizer->giveElementContainingPoint(iTipInfo.mGlobalCoord);
if ( tipEl != NULL ) {
// Check if the candidate tip is located on the current crack
FloatArray N;
FloatArray locCoord;
tipEl->computeLocalCoordinates(locCoord, iTipInfo.mGlobalCoord);
FEInterpolation *interp = tipEl->giveInterpolation();
interp->evalN( N, locCoord, FEIElementGeometryWrapper(tipEl) );
double normalSignDist;
evalLevelSetNormal( normalSignDist, iTipInfo.mGlobalCoord, N, tipEl->giveDofManArray() );
double tangSignDist;
evalLevelSetTangential( tangSignDist, iTipInfo.mGlobalCoord, N, tipEl->giveDofManArray() );
if ( fabs(normalSignDist) < tol && tangSignDist > tol ) {
return true;
}
}
return false;
}
示例2:
int
PrimaryField :: __evaluateAt(FloatArray &answer, FloatArray& coords,
ValueModeType mode, TimeStep *atTime,
IntArray *dofId)
{
Element *bgelem;
Domain *domain = emodel->giveDomain(domainIndx);
SpatialLocalizer *sl = domain->giveSpatialLocalizer();
// locate background element
if ( ( bgelem = sl->giveElementContainingPoint(coords) ) == NULL ) {
//_error ("PrimaryField::evaluateAt: point not found in domain\n");
return 1;
}
EIPrimaryFieldInterface *interface = ( EIPrimaryFieldInterface * ) ( bgelem->giveInterface(EIPrimaryFieldInterfaceType) );
if ( interface ) {
if (dofId) {
return interface->EIPrimaryFieldI_evaluateFieldVectorAt(answer, * this, coords, *dofId, mode, atTime);
} else { // use element default dof id mask
IntArray elemDofId;
bgelem->giveElementDofIDMask(this->giveEquationID(), elemDofId);
return interface->EIPrimaryFieldI_evaluateFieldVectorAt(answer, * this, coords, elemDofId, mode, atTime);
}
} else {
_error("ScalarPrimaryField::operator(): background element does not support EIPrimaryFiledInterface\n");
return 1; // failed
}
}
示例3:
void
MMAContainingElementProjection :: __init(Domain *dold, IntArray &type, FloatArray &coords, Set &elemSet, TimeStep *tStep, bool iCohesiveZoneGP)
{
SpatialLocalizer *sl = dold->giveSpatialLocalizer();
FloatArray jGpCoords;
double distance, minDist = 1.e6;
Element *srcElem;
if ( ( srcElem = sl->giveElementContainingPoint(coords, elemSet) ) ) {
this->source = NULL;
for ( GaussPoint *jGp: *srcElem->giveDefaultIntegrationRulePtr() ) {
if ( srcElem->computeGlobalCoordinates( jGpCoords, jGp->giveNaturalCoordinates() ) ) {
distance = coords.distance(jGpCoords);
if ( distance < minDist ) {
minDist = distance;
this->source = jGp;
}
}
}
if ( !source ) {
OOFEM_ERROR("no suitable source found");
}
} else {
OOFEM_ERROR("No suitable element found");
}
}
示例4: propagateInterface
bool PLCrackPrescribedDir :: propagateInterface(Domain &iDomain, EnrichmentFront &iEnrFront, TipPropagation &oTipProp)
{
if ( !iEnrFront.propagationIsAllowed() ) {
return false;
}
const TipInfo &tipInfo = iEnrFront.giveTipInfo();
SpatialLocalizer *localizer = iDomain.giveSpatialLocalizer();
// It is meaningless to propagate a tip that is not inside any element
if ( tipInfo.mGlobalCoord.giveSize() == 0 ) {
return false;
}
Element *el = localizer->giveElementContainingPoint(tipInfo.mGlobalCoord);
if ( el == NULL ) {
return false;
}
double angleRad = mAngle * M_PI / 180.0;
FloatArray dir = {
cos(angleRad), sin(angleRad)
};
oTipProp.mTipIndex = tipInfo.mTipIndex;
oTipProp.mPropagationDir = dir;
oTipProp.mPropagationLength = mIncrementLength;
return true;
}
示例5: dist
void
MMALeastSquareProjection :: __init(Domain *dold, IntArray &type, FloatArray &coords, Set &elemSet, TimeStep *tStep, bool iCohesiveZoneGP)
//(Domain* dold, IntArray& varTypes, GaussPoint* gp, TimeStep* tStep)
{
GaussPoint *sourceIp;
Element *sourceElement;
SpatialLocalizer *sl = dold->giveSpatialLocalizer();
IntegrationRule *iRule;
IntArray patchList;
this->patchDomain = dold;
// find the closest IP on old mesh
sourceElement = sl->giveElementContainingPoint(coords, elemSet);
if ( !sourceElement ) {
OOFEM_ERROR("no suitable source element found");
}
// determine the type of patch
Element_Geometry_Type egt = sourceElement->giveGeometryType();
if ( egt == EGT_line_1 ) {
this->patchType = MMALSPPatchType_1dq;
} else if ( ( egt == EGT_triangle_1 ) || ( egt == EGT_quad_1 ) ) {
this->patchType = MMALSPPatchType_2dq;
} else {
OOFEM_ERROR("unsupported material mode");
}
/* Determine the state of closest point.
* Only IP in the neighbourhood with same state can be used
* to interpolate the values.
*/
FloatArray dam;
int state = 0;
if ( this->stateFilter ) {
iRule = sourceElement->giveDefaultIntegrationRulePtr();
for ( GaussPoint *gp: *iRule ) {
sourceElement->giveIPValue(dam, gp, IST_PrincipalDamageTensor, tStep);
if ( dam.computeNorm() > 1.e-3 ) {
state = 1; // damaged
}
}
}
// from source neighbours the patch will be constructed
Element *element;
IntArray neighborList;
patchList.resize(1);
patchList.at(1) = sourceElement->giveNumber();
int minNumberOfPoints = this->giveNumberOfUnknownPolynomialCoefficients(this->patchType);
int actualNumberOfPoints = sourceElement->giveDefaultIntegrationRulePtr()->giveNumberOfIntegrationPoints();
int nite = 0;
int elemFlag;
// check if number of IP in patchList is sufficient
// some recursion control would be appropriate
while ( ( actualNumberOfPoints < minNumberOfPoints ) && ( nite <= 2 ) ) {
//if not, construct the neighborhood
dold->giveConnectivityTable()->giveElementNeighbourList(neighborList, patchList);
// count number of available points
patchList.clear();
actualNumberOfPoints = 0;
for ( int i = 1; i <= neighborList.giveSize(); i++ ) {
if ( this->stateFilter ) {
element = patchDomain->giveElement( neighborList.at(i) );
// exclude elements in different regions
if ( !elemSet.hasElement( element->giveNumber() ) ) {
continue;
}
iRule = element->giveDefaultIntegrationRulePtr();
elemFlag = 0;
for ( GaussPoint *gp: *iRule ) {
element->giveIPValue(dam, gp, IST_PrincipalDamageTensor, tStep);
if ( state && ( dam.computeNorm() > 1.e-3 ) ) {
actualNumberOfPoints++;
elemFlag = 1;
} else if ( ( state == 0 ) && ( dam.computeNorm() < 1.e-3 ) ) {
actualNumberOfPoints++;
elemFlag = 1;
}
}
if ( elemFlag ) {
// include this element with corresponding state in neighbor search.
patchList.followedBy(neighborList.at(i), 10);
}
} else { // if (! yhis->stateFilter)
element = patchDomain->giveElement( neighborList.at(i) );
// exclude elements in different regions
if ( !elemSet.hasElement( element->giveNumber() ) ) {
continue;
}
actualNumberOfPoints += element->giveDefaultIntegrationRulePtr()->giveNumberOfIntegrationPoints();
patchList.followedBy(neighborList.at(i), 10);
}
} // end loop over neighbor list
//.........这里部分代码省略.........
示例6: exportPrimVarAs
void
POIExportModule :: exportPrimVarAs(UnknownType valID, FILE *stream, TimeStep *tStep)
{
Domain *d = emodel->giveDomain(1);
int j;
FloatArray pv, coords(3);
InternalStateValueType type = ISVT_UNDEFINED;
if ( valID == DisplacementVector ) {
type = ISVT_VECTOR;
} else if ( valID == FluxVector ) {
type = ISVT_SCALAR;
} else {
OOFEM_ERROR("POIExportModule::exportPrimVarAs: unsupported UnknownType");
}
// print header
if ( type == ISVT_SCALAR ) {
fprintf(stream, "SCALARS prim_scalar_%d\n", ( int ) valID);
} else if ( type == ISVT_VECTOR ) {
fprintf(stream, "VECTORS vector_%d float\n", ( int ) valID);
} else {
fprintf(stderr, "POIExportModule::exportPrimVarAs: unsupported variable type\n");
}
SpatialLocalizer *sl = d->giveSpatialLocalizer();
// loop over POIs
std::list< POI_dataType > :: iterator PoiIter;
for ( PoiIter = POIList.begin(); PoiIter != POIList.end(); ++PoiIter ) {
coords.at(1) = ( * PoiIter ).x;
coords.at(2) = ( * PoiIter ).y;
coords.at(3) = ( * PoiIter ).z;
//region = (*PoiIter).region;
Element *source = sl->giveElementContainingPoint(coords, NULL);
if ( source ) {
// ask interface
EIPrimaryUnknownMapperInterface *interface =
( EIPrimaryUnknownMapperInterface * ) ( source->giveInterface(EIPrimaryUnknownMapperInterfaceType) );
if ( interface ) {
interface->EIPrimaryUnknownMI_computePrimaryUnknownVectorAt(VM_Total, tStep, coords, pv);
} else {
pv.resize(0);
OOFEM_WARNING2( "POIExportModule::exportPrimVarAs: element %d with no EIPrimaryUnknownMapperInterface support",
source->giveNumber() );
}
fprintf(stream, "%10d ", ( * PoiIter ).id);
if ( pv.giveSize() ) {
for ( j = 1; j <= pv.giveSize(); j++ ) {
fprintf( stream, " %15e ", pv.at(j) );
}
}
fprintf(stream, "\n");
} else {
OOFEM_ERROR4( "POIExportModule::exportPrimVarAs: no element containing POI(%e,%e,%e) found",
coords.at(1), coords.at(2), coords.at(3) );
}
}
}
示例7: tangent
void PLHoopStressCirc :: propagateInterfaces(Domain &iDomain, EnrichmentDomain &ioEnrDom)
{
// Fetch crack tip data
TipInfo tipInfoStart, tipInfoEnd;
ioEnrDom.giveTipInfos(tipInfoStart, tipInfoEnd);
std :: vector< TipInfo >tipInfo = {tipInfoStart, tipInfoEnd};
SpatialLocalizer *localizer = iDomain.giveSpatialLocalizer();
for ( size_t tipIndex = 0; tipIndex < tipInfo.size(); tipIndex++ ) {
// Construct circle points on an arc from -90 to 90 degrees
double angle = -90.0 + mAngleInc;
std :: vector< double >angles;
while ( angle <= ( 90.0 - mAngleInc ) ) {
angles.push_back(angle * M_PI / 180.0);
angle += mAngleInc;
}
const FloatArray &xT = tipInfo [ tipIndex ].mGlobalCoord;
const FloatArray &t = tipInfo [ tipIndex ].mTangDir;
const FloatArray &n = tipInfo [ tipIndex ].mNormalDir;
// It is meaningless to propagate a tip that is not inside any element
Element *el = localizer->giveElementContainingPoint(tipInfo [ tipIndex ].mGlobalCoord);
if ( el != NULL ) {
std :: vector< FloatArray >circPoints;
for ( size_t i = 0; i < angles.size(); i++ ) {
FloatArray tangent(2);
tangent.zero();
tangent.add(cos(angles [ i ]), t);
tangent.add(sin(angles [ i ]), n);
tangent.normalize();
FloatArray x(xT);
x.add(mRadius, tangent);
circPoints.push_back(x);
}
std :: vector< double >sigTTArray, sigRTArray;
// Loop over circle points
for ( size_t pointIndex = 0; pointIndex < circPoints.size(); pointIndex++ ) {
FloatArray stressVec;
if ( mUseRadialBasisFunc ) {
// Interpolate stress with radial basis functions
// Choose a cut-off length l:
// take the distance between two nodes in the element containing the
// crack tip multiplied by a constant factor.
// ( This choice implies that we hope that the element has reasonable
// aspect ratio.)
const FloatArray &x1 = * ( el->giveDofManager(1)->giveCoordinates() );
const FloatArray &x2 = * ( el->giveDofManager(2)->giveCoordinates() );
const double l = 1.0 * x1.distance(x2);
// Use the octree to get all elements that have
// at least one Gauss point in a certain region around the tip.
const double searchRadius = 3.0 * l;
std :: set< int >elIndices;
localizer->giveAllElementsWithIpWithinBox(elIndices, circPoints [ pointIndex ], searchRadius);
// Loop over the elements and Gauss points obtained.
// Evaluate the interpolation.
FloatArray sumQiWiVi;
double sumWiVi = 0.0;
for ( int elIndex: elIndices ) {
Element *gpEl = iDomain.giveElement(elIndex);
IntegrationRule *iRule = gpEl->giveDefaultIntegrationRulePtr();
for ( GaussPoint *gp_i: *iRule ) {
////////////////////////////////////////
// Compute global gp coordinates
FloatArray N;
FEInterpolation *interp = gpEl->giveInterpolation();
interp->evalN( N, * ( gp_i->giveCoordinates() ), FEIElementGeometryWrapper(gpEl) );
// Compute global coordinates of Gauss point
FloatArray globalCoord(2);
globalCoord.zero();
for ( int i = 1; i <= gpEl->giveNumberOfDofManagers(); i++ ) {
DofManager *dMan = gpEl->giveDofManager(i);
globalCoord.at(1) += N.at(i) * dMan->giveCoordinate(1);
globalCoord.at(2) += N.at(i) * dMan->giveCoordinate(2);
}
////////////////////////////////////////
// Compute weight of kernel function
FloatArray tipToGP;
tipToGP.beDifferenceOf(globalCoord, xT);
bool inFrontOfCrack = true;
//.........这里部分代码省略.........
示例8: evaluateAt
int
EIPrimaryUnknownMapper :: evaluateAt(FloatArray &answer, IntArray &dofMask, ValueModeType mode,
Domain *oldd, FloatArray &coords, IntArray ®List, TimeStep *tStep)
{
Element *oelem;
EIPrimaryUnknownMapperInterface *interface;
SpatialLocalizer *sl = oldd->giveSpatialLocalizer();
///@todo Change to the other version after checking that it works properly. Will render "giveElementCloseToPoint" obsolete (superseeded by giveElementClosestToPoint).
#if 1
if ( regList.isEmpty() ) {
oelem = sl->giveElementContainingPoint(coords);
} else {
oelem = sl->giveElementContainingPoint(coords, & regList);
}
if ( !oelem ) {
if ( regList.isEmpty() ) {
oelem = oldd->giveSpatialLocalizer()->giveElementCloseToPoint(coords);
} else {
oelem = oldd->giveSpatialLocalizer()->giveElementCloseToPoint(coords, & regList);
}
if ( !oelem ) {
OOFEM_WARNING("Couldn't find any element containing point.");
return false;
}
}
#else
FloatArray lcoords, closest;
if ( regList.isEmpty() ) {
oelem = sl->giveElementClosestToPoint(lcoords, closest, coords, 0);
} else {
// Take the minimum of any region
double mindist = 0.0, distance;
oelem = NULL;
for ( int i = 1; i < regList.giveSize(); ++i ) {
Element *tmpelem = sl->giveElementClosestToPoint( lcoords, closest, coords, regList.at(i) );
distance = closest.distance_square(coords);
if ( tmpelem != NULL ) {
distance = closest.distance_square(coords);
if ( distance < mindist || i == 1 ) {
mindist = distance;
oelem = tmpelem;
if ( distance == 0.0 ) {
break;
}
}
}
}
}
if ( !oelem ) {
OOFEM_WARNING("Couldn't find any element containing point.");
return false;
}
#endif
interface = static_cast< EIPrimaryUnknownMapperInterface * >( oelem->giveInterface(EIPrimaryUnknownMapperInterfaceType) );
if ( interface ) {
oelem->giveElementDofIDMask(dofMask);
#if 1
FloatArray lcoords;
if ( oelem->computeLocalCoordinates(lcoords, coords) ) {
interface->EIPrimaryUnknownMI_computePrimaryUnknownVectorAtLocal(mode, tStep, lcoords, answer);
} else {
answer.clear();
}
#else
interface->EIPrimaryUnknownMI_computePrimaryUnknownVectorAtLocal(mode, tStep, lcoords, answer);
#endif
} else {
OOFEM_ERROR("Element does not support EIPrimaryUnknownMapperInterface");
}
return true;
}
示例9: line
//.........这里部分代码省略.........
// }
// const FloatArray &p1 = *(el->giveDofManager(n1)->giveCoordinates());
// const FloatArray &p2 = *(el->giveDofManager(n2)->giveCoordinates());
}
// printf("intersecPoints.size(): %lu\n", intersecPoints.size());
if(intersecPoints.size() == 2) {
ps = std::move(intersecPoints[0]);
pe = std::move(intersecPoints[1]);
}
else {
OOFEM_ERROR("intersecPoints.size() != 2")
}
}
FloatArray points = {ps(0), ps(1), pc(0), pc(1), pe(0), pe(1)};
// double diffX = 0.5*(ps(0) + pe(0)) - pc(0);
// printf("diffX: %e\n", diffX);
// double diffY = 0.5*(ps(1) + pe(1)) - pc(1);
// printf("diffY: %e\n", diffY);
// TODO: Check if nucleation is allowed, by checking for already existing cracks close to the GP.
// Idea: Nucleation is not allowed if we are within an enriched element. In this way, branching is not
// completely prohibited, but we avoid initiating multiple similar cracks.
bool insertionAllowed = true;
Element *el_s = octree->giveElementContainingPoint(ps);
if(el_s) {
if( xMan->isElementEnriched(el_s) ) {
insertionAllowed = false;
}
}
Element *el_c = octree->giveElementContainingPoint(pc);
if(el_c) {
if( xMan->isElementEnriched(el_c) ) {
insertionAllowed = false;
}
}
Element *el_e = octree->giveElementContainingPoint(pe);
if(el_e) {
if( xMan->isElementEnriched(el_e) ) {
insertionAllowed = false;
}
}
for(const auto &x: center_coord_inserted_cracks) {
if( x.distance(pc) < 2.0*mInitialCrackLength) {
insertionAllowed = false;
break;
printf("Preventing insertion.\n");
}
}
if(insertionAllowed) {
int n = xMan->giveNumberOfEnrichmentItems() + 1;
std::unique_ptr<Crack> crack = std::make_unique<Crack>(n, xMan, mpDomain);