$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 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
1.6.3
1.6.3