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

mrtLattices.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  */
00027 
00034 #ifndef MRT_LATTICES_HH
00035 #define MRT_LATTICES_HH
00036 
00037 namespace plb {
00038 namespace descriptors {
00039 
00040     // MRT D2Q9 ////////////////////////////////////////////////////////////
00041 
00042     template<typename T>
00043     const T MRTD2Q9DescriptorBase<T>::M[BaseDescriptor::q][BaseDescriptor::q] =
00044         {
00045             { (T)1,  (T)1,  (T)1,  (T)1,  (T)1,  (T)1,  (T)1,  (T)1,  (T)1 },
00046             {-(T)4,  (T)2, -(T)1,  (T)2, -(T)1,  (T)2, -(T)1,  (T)2, -(T)1 },
00047             { (T)4,  (T)1, -(T)2,  (T)1, -(T)2,  (T)1, -(T)2,  (T)1, -(T)2 },
00048             {  T(), -(T)1, -(T)1, -(T)1,   T(),  (T)1,  (T)1,  (T)1,   T() },
00049             {  T(), -(T)1,  (T)2, -(T)1,   T(),  (T)1, -(T)2,  (T)1,   T() },
00050             {  T(),  (T)1,   T(), -(T)1, -(T)1, -(T)1,   T(),  (T)1,  (T)1 },
00051             {  T(),  (T)1,   T(), -(T)1,  (T)2, -(T)1,   T(),  (T)1, -(T)2 },
00052             {  T(),   T(),  (T)1,   T(), -(T)1,   T(),  (T)1,   T(), -(T)1 },
00053             {  T(), -(T)1,   T(),  (T)1,   T(), -(T)1,   T(),  (T)1,   T() }
00054         };
00055     
00056     template<typename T>
00057     const T MRTD2Q9DescriptorBase<T>::invM[BaseDescriptor::q][BaseDescriptor::q] =
00058         {
00059             {(T)1/(T)9, -(T)1/(T)9, (T)1/(T)9, T(), T(), T(), T(), T(), T()}, 
00060             {(T)1/(T)9, (T)1/(T)18, (T)1/(T)36, -(T)1/(T)6, -(T)1/(T)12, (T)1/(T)6, (T)1/(T)12, T(), -(T)1/(T)4}, 
00061             {(T)1/(T)9, -(T)1/(T)36, -(T)1/(T)18, -(T)1/(T)6, (T)1/(T)6, T(), T(), (T)1/(T)4, T()},  
00062             {(T)1/(T)9, (T)1/(T)18, (T)1/(T)36, -(T)1/(T)6, -(T)1/(T)12, -(T)1/(T)6, -(T)1/(T)12, T(), (T)1/(T)4}, 
00063             {(T)1/(T)9, -(T)1/(T)36, -(T)1/(T)18, T(), T(), -(T)1/(T)6, (T)1/(T)6, -(T)1/(T)4, T()}, 
00064             {(T)1/(T)9, (T)1/(T)18, (T)1/(T)36, (T)1/(T)6, (T)1/(T)12, -(T)1/(T)6, -(T)1/(T)12, T(), -(T)1/(T)4}, 
00065             {(T)1/(T)9, -(T)1/(T)36, -(T)1/(T)18, (T)1/(T)6, -(T)1/(T)6, T(), T(), (T)1/(T)4, T()}, 
00066             {(T)1/(T)9, (T)1/(T)18, (T)1/(T)36, (T)1/(T)6, (T)1/(T)12, (T)1/(T)6, (T)1/(T)12, T(), (T)1/(T)4}, 
00067             {(T)1/(T)9, -(T)1/(T)36, -(T)1/(T)18, T(), T(), (T)1/(T)6, -(T)1/(T)6, -(T)1/(T)4, T()}
00068         };
00069         
00070     template<typename T>
00071     const T MRTD2Q9DescriptorBase<T>::S[BaseDescriptor::q] =
00072     { T(), (T)1.63, (T)1.14, T(), (T)1.92, T(), (T)1.92, T(), T() };
00073     // s7=s8 to have a shear viscosity nu
00074     // and the bulk viscosity depends on s1.
00075     // sq->s4 and s6
00076     // s_epsilon -> s2
00077     
00078     template<typename T>
00079     const int MRTD2Q9DescriptorBase<T>::momentumIndexes[MRTD2Q9DescriptorBase<T>::jIndexes] = {3, 5};
00080     
00081     template<typename T>
00082     const int MRTD2Q9DescriptorBase<T>::shearViscIndexes[MRTD2Q9DescriptorBase<T>::shearIndexes] = {7, 8};
00083     
00084     template<typename T>
00085     const int MRTD2Q9DescriptorBase<T>::qViscIndexes[MRTD2Q9DescriptorBase<T>::qIndexes] = {4, 6};
00086 
00087     template<typename T>
00088     const char MRTD2Q9Descriptor<T>::name[] = "MRTD2Q9";
00089     
00090     // EXTERNAL FORCE MRT D2Q9 ////////////////////////////////////////////////////////////
00091     
00092     template<typename T>
00093     const char ForcedMRTD2Q9Descriptor<T>::name[] = "ForcedMRTD2Q9";
00094     
00095     
00096     // EXTERNAL VELOCITY MRT D2Q9 ////////////////////////////////////////////////////////////
00097     
00098     template<typename T>
00099     const char ExternalVelocityMRTD2Q9Descriptor<T>::name[] = "ExternalVelocityMRTD2Q9";
00100 
00101     
00102     // MRT D3Q19 ////////////////////////////////////////////////////////////
00103 
00104     template<typename T>
00105     const T MRTD3Q19DescriptorBase<T>::M[BaseDescriptor::q][BaseDescriptor::q] =
00106         {
00107  /*0*/      {(T)1, 
00108              (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, 
00109              (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1},
00110 /*1*/       {(T)-30, 
00111              (T)-11, (T)-11, (T)-11, (T)8, (T)8, (T)8, (T)8, (T)8, (T)8, 
00112              (T)-11, (T)-11, (T)-11, (T)8, (T)8, (T)8, (T)8, (T)8, (T)8},
00113 /*2*/       {(T)12, 
00114              (T)-4, (T)-4, (T)-4, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1, 
00115              (T)-4, (T)-4, (T)-4, (T)1, (T)1, (T)1, (T)1, (T)1, (T)1},
00116 /*3*/       {T(), 
00117              (T)-1, T(), T(), (T)-1, (T)-1, (T)-1, (T)-1, T(), T(), 
00118              (T)1, T(), T(), (T)1, (T)1, (T)1, (T)1, T(), T()},
00119 /*4*/       {T(), 
00120              (T)4, T(), T(), (T)-1, (T)-1, (T)-1, (T)-1, T(), T(), 
00121              (T)-4, T(), T(), (T)1, (T)1, (T)1, (T)1, T(), T()},
00122 /*5*/       {T(), 
00123              T(), (T)-1, T(), (T)-1, (T)1, T(), T(), (T)-1, (T)-1, 
00124              T(), (T)1, T(), (T)1, (T)-1, T(), T(), (T)1, (T)1},
00125 /*6*/       {T(), 
00126              T(), (T)4, T(), (T)-1, (T)1, T(), T(), (T)-1, (T)-1, 
00127              T(), (T)-4, T(), (T)1, (T)-1, T(), T(), (T)1, (T)1},
00128 /*7*/       {T(), 
00129              T(), T(), (T)-1, T(), T(), (T)-1, (T)1, (T)-1, (T)1, 
00130              T(), T(), (T)1, T(), T(), (T)1, (T)-1, (T)1, (T)-1},
00131 /*8*/       {T(), 
00132              T(), T(), (T)4, T(), T(), (T)-1, (T)1, (T)-1, (T)1, 
00133              T(), T(), (T)-4, T(), T(), (T)1, (T)-1, (T)1, (T)-1},
00134 /*9*/       {T(), 
00135              (T)2, (T)-1, (T)-1, (T)1, (T)1, (T)1, (T)1, (T)-2, (T)-2, 
00136              (T)2, (T)-1, (T)-1, (T)1, (T)1, (T)1, (T)1, (T)-2, (T)-2},
00137 /*10*/      {T(), 
00138              (T)-4, (T)2, (T)2, (T)1, (T)1, (T)1, (T)1, (T)-2, (T)-2, 
00139              (T)-4, (T)2, (T)2, (T)1, (T)1, (T)1, (T)1, (T)-2, (T)-2},
00140 /*11*/      {T(), 
00141              T(), (T)1, (T)-1, (T)1, (T)1, (T)-1, (T)-1, T(), T(), 
00142              T(), (T)1, (T)-1, (T)1, (T)1, (T)-1, (T)-1, T(), T()},
00143 /*12*/      {T(), 
00144              T(), (T)-2, (T)2, (T)1, (T)1, (T)-1, (T)-1, T(), T(), 
00145              T(), (T)-2, (T)2, (T)1, (T)1, (T)-1, (T)-1, T(), T()},
00146 /*13*/      {T(), 
00147              T(), T(), T(), (T)1, (T)-1, T(), T(), T(), T(), 
00148              T(), T(), T(), (T)1, (T)-1, T(), T(), T(), T()},
00149 /*14*/      {T(), 
00150              T(), T(), T(), T(), T(), T(), T(), (T)1, (T)-1, 
00151              T(), T(), T(), T(), T(), T(), T(), (T)1, (T)-1},
00152 /*15*/      {T(), 
00153              T(), T(), T(), T(), T(), (T)1, (T)-1, T(), T(), 
00154              T(), T(), T(), T(), T(), (T)1, (T)-1, T(), T()},
00155 /*16*/      {T(), 
00156              T(), T(), T(), (T)-1, (T)-1, (T)1, (T)1, T(), T(), 
00157              T(), T(), T(), (T)1, (T)1, (T)-1, (T)-1, T(), T()},
00158 /*17*/      {T(), 
00159              T(), T(), T(), (T)1, (T)-1, T(), T(), (T)-1, (T)-1, 
00160              T(), T(), T(), (T)-1, (T)1, T(), T(), (T)1, (T)1},
00161 /*18*/      {T(), 
00162              T(), T(), T(), T(), T(), (T)-1, (T)1, (T)1, (T)-1, 
00163              T(), T(), T(), T(), T(), (T)1, (T)-1, (T)-1, (T)1}
00164         };
00165     
00166     template<typename T>
00167     const T MRTD3Q19DescriptorBase<T>::invM[BaseDescriptor::q][BaseDescriptor::q] =
00168         {
00169 /*0*/       {(T)1/(T)19,
00170              -(T)5/(T)399,(T)1/(T)21,T(),T(),T(),T(),T(),T(),
00171              T(),T(),T(),T(),T(),T(),T(),T(),T(),T()},
00172              
00173 /*1*/       {(T)1/(T)19,
00174              -(T)11/(T)2394,-(T)1/(T)63,-(T)1/(T)10,(T)1/(T)10,T(),T(),T(),T(),(T)1/(T)18,
00175              -(T)1/(T)18,T(),T(),T(),T(),T(),T(),T(),T()},
00176              
00177 /*2*/       {(T)1/(T)19,
00178              -(T)11/(T)2394,-(T)1/(T)63,T(),T(),-(T)1/(T)10,(T)1/(T)10,T(),T(),-(T)1/(T)36,
00179              (T)1/(T)36,(T)1/(T)12,-(T)1/(T)12,T(),T(),T(),T(),T(),T()},
00180              
00181 /*3*/       {(T)1/(T)19,
00182              -(T)11/(T)2394,-(T)1/(T)63,T(),T(),T(),T(),-(T)1/(T)10,(T)1/(T)10,-(T)1/(T)36,
00183              (T)1/(T)36,-(T)1/(T)12,(T)1/(T)12,T(),T(),T(),T(),T(),T()},
00184              
00185 /*4*/       {(T)1/(T)19,
00186              (T)4/(T)1197,(T)1/(T)252,-(T)1/(T)10,-(T)1/(T)40,-(T)1/(T)10,-(T)1/(T)40,T(),T(),(T)1/(T)36,
00187              (T)1/(T)72,(T)1/(T)12,(T)1/(T)24,(T)1/(T)4,T(),T(),-(T)1/(T)8,(T)1/(T)8,T()},
00188              
00189 /*5*/       {(T)1/(T)19,
00190              (T)4/(T)1197,(T)1/(T)252,-(T)1/(T)10,-(T)1/(T)40,(T)1/(T)10,(T)1/(T)40,T(),T(),(T)1/(T)36,
00191              (T)1/(T)72,(T)1/(T)12,(T)1/(T)24,-(T)1/(T)4,T(),T(),-(T)1/(T)8,-(T)1/(T)8,T()},
00192              
00193 /*6*/       {(T)1/(T)19,
00194              (T)4/(T)1197,(T)1/(T)252,-(T)1/(T)10,-(T)1/(T)40,T(),T(),-(T)1/(T)10,-(T)1/(T)40,(T)1/(T)36,
00195              (T)1/(T)72,-(T)1/(T)12,-(T)1/(T)24,T(),T(),(T)1/(T)4,(T)1/(T)8,T(),-(T)1/(T)8},
00196              
00197 /*7*/       {(T)1/(T)19,
00198              (T)4/(T)1197,(T)1/(T)252,-(T)1/(T)10,-(T)1/(T)40,T(),T(),(T)1/(T)10,(T)1/(T)40,(T)1/(T)36,
00199              (T)1/(T)72,-(T)1/(T)12,-(T)1/(T)24,T(),T(),-(T)1/(T)4,(T)1/(T)8,T(),(T)1/(T)8},
00200              
00201 /*8*/       {(T)1/(T)19,
00202              (T)4/(T)1197,(T)1/(T)252,T(),T(),-(T)1/(T)10,-(T)1/(T)40,-(T)1/(T)10,-(T)1/(T)40,-(T)1/(T)18,
00203              -(T)1/(T)36,T(),T(),T(),(T)1/(T)4,T(),T(),-(T)1/(T)8,(T)1/(T)8},
00204              
00205 /*9*/       {(T)1/(T)19,
00206              (T)4/(T)1197,(T)1/(T)252,T(),T(),-(T)1/(T)10,-(T)1/(T)40,(T)1/(T)10,(T)1/(T)40,-(T)1/(T)18,
00207              -(T)1/(T)36,T(),T(),T(),-(T)1/(T)4,T(),T(),-(T)1/(T)8,-(T)1/(T)8},
00208              
00209 /*10*/      {(T)1/(T)19,
00210              -(T)11/(T)2394,-(T)1/(T)63,(T)1/(T)10,-(T)1/(T)10,T(),T(),T(),T(),(T)1/(T)18,
00211              -(T)1/(T)18,T(),T(),T(),T(),T(),T(),T(),T()},
00212              
00213 /*11*/      {(T)1/(T)19,
00214              -(T)11/(T)2394,-(T)1/(T)63,T(),T(),(T)1/(T)10,-(T)1/(T)10,T(),T(),-(T)1/(T)36,(T)1/(T)36,
00215              (T)1/(T)12,-(T)1/(T)12,T(),T(),T(),T(),T(),T()},
00216              
00217 /*12*/      {(T)1/(T)19,
00218              -(T)11/(T)2394,-(T)1/(T)63,T(),T(),T(),T(),(T)1/(T)10,-(T)1/(T)10,-(T)1/(T)36,
00219              (T)1/(T)36,-(T)1/(T)12,(T)1/(T)12,T(),T(),T(),T(),T(),T()},
00220              
00221 /*13*/      {(T)1/(T)19,
00222              (T)4/(T)1197,(T)1/(T)252,(T)1/(T)10,(T)1/(T)40,(T)1/(T)10,(T)1/(T)40,T(),T(),(T)1/(T)36,
00223              (T)1/(T)72,(T)1/(T)12,(T)1/(T)24,(T)1/(T)4,T(),T(),(T)1/(T)8,-(T)1/(T)8,T()},
00224              
00225 /*14*/      {(T)1/(T)19,
00226              (T)4/(T)1197,(T)1/(T)252,(T)1/(T)10,(T)1/(T)40,-(T)1/(T)10,-(T)1/(T)40,T(),T(),(T)1/(T)36,
00227              (T)1/(T)72,(T)1/(T)12,(T)1/(T)24,-(T)1/(T)4,T(),T(),(T)1/(T)8,(T)1/(T)8,T()},
00228              
00229 /*15*/      {(T)1/(T)19,
00230              (T)4/(T)1197,(T)1/(T)252,(T)1/(T)10,(T)1/(T)40,T(),T(),(T)1/(T)10,(T)1/(T)40,(T)1/(T)36,
00231              (T)1/(T)72,-(T)1/(T)12,-(T)1/(T)24,T(),T(),(T)1/(T)4,-(T)1/(T)8,T(),(T)1/(T)8},
00232              
00233 /*16*/      {(T)1/(T)19,
00234              (T)4/(T)1197,(T)1/(T)252,(T)1/(T)10,(T)1/(T)40,T(),T(),-(T)1/(T)10,-(T)1/(T)40,(T)1/(T)36,
00235              (T)1/(T)72,-(T)1/(T)12,-(T)1/(T)24,T(),T(),-(T)1/(T)4,-(T)1/(T)8,T(),-(T)1/(T)8},
00236              
00237 /*17*/      {(T)1/(T)19,
00238              (T)4/(T)1197,(T)1/(T)252,T(),T(),(T)1/(T)10,(T)1/(T)40,(T)1/(T)10,(T)1/(T)40,-(T)1/(T)18,
00239              -(T)1/(T)36,T(),T(),T(),(T)1/(T)4,T(),T(),(T)1/(T)8,-(T)1/(T)8},
00240              
00241 /*18*/      {(T)1/(T)19,
00242              (T)4/(T)1197,(T)1/(T)252,T(),T(),(T)1/(T)10,(T)1/(T)40,-(T)1/(T)10,-(T)1/(T)40,-(T)1/(T)18,
00243              -(T)1/(T)36,T(),T(),T(),-(T)1/(T)4,T(),T(),(T)1/(T)8,(T)1/(T)8}
00244         };
00245         
00246     template<typename T>
00247     const T MRTD3Q19DescriptorBase<T>::S[BaseDescriptor::q] =
00248     {
00249 /*s0*/  T(), // rho (conserved)
00250 /*s1*/  (T)1.19, 
00251 /*s2*/  (T)1.4, 
00252 /*s3*/  T(), // rho*ux (conserved)
00253 /*s4*/  (T)1.2, // <=> q index
00254 /*s5*/  T(), // rho*uy (conserved)
00255 /*s6*/  (T)1.2, // = s4 <=> q index
00256 /*s7*/  T(), // rho*uz (conserved)
00257 /*s8*/  (T)1.2, // = s4 <=> q index
00258 /*s9*/  T(), //should be equal to s13, used to define nu
00259 /*s10*/ (T)1.4,
00260 /*s11*/ T(), // = s9,
00261 /*s12*/ (T)1.4, 
00262 /*s13*/ T(), //should be equal to s9, used to define nu
00263 /*s14*/ T(), // = s13,
00264 /*s15*/ T(), // = s13,
00265 /*s16*/ (T)1.98,
00266 /*s17*/ (T)1.98, // = s16,
00267 /*s18*/ (T)1.98  // = s16,
00268     };
00269     
00270     template<typename T>
00271     const int MRTD3Q19DescriptorBase<T>::momentumIndexes[MRTD3Q19DescriptorBase<T>::jIndexes] = 
00272         {3, 5, 7};
00273     
00274     template<typename T>
00275     const int MRTD3Q19DescriptorBase<T>::shearViscIndexes[MRTD3Q19DescriptorBase<T>::shearIndexes] = 
00276         {9, 11, 13, 14, 15};
00277         
00278     template<typename T>
00279     const int MRTD3Q19DescriptorBase<T>::qViscIndexes[MRTD3Q19DescriptorBase<T>::qIndexes] = {4, 6, 8};
00280 
00281     template<typename T>
00282     const char MRTD3Q19Descriptor<T>::name[] = "MRTD3Q19";
00283     
00284     // EXTERNAL FORCE MRT D3Q19 ////////////////////////////////////////////////////////////
00285     
00286     template<typename T>
00287     const char ForcedMRTD3Q19Descriptor<T>::name[] = "ForcedMRTD3Q19";
00288     
00289     // EXTERNAL VELOCITY MRT D3Q19 ////////////////////////////////////////////////////////////
00290     
00291     template<typename T>
00292     const char ExternalVelocityMRTD3Q19Descriptor<T>::name[] = "ExternalVelocityMRTD3Q19";
00293 
00294 }  // namespace descriptors
00295 
00296 }  // namespace plb
00297 
00298 #endif