$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
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
1.6.3
1.6.3