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

carreauDynamics.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 
00028 #ifndef CARREAU_DYNAMICS_HH
00029 #define CARREAU_DYNAMICS_HH
00030 
00031 #include "complexDynamics/carreauGlobalDefs.h"
00032 #include "complexDynamics/carreauDynamics.h"
00033 #include "latticeBoltzmann/momentTemplates.h"
00034 #include "complexDynamics/carreauDynamicsTemplates.h"
00035 #include "core/util.h"
00036 #include "core/dynamicsIdentifiers.h"
00037 
00038 namespace plb {
00039 
00040 template<typename T, template<typename U> class Descriptor,int N>
00041 int CarreauDynamics<T,Descriptor,N>::id =
00042     meta::registerCompositeDynamics<T,Descriptor, CarreauDynamics<T,Descriptor,N> >
00043         ( std::string("CarreauDynamics_")+util::val2str(N) );
00044 
00045 template<typename T, template<typename U> class Descriptor,int N>
00046 CarreauDynamics<T,Descriptor,N>::CarreauDynamics(Dynamics<T,Descriptor>* baseDynamics_, bool automaticPrepareCollision)
00047     : OmegaFromPiDynamics<T,Descriptor>(baseDynamics_, automaticPrepareCollision)
00048 {
00049 }
00050 
00051 template<typename T, template<typename U> class Descriptor,int N>
00052 T CarreauDynamics<T,Descriptor,N>::
00053         getOmegaFromPiAndRhoBar(Array<T,SymmetricTensor<T,Descriptor>::n> const& PiNeq, T rhoBar) const
00054 {
00055     T nu0_nuInfoverCs2  = (global::CarreauParameters().getNu0()-global::CarreauParameters().getNuInf())*Descriptor<T>::invCs2;
00056     T nuInfoverCs2  = global::CarreauParameters().getNuInf()*Descriptor<T>::invCs2;
00057     T nMinusOneOverTwo  = (global::CarreauParameters().getExponent() - (T)1)/(T)2;
00058     T lambdaOverCs2sqr  = global::CarreauParameters().getLambda()*Descriptor<T>::invCs2;
00059     lambdaOverCs2sqr *= lambdaOverCs2sqr;
00060     
00061     
00062     T piNeqNormSqr = SymmetricTensor<T,Descriptor>::tensorNormSqr(PiNeq);
00063     T alpha = lambdaOverCs2sqr * piNeqNormSqr *(T)0.5
00064             *Descriptor<T>::invRho(rhoBar)*Descriptor<T>::invRho(rhoBar);
00065     
00066     T omega = carreauDynamicsTemplates<T,N>::
00067             fromPiAndRhoToOmega(alpha, nu0_nuInfoverCs2, nuInfoverCs2, nMinusOneOverTwo, this->getOmega());
00068     
00069     return omega;
00070 }
00071 
00072 template<typename T, template<typename U> class Descriptor,int N>
00073 CarreauDynamics<T,Descriptor,N>* CarreauDynamics<T,Descriptor,N>::clone() const {
00074     return new CarreauDynamics<T,Descriptor,N>(*this);
00075 }
00076  
00077 template<typename T, template<typename U> class Descriptor,int N>
00078 int CarreauDynamics<T,Descriptor,N>::getId() const {
00079     return id;
00080 }
00081 
00082 /* *************** Class BGKCarreauDynamics ************************************ */
00083 
00084 template<typename T, template<typename U> class Descriptor, int N>
00085 int BGKCarreauDynamics<T,Descriptor,N>::id =
00086     meta::registerOneParamDynamics<T,Descriptor,BGKCarreauDynamics<T,Descriptor,N> >
00087             ( std::string("CarreauDynamics_BGK_")+util::val2str(N) );
00088 
00091 template<typename T, template<typename U> class Descriptor, int N>
00092 BGKCarreauDynamics<T,Descriptor,N>::BGKCarreauDynamics(T omega)
00093     : IsoThermalBulkDynamics<T,Descriptor>(omega)
00094 { }
00095 
00096 template<typename T, template<typename U> class Descriptor, int N>
00097 BGKCarreauDynamics<T,Descriptor,N>* BGKCarreauDynamics<T,Descriptor,N>::clone() const
00098 {
00099     return new BGKCarreauDynamics<T,Descriptor,N>(*this);
00100 }
00101  
00102 template<typename T, template<typename U> class Descriptor, int N>
00103 int BGKCarreauDynamics<T,Descriptor,N>::getId() const {
00104     return id;
00105 }
00106 
00107 template<typename T, template<typename U> class Descriptor, int N>
00108 void BGKCarreauDynamics<T,Descriptor,N>::collide (
00109         Cell<T,Descriptor>& cell,
00110         BlockStatistics& statistics )
00111 {
00112     T nu0_nuInfoverCs2  = (global::CarreauParameters().getNu0()-global::CarreauParameters().getNuInf())
00113                             * Descriptor<T>::invCs2;
00114     T nuInfoverCs2  = global::CarreauParameters().getNuInf()*Descriptor<T>::invCs2;
00115     T nMinusOneOverTwo  = (global::CarreauParameters().getExponent() - (T)1)/(T)2;
00116     T lambdaOverCs2sqr  = global::CarreauParameters().getLambda()*Descriptor<T>::invCs2;
00117     lambdaOverCs2sqr *= lambdaOverCs2sqr;
00118     
00119     T rhoBar;
00120     Array<T,Descriptor<T>::d> j;
00121     Array<T,SymmetricTensor<T,Descriptor>::n> PiNeq;
00122     momentTemplates<T,Descriptor>::compute_rhoBar_j_PiNeq(cell, rhoBar, j, PiNeq);
00123     
00124     T piNeqNormSqr = SymmetricTensor<T,Descriptor>::tensorNormSqr(PiNeq);
00125     T alpha = lambdaOverCs2sqr * piNeqNormSqr *(T)0.5
00126             *Descriptor<T>::invRho(rhoBar)*Descriptor<T>::invRho(rhoBar);
00127     
00128     T omegaTmp = (T)1;
00129     T omega0 = this->getOmega();
00130     
00131     for (int iN = 0; iN < N; ++iN)
00132     {
00133         omegaTmp = carreauDynamicsTemplates<T,0>::
00134             fromPiAndRhoToOmega(alpha, nu0_nuInfoverCs2, nuInfoverCs2, nMinusOneOverTwo, omega0);
00135         if (fabs((omegaTmp - omega0)/omega0) < 1.0e-10)
00136         {
00137             omega0=omegaTmp;
00138             break;
00139         }
00140         omega0=omegaTmp;
00141     }
00142     
00143     this->setOmega(omega0);
00144     
00145     T uSqr = dynamicsTemplates<T,Descriptor>::bgk_ma2_collision(
00146                  cell, rhoBar, j, this->getOmega() );
00147     
00148     if (cell.takesStatistics()) {
00149         gatherStatistics(statistics, rhoBar, uSqr);
00150     }
00151 }
00152 
00153 template<typename T, template<typename U> class Descriptor, int N>
00154 T BGKCarreauDynamics<T,Descriptor,N>::computeEquilibrium (
00155         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j, T jSqr, T thetaBar ) const
00156 {
00157     T invRho = Descriptor<T>::invRho(rhoBar);
00158     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00159 }
00160 
00161 
00162 /* *************** Class RegularizedBGKCarreauDynamics ************************************ */
00163 
00164 template<typename T, template<typename U> class Descriptor, int N>
00165 int RegularizedBGKCarreauDynamics<T,Descriptor,N>::id =
00166     meta::registerOneParamDynamics<T,Descriptor,RegularizedBGKCarreauDynamics<T,Descriptor,N> >
00167             ( std::string("CarreauDynamics_RLB_")+util::val2str(N) );
00168 
00171 template<typename T, template<typename U> class Descriptor, int N>
00172 RegularizedBGKCarreauDynamics<T,Descriptor,N>::RegularizedBGKCarreauDynamics(T omega)
00173     : IsoThermalBulkDynamics<T,Descriptor>(omega)
00174 {
00175 }
00176 
00177 template<typename T, template<typename U> class Descriptor, int N>
00178 RegularizedBGKCarreauDynamics<T,Descriptor,N>* RegularizedBGKCarreauDynamics<T,Descriptor,N>::clone() const
00179 {
00180     return new RegularizedBGKCarreauDynamics<T,Descriptor,N>(*this);
00181 }
00182  
00183 template<typename T, template<typename U> class Descriptor, int N>
00184 int RegularizedBGKCarreauDynamics<T,Descriptor,N>::getId() const {
00185     return id;
00186 }
00187 
00188 template<typename T, template<typename U> class Descriptor, int N>
00189 void RegularizedBGKCarreauDynamics<T,Descriptor,N>::collide (
00190         Cell<T,Descriptor>& cell,
00191         BlockStatistics& statistics )
00192 {
00193     T nu0overCs2        = global::CarreauParameters().getNu0()*Descriptor<T>::invCs2;
00194     T nMinusOneOverTwo  = (global::CarreauParameters().getExponent() - (T)1)/(T)2;
00195     T lambdaOverCs2sqr  = global::CarreauParameters().getLambda()*Descriptor<T>::invCs2;
00196     lambdaOverCs2sqr *= lambdaOverCs2sqr;
00197     
00198     T rhoBar;
00199     Array<T,Descriptor<T>::d> j;
00200     Array<T,SymmetricTensor<T,Descriptor>::n> PiNeq;
00201     momentTemplates<T,Descriptor>::compute_rhoBar_j_PiNeq(cell, rhoBar, j, PiNeq);
00202     
00203     T piNeqNormSqr = SymmetricTensor<T,Descriptor>::tensorNormSqr(PiNeq);
00204     T alpha = lambdaOverCs2sqr * piNeqNormSqr *(T)0.5
00205             *Descriptor<T>::invRho(rhoBar)*Descriptor<T>::invRho(rhoBar);
00206     
00207     T omegaTmp = (T)1;
00208     T omega0 = this->getOmega();
00209     
00210     for (int iN = 0; iN < N; ++iN)
00211     {
00212         omegaTmp = carreauDynamicsTemplates<T,0>::
00213             fromPiAndRhoToOmega(alpha, nu0overCs2, nMinusOneOverTwo, omega0);
00214         if (fabs((omegaTmp - omega0)/omega0) < 1.0e-3)
00215         {
00216             break;
00217         }
00218         omega0=omegaTmp;
00219     }
00220     
00221     this->setOmega(omegaTmp);
00222     
00223     T uSqr = dynamicsTemplates<T,Descriptor>::rlb_collision (
00224                  cell, rhoBar, j, PiNeq, this->getOmega() );
00225     
00226     if (cell.takesStatistics()) {
00227         gatherStatistics(statistics, rhoBar, uSqr);
00228     }
00229 }
00230 
00231 template<typename T, template<typename U> class Descriptor, int N>
00232 T RegularizedBGKCarreauDynamics<T,Descriptor,N>::computeEquilibrium (
00233         plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j, T jSqr, T thetaBar ) const
00234 {
00235     T invRho = Descriptor<T>::invRho(rhoBar);
00236     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00237 }
00238 
00239 } // namespace plb
00240 
00241 #endif  // VARIABLE_OMEGA_DYNAMICS_HH