$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 EXTERNAL_FORCE_MRT_DYNAMICS_HH 00031 #define EXTERNAL_FORCE_MRT_DYNAMICS_HH 00032 00033 #include "externalForceMrtDynamics.h" 00034 #include "latticeBoltzmann/mrtTemplates.h" 00035 #include "latticeBoltzmann/dynamicsTemplates.h" 00036 #include "latticeBoltzmann/momentTemplates.h" 00037 #include "core/latticeStatistics.h" 00038 #include <algorithm> 00039 #include <limits> 00040 00041 namespace plb { 00042 00043 /* *************** Class ShanChenExternalForceMRTdynamics *********************************************** */ 00044 00045 template<typename T, template<typename U> class Descriptor> 00046 int GuoExternalForceMRTdynamics<T,Descriptor>::id = 00047 meta::registerGeneralDynamics<T,Descriptor,GuoExternalForceMRTdynamics<T,Descriptor> >("MRT_ExternalForce_Guo"); 00048 00049 template<typename T, template<typename U> class Descriptor> 00050 GuoExternalForceMRTdynamics<T,Descriptor>::GuoExternalForceMRTdynamics(plint externalParam_) 00051 : ExternalForceDynamics<T,Descriptor>(mrtParam<T,Descriptor>().get(externalParam_).getOmega()), 00052 param(0), 00053 externalParam(externalParam_) 00054 { } 00055 00056 template<typename T, template<typename U> class Descriptor> 00057 GuoExternalForceMRTdynamics<T,Descriptor>::GuoExternalForceMRTdynamics(MRTparam<T,Descriptor>* param_) 00058 : ExternalForceDynamics<T,Descriptor>(param_->getOmega()), 00059 param(param_), 00060 externalParam(-1) 00061 { } 00062 00063 template<typename T, template<typename U> class Descriptor> 00064 GuoExternalForceMRTdynamics<T,Descriptor>::GuoExternalForceMRTdynamics(HierarchicUnserializer& unserializer) 00065 : ExternalForceDynamics<T,Descriptor>(T()) 00066 { 00067 unserialize(unserializer); 00068 } 00069 00070 template<typename T, template<typename U> class Descriptor> 00071 GuoExternalForceMRTdynamics<T,Descriptor>::GuoExternalForceMRTdynamics(GuoExternalForceMRTdynamics<T,Descriptor> const& rhs) 00072 : ExternalForceDynamics<T,Descriptor>(rhs), 00073 param(rhs.param ? rhs.param->clone() : 0), 00074 externalParam(rhs.externalParam) 00075 { } 00076 00077 template<typename T, template<typename U> class Descriptor> 00078 GuoExternalForceMRTdynamics<T,Descriptor>& 00079 GuoExternalForceMRTdynamics<T,Descriptor>::operator=(GuoExternalForceMRTdynamics<T,Descriptor> const& rhs) 00080 { 00081 GuoExternalForceMRTdynamics<T,Descriptor>(rhs).swap(*this); 00082 return *this; 00083 } 00084 00085 template<typename T, template<typename U> class Descriptor> 00086 GuoExternalForceMRTdynamics<T,Descriptor>::~GuoExternalForceMRTdynamics() 00087 { 00088 delete param; 00089 } 00090 00091 template<typename T, template<typename U> class Descriptor> 00092 void GuoExternalForceMRTdynamics<T,Descriptor>::swap(GuoExternalForceMRTdynamics<T,Descriptor>& rhs) 00093 { 00094 std::swap(param, rhs.param); 00095 std::swap(externalParam, rhs.externalParam); 00096 T tmpOmega = this->getOmega(); 00097 this->setOmega(rhs.getOmega()); 00098 rhs.setOmega(tmpOmega); 00099 } 00100 00101 template<typename T, template<typename U> class Descriptor> 00102 GuoExternalForceMRTdynamics<T,Descriptor>* GuoExternalForceMRTdynamics<T,Descriptor>::clone() const { 00103 return new GuoExternalForceMRTdynamics<T,Descriptor>(*this); 00104 } 00105 00106 template<typename T, template<typename U> class Descriptor> 00107 int GuoExternalForceMRTdynamics<T,Descriptor>::getId() const { 00108 return id; 00109 } 00110 00111 template<typename T, template<typename U> class Descriptor> 00112 void GuoExternalForceMRTdynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const 00113 { 00114 int useExternalParamFlag = param ? 0:1; 00115 serializer.addValue(useExternalParamFlag); 00116 if (param) { 00117 param->serialize(serializer); 00118 } 00119 else { 00120 serializer.addValue(externalParam); 00121 } 00122 ExternalForceDynamics<T,Descriptor>::serialize(serializer); 00123 } 00124 00125 template<typename T, template<typename U> class Descriptor> 00126 void GuoExternalForceMRTdynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer) 00127 { 00128 int useExternalParamFlag = unserializer.readValue<int>(); 00129 if (useExternalParamFlag) { 00130 externalParam = unserializer.readValue<plint>(); 00131 param = 0; 00132 } 00133 else { 00134 delete param; 00135 param = new MRTparam<T,Descriptor>(unserializer); 00136 externalParam = -1; 00137 } 00138 ExternalForceDynamics<T,Descriptor>::unserialize(unserializer); 00139 } 00140 00141 template<typename T, template<typename U> class Descriptor> 00142 void GuoExternalForceMRTdynamics<T,Descriptor>::collide ( 00143 Cell<T,Descriptor>& cell, BlockStatistics& statistics ) 00144 { 00145 typedef mrtTemplates<T,Descriptor> mrtTemp; 00146 00147 T rhoBar = momentTemplates<T,Descriptor>::get_rhoBar(cell); 00148 MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam)); 00149 00150 Array<T,Descriptor<T>::d> u, j; 00151 this->computeVelocity(cell, u); 00152 T rho = Descriptor<T>::fullRho(rhoBar); 00153 for (plint iD = 0; iD < Descriptor<T>::d; ++iD) { 00154 j[iD] = rho * u[iD]; 00155 } 00156 00157 T jSqr = mrtTemp::mrtCollisionWithForce(cell, rhoBar, j, parameter->getInvM(), (T)1); 00158 00159 if (cell.takesStatistics()) { 00160 T invRho = Descriptor<T>::invRho(rhoBar); 00161 gatherStatistics(statistics, rhoBar, jSqr*invRho*invRho); 00162 // gatherStatistics(statistics, rhoBar, uSqr); 00163 } 00164 } 00165 00166 template<typename T, template<typename U> class Descriptor> 00167 T GuoExternalForceMRTdynamics<T,Descriptor>::computeEquilibrium(plint iPop, T rhoBar, Array<T,Descriptor<T>::d> const& j, 00168 T jSqr, T thetaBar) const 00169 { 00170 T invRho = Descriptor<T>::invRho(rhoBar); 00171 return dynamicsTemplates<T,Descriptor>::bgk_ma2_equilibrium(iPop, rhoBar, invRho, j, jSqr); 00172 } 00173 00174 template<typename T, template<typename U> class Descriptor> 00175 MRTparam<T,Descriptor> const& GuoExternalForceMRTdynamics<T,Descriptor>::getMrtParameter() const { 00176 MRTparam<T,Descriptor>* parameter = param ? param : &(mrtParam<T,Descriptor>().get(externalParam)); 00177 return *parameter; 00178 } 00179 00180 } 00181 #endif 00182
1.6.3
1.6.3