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