Particle insertion (domain check)
- Domain check is added to prevent points that are outside of internalDomainBox
This commit is contained in:
parent
9c2a9a81b0
commit
89d7e1f0ba
|
@ -68,6 +68,16 @@ bool pFlow::InsertionRegion<ShapeType>::insertParticles
|
||||||
|
|
||||||
if(newNum == 0) return true;
|
if(newNum == 0) return true;
|
||||||
|
|
||||||
|
auto internalBox = pStruct().internalDomainBox();
|
||||||
|
|
||||||
|
if( !(internalBox.minPoint() < internalBox.maxPoint()))
|
||||||
|
{
|
||||||
|
WARNING<<"Minimum point of internal point is not lower than "<<
|
||||||
|
"the maximum point \n"<<
|
||||||
|
"minimum point: "<< internalBox.minPoint()<<
|
||||||
|
"\nmaximum point:"<<internalBox.maxPoint()<<END_WARNING;
|
||||||
|
}
|
||||||
|
|
||||||
names.reserve(max(newNum,names.capacity()));
|
names.reserve(max(newNum,names.capacity()));
|
||||||
pos.reserve(max(newNum,pos.capacity()));
|
pos.reserve(max(newNum,pos.capacity()));
|
||||||
names.clear();
|
names.clear();
|
||||||
|
@ -75,13 +85,7 @@ bool pFlow::InsertionRegion<ShapeType>::insertParticles
|
||||||
|
|
||||||
realVector diams("diams", newNum, 0, RESERVE());
|
realVector diams("diams", newNum, 0, RESERVE());
|
||||||
|
|
||||||
for(uint32 i=0; i<newNum; i++)
|
|
||||||
{
|
|
||||||
uint32 idx;
|
|
||||||
shapes_.shapeNameToIndex(names[i], idx);
|
|
||||||
diams[i] = shapes_.boundingDiameter(idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
uint32 idx;
|
uint32 idx;
|
||||||
auto& mix = mixture();
|
auto& mix = mixture();
|
||||||
|
@ -94,6 +98,10 @@ bool pFlow::InsertionRegion<ShapeType>::insertParticles
|
||||||
{
|
{
|
||||||
|
|
||||||
realx3 p = pReg.peek();
|
realx3 p = pReg.peek();
|
||||||
|
|
||||||
|
// check if point is inside internal box
|
||||||
|
if(!internalBox.isInside(p))continue;
|
||||||
|
|
||||||
if( !checkForContact(pos, diams, p, d) )
|
if( !checkForContact(pos, diams, p, d) )
|
||||||
{
|
{
|
||||||
names.push_back(name);
|
names.push_back(name);
|
||||||
|
|
|
@ -22,6 +22,7 @@ Licence:
|
||||||
#define __InsertionRegion_hpp__
|
#define __InsertionRegion_hpp__
|
||||||
|
|
||||||
#include "dictionary.hpp"
|
#include "dictionary.hpp"
|
||||||
|
#include "pointStructure.hpp"
|
||||||
#include "insertionRegion.hpp"
|
#include "insertionRegion.hpp"
|
||||||
|
|
||||||
namespace pFlow
|
namespace pFlow
|
||||||
|
|
|
@ -39,6 +39,12 @@ pFlow::insertion::insertion(particles& prtcl)
|
||||||
readInsertionDict(*this);
|
readInsertionDict(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pFlow::pointStructure&
|
||||||
|
pFlow::insertion::pStruct() const
|
||||||
|
{
|
||||||
|
return particles_.pStruct();
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
pFlow::insertion::read(iIstream& is, const IOPattern& iop)
|
pFlow::insertion::read(iIstream& is, const IOPattern& iop)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,7 @@ namespace pFlow
|
||||||
|
|
||||||
// forward
|
// forward
|
||||||
class particles;
|
class particles;
|
||||||
|
class pointStructure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for particle insertion
|
* Base class for particle insertion
|
||||||
|
@ -88,6 +89,8 @@ public:
|
||||||
return particles_;
|
return particles_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pointStructure& pStruct()const;
|
||||||
|
|
||||||
inline bool readFromFile() const
|
inline bool readFromFile() const
|
||||||
{
|
{
|
||||||
return readFromFile_;
|
return readFromFile_;
|
||||||
|
|
|
@ -158,6 +158,12 @@ pFlow::insertionRegion::insertionRegion(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pFlow::pointStructure&
|
||||||
|
pFlow::insertionRegion::pStruct() const
|
||||||
|
{
|
||||||
|
return Insertion().pStruct();
|
||||||
|
}
|
||||||
|
|
||||||
pFlow::uint32
|
pFlow::uint32
|
||||||
pFlow::insertionRegion::numberToBeInserted(uint32 iter, real t, real dt)
|
pFlow::insertionRegion::numberToBeInserted(uint32 iter, real t, real dt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,7 @@ namespace pFlow
|
||||||
|
|
||||||
class dictionary;
|
class dictionary;
|
||||||
class insertion;
|
class insertion;
|
||||||
|
class pointStructure;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class defines all the necessary enteties for defining an insertion
|
* This class defines all the necessary enteties for defining an insertion
|
||||||
|
@ -92,7 +93,7 @@ private:
|
||||||
/// insertion region dictionary
|
/// insertion region dictionary
|
||||||
const dictionary& dict_;
|
const dictionary& dict_;
|
||||||
|
|
||||||
/// ref to pointStructure
|
/// ref to insertion
|
||||||
const insertion& insertion_;
|
const insertion& insertion_;
|
||||||
|
|
||||||
/// @brief time control for insertion events
|
/// @brief time control for insertion events
|
||||||
|
@ -163,6 +164,8 @@ public:
|
||||||
return insertion_;
|
return insertion_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pointStructure& pStruct()const;
|
||||||
|
|
||||||
inline bool insertionTime(uint32 iter, real t, real dt) const
|
inline bool insertionTime(uint32 iter, real t, real dt) const
|
||||||
{
|
{
|
||||||
return tControl_.timeEvent(iter, t, dt);
|
return tControl_.timeEvent(iter, t, dt);
|
||||||
|
|
|
@ -23,7 +23,7 @@ template <typename Type>
|
||||||
bool pFlow::setFieldEntry::checkForType()const
|
bool pFlow::setFieldEntry::checkForType()const
|
||||||
{
|
{
|
||||||
word typeName( entry_.firstPart() );
|
word typeName( entry_.firstPart() );
|
||||||
return basicTypeName<Type>() == typeName;
|
return getTypeName<Type>() == typeName;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Type>
|
template <typename Type>
|
||||||
|
|
|
@ -153,12 +153,30 @@ public:
|
||||||
(dict, bplane, internal, bndrs, thisIndex)
|
(dict, bplane, internal, bndrs, thisIndex)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/// The length from boundary plane into the domain
|
||||||
|
/// where beyond that distance internal points exist.
|
||||||
|
/// By conventions is it always equal to neighborLength_
|
||||||
|
real neighborLengthIntoInternal()const
|
||||||
|
{
|
||||||
|
return neighborLength_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The distance length from boundary plane
|
||||||
|
/// where neighbor particles exist in that distance.
|
||||||
|
/// This length may be modified in each boundary type
|
||||||
|
/// as required. In this case the boundaryExtensionLength
|
||||||
|
/// method should also be modified accordingly.
|
||||||
virtual
|
virtual
|
||||||
real neighborLength()const
|
real neighborLength()const
|
||||||
{
|
{
|
||||||
return neighborLength_;
|
return neighborLength_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The extention length (in vector form) for the boundary
|
||||||
|
/// as required by each boundary type. It is allowed for
|
||||||
|
/// each boundary type to be extended outward to allow
|
||||||
|
/// particles to stay more in its list before being removed
|
||||||
|
/// from its list.
|
||||||
virtual
|
virtual
|
||||||
realx3 boundaryExtensionLength()const
|
realx3 boundaryExtensionLength()const
|
||||||
{
|
{
|
||||||
|
@ -240,6 +258,7 @@ public:
|
||||||
|
|
||||||
const boundaryBase& mirrorBoundary()const;
|
const boundaryBase& mirrorBoundary()const;
|
||||||
|
|
||||||
|
/// the actual boundary plane of this boundary
|
||||||
const plane& boundaryPlane()const
|
const plane& boundaryPlane()const
|
||||||
{
|
{
|
||||||
return boundaryPlane_;
|
return boundaryPlane_;
|
||||||
|
|
|
@ -143,12 +143,27 @@ bool pFlow::boundaryList::setLists()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pFlow::boundaryList::beforeIteration
|
pFlow::box
|
||||||
(
|
pFlow::boundaryList::internalDomainBox() const
|
||||||
uint32 iter,
|
{
|
||||||
real t,
|
const auto& thisBox = pStruct_.thisDomain().domainBox();
|
||||||
real dt
|
|
||||||
)
|
const realx3 lowerPointDisplacement = {
|
||||||
|
boundary(0).neighborLengthIntoInternal(),
|
||||||
|
boundary(2).neighborLengthIntoInternal(),
|
||||||
|
boundary(4).neighborLengthIntoInternal()};
|
||||||
|
|
||||||
|
const realx3 upperPointDisplacement = {
|
||||||
|
boundary(1).neighborLengthIntoInternal(),
|
||||||
|
boundary(3).neighborLengthIntoInternal(),
|
||||||
|
boundary(5).neighborLengthIntoInternal()};
|
||||||
|
|
||||||
|
return {thisBox.minPoint() + lowerPointDisplacement,
|
||||||
|
thisBox.maxPoint() - upperPointDisplacement};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
pFlow::boundaryList::beforeIteration(uint32 iter, real t, real dt)
|
||||||
{
|
{
|
||||||
// it is time to update lists
|
// it is time to update lists
|
||||||
if(timeControl_.timeEvent(iter, t, dt))
|
if(timeControl_.timeEvent(iter, t, dt))
|
||||||
|
|
|
@ -46,6 +46,8 @@ private:
|
||||||
|
|
||||||
domain extendedDomain_;
|
domain extendedDomain_;
|
||||||
|
|
||||||
|
box internalDomainBox_;
|
||||||
|
|
||||||
bool listSet_ = false;
|
bool listSet_ = false;
|
||||||
|
|
||||||
void setExtendedDomain();
|
void setExtendedDomain();
|
||||||
|
@ -105,6 +107,16 @@ public:
|
||||||
return extendedDomain_;
|
return extendedDomain_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
const auto& extendedDomainBox()const
|
||||||
|
{
|
||||||
|
return extendedDomain_.domainBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
box internalDomainBox()const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool beforeIteration(uint32 iter, real t, real dt);
|
bool beforeIteration(uint32 iter, real t, real dt);
|
||||||
|
|
||||||
bool iterate(uint32 iter, real t, real dt);
|
bool iterate(uint32 iter, real t, real dt);
|
||||||
|
|
|
@ -79,10 +79,12 @@ public:
|
||||||
|
|
||||||
//// - Methods
|
//// - Methods
|
||||||
|
|
||||||
|
|
||||||
INLINE_FUNCTION_HD
|
INLINE_FUNCTION_HD
|
||||||
bool isInside(const realx3& point)const
|
bool isInside(const realx3& point)const
|
||||||
{
|
{
|
||||||
return point > min_ && point <max_;
|
// box planes are also included as the inside of the box
|
||||||
|
return point >= min_ && point <=max_;
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE_FUNCTION_HD
|
INLINE_FUNCTION_HD
|
||||||
|
|
|
@ -90,7 +90,9 @@ public:
|
||||||
auto p1Point = point-p1_;
|
auto p1Point = point-p1_;
|
||||||
auto H = cross(p1Point , axisVector_);
|
auto H = cross(p1Point , axisVector_);
|
||||||
auto H2 = dot(H,H);
|
auto H2 = dot(H,H);
|
||||||
if( H2 < radius2_*axisVector2_)
|
|
||||||
|
// the shell itslef is considered as inside point
|
||||||
|
if( H2 <= radius2_*axisVector2_)
|
||||||
{
|
{
|
||||||
real t = dot(p1Point, axisVector_)/axisVector2_;
|
real t = dot(p1Point, axisVector_)/axisVector2_;
|
||||||
if(t >= 0.0 && t <= 1.0)
|
if(t >= 0.0 && t <= 1.0)
|
||||||
|
|
|
@ -103,6 +103,12 @@ public:
|
||||||
return pointFromPlane(p)>=0;
|
return pointFromPlane(p)>=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INLINE_FUNCTION_HD
|
||||||
|
bool pointInNegativeSide(const realx3& p)const
|
||||||
|
{
|
||||||
|
return pointFromPlane(p)<0;
|
||||||
|
}
|
||||||
|
|
||||||
INLINE_FUNCTION_HD
|
INLINE_FUNCTION_HD
|
||||||
bool inPositiveDistance(const realx3& p, real dist)const
|
bool inPositiveDistance(const realx3& p, real dist)const
|
||||||
{
|
{
|
||||||
|
@ -114,14 +120,7 @@ public:
|
||||||
bool inNegativeDistance(const realx3& p, real dist)const
|
bool inNegativeDistance(const realx3& p, real dist)const
|
||||||
{
|
{
|
||||||
real d = pointFromPlane(p);
|
real d = pointFromPlane(p);
|
||||||
return d < 0.0 && d <= -dist;
|
return d < 0.0 && d >= -dist;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
INLINE_FUNCTION_HD
|
|
||||||
bool pointInNegativeSide(const realx3& p)const
|
|
||||||
{
|
|
||||||
return pointFromPlane(p)<0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE_FUNCTION_HD
|
INLINE_FUNCTION_HD
|
||||||
|
|
|
@ -543,7 +543,7 @@ pFlow::uint32 pFlow::pointFlag<ExecutionSpace>::changeCapacity
|
||||||
while( emptySpots < reqEmptySpots )
|
while( emptySpots < reqEmptySpots )
|
||||||
{
|
{
|
||||||
newCap = newCap*pFlow::gSettings::vectorGrowthFactor__+1;
|
newCap = newCap*pFlow::gSettings::vectorGrowthFactor__+1;
|
||||||
uint32 emptySpots = newCap - numActive_;
|
emptySpots = newCap - numActive_;
|
||||||
}
|
}
|
||||||
|
|
||||||
viewType newFlags(flags_.label(), newCap);
|
viewType newFlags(flags_.label(), newCap);
|
||||||
|
|
|
@ -153,6 +153,12 @@ public:
|
||||||
{
|
{
|
||||||
return boundaries_.extendedDomain();
|
return boundaries_.extendedDomain();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
auto internalDomainBox()const
|
||||||
|
{
|
||||||
|
return boundaries_.internalDomainBox();
|
||||||
|
}
|
||||||
|
|
||||||
// - IO methods
|
// - IO methods
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ public:
|
||||||
{
|
{
|
||||||
auto cPoint = point-center_;
|
auto cPoint = point-center_;
|
||||||
auto dist2 = dot(cPoint,cPoint);
|
auto dist2 = dot(cPoint,cPoint);
|
||||||
return dist2 < radius2_;
|
return dist2 <= radius2_;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue