Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / lagrangian / intermediate / submodels / Kinematic / PatchInteractionModel / StandardWallInteraction / StandardWallInteraction.C
bloba5d1a0308d30a54803a140176c4446f880155689
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "StandardWallInteraction.H"
28 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
30 template <class CloudType>
31 Foam::StandardWallInteraction<CloudType>::StandardWallInteraction
33     const dictionary& dict,
34     CloudType& cloud
37     PatchInteractionModel<CloudType>(dict, cloud, typeName),
38     interactionType_
39     (
40         this->wordToInteractionType(this->coeffDict().lookup("type"))
41     ),
42     e_(0.0),
43     mu_(0.0)
45     switch (interactionType_)
46     {
47         case PatchInteractionModel<CloudType>::itOther:
48         {
49             word interactionTypeName(this->coeffDict().lookup("type"));
51             FatalErrorIn
52             (
53                 "StandardWallInteraction<CloudType>::StandardWallInteraction"
54                 "("
55                     "const dictionary&, "
56                     "CloudType& cloud"
57                 ")"
58             )   << "Unknown interaction result type "
59                 << interactionTypeName
60                 << ". Valid selections are:" << this->interactionTypeNames_
61                 << endl << exit(FatalError);
63             break;
64         }
65         case PatchInteractionModel<CloudType>::itRebound:
66         {
67             e_ = this->coeffDict().lookupOrDefault("e", 1.0);
68             mu_ = this->coeffDict().lookupOrDefault("mu", 0.0);
69             break;
70         }
71         default:
72         {
73             // do nothing
74         }
75     }
79 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
81 template <class CloudType>
82 Foam::StandardWallInteraction<CloudType>::~StandardWallInteraction()
86 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
88 template<class CloudType>
89 bool Foam::StandardWallInteraction<CloudType>::active() const
91     return true;
95 template <class CloudType>
96 bool Foam::StandardWallInteraction<CloudType>::correct
98     const polyPatch& pp,
99     const label faceId,
100     bool& keepParticle,
101     vector& U
102 ) const
104     if (pp.isWall())
105     {
106         switch (interactionType_)
107         {
108             case PatchInteractionModel<CloudType>::itEscape:
109             {
110                 keepParticle = false;
111                 U = vector::zero;
112                 break;
113             }
114             case PatchInteractionModel<CloudType>::itStick:
115             {
116                 keepParticle = true;
117                 U = vector::zero;
118                 break;
119             }
120             case PatchInteractionModel<CloudType>::itRebound:
121             {
122                 keepParticle = true;
124                 vector nw = pp.faceAreas()[pp.whichFace(faceId)];
125                 nw /= mag(nw);
127                 scalar Un = U & nw;
128                 vector Ut = U - Un*nw;
130                 if (Un > 0)
131                 {
132                     U -= (1.0 + e_)*Un*nw;
133                 }
135                 U -= mu_*Ut;
137                 break;
138             }
139             default:
140             {
141                 FatalErrorIn
142                 (
143                     "bool StandardWallInteraction<CloudType>::correct"
144                     "("
145                         "const polyPatch&, "
146                         "const label, "
147                         "bool&, "
148                         "vector&"
149                     ") const"
150                 )   << "Unknown interaction type "
151                     << this->interactionTypeToWord(interactionType_)
152                     << "(" << interactionType_ << ")" << endl
153                     << abort(FatalError);
154             }
155         }
157         return true;
158     }
160     return false;
164 // ************************************************************************* //