diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H index 4dd608c5bb..84123c89f4 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -182,8 +182,8 @@ public: // Constructors - //- Construct from components - inline trackData + //- Construct from components + inline trackData ( KinematicCloud& cloud, const constantProperties& constProps, diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H index 7f531a05cf..ceef9ca8b2 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H @@ -439,14 +439,23 @@ inline Foam::scalar Foam::KinematicParcel::wallImpactDistance const vector& ) const { - // Do not use a wall impact distance to allow proper multiple face - // collisions. In a twisted mesh the particle can be within range - // of a wall but not in the cell attached to a wall face, hence - // miss the interaction. + const KinematicCloud& c = + dynamic_cast&>(this->cloud()); - return 0.0; + if (c.collision().controlsWallInteraction()) + { + // Do not use a wall impact distance if the collision model + // controls wall interactions to allow proper multiple face + // collisions. In a twisted mesh the particle can be within + // range of a wall but not in the cell attached to a wall + // face, hence miss the interaction. - // return 0.5*d_; + return 0.0; + } + else + { + return 0.5*d_; + } } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H index 3420f8d9e5..cbce0ee43a 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/CollisionModel/CollisionModel.H @@ -141,6 +141,10 @@ public: //- Flag to indicate whether model activates injection model virtual bool active() const = 0; + //- Indicates whether model determines wall collisions or not, + // used to determine what value to use for wallImpactDistance + virtual bool controlsWallInteraction() const = 0; + // Collision function virtual void collide() = 0; }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C index f99edcd47f..993fe53b70 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.C @@ -61,6 +61,13 @@ bool Foam::NoCollision::active() const } +template +bool Foam::NoCollision::controlsWallInteraction() const +{ + return false; +} + + template void Foam::NoCollision::collide() {} diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H index 5806806892..e0c0ffbc6b 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/NoCollision/NoCollision.H @@ -82,6 +82,10 @@ public: //- Flag to indicate whether model activates injection model virtual bool active() const; + //- Indicates whether model determines wall collisions or not, + // used to determine what value to use for wallImpactDistance + virtual bool controlsWallInteraction() const; + // Collision function virtual void collide(); }; diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C index ba7959662d..27e8886cdd 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.C @@ -611,6 +611,13 @@ bool Foam::PairCollision::active() const } +template +bool Foam::PairCollision::controlsWallInteraction() const +{ + return true; +} + + template void Foam::PairCollision::collide() { diff --git a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H index 8d5baa02f8..8699d477cd 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/CollisionModel/PairCollision/PairCollision.H @@ -174,6 +174,10 @@ public: //- Flag to indicate whether model activates injection model virtual bool active() const; + //- Indicates whether model determines wall collisions or not, + // used to determine what value to use for wallImpactDistance + virtual bool controlsWallInteraction() const; + // Collision function virtual void collide(); };