$treeview $search $mathjax
Palabos  Version 1.1
$projectbrief
$projectbrief
$searchbox

externalForceDynamics.hh

Go to the documentation of this file.
00001 /* This file is part of the Palabos library.
00002  *
00003  * Copyright (C) 2011 FlowKit Sarl
00004  * Avenue de Chailly 23
00005  * 1012 Lausanne, Switzerland
00006  * E-mail contact: contact@flowkit.com
00007  *
00008  * The most recent release of Palabos can be downloaded at 
00009  * <http://www.palabos.org/>
00010  *
00011  * The library Palabos is free software: you can redistribute it and/or
00012  * modify it under the terms of the GNU Affero General Public License as
00013  * published by the Free Software Foundation, either version 3 of the
00014  * License, or (at your option) any later version.
00015  *
00016  * The library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Affero General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Affero General Public License
00022  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00023 */
00024 
00025 /* Main author: Orestis Malaspinas
00026  */
00027 
00031 #ifndef EXTERNAL_FORCE_DYNAMICS_HH
00032 #define EXTERNAL_FORCE_DYNAMICS_HH
00033 
00034 #include "basicDynamics/isoThermalDynamics.h"
00035 #include "core/cell.h"
00036 #include "latticeBoltzmann/dynamicsTemplates.h"
00037 #include "latticeBoltzmann/momentTemplates.h"
00038 #include "latticeBoltzmann/offEquilibriumTemplates.h"
00039 #include "latticeBoltzmann/d3q13Templates.h"
00040 #include "latticeBoltzmann/geometricOperationTemplates.h"
00041 #include "latticeBoltzmann/externalForceTemplates.h"
00042 #include "core/latticeStatistics.h"
00043 #include <algorithm>
00044 #include "core/dynamicsIdentifiers.h"
00045 #include <limits>
00046 
00047 namespace plb {
00048 
00049 /* *************** Class ExternalForceDynamics *********************************************** */
00050 
00053 template<typename T, template<typename U> class Descriptor>
00054 ExternalForceDynamics<T,Descriptor>::ExternalForceDynamics(T omega_ )
00055     : IsoThermalBulkDynamics<T,Descriptor>(omega_)
00056 { }
00057 
00058 template<typename T, template<typename U> class Descriptor>
00059 void ExternalForceDynamics<T,Descriptor>::computeVelocity (
00060                                         Cell<T,Descriptor> const& cell, 
00061                                         Array<T,Descriptor<T>::d>& u ) const
00062 {
00063     T rhoBar;
00064     Array<T,Descriptor<T>::d> force, j;
00065     momentTemplates<T,Descriptor>::get_rhoBar_j(cell,rhoBar, j);
00066     force.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::forceBeginsAt));
00067     
00068     T invRho = Descriptor<T>::invRho(rhoBar);
00069     for (plint iD = 0; iD < Descriptor<T>::d; ++iD)
00070     {
00071         u[iD] = j[iD]*invRho + force[iD]/(T)2;
00072     }
00073     
00074 }
00075 
00076 
00077 /* *************** Class NaiveExternalForceBGKdynamics ********************************** */
00078 
00079 template<typename T, template<typename U> class Descriptor>
00080 int NaiveExternalForceBGKdynamics<T,Descriptor>::id =
00081     meta::registerOneParamDynamics<T,Descriptor,NaiveExternalForceBGKdynamics<T,Descriptor> >("BGK_ExternalForce_Naive");
00082 
00085 template<typename T, template<typename U> class Descriptor>
00086 NaiveExternalForceBGKdynamics<T,Descriptor>::NaiveExternalForceBGKdynamics(T omega_ )
00087     : ExternalForceDynamics<T,Descriptor>(omega_)
00088 { }
00089 
00090 template<typename T, template<typename U> class Descriptor>
00091 NaiveExternalForceBGKdynamics<T,Descriptor>* NaiveExternalForceBGKdynamics<T,Descriptor>::clone() const {
00092     return new NaiveExternalForceBGKdynamics<T,Descriptor>(*this);
00093 }
00094 
00095 template<typename T, template<typename U> class Descriptor>
00096 int NaiveExternalForceBGKdynamics<T,Descriptor>::getId() const {
00097     return id;
00098 }
00099 
00100 template<typename T, template<typename U> class Descriptor>
00101 void NaiveExternalForceBGKdynamics<T,Descriptor>::collide (
00102         Cell<T,Descriptor>& cell,
00103         BlockStatistics& statistics )
00104 {
00105     T rhoBar = this->computeRhoBar(cell);
00106     Array<T,Descriptor<T>::d> u, j;
00107     this->computeVelocity(cell, u);
00108     T rho = Descriptor<T>::fullRho(rhoBar);
00109     for (plint iD = 0; iD < Descriptor<T>::d; ++iD)
00110     {
00111         j[iD] = rho * u[iD];
00112     }
00113     
00114     T uSqr = dynamicsTemplates<T,Descriptor>::bgk_ma2_collision(cell, rhoBar, j, this->getOmega());
00115     externalForceTemplates<T,Descriptor>::addNaiveForce(cell, u, this->getOmega(), (T)1);
00116     
00117     if (cell.takesStatistics()) {
00118         gatherStatistics(statistics, rhoBar, uSqr);
00119     }
00120 }
00121 
00122 template<typename T, template<typename U> class Descriptor>
00123 T NaiveExternalForceBGKdynamics<T,Descriptor>::computeEquilibrium (
00124         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00125         T jSqr, T thetaBar) const
00126 {
00127     T invRho = Descriptor<T>::invRho(rhoBar);
00128     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00129 }
00130 
00131 
00132 /* *************** Class GuoExternalForceBGKdynamics ********************************** */
00133 
00134 template<typename T, template<typename U> class Descriptor>
00135 int GuoExternalForceBGKdynamics<T,Descriptor>::id =
00136     meta::registerOneParamDynamics<T,Descriptor,GuoExternalForceBGKdynamics<T,Descriptor> >("BGK_ExternalForce_Guo");
00137 
00140 template<typename T, template<typename U> class Descriptor>
00141 GuoExternalForceBGKdynamics<T,Descriptor>::GuoExternalForceBGKdynamics(T omega_ )
00142     : ExternalForceDynamics<T,Descriptor>(omega_)
00143 { }
00144 
00145 template<typename T, template<typename U> class Descriptor>
00146 GuoExternalForceBGKdynamics<T,Descriptor>* GuoExternalForceBGKdynamics<T,Descriptor>::clone() const {
00147     return new GuoExternalForceBGKdynamics<T,Descriptor>(*this);
00148 }
00149 
00150 template<typename T, template<typename U> class Descriptor>
00151 int GuoExternalForceBGKdynamics<T,Descriptor>::getId() const {
00152     return id;
00153 }
00154 
00155 template<typename T, template<typename U> class Descriptor>
00156 void GuoExternalForceBGKdynamics<T,Descriptor>::collide (
00157         Cell<T,Descriptor>& cell,
00158         BlockStatistics& statistics )
00159 {
00160     T rhoBar = this->computeRhoBar(cell);
00161     Array<T,Descriptor<T>::d> u, j;
00162     this->computeVelocity(cell, u);
00163     T rho = Descriptor<T>::fullRho(rhoBar);
00164     for (plint iD = 0; iD < Descriptor<T>::d; ++iD)
00165     {
00166         j[iD] = rho * u[iD];
00167     }
00168     
00169     T uSqr = dynamicsTemplates<T,Descriptor>::bgk_ma2_collision(cell, rhoBar, j, this->getOmega());
00170     externalForceTemplates<T,Descriptor>::addGuoForce(cell, u, this->getOmega(), (T)1);
00171     
00172     if (cell.takesStatistics()) {
00173         gatherStatistics(statistics, rhoBar, uSqr);
00174     }
00175 }
00176 
00177 template<typename T, template<typename U> class Descriptor>
00178 T GuoExternalForceBGKdynamics<T,Descriptor>::computeEquilibrium (
00179         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00180         T jSqr, T thetaBar) const
00181 {
00182     T invRho = Descriptor<T>::invRho(rhoBar);
00183     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00184 }
00185 
00186 
00187 /* *************** Class ShanChenExternalForceBGKdynamics ********************************** */
00188 
00189 template<typename T, template<typename U> class Descriptor>
00190 int ShanChenExternalForceBGKdynamics<T,Descriptor>::id =
00191     meta::registerOneParamDynamics<T,Descriptor,ShanChenExternalForceBGKdynamics<T,Descriptor> > 
00192                                       ("BGK_ExternalForce_ShanChen");
00193 
00196 template<typename T, template<typename U> class Descriptor>
00197 ShanChenExternalForceBGKdynamics<T,Descriptor>::ShanChenExternalForceBGKdynamics(T omega_ )
00198     : ExternalForceDynamics<T,Descriptor>(omega_)
00199 { }
00200 
00201 template<typename T, template<typename U> class Descriptor>
00202 ShanChenExternalForceBGKdynamics<T,Descriptor>* ShanChenExternalForceBGKdynamics<T,Descriptor>::clone() const {
00203     return new ShanChenExternalForceBGKdynamics<T,Descriptor>(*this);
00204 }
00205 
00206 template<typename T, template<typename U> class Descriptor>
00207 int ShanChenExternalForceBGKdynamics<T,Descriptor>::getId() const {
00208     return id;
00209 }
00210 
00211 
00212 template<typename T, template<typename U> class Descriptor>
00213 void ShanChenExternalForceBGKdynamics<T,Descriptor>::collide (
00214         Cell<T,Descriptor>& cell,
00215         BlockStatistics& statistics )
00216 {
00217     T rhoBar;
00218     Array<T,Descriptor<T>::d> j;
00219     momentTemplates<T,Descriptor>::get_rhoBar_j(cell, rhoBar, j);
00220     
00221     T invOmega = 1./this->getOmega();
00222     Array<T,Descriptor<T>::d> force;
00223     force.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::forceBeginsAt));
00224     Array<T,Descriptor<T>::d> jCorrected(j+invOmega*Descriptor<T>::fullRho(rhoBar) * force);
00225     
00226     dynamicsTemplates<T,Descriptor>::bgk_ma2_collision(cell, rhoBar, jCorrected, this->getOmega());
00227     if (cell.takesStatistics()) {
00228         T uSqr = T();
00229         T invRho = Descriptor<T>::invRho(rhoBar);
00230         for (int iD=0; iD<Descriptor<T>::d; ++iD) {
00231             uSqr += util::sqr(j[iD]*invRho + 0.5*force[iD]);
00232         }
00233         gatherStatistics(statistics, rhoBar, uSqr);
00234     }
00235 }
00236 
00237 template<typename T, template<typename U> class Descriptor>
00238 T ShanChenExternalForceBGKdynamics<T,Descriptor>::computeEquilibrium (
00239         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00240         T jSqr, T thetaBar ) const
00241 {
00242     T invRho = Descriptor<T>::invRho(rhoBar);
00243     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00244 }
00245 
00246 
00247 /* *************** Class HeExternalForceBGKdynamics ********************************** */
00248 
00249 template<typename T, template<typename U> class Descriptor>
00250 int HeExternalForceBGKdynamics<T,Descriptor>::id =
00251     meta::registerOneParamDynamics<T,Descriptor,HeExternalForceBGKdynamics<T,Descriptor> >("BGK_ExternalForce_He");
00252 
00255 template<typename T, template<typename U> class Descriptor>
00256 HeExternalForceBGKdynamics<T,Descriptor>::HeExternalForceBGKdynamics(T omega_ )
00257     : ExternalForceDynamics<T,Descriptor>(omega_)
00258 { }
00259 
00260 template<typename T, template<typename U> class Descriptor>
00261 HeExternalForceBGKdynamics<T,Descriptor>* HeExternalForceBGKdynamics<T,Descriptor>::clone() const {
00262     return new HeExternalForceBGKdynamics<T,Descriptor>(*this);
00263 }
00264 
00265 template<typename T, template<typename U> class Descriptor>
00266 int HeExternalForceBGKdynamics<T,Descriptor>::getId() const {
00267     return id;
00268 }
00269 
00270 template<typename T, template<typename U> class Descriptor>
00271 void HeExternalForceBGKdynamics<T,Descriptor>::collide (
00272         Cell<T,Descriptor>& cell,
00273         BlockStatistics& statistics )
00274 {
00275     T rhoBar;
00276     Array<T,Descriptor<T>::d> j;
00277     momentTemplates<T,Descriptor>::get_rhoBar_j(cell, rhoBar, j);
00278     T uSqr = externalForceTemplates<T,Descriptor>::heForcedBGKCollision (
00279             cell, rhoBar, j, this->getOmega());
00280     if (cell.takesStatistics()) {
00281         gatherStatistics(statistics, rhoBar, uSqr);
00282     }
00283 }
00284 
00285 template<typename T, template<typename U> class Descriptor>
00286 T HeExternalForceBGKdynamics<T,Descriptor>::computeEquilibrium (
00287         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00288         T jSqr, T thetaBar) const
00289 {
00290     T invRho = Descriptor<T>::invRho(rhoBar);
00291     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00292 }
00293 
00294 /* *************** Class IncGuoExternalForceBGKdynamics ********************************** */
00295 
00296 template<typename T, template<typename U> class Descriptor>
00297 int IncGuoExternalForceBGKdynamics<T,Descriptor>::id =
00298     meta::registerOneParamDynamics<T,Descriptor,IncGuoExternalForceBGKdynamics<T,Descriptor> >("IncBGK_ExternalForce_Guo");
00299 
00302 template<typename T, template<typename U> class Descriptor>
00303 IncGuoExternalForceBGKdynamics<T,Descriptor>::IncGuoExternalForceBGKdynamics(T omega_ )
00304     : ExternalForceDynamics<T,Descriptor>(omega_)
00305 { }
00306 
00307 template<typename T, template<typename U> class Descriptor>
00308 IncGuoExternalForceBGKdynamics<T,Descriptor>* IncGuoExternalForceBGKdynamics<T,Descriptor>::clone() const {
00309     return new IncGuoExternalForceBGKdynamics<T,Descriptor>(*this);
00310 }
00311 
00312 template<typename T, template<typename U> class Descriptor>
00313 int IncGuoExternalForceBGKdynamics<T,Descriptor>::getId() const {
00314     return id;
00315 }
00316 
00317 template<typename T, template<typename U> class Descriptor>
00318 void IncGuoExternalForceBGKdynamics<T,Descriptor>::collide (
00319         Cell<T,Descriptor>& cell,
00320         BlockStatistics& statistics )
00321 {
00322     T rhoBar = this->computeRhoBar(cell);
00323     Array<T,Descriptor<T>::d> u, j;
00324     this->computeVelocity(cell, u);
00325     T rho = Descriptor<T>::fullRho(rhoBar);
00326     for (plint iD = 0; iD < Descriptor<T>::d; ++iD)
00327     {
00328         j[iD] = rho*u[iD];
00329     }
00330     
00331     T uSqr = dynamicsTemplates<T,Descriptor>::bgk_inc_collision(cell, rhoBar, j, this->getOmega());
00332     externalForceTemplates<T,Descriptor>::addGuoForce(cell, u, this->getOmega(), (T)1);
00333     
00334     if (cell.takesStatistics()) {
00335         gatherStatistics(statistics, rhoBar, uSqr);
00336     }
00337 }
00338 
00339 template<typename T, template<typename U> class Descriptor>
00340 T IncGuoExternalForceBGKdynamics<T,Descriptor>::computeEquilibrium (
00341         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00342         T jSqr, T thetaBar) const
00343 {
00344     T invRho = Descriptor<T>::invRho(rhoBar);
00345     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00346 }
00347 
00348 template<typename T, template<typename U> class Descriptor>
00349 bool IncGuoExternalForceBGKdynamics<T,Descriptor>::velIsJ() const {
00350     return true;
00351 }
00352 
00353 }  // namespace plb
00354 
00355 #endif  // EXTERNAL_FORCE_DYNAMICS_HH