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

mrtDynamics.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 /* Orestis Malaspinas contributed this code. */
00026 
00030 #ifndef MRT_DYNAMICS_HH
00031 #define MRT_DYNAMICS_HH
00032 
00033 #include "latticeBoltzmann/mrtTemplates.h"
00034 #include "latticeBoltzmann/dynamicsTemplates.h"
00035 #include "latticeBoltzmann/momentTemplates.h"
00036 #include "core/latticeStatistics.h"
00037 #include <algorithm>
00038 #include <limits>
00039 
00040 namespace plb {
00041 
00042 /* *************** Class MRTparam *********************************************** */
00043 
00044 template<typename T, template<typename U> class Descriptor>
00045 MRTparam<T,Descriptor>::MRTparam()
00046 {
00047     iniRelaxationVector();
00048     precompute_invM_S();
00049 }
00050 
00051 template<typename T, template<typename U> class Descriptor>
00052 MRTparam<T,Descriptor>::MRTparam(T omega_)
00053 {
00054     iniRelaxationVector();
00055     for (plint iPop  = 0; iPop < Descriptor<T>::shearIndexes; ++iPop) {
00056         s[Descriptor<T>::shearViscIndexes[iPop]] = omega_;
00057     }
00058     precompute_invM_S();
00059 }
00060 
00061 template<typename T, template<typename U> class Descriptor>
00062 MRTparam<T,Descriptor>::MRTparam(T omega_, T lambda_)
00063 {
00064     iniRelaxationVector();
00065     for (plint iPop  = 0; iPop < Descriptor<T>::shearIndexes; ++iPop) {
00066         s[Descriptor<T>::shearViscIndexes[iPop]] = omega_;
00067     }
00068     s[Descriptor<T>::bulkViscIndex] = lambda_;
00069     precompute_invM_S();
00070 }
00071 
00072 template<typename T, template<typename U> class Descriptor>
00073 MRTparam<T,Descriptor>::MRTparam(std::vector<T> s_)
00074     : s(s_)
00075 {
00076     PLB_ASSERT(s.size() == Descriptor<T>::q);
00077     precompute_invM_S();
00078 }
00079 
00080 template<typename T, template<typename U> class Descriptor>
00081 MRTparam<T,Descriptor>::MRTparam(HierarchicUnserializer& unserializer)
00082 {
00083     unserialize(unserializer);
00084 }
00085 
00086 template<typename T, template<typename U> class Descriptor>
00087 void MRTparam<T,Descriptor>::serialize(HierarchicSerializer& serializer) const
00088 {
00089     serializer.addValue((int)s.size());
00090     serializer.addValues(s);
00091 }
00092     
00093 template<typename T, template<typename U> class Descriptor>
00094 void MRTparam<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer)
00095 {
00096     s.resize(unserializer.readValue<int>());
00097     unserializer.readValues(s);
00098     precompute_invM_S();
00099 }
00100 
00101 template<typename T, template<typename U> class Descriptor>
00102 MRTparam<T,Descriptor>* MRTparam<T,Descriptor>::clone() const {
00103     return new MRTparam<T,Descriptor>(*this);
00104 }
00105 
00106 template<typename T, template<typename U> class Descriptor>
00107 T MRTparam<T,Descriptor>::getParameter(plint whichParameter) const 
00108 {
00109     switch (whichParameter) {
00110         case dynamicParams::omega_shear   : return getOmega();
00111         case dynamicParams::omega_bulk    : return getLambda();
00112         case dynamicParams::omega_epsilon : return getOmegaEpsilon();
00113         case dynamicParams::omega_q       : return getOmegaQ();
00114     };
00115     return 0.;
00116 }
00117 
00118 template<typename T, template<typename U> class Descriptor>
00119 void MRTparam<T,Descriptor>::setParameter(plint whichParameter, T value)
00120 {
00121     switch (whichParameter) {
00122         case dynamicParams::omega_shear   : setOmega(value);
00123         case dynamicParams::omega_bulk    : setLambda(value);
00124         case dynamicParams::omega_q       : setOmegaQ(value);
00125         case dynamicParams::omega_epsilon : setOmegaEpsilon(value);
00126     };
00127     precompute_invM_S();
00128 }
00129 
00130 
00131 template<typename T, template<typename U> class Descriptor>
00132 std::vector<T> const& MRTparam<T,Descriptor>::getS() const 
00133 {
00134     return s;
00135 }
00136 
00137 template<typename T, template<typename U> class Descriptor>
00138 typename MRTparam<T,Descriptor>::MatT& MRTparam<T,Descriptor>::getInvM()
00139 {
00140     return invM_S;
00141 }
00142 
00143 template<typename T, template<typename U> class Descriptor>
00144 T MRTparam<T,Descriptor>::getOmega() const 
00145 {
00146     return s[Descriptor<T>::shearViscIndexes[0]];
00147 }
00148 
00149 template<typename T, template<typename U> class Descriptor>
00150 void MRTparam<T,Descriptor>::setOmega(T omega_) 
00151 {
00152     for (plint iPop  = 0; iPop < Descriptor<T>::shearIndexes; ++iPop) {
00153         s[Descriptor<T>::shearViscIndexes[iPop]] = omega_;
00154     }
00155     precompute_invM_S();
00156 }
00157 
00158 template<typename T, template<typename U> class Descriptor>
00159 T MRTparam<T,Descriptor>::getOmegaQ() const 
00160 {
00161     return s[Descriptor<T>::qViscIndexes[0]];
00162 }
00163 
00164 template<typename T, template<typename U> class Descriptor>
00165 void MRTparam<T,Descriptor>::setOmegaQ(T q_) 
00166 {
00167     for (int iPop = 0; iPop < Descriptor<T>::qIndexes; ++iPop) {
00168         s[Descriptor<T>::qViscIndexes[iPop]] = q_;
00169     }
00170     precompute_invM_S();
00171 }
00172 
00173 template<typename T, template<typename U> class Descriptor>
00174 T MRTparam<T,Descriptor>::getOmegaEpsilon() const 
00175 {
00176     return s[Descriptor<T>::epsilonIndex];
00177 }
00178 
00179 template<typename T, template<typename U> class Descriptor>
00180 void MRTparam<T,Descriptor>::setOmegaEpsilon(T epsilon_) 
00181 {
00182     s[Descriptor<T>::epsilonIndex] = epsilon_;
00183     precompute_invM_S();
00184 }
00185 
00186 template<typename T, template<typename U> class Descriptor>
00187 T MRTparam<T,Descriptor>::getLambda() const 
00188 {
00189     return s[Descriptor<T>::bulkViscIndex];
00190 }
00191 
00192 template<typename T, template<typename U> class Descriptor>
00193 void MRTparam<T,Descriptor>::setLambda(T lambda_) 
00194 {
00195     s[Descriptor<T>::bulkViscIndex] = lambda_;
00196     precompute_invM_S();
00197 }
00198 
00199 template<typename T, template<typename U> class Descriptor>
00200 void MRTparam<T,Descriptor>::iniRelaxationVector()
00201 {
00202     s.resize(Descriptor<T>::q);
00203     for (plint iPop = 0; iPop < Descriptor<T>::q; ++iPop) {
00204         s[iPop] = Descriptor<T>::S[iPop];
00205     }
00206 }
00207 
00208 template<typename T, template<typename U> class Descriptor>
00209 void MRTparam<T,Descriptor>::precompute_invM_S()
00210 {
00211     PLB_ASSERT(s.size() == Descriptor<T>::q);
00212     for (plint iPop = 0; iPop < Descriptor<T>::q; ++iPop) {
00213         for (plint jPop = 0; jPop < Descriptor<T>::q; ++jPop) {
00214             invM_S[iPop][jPop] = T();
00215             for (plint kPop = 0; kPop < Descriptor<T>::q; ++kPop) {
00216                 if (kPop == jPop) {
00217                     invM_S[iPop][jPop] += Descriptor<T>::invM[iPop][kPop] * s[kPop];
00218                 }
00219             }
00220         }
00221     }
00222 }
00223 
00224 
00225 /* *************** Class MRTparamList ********************************************** */
00226 
00227 template<typename T, template<typename U> class Descriptor>
00228 void MRTparamList<T,Descriptor>::set(plint id, MRTparam<T,Descriptor> const& param)
00229 {
00230     PLB_PRECONDITION(id>=0);
00231     parameters.resize(id+1);
00232     parameters[id] = param;
00233 }
00234 
00235 template<typename T, template<typename U> class Descriptor>
00236 MRTparam<T,Descriptor>&  MRTparamList<T,Descriptor>::get(plint id) {
00237     PLB_PRECONDITION(id>=0 && id<(plint)parameters.size());
00238     return parameters[id];
00239 }
00240 
00241 template<typename T, template<typename U> class Descriptor>
00242 MRTparam<T,Descriptor> const&  MRTparamList<T,Descriptor>::get(plint id) const
00243 {
00244     PLB_PRECONDITION(id>=0 && id<(plint)parameters.size());
00245     return parameters[id];
00246 }
00247 
00248 template<typename T, template<typename U> class Descriptor>
00249 MRTparamList<T,Descriptor>& mrtParam() {
00250     static MRTparamList<T,Descriptor> paramList;
00251     return paramList;
00252 }
00253 
00254 
00255 /* *************** Class MRTdynamics *********************************************** */
00256 
00257 template<typename T, template<typename U> class Descriptor>
00258 int MRTdynamics<T,Descriptor>::id =
00259     meta::registerGeneralDynamics<T,Descriptor,MRTdynamics<T,Descriptor> >("MRT");
00260 
00261 template<typename T, template<typename U> class Descriptor>
00262 MRTdynamics<T,Descriptor>::MRTdynamics(plint externalParam_)
00263     : IsoThermalBulkDynamics<T,Descriptor>(mrtParam<T,Descriptor>().get(externalParam_).getOmega()),
00264       param(0),
00265       externalParam(externalParam_)
00266 { } 
00267 
00268 template<typename T, template<typename U> class Descriptor>
00269 MRTdynamics<T,Descriptor>::MRTdynamics(MRTparam<T,Descriptor>* param_)
00270     : IsoThermalBulkDynamics<T,Descriptor>(param_->getOmega()),
00271       param(param_),
00272       externalParam(-1)
00273 { }
00274 
00275 template<typename T, template<typename U> class Descriptor>
00276 MRTdynamics<T,Descriptor>::MRTdynamics(HierarchicUnserializer& unserializer) 
00277     : IsoThermalBulkDynamics<T,Descriptor>(T()),
00278       param(0),
00279       externalParam(-1)
00280 {
00281     unserialize(unserializer);
00282 }
00283 
00284 template<typename T, template<typename U> class Descriptor>
00285 MRTdynamics<T,Descriptor>::MRTdynamics(MRTdynamics<T,Descriptor> const& rhs)
00286     : IsoThermalBulkDynamics<T,Descriptor>(rhs),
00287       param(rhs.param ? rhs.param->clone() : 0),
00288       externalParam(rhs.externalParam)
00289 { }
00290 
00291 template<typename T, template<typename U> class Descriptor>
00292 MRTdynamics<T,Descriptor>&
00293     MRTdynamics<T,Descriptor>::operator=(MRTdynamics<T,Descriptor> const& rhs)
00294 {
00295     MRTdynamics<T,Descriptor>(rhs).swap(*this);
00296     return *this;
00297 }
00298 
00299 template<typename T, template<typename U> class Descriptor>
00300 MRTdynamics<T,Descriptor>::~MRTdynamics()
00301 {
00302     delete param;
00303 }
00304 
00305 template<typename T, template<typename U> class Descriptor>
00306 void MRTdynamics<T,Descriptor>::swap(MRTdynamics<T,Descriptor>& rhs)
00307 {
00308     std::swap(param, rhs.param);
00309     std::swap(externalParam, rhs.externalParam);
00310     T tmpOmega = this->getOmega();
00311     this->setOmega(rhs.getOmega());
00312     rhs.setOmega(tmpOmega);
00313 }
00314 
00315 template<typename T, template<typename U> class Descriptor>
00316 MRTdynamics<T,Descriptor>* MRTdynamics<T,Descriptor>::clone() const {
00317     return new MRTdynamics<T,Descriptor>(*this);
00318 }
00319  
00320 template<typename T, template<typename U> class Descriptor>
00321 int MRTdynamics<T,Descriptor>::getId() const {
00322     return id;
00323 }
00324 
00325 template<typename T, template<typename U> class Descriptor>
00326 void MRTdynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const
00327 {
00328     int useExternalParamFlag = param ? 0:1;
00329     serializer.addValue(useExternalParamFlag);
00330     if (param) {
00331         param->serialize(serializer);
00332     }
00333     else {
00334         serializer.addValue(externalParam);
00335     }
00336     IsoThermalBulkDynamics<T,Descriptor>::serialize(serializer);
00337 }
00338 
00339 template<typename T, template<typename U> class Descriptor>
00340 void MRTdynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer)
00341 {
00342     int useExternalParamFlag = unserializer.readValue<int>();
00343     if (useExternalParamFlag) {
00344         externalParam = unserializer.readValue<plint>();
00345         param = 0;
00346     }
00347     else {
00348         delete param;
00349         param = new MRTparam<T,Descriptor>(unserializer);
00350         externalParam = -1;
00351     }
00352     IsoThermalBulkDynamics<T,Descriptor>::unserialize(unserializer);
00353 }
00354 
00355 template<typename T, template<typename U> class Descriptor>
00356 void MRTdynamics<T,Descriptor>::collide (
00357         Cell<T,Descriptor>& cell, BlockStatistics& statistics )
00358 {
00359     typedef mrtTemplates<T,Descriptor> mrtTemp;
00360     
00361     T rhoBar;
00362     Array<T,Descriptor<T>::d> j;
00363     momentTemplates<T,Descriptor>::get_rhoBar_j(cell,rhoBar,j);
00364     MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam));
00365     T jSqr = mrtTemp::mrtCollision(cell, rhoBar, j, parameter->getInvM());
00366 
00367     if (cell.takesStatistics()) {
00368         gatherStatistics(statistics, rhoBar, jSqr * Descriptor<T>::invRho(rhoBar) * Descriptor<T>::invRho(rhoBar) );
00369     }
00370 }
00371 
00372 template<typename T, template<typename U> class Descriptor>
00373 T MRTdynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00374                                                 T jSqr, T thetaBar) const
00375 {
00376     T invRho = Descriptor<T>::invRho(rhoBar);
00377     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00378 }
00379 
00380 template<typename T, template<typename U> class Descriptor>
00381 MRTparam<T,Descriptor> const& MRTdynamics<T,Descriptor>::getMrtParameter() const {
00382     MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam));
00383     return *parameter;
00384 }
00385 
00386 
00387 /* *************** Class ExternalVelocityMRTdynamics *********************************************** */
00388 
00389 template<typename T, template<typename U> class Descriptor>
00390 int ExternalVelocityMRTdynamics<T,Descriptor>::id =
00391     meta::registerGeneralDynamics<T,Descriptor,ExternalVelocityMRTdynamics<T,Descriptor> >("ExternalVelocityMRT");
00392 
00393 template<typename T, template<typename U> class Descriptor>
00394 ExternalVelocityMRTdynamics<T,Descriptor>::ExternalVelocityMRTdynamics(plint externalParam_)
00395     : IsoThermalBulkDynamics<T,Descriptor>(mrtParam<T,Descriptor>().get(externalParam_).getOmega()),
00396       param(0),
00397       externalParam(externalParam_)
00398 { } 
00399 
00400 template<typename T, template<typename U> class Descriptor>
00401 ExternalVelocityMRTdynamics<T,Descriptor>::ExternalVelocityMRTdynamics(MRTparam<T,Descriptor>* param_)
00402     : IsoThermalBulkDynamics<T,Descriptor>(param_->getOmega()),
00403       param(param_),
00404       externalParam(-1)
00405 { }
00406 
00407 template<typename T, template<typename U> class Descriptor>
00408 ExternalVelocityMRTdynamics<T,Descriptor>::ExternalVelocityMRTdynamics(HierarchicUnserializer& unserializer) 
00409     : IsoThermalBulkDynamics<T,Descriptor>(T())
00410 {
00411     unserialize(unserializer);
00412 }
00413 
00414 template<typename T, template<typename U> class Descriptor>
00415 ExternalVelocityMRTdynamics<T,Descriptor>::ExternalVelocityMRTdynamics(ExternalVelocityMRTdynamics<T,Descriptor> const& rhs)
00416     : IsoThermalBulkDynamics<T,Descriptor>(rhs),
00417       param(rhs.param ? rhs.param->clone() : 0),
00418       externalParam(rhs.externalParam)
00419 { }
00420 
00421 template<typename T, template<typename U> class Descriptor>
00422 ExternalVelocityMRTdynamics<T,Descriptor>&
00423     ExternalVelocityMRTdynamics<T,Descriptor>::operator=(ExternalVelocityMRTdynamics<T,Descriptor> const& rhs)
00424 {
00425     ExternalVelocityMRTdynamics<T,Descriptor>(rhs).swap(*this);
00426     return *this;
00427 }
00428 
00429 template<typename T, template<typename U> class Descriptor>
00430 ExternalVelocityMRTdynamics<T,Descriptor>::~ExternalVelocityMRTdynamics()
00431 {
00432     delete param;
00433 }
00434 
00435 template<typename T, template<typename U> class Descriptor>
00436 void ExternalVelocityMRTdynamics<T,Descriptor>::swap(ExternalVelocityMRTdynamics<T,Descriptor>& rhs)
00437 {
00438     std::swap(param, rhs.param);
00439     std::swap(externalParam, rhs.externalParam);
00440     T tmpOmega = this->getOmega();
00441     this->setOmega(rhs.getOmega());
00442     rhs.setOmega(tmpOmega);
00443 }
00444 
00445 template<typename T, template<typename U> class Descriptor>
00446 ExternalVelocityMRTdynamics<T,Descriptor>* ExternalVelocityMRTdynamics<T,Descriptor>::clone() const {
00447     return new ExternalVelocityMRTdynamics<T,Descriptor>(*this);
00448 }
00449  
00450 template<typename T, template<typename U> class Descriptor>
00451 int ExternalVelocityMRTdynamics<T,Descriptor>::getId() const {
00452     return id;
00453 }
00454 
00455 template<typename T, template<typename U> class Descriptor>
00456 void ExternalVelocityMRTdynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const
00457 {
00458     int useExternalParamFlag = param ? 0:1;
00459     serializer.addValue(useExternalParamFlag);
00460     if (param) {
00461         param->serialize(serializer);
00462     }
00463     else {
00464         serializer.addValue(externalParam);
00465     }
00466     IsoThermalBulkDynamics<T,Descriptor>::serialize(serializer);
00467 }
00468 
00469 template<typename T, template<typename U> class Descriptor>
00470 void ExternalVelocityMRTdynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer)
00471 {
00472     int useExternalParamFlag = unserializer.readValue<int>();
00473     if (useExternalParamFlag) {
00474         externalParam = unserializer.readValue<plint>();
00475         param = 0;
00476     }
00477     else {
00478         delete param;
00479         param = new MRTparam<T,Descriptor>(unserializer);
00480         externalParam = -1;
00481     }
00482     IsoThermalBulkDynamics<T,Descriptor>::unserialize(unserializer);
00483 }
00484 
00485 template<typename T, template<typename U> class Descriptor>
00486 void ExternalVelocityMRTdynamics<T,Descriptor>::collide (
00487         Cell<T,Descriptor>& cell, BlockStatistics& statistics )
00488 {
00489     typedef mrtTemplates<T,Descriptor> mrtTemp;
00490     
00491     T rhoBar = momentTemplates<T,Descriptor>::get_rhoBar(cell);
00492     Array<T,Descriptor<T>::d> j;
00493     j.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::velocityBeginsAt));
00494     j *= Descriptor<T>::fullRho(rhoBar);
00495     MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam));
00496     T jSqr = mrtTemp::mrtCollision(cell, rhoBar, j, parameter->getInvM());
00497 
00498     if (cell.takesStatistics()) {
00499         gatherStatistics(statistics, rhoBar, jSqr * Descriptor<T>::invRho(rhoBar) * Descriptor<T>::invRho(rhoBar) );
00500     }
00501 }
00502 
00503 template<typename T, template<typename U> class Descriptor>
00504 T ExternalVelocityMRTdynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00505                                                 T jSqr, T thetaBar) const
00506 {
00507     T invRho = Descriptor<T>::invRho(rhoBar);
00508     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr);
00509 }
00510 
00511 template<typename T, template<typename U> class Descriptor>
00512 T ExternalVelocityMRTdynamics<T,Descriptor>::computeRhoBar(Cell<T,Descriptor> const& cell) const {
00513     return momentTemplates<T,Descriptor>::get_rhoBar(cell);
00514 }
00515 
00516 template<typename T, template<typename U> class Descriptor>
00517 void ExternalVelocityMRTdynamics<T,Descriptor>::computeRhoBarJ(Cell<T,Descriptor> const& cell,
00518                     T& rhoBar, Array<T,Descriptor<T>::d>& j) const
00519 {
00520     rhoBar = momentTemplates<T,Descriptor>::get_rhoBar(cell);
00521     j.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::velocityBeginsAt));
00522     j *= Descriptor<T>::fullRho(rhoBar);
00523 }
00524 
00525 template<typename T, template<typename U> class Descriptor>
00526 void ExternalVelocityMRTdynamics<T,Descriptor>::computeVelocity( Cell<T,Descriptor> const& cell, Array<T,Descriptor<T>::d>& u ) const {
00527     u.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::velocityBeginsAt));
00528 }
00529 
00530 /* *************** Class IncMRTdynamics *********************************************** */
00531 
00532 template<typename T, template<typename U> class Descriptor>
00533 int IncMRTdynamics<T,Descriptor>::id =
00534     meta::registerGeneralDynamics<T,Descriptor,IncMRTdynamics<T,Descriptor> >("IncMRT");
00535 
00536 template<typename T, template<typename U> class Descriptor>
00537 IncMRTdynamics<T,Descriptor>::IncMRTdynamics(plint externalParam_)
00538     : IsoThermalBulkDynamics<T,Descriptor>(mrtParam<T,Descriptor>().get(externalParam_).getOmega()),
00539       param(0),
00540       externalParam(externalParam_)
00541 { } 
00542 
00543 template<typename T, template<typename U> class Descriptor>
00544 IncMRTdynamics<T,Descriptor>::IncMRTdynamics(MRTparam<T,Descriptor>* param_)
00545     : IsoThermalBulkDynamics<T,Descriptor>(param_->getOmega()),
00546       param(param_),
00547       externalParam(-1)
00548 { }
00549 
00550 template<typename T, template<typename U> class Descriptor>
00551 IncMRTdynamics<T,Descriptor>::IncMRTdynamics(HierarchicUnserializer& unserializer) 
00552     : IsoThermalBulkDynamics<T,Descriptor>(T())
00553 {
00554     unserialize(unserializer);
00555 }
00556 
00557 template<typename T, template<typename U> class Descriptor>
00558 IncMRTdynamics<T,Descriptor>::IncMRTdynamics(IncMRTdynamics<T,Descriptor> const& rhs)
00559     : IsoThermalBulkDynamics<T,Descriptor>(rhs),
00560       param(rhs.param ? rhs.param->clone() : 0),
00561       externalParam(rhs.externalParam)
00562 { }
00563 
00564 template<typename T, template<typename U> class Descriptor>
00565 IncMRTdynamics<T,Descriptor>&
00566     IncMRTdynamics<T,Descriptor>::operator=(IncMRTdynamics<T,Descriptor> const& rhs)
00567 {
00568     IncMRTdynamics<T,Descriptor>(rhs).swap(*this);
00569     return *this;
00570 }
00571 
00572 template<typename T, template<typename U> class Descriptor>
00573 IncMRTdynamics<T,Descriptor>::~IncMRTdynamics()
00574 {
00575     delete param;
00576 }
00577 
00578 template<typename T, template<typename U> class Descriptor>
00579 void IncMRTdynamics<T,Descriptor>::swap(IncMRTdynamics<T,Descriptor>& rhs)
00580 {
00581     std::swap(param, rhs.param);
00582     std::swap(externalParam, rhs.externalParam);
00583     T tmpOmega = this->getOmega();
00584     this->setOmega(rhs.getOmega());
00585     rhs.setOmega(tmpOmega);
00586 }
00587 
00588 template<typename T, template<typename U> class Descriptor>
00589 IncMRTdynamics<T,Descriptor>* IncMRTdynamics<T,Descriptor>::clone() const {
00590     return new IncMRTdynamics<T,Descriptor>(*this);
00591 }
00592  
00593 template<typename T, template<typename U> class Descriptor>
00594 int IncMRTdynamics<T,Descriptor>::getId() const {
00595     return id;
00596 }
00597 
00598 template<typename T, template<typename U> class Descriptor>
00599 void IncMRTdynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const
00600 {
00601     int useExternalParamFlag = param ? 0:1;
00602     serializer.addValue(useExternalParamFlag);
00603     if (param) {
00604         param->serialize(serializer);
00605     }
00606     else {
00607         serializer.addValue(externalParam);
00608     }
00609     IsoThermalBulkDynamics<T,Descriptor>::serialize(serializer);
00610 }
00611 
00612 template<typename T, template<typename U> class Descriptor>
00613 void IncMRTdynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer)
00614 {
00615     int useExternalParamFlag = unserializer.readValue<int>();
00616     if (useExternalParamFlag) {
00617         externalParam = unserializer.readValue<plint>();
00618         param = 0;
00619     }
00620     else {
00621         delete param;
00622         param = new MRTparam<T,Descriptor>(unserializer);
00623         externalParam = -1;
00624     }
00625     IsoThermalBulkDynamics<T,Descriptor>::unserialize(unserializer);
00626 }
00627 
00628 template<typename T, template<typename U> class Descriptor>
00629 void IncMRTdynamics<T,Descriptor>::collide (
00630         Cell<T,Descriptor>& cell, BlockStatistics& statistics )
00631 {
00632     typedef mrtTemplates<T,Descriptor> mrtTemp;
00633     
00634     T rhoBar;
00635     Array<T,Descriptor<T>::d> j;
00636     momentTemplates<T,Descriptor>::get_rhoBar_j(cell,rhoBar,j);
00637     MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam));
00638     T jSqr = mrtTemp::quasiIncMrtCollision(cell, rhoBar, j, parameter->getInvM());
00639 
00640     if (cell.takesStatistics()) {
00641         gatherStatistics(statistics, rhoBar, jSqr * Descriptor<T>::invRho(rhoBar) * Descriptor<T>::invRho(rhoBar) );
00642     }
00643 }
00644 
00645 template<typename T, template<typename U> class Descriptor>
00646 T IncMRTdynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00647                                                 T jSqr, T thetaBar) const
00648 {
00649     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, (T)1, j, jSqr);
00650 }
00651 
00652 template<typename T, template<typename U> class Descriptor>
00653 bool IncMRTdynamics<T,Descriptor>::velIsJ() const {
00654     return true;
00655 }
00656 
00657 template<typename T, template<typename U> class Descriptor>
00658 void IncMRTdynamics<T,Descriptor>::computeVelocity( Cell<T,Descriptor> const& cell,
00659                                                                  Array<T,Descriptor<T>::d>& u ) const 
00660 {
00661     T dummyRhoBar;
00662     this->computeRhoBarJ(cell, dummyRhoBar, u);
00663 }
00664 
00665 /* *************** Class ExternalVelocityIncMRTdynamics *********************************************** */
00666 
00667 template<typename T, template<typename U> class Descriptor>
00668 int ExternalVelocityIncMRTdynamics<T,Descriptor>::id =
00669     meta::registerGeneralDynamics<T,Descriptor,ExternalVelocityIncMRTdynamics<T,Descriptor> >("ExternalVelocityIncMRT");
00670 
00671 template<typename T, template<typename U> class Descriptor>
00672 ExternalVelocityIncMRTdynamics<T,Descriptor>::ExternalVelocityIncMRTdynamics(plint externalParam_)
00673     : IsoThermalBulkDynamics<T,Descriptor>(mrtParam<T,Descriptor>().get(externalParam_).getOmega()),
00674       param(0),
00675       externalParam(externalParam_)
00676 { } 
00677 
00678 template<typename T, template<typename U> class Descriptor>
00679 ExternalVelocityIncMRTdynamics<T,Descriptor>::ExternalVelocityIncMRTdynamics(MRTparam<T,Descriptor>* param_)
00680     : IsoThermalBulkDynamics<T,Descriptor>(param_->getOmega()),
00681       param(param_),
00682       externalParam(-1)
00683 { }
00684 
00685 template<typename T, template<typename U> class Descriptor>
00686 ExternalVelocityIncMRTdynamics<T,Descriptor>::ExternalVelocityIncMRTdynamics(HierarchicUnserializer& unserializer) 
00687     : IsoThermalBulkDynamics<T,Descriptor>(T())
00688 {
00689     unserialize(unserializer);
00690 }
00691 
00692 template<typename T, template<typename U> class Descriptor>
00693 ExternalVelocityIncMRTdynamics<T,Descriptor>::ExternalVelocityIncMRTdynamics(
00694         ExternalVelocityIncMRTdynamics<T,Descriptor> const& rhs)
00695     : IsoThermalBulkDynamics<T,Descriptor>(rhs),
00696       param(rhs.param ? rhs.param->clone() : 0),
00697       externalParam(rhs.externalParam)
00698 { }
00699 
00700 template<typename T, template<typename U> class Descriptor>
00701 ExternalVelocityIncMRTdynamics<T,Descriptor>&
00702     ExternalVelocityIncMRTdynamics<T,Descriptor>::operator=(ExternalVelocityIncMRTdynamics<T,Descriptor> const& rhs)
00703 {
00704     ExternalVelocityIncMRTdynamics<T,Descriptor>(rhs).swap(*this);
00705     return *this;
00706 }
00707 
00708 template<typename T, template<typename U> class Descriptor>
00709 ExternalVelocityIncMRTdynamics<T,Descriptor>::~ExternalVelocityIncMRTdynamics()
00710 {
00711     delete param;
00712 }
00713 
00714 template<typename T, template<typename U> class Descriptor>
00715 void ExternalVelocityIncMRTdynamics<T,Descriptor>::swap(ExternalVelocityIncMRTdynamics<T,Descriptor>& rhs)
00716 {
00717     std::swap(param, rhs.param);
00718     std::swap(externalParam, rhs.externalParam);
00719     T tmpOmega = this->getOmega();
00720     this->setOmega(rhs.getOmega());
00721     rhs.setOmega(tmpOmega);
00722 }
00723 
00724 template<typename T, template<typename U> class Descriptor>
00725 ExternalVelocityIncMRTdynamics<T,Descriptor>* ExternalVelocityIncMRTdynamics<T,Descriptor>::clone() const {
00726     return new ExternalVelocityIncMRTdynamics<T,Descriptor>(*this);
00727 }
00728  
00729 template<typename T, template<typename U> class Descriptor>
00730 int ExternalVelocityIncMRTdynamics<T,Descriptor>::getId() const {
00731     return id;
00732 }
00733 
00734 template<typename T, template<typename U> class Descriptor>
00735 void ExternalVelocityIncMRTdynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const
00736 {
00737     int useExternalParamFlag = param ? 0:1;
00738     serializer.addValue(useExternalParamFlag);
00739     if (param) {
00740         param->serialize(serializer);
00741     }
00742     else {
00743         serializer.addValue(externalParam);
00744     }
00745     IsoThermalBulkDynamics<T,Descriptor>::serialize(serializer);
00746 }
00747 
00748 template<typename T, template<typename U> class Descriptor>
00749 void ExternalVelocityIncMRTdynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer)
00750 {
00751     int useExternalParamFlag = unserializer.readValue<int>();
00752     if (useExternalParamFlag) {
00753         externalParam = unserializer.readValue<plint>();
00754         param = 0;
00755     }
00756     else {
00757         delete param;
00758         param = new MRTparam<T,Descriptor>(unserializer);
00759         externalParam = -1;
00760     }
00761     IsoThermalBulkDynamics<T,Descriptor>::unserialize(unserializer);
00762 }
00763 
00764 template<typename T, template<typename U> class Descriptor>
00765 void ExternalVelocityIncMRTdynamics<T,Descriptor>::collide (
00766         Cell<T,Descriptor>& cell, BlockStatistics& statistics )
00767 {
00768     typedef mrtTemplates<T,Descriptor> mrtTemp;
00769     
00770     T rhoBar = momentTemplates<T,Descriptor>::get_rhoBar(cell);
00771     Array<T,Descriptor<T>::d> j;
00772     j.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::velocityBeginsAt));
00773     MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam));
00774     T jSqr = mrtTemp::quasiIncMrtCollision(cell, rhoBar, j, parameter->getInvM());
00775 
00776     if (cell.takesStatistics()) {
00777         gatherStatistics(statistics, rhoBar, jSqr * Descriptor<T>::invRho(rhoBar) * Descriptor<T>::invRho(rhoBar) );
00778     }
00779 }
00780 
00781 template<typename T, template<typename U> class Descriptor>
00782 T ExternalVelocityIncMRTdynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j,
00783                                                 T jSqr, T thetaBar) const
00784 {
00785     return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, (T)1, j, jSqr);
00786 }
00787 
00788 template<typename T, template<typename U> class Descriptor>
00789 bool ExternalVelocityIncMRTdynamics<T,Descriptor>::velIsJ() const {
00790     return true;
00791 }
00792 
00793 template<typename T, template<typename U> class Descriptor>
00794 T ExternalVelocityIncMRTdynamics<T,Descriptor>::computeRhoBar(Cell<T,Descriptor> const& cell) const {
00795     return momentTemplates<T,Descriptor>::get_rhoBar(cell);
00796 }
00797 
00798 template<typename T, template<typename U> class Descriptor>
00799 void ExternalVelocityIncMRTdynamics<T,Descriptor>::computeRhoBarJ(Cell<T,Descriptor> const& cell,
00800                     T& rhoBar, Array<T,Descriptor<T>::d>& j) const
00801 {
00802     rhoBar = momentTemplates<T,Descriptor>::get_rhoBar(cell);
00803     j.from_cArray(cell.getExternal(Descriptor<T>::ExternalField::velocityBeginsAt));
00804 }
00805 
00806 template<typename T, template<typename U> class Descriptor>
00807 void ExternalVelocityIncMRTdynamics<T,Descriptor>::computeVelocity( Cell<T,Descriptor> const& cell,
00808                                                                  Array<T,Descriptor<T>::d>& u ) const 
00809 {
00810     T dummyRhoBar;
00811     computeRhoBarJ(cell, dummyRhoBar, u);
00812 }
00813 
00814 }
00815 
00816 #endif  // MRT_DYNAMICS_HH
00817