$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 */ 00027 00033 #ifndef MRT_TEMPLATES_3D_H 00034 #define MRT_TEMPLATES_3D_H 00035 00036 #include "core/globalDefs.h" 00037 00038 namespace plb { 00039 00040 // Efficient specialization for D3Q19 lattice 00041 template<typename T> struct mrtTemplatesImpl<T, descriptors::MRTD3Q19DescriptorBase<T> > { 00042 00043 typedef descriptors::D3Q19DescriptorBase<T> Descriptor; 00044 00046 static void computeEquilibrium( Array<T,Descriptor::q>& momentsEq, 00047 T rhoBar, Array<T,3> const& j, T jSqr ) 00048 { 00049 T invRho = Descriptor::invRho(rhoBar); 00050 00051 momentsEq[0] = rhoBar; 00052 momentsEq[1] = (T)19*jSqr*invRho-(T)11*rhoBar; 00053 momentsEq[2] = -(T)5.5*jSqr*invRho+(T)3*rhoBar; 00054 momentsEq[3] = j[0]; 00055 momentsEq[4] = -((T)2/(T)3)*j[0]; 00056 momentsEq[5] = j[1]; 00057 momentsEq[6] = -((T)2/3)*j[1]; 00058 momentsEq[7] = j[2]; 00059 momentsEq[8] = -((T)2/(T)3)*j[2]; 00060 momentsEq[9] = ((T)2*j[0]*j[0]-j[1]*j[1]-j[2]*j[2])*invRho; 00061 momentsEq[10] = (-j[0]*j[0]+(T)0.5*j[1]*j[1]+(T)0.5*j[2]*j[2])*invRho; 00062 momentsEq[11] = (j[1]*j[1]-j[2]*j[2])*invRho; 00063 momentsEq[12] = (-(T)0.5*j[1]*j[1]+(T)0.5*j[2]*j[2])*invRho; 00064 momentsEq[13] = j[1]*j[0]*invRho; 00065 momentsEq[14] = j[2]*j[1]*invRho; 00066 momentsEq[15] = j[2]*j[0]*invRho; 00067 momentsEq[16] = T(); 00068 momentsEq[17] = T(); 00069 momentsEq[18] = T(); 00070 00071 } 00072 00074 static void computeMoments(Array<T,Descriptor::q>& moments, const Array<T,Descriptor::q>& f) 00075 { 00076 moments[0] = f[0]+f[1]+f[2]+f[3]+f[4]+f[5]+f[6]+f[7]+f[8]+f[9]+f[10]+f[11]+f[12]+f[13]+f[14]+f[15]+f[16]+f[17]+f[18]; 00077 moments[1] = 00078 -(T)30*f[0]-(T)11*(f[1]+f[2]+f[3]+f[10]+f[11]+f[12]) 00079 +(T)8*(f[4]+f[5]+f[6]+f[7]+f[8]+f[9]+f[13]+f[14]+f[15]+f[16]+f[17]+f[18]); 00080 moments[2] = 12*f[0]-4*f[1]-4*f[2]-4*f[3]+f[4]+f[5]+f[6]+f[7]+f[8]+f[9]-4*f[10]-4*f[11]-4*f[12]+f[13]+f[14]+f[15]+f[16]+f[17]+f[18]; 00081 moments[3] = -f[1]-f[4]-f[5]-f[6]-f[7]+f[10]+f[13]+f[14]+f[15]+f[16]; 00082 moments[4] = 4*f[1]-f[4]-f[5]-f[6]-f[7]-4*f[10]+f[13]+f[14]+f[15]+f[16]; 00083 moments[5] = -f[2]-f[4]+f[5]-f[8]-f[9]+f[11]+f[13]-f[14]+f[17]+f[18]; 00084 moments[6] = 4*f[2]-f[4]+f[5]-f[8]-f[9]-4*f[11]+f[13]-f[14]+f[17]+f[18]; 00085 moments[7] = -f[3]-f[6]+f[7]-f[8]+f[9]+f[12]+f[15]-f[16]+f[17]-f[18]; 00086 moments[8] = 4*f[3]-f[6]+f[7]-f[8]+f[9]-4*f[12]+f[15]-f[16]+f[17]-f[18]; 00087 moments[9] = 2*f[1]-f[2]-f[3]+f[4]+f[5]+f[6]+f[7]-2*f[8]-2*f[9]+2*f[10]-f[11]-f[12]+f[13]+f[14]+f[15]+f[16]-2*f[17]-2*f[18]; 00088 moments[10] = -4*f[1]+2*f[2]+2*f[3]+f[4]+f[5]+f[6]+f[7]-2*f[8]-2*f[9]-4*f[10]+2*f[11]+2*f[12]+f[13]+f[14]+f[15]+f[16]-2*f[17]-2*f[18]; 00089 moments[11] = f[2]-f[3]+f[4]+f[5]-f[6]-f[7]+f[11]-f[12]+f[13]+f[14]-f[15]-f[16]; 00090 moments[12] = -2*f[2]+2*f[3]+f[4]+f[5]-f[6]-f[7]-2*f[11]+2*f[12]+f[13]+f[14]-f[15]-f[16]; 00091 moments[13] = f[4]-f[5]+f[13]-f[14]; 00092 moments[14] = f[8]-f[9]+f[17]-f[18]; 00093 moments[15] = f[6]-f[7]+f[15]-f[16]; 00094 moments[16] = -f[4]-f[5]+f[6]+f[7]+f[13]+f[14]-f[15]-f[16]; 00095 moments[17] = f[4]-f[5]-f[8]-f[9]-f[13]+f[14]+f[17]+f[18]; 00096 moments[18] = -f[6]+f[7]+f[8]-f[9]+f[15]-f[16]-f[17]+f[18]; 00097 00098 } 00099 00101 static T mrtCollision( Array<T,Descriptor::q>& f, 00102 const T &rhoBar, const Array<T,3> & j, 00103 const T invM_S[19][19] ) 00104 { 00105 00106 Array<T,19> moments, momentsEq; 00107 00108 computeMoments(moments,f); 00109 00110 T jSqr = VectorTemplateImpl<T,3>::normSqr(j); 00111 00112 computeEquilibrium(momentsEq,rhoBar,j,jSqr); 00113 00114 T mom1 = moments[1] - momentsEq[1]; 00115 T mom2 = moments[2] - momentsEq[2]; 00116 T mom3 = moments[3] - momentsEq[3]; 00117 T mom4 = moments[4] - momentsEq[4]; 00118 T mom5 = moments[5] - momentsEq[5]; 00119 T mom6 = moments[6] - momentsEq[6]; 00120 T mom7 = moments[7] - momentsEq[7]; 00121 T mom8 = moments[8] - momentsEq[8]; 00122 T mom9 = moments[9] - momentsEq[9]; 00123 T mom10 = moments[10] - momentsEq[10]; 00124 T mom11 = moments[11] - momentsEq[11]; 00125 T mom12 = moments[12] - momentsEq[12]; 00126 T mom13 = moments[13] - momentsEq[13]; 00127 T mom14 = moments[14] - momentsEq[14]; 00128 T mom15 = moments[15] - momentsEq[15]; 00129 T mom16 = moments[16]; 00130 T mom17 = moments[17]; 00131 T mom18 = moments[18]; 00132 00133 00134 f[0] -= invM_S[0][1]*mom1 00135 +invM_S[0][2]*mom2; 00136 00137 f[1] -= invM_S[1][1]*mom1 00138 +invM_S[1][2]*mom2 00139 +invM_S[1][3]*mom3 00140 +invM_S[1][4]*mom4 00141 +invM_S[1][9]*mom9 00142 +invM_S[1][10]*mom10; 00143 00144 f[2] -= invM_S[2][1]*mom1 00145 +invM_S[2][2]*mom2 00146 +invM_S[2][5]*mom5 00147 +invM_S[2][6]*mom6 00148 +invM_S[2][9]*mom9 00149 +invM_S[2][10]*mom10 00150 +invM_S[2][11]*mom11 00151 +invM_S[2][12]*mom12; 00152 00153 f[3] -= invM_S[3][1]*mom1 00154 +invM_S[3][2]*mom2 00155 +invM_S[3][7]*mom7 00156 +invM_S[3][8]*mom8 00157 +invM_S[3][9]*mom9 00158 +invM_S[3][10]*mom10 00159 +invM_S[3][11]*mom11 00160 +invM_S[3][12]*mom12; 00161 00162 f[4] -= invM_S[4][1]*mom1 00163 +invM_S[4][2]*mom2 00164 +invM_S[4][3]*mom3 00165 +invM_S[4][4]*mom4 00166 +invM_S[4][5]*mom5 00167 +invM_S[4][6]*mom6 00168 +invM_S[4][9]*mom9 00169 +invM_S[4][10]*mom10 00170 +invM_S[4][11]*mom11 00171 +invM_S[4][12]*mom12 00172 +invM_S[4][13]*mom13 00173 +invM_S[4][16]*mom16 00174 +invM_S[4][17]*mom17; 00175 00176 f[5] -= invM_S[5][1]*mom1 00177 +invM_S[5][2]*mom2 00178 +invM_S[5][3]*mom3 00179 +invM_S[5][4]*mom4 00180 +invM_S[5][5]*mom5 00181 +invM_S[5][6]*mom6 00182 +invM_S[5][9]*mom9 00183 +invM_S[5][10]*mom10 00184 +invM_S[5][11]*mom11 00185 +invM_S[5][12]*mom12 00186 +invM_S[5][13]*mom13 00187 +invM_S[5][16]*mom16 00188 +invM_S[5][17]*mom17; 00189 00190 f[6] -= invM_S[6][1]*mom1 00191 +invM_S[6][2]*mom2 00192 +invM_S[6][3]*mom3 00193 +invM_S[6][4]*mom4 00194 +invM_S[6][7]*mom7 00195 +invM_S[6][8]*mom8 00196 +invM_S[6][9]*mom9 00197 +invM_S[6][10]*mom10 00198 +invM_S[6][11]*mom11 00199 +invM_S[6][12]*mom12 00200 +invM_S[6][15]*mom15 00201 +invM_S[6][16]*mom16 00202 +invM_S[6][18]*mom18; 00203 00204 f[7] -= invM_S[7][1]*mom1 00205 +invM_S[7][2]*mom2 00206 +invM_S[7][3]*mom3 00207 +invM_S[7][4]*mom4 00208 +invM_S[7][7]*mom7 00209 +invM_S[7][8]*mom8 00210 +invM_S[7][9]*mom9 00211 +invM_S[7][10]*mom10 00212 +invM_S[7][11]*mom11 00213 +invM_S[7][12]*mom12 00214 +invM_S[7][15]*mom15 00215 +invM_S[7][16]*mom16 00216 +invM_S[7][18]*mom18; 00217 00218 f[8] -= invM_S[8][1]*mom1 00219 +invM_S[8][2]*mom2 00220 +invM_S[8][5]*mom5 00221 +invM_S[8][6]*mom6 00222 +invM_S[8][7]*mom7 00223 +invM_S[8][8]*mom8 00224 +invM_S[8][9]*mom9 00225 +invM_S[8][10]*mom10 00226 +invM_S[8][14]*mom14 00227 +invM_S[8][17]*mom17 00228 +invM_S[8][18]*mom18; 00229 00230 f[9] -= invM_S[9][1]*mom1 00231 +invM_S[9][2]*mom2 00232 +invM_S[9][5]*mom5 00233 +invM_S[9][6]*mom6 00234 +invM_S[9][7]*mom7 00235 +invM_S[9][8]*mom8 00236 +invM_S[9][9]*mom9 00237 +invM_S[9][10]*mom10 00238 +invM_S[9][14]*mom14 00239 +invM_S[9][17]*mom17 00240 +invM_S[9][18]*mom18; 00241 00242 f[10] -= invM_S[10][1]*mom1 00243 +invM_S[10][2]*mom2 00244 +invM_S[10][3]*mom3 00245 +invM_S[10][4]*mom4 00246 +invM_S[10][9]*mom9 00247 +invM_S[10][10]*mom10; 00248 00249 f[11] -= invM_S[11][1]*mom1 00250 +invM_S[11][2]*mom2 00251 +invM_S[11][5]*mom5 00252 +invM_S[11][6]*mom6 00253 +invM_S[11][9]*mom9 00254 +invM_S[11][10]*mom10 00255 +invM_S[11][11]*mom11 00256 +invM_S[11][12]*mom12; 00257 00258 f[12] -= invM_S[12][1]*mom1 00259 +invM_S[12][2]*mom2 00260 +invM_S[12][7]*mom7 00261 +invM_S[12][8]*mom8 00262 +invM_S[12][9]*mom9 00263 +invM_S[12][10]*mom10 00264 +invM_S[12][11]*mom11 00265 +invM_S[12][12]*mom12; 00266 00267 f[13] -= invM_S[13][1]*mom1 00268 +invM_S[13][2]*mom2 00269 +invM_S[13][3]*mom3 00270 +invM_S[13][4]*mom4 00271 +invM_S[13][5]*mom5 00272 +invM_S[13][6]*mom6 00273 +invM_S[13][9]*mom9 00274 +invM_S[13][10]*mom10 00275 +invM_S[13][11]*mom11 00276 +invM_S[13][12]*mom12 00277 +invM_S[13][13]*mom13 00278 +invM_S[13][16]*mom16 00279 +invM_S[13][17]*mom17; 00280 00281 f[14] -= invM_S[14][1]*mom1 00282 +invM_S[14][2]*mom2 00283 +invM_S[14][3]*mom3 00284 +invM_S[14][4]*mom4 00285 +invM_S[14][5]*mom5 00286 +invM_S[14][6]*mom6 00287 +invM_S[14][9]*mom9 00288 +invM_S[14][10]*mom10 00289 +invM_S[14][11]*mom11 00290 +invM_S[14][12]*mom12 00291 +invM_S[14][13]*mom13 00292 +invM_S[14][16]*mom16 00293 +invM_S[14][17]*mom17; 00294 00295 f[15] -= invM_S[15][1]*mom1 00296 +invM_S[15][2]*mom2 00297 +invM_S[15][3]*mom3 00298 +invM_S[15][4]*mom4 00299 +invM_S[15][7]*mom7 00300 +invM_S[15][8]*mom8 00301 +invM_S[15][9]*mom9 00302 +invM_S[15][10]*mom10 00303 +invM_S[15][11]*mom11 00304 +invM_S[15][12]*mom12 00305 +invM_S[15][15]*mom15 00306 +invM_S[15][16]*mom16 00307 +invM_S[15][18]*mom18; 00308 00309 f[16] -= invM_S[16][1]*mom1 00310 +invM_S[16][2]*mom2 00311 +invM_S[16][3]*mom3 00312 +invM_S[16][4]*mom4 00313 +invM_S[16][7]*mom7 00314 +invM_S[16][8]*mom8 00315 +invM_S[16][9]*mom9 00316 +invM_S[16][10]*mom10 00317 +invM_S[16][11]*mom11 00318 +invM_S[16][12]*mom12 00319 +invM_S[16][15]*mom15 00320 +invM_S[16][16]*mom16 00321 +invM_S[16][18]*mom18; 00322 00323 f[17] -= invM_S[17][1]*mom1 00324 +invM_S[17][2]*mom2 00325 +invM_S[17][5]*mom5 00326 +invM_S[17][6]*mom6 00327 +invM_S[17][7]*mom7 00328 +invM_S[17][8]*mom8 00329 +invM_S[17][9]*mom9 00330 +invM_S[17][10]*mom10 00331 +invM_S[17][14]*mom14 00332 +invM_S[17][17]*mom17 00333 +invM_S[17][18]*mom18; 00334 00335 f[18] -= invM_S[18][1]*mom1 00336 +invM_S[18][2]*mom2 00337 +invM_S[18][5]*mom5 00338 +invM_S[18][6]*mom6 00339 +invM_S[18][7]*mom7 00340 +invM_S[18][8]*mom8 00341 +invM_S[18][9]*mom9 00342 +invM_S[18][10]*mom10 00343 +invM_S[18][14]*mom14 00344 +invM_S[18][17]*mom17 00345 +invM_S[18][18]*mom18; 00346 00347 return jSqr; 00348 } 00349 00350 static void addGuoForce( Array<T,Descriptor::q>& f, const Array<T,Descriptor::d>& force, 00351 Array<T,Descriptor::d> const& u, 00352 T invM_S[Descriptor::q][Descriptor::q], T amplitude ) 00353 { 00354 Array<T,Descriptor::q> forcing; 00355 T g_u = force[0] * u[0] + force[1] * u[1] + force[2] * u[2]; 00356 00357 T mom1 = -(T)19*g_u; 00358 T mom2 = (T)5.5*g_u; 00359 T mom3 = -(T)0.5*force[0]; 00360 T mom4 = force[0] / (T)3; 00361 T mom5 = -(T)0.5*force[1]; 00362 T mom6 = force[1] / (T)3; 00363 T mom7 = -(T)0.5*force[2]; 00364 T mom8 = force[2] / (T)3; 00365 T mom9 = -(2*force[0]*u[0]-force[1]*u[1]-force[2]*u[2]); 00366 T mom10 = (T)0.5*(2*force[0]*u[0]-force[1]*u[1]-force[2]*u[2]); 00367 T mom11 = -(force[1]*u[1]-force[2]*u[2]); 00368 T mom12 = (T)0.5*(force[1]*u[1]-force[2]*u[2]); 00369 T mom13 = -(T)0.5*(force[0]*u[1]+force[1]*u[0]); 00370 T mom14 = -(T)0.5*(force[2]*u[1]+force[1]*u[2]); 00371 T mom15 = -(T)0.5*(force[0]*u[2]+force[2]*u[0]); 00372 00373 00374 f[0] += invM_S[0][1]*mom1 00375 +invM_S[0][2]*mom2; 00376 00377 f[1] += invM_S[1][1]*mom1 00378 +invM_S[1][2]*mom2 00379 +invM_S[1][3]*mom3 00380 +invM_S[1][4]*mom4 00381 +invM_S[1][9]*mom9 00382 +invM_S[1][10]*mom10; 00383 00384 f[2] += invM_S[2][1]*mom1 00385 +invM_S[2][2]*mom2 00386 +invM_S[2][5]*mom5 00387 +invM_S[2][6]*mom6 00388 +invM_S[2][9]*mom9 00389 +invM_S[2][10]*mom10 00390 +invM_S[2][11]*mom11 00391 +invM_S[2][12]*mom12; 00392 00393 f[3] += invM_S[3][1]*mom1 00394 +invM_S[3][2]*mom2 00395 +invM_S[3][7]*mom7 00396 +invM_S[3][8]*mom8 00397 +invM_S[3][9]*mom9 00398 +invM_S[3][10]*mom10 00399 +invM_S[3][11]*mom11 00400 +invM_S[3][12]*mom12; 00401 00402 f[4] += invM_S[4][1]*mom1 00403 +invM_S[4][2]*mom2 00404 +invM_S[4][3]*mom3 00405 +invM_S[4][4]*mom4 00406 +invM_S[4][5]*mom5 00407 +invM_S[4][6]*mom6 00408 +invM_S[4][9]*mom9 00409 +invM_S[4][10]*mom10 00410 +invM_S[4][11]*mom11 00411 +invM_S[4][12]*mom12 00412 +invM_S[4][13]*mom13; 00413 00414 f[5] += invM_S[5][1]*mom1 00415 +invM_S[5][2]*mom2 00416 +invM_S[5][3]*mom3 00417 +invM_S[5][4]*mom4 00418 +invM_S[5][5]*mom5 00419 +invM_S[5][6]*mom6 00420 +invM_S[5][9]*mom9 00421 +invM_S[5][10]*mom10 00422 +invM_S[5][11]*mom11 00423 +invM_S[5][12]*mom12 00424 +invM_S[5][13]*mom13; 00425 00426 f[6] += invM_S[6][1]*mom1 00427 +invM_S[6][2]*mom2 00428 +invM_S[6][3]*mom3 00429 +invM_S[6][4]*mom4 00430 +invM_S[6][7]*mom7 00431 +invM_S[6][8]*mom8 00432 +invM_S[6][9]*mom9 00433 +invM_S[6][10]*mom10 00434 +invM_S[6][11]*mom11 00435 +invM_S[6][12]*mom12 00436 +invM_S[6][15]*mom15; 00437 00438 f[7] += invM_S[7][1]*mom1 00439 +invM_S[7][2]*mom2 00440 +invM_S[7][3]*mom3 00441 +invM_S[7][4]*mom4 00442 +invM_S[7][7]*mom7 00443 +invM_S[7][8]*mom8 00444 +invM_S[7][9]*mom9 00445 +invM_S[7][10]*mom10 00446 +invM_S[7][11]*mom11 00447 +invM_S[7][12]*mom12 00448 +invM_S[7][15]*mom15; 00449 00450 f[8] += invM_S[8][1]*mom1 00451 +invM_S[8][2]*mom2 00452 +invM_S[8][5]*mom5 00453 +invM_S[8][6]*mom6 00454 +invM_S[8][7]*mom7 00455 +invM_S[8][8]*mom8 00456 +invM_S[8][9]*mom9 00457 +invM_S[8][10]*mom10 00458 +invM_S[8][14]*mom14; 00459 00460 f[9] += invM_S[9][1]*mom1 00461 +invM_S[9][2]*mom2 00462 +invM_S[9][5]*mom5 00463 +invM_S[9][6]*mom6 00464 +invM_S[9][7]*mom7 00465 +invM_S[9][8]*mom8 00466 +invM_S[9][9]*mom9 00467 +invM_S[9][10]*mom10 00468 +invM_S[9][14]*mom14; 00469 00470 f[10] += invM_S[10][1]*mom1 00471 +invM_S[10][2]*mom2 00472 +invM_S[10][3]*mom3 00473 +invM_S[10][4]*mom4 00474 +invM_S[10][9]*mom9 00475 +invM_S[10][10]*mom10; 00476 00477 f[11] += invM_S[11][1]*mom1 00478 +invM_S[11][2]*mom2 00479 +invM_S[11][5]*mom5 00480 +invM_S[11][6]*mom6 00481 +invM_S[11][9]*mom9 00482 +invM_S[11][10]*mom10 00483 +invM_S[11][11]*mom11 00484 +invM_S[11][12]*mom12; 00485 00486 f[12] += invM_S[12][1]*mom1 00487 +invM_S[12][2]*mom2 00488 +invM_S[12][7]*mom7 00489 +invM_S[12][8]*mom8 00490 +invM_S[12][9]*mom9 00491 +invM_S[12][10]*mom10 00492 +invM_S[12][11]*mom11 00493 +invM_S[12][12]*mom12; 00494 00495 f[13] += invM_S[13][1]*mom1 00496 +invM_S[13][2]*mom2 00497 +invM_S[13][3]*mom3 00498 +invM_S[13][4]*mom4 00499 +invM_S[13][5]*mom5 00500 +invM_S[13][6]*mom6 00501 +invM_S[13][9]*mom9 00502 +invM_S[13][10]*mom10 00503 +invM_S[13][11]*mom11 00504 +invM_S[13][12]*mom12 00505 +invM_S[13][13]*mom13; 00506 00507 f[14] += invM_S[14][1]*mom1 00508 +invM_S[14][2]*mom2 00509 +invM_S[14][3]*mom3 00510 +invM_S[14][4]*mom4 00511 +invM_S[14][5]*mom5 00512 +invM_S[14][6]*mom6 00513 +invM_S[14][9]*mom9 00514 +invM_S[14][10]*mom10 00515 +invM_S[14][11]*mom11 00516 +invM_S[14][12]*mom12 00517 +invM_S[14][13]*mom13; 00518 00519 f[15] += invM_S[15][1]*mom1 00520 +invM_S[15][2]*mom2 00521 +invM_S[15][3]*mom3 00522 +invM_S[15][4]*mom4 00523 +invM_S[15][7]*mom7 00524 +invM_S[15][8]*mom8 00525 +invM_S[15][9]*mom9 00526 +invM_S[15][10]*mom10 00527 +invM_S[15][11]*mom11 00528 +invM_S[15][12]*mom12 00529 +invM_S[15][15]*mom15; 00530 00531 f[16] += invM_S[16][1]*mom1 00532 +invM_S[16][2]*mom2 00533 +invM_S[16][3]*mom3 00534 +invM_S[16][4]*mom4 00535 +invM_S[16][7]*mom7 00536 +invM_S[16][8]*mom8 00537 +invM_S[16][9]*mom9 00538 +invM_S[16][10]*mom10 00539 +invM_S[16][11]*mom11 00540 +invM_S[16][12]*mom12 00541 +invM_S[16][15]*mom15; 00542 00543 f[17] += invM_S[17][1]*mom1 00544 +invM_S[17][2]*mom2 00545 +invM_S[17][5]*mom5 00546 +invM_S[17][6]*mom6 00547 +invM_S[17][7]*mom7 00548 +invM_S[17][8]*mom8 00549 +invM_S[17][9]*mom9 00550 +invM_S[17][10]*mom10 00551 +invM_S[17][14]*mom14; 00552 00553 f[18] += invM_S[18][1]*mom1 00554 +invM_S[18][2]*mom2 00555 +invM_S[18][5]*mom5 00556 +invM_S[18][6]*mom6 00557 +invM_S[18][7]*mom7 00558 +invM_S[18][8]*mom8 00559 +invM_S[18][9]*mom9 00560 +invM_S[18][10]*mom10 00561 +invM_S[18][14]*mom14; 00562 00563 00564 static const T oneOver6 = (T)1/(T)6; 00565 static const T oneOver12 = (T)1/(T)12; 00566 00567 f[0] += -g_u; 00568 00569 f[1] += oneOver6*(force[0]*(-(T)1+2*u[0])-force[1]*u[1]-force[2]*u[2]); 00570 00571 f[2] += -oneOver6*(force[0]*u[0]+force[1]*((T)1-2*u[1])+force[2]*u[2]); 00572 00573 f[3] += -oneOver6*(force[0]*u[0] 00574 + force[1]*u[1] 00575 + force[2]*((T)1-2*u[2])); 00576 00577 f[4] += oneOver12*(force[0]*(-(T)1+2*u[0]+3*u[1]) 00578 + force[1]*(-(T)1+2*u[1]+3*u[0]) 00579 - force[2]*u[2]); 00580 00581 f[5] += oneOver12*( force[0]*(-(T)1+2*u[0]-3*u[1]) 00582 + force[1]*((T)1+2*u[1]-3*u[0]) 00583 - force[2]*u[2]); 00584 00585 f[6] += oneOver12*(force[0]*(-(T)1+2*u[0]+3*u[2]) 00586 - force[1]*u[1] 00587 + force[2]*(-(T)1+2*u[2]+3*u[0])); 00588 00589 f[7] += oneOver12*(force[0]*(-(T)1+2*u[0]-3*u[2]) 00590 - force[1]*u[1] 00591 + force[2]*((T)1+2*u[2]-3*u[0])); 00592 00593 f[8] += -oneOver12*(force[0]*u[0] 00594 + force[1]*((T)1-2*u[1]-3*u[2]) 00595 + force[2]*((T)1-2*u[2]-3*u[1])); 00596 00597 f[9] += -oneOver12*(force[0]*u[0] 00598 + force[1]*((T)1-2*u[1]+3*u[2]) 00599 + force[2]*(-(T)1-2*u[2]+3*u[1])); 00600 00601 f[10] += oneOver6*(force[0]*((T)1+2*u[0]) 00602 -force[1]*u[1] 00603 -force[2]*u[2]); 00604 00605 f[11] += -oneOver6*(force[0]*u[0] 00606 +force[1]*(-(T)1-2*u[1]) 00607 +force[2]*u[2]); 00608 00609 f[12] += -oneOver6*(force[0]*u[0] 00610 +force[1]*u[1] 00611 +force[2]*(-(T)1-2*u[2])); 00612 00613 f[13] += oneOver12*(force[0]*((T)1+2*u[0]+3*u[1]) 00614 +force[1]*((T)1+2*u[1]+3*u[0]) 00615 -force[2]*u[2]); 00616 00617 f[14] += oneOver12*(force[0]*((T)1+2*u[0]-3*u[1]) 00618 +force[1]*(-(T)1+2*u[1]-3*u[0]) 00619 -force[2]*u[2]); 00620 00621 f[15] += oneOver12*(force[0]*((T)1+2*u[0]+3*u[2]) 00622 -force[1]*u[1] 00623 +force[2]*((T)1+2*u[2]+3*u[0])); 00624 00625 f[16] += oneOver12*(force[0]*((T)1+2*u[0]-3*u[2]) 00626 -force[1]*u[1] 00627 +force[2]*(-(T)1+2*u[2]-3*u[0])); 00628 00629 f[17] += -oneOver12*(force[0]*u[0] 00630 +force[1]*(-(T)1-2*u[1]-3*u[2]) 00631 +force[2]*(-(T)1-2*u[2]-3*u[1])); 00632 00633 f[18] += -oneOver12*(force[0]*u[0] 00634 +force[1]*(-(T)1-2*u[1]+3*u[2]) 00635 +force[2]*((T)1-2*u[2]+3*u[1])); 00636 } 00637 00639 static T mrtCollisionWithForce( Array<T,Descriptor::q>& f, 00640 const T &rhoBar, const Array<T,Descriptor::d> & u, 00641 T invM_S[Descriptor::q][Descriptor::q], 00642 const Array<T,Descriptor::d> &force, T amplitude) 00643 { 00644 Array<T,Descriptor::d> j = Descriptor::fullRho(rhoBar)*u; 00645 T jSqr = mrtCollision( f, rhoBar, j, invM_S ); 00646 addGuoForce( f, force, u, invM_S, amplitude ); 00647 00648 return jSqr; 00649 } 00650 00652 static void computeQuasiIncEquilibrium( Array<T,Descriptor::q>& momentsEq, 00653 T rhoBar, Array<T,3> const& j, T jSqr ) 00654 { 00655 momentsEq[0] = rhoBar; 00656 momentsEq[1] = (T)19*jSqr-(T)11*rhoBar; 00657 momentsEq[2] = -(T)5.5*jSqr+(T)3*rhoBar; 00658 momentsEq[3] = j[0]; 00659 momentsEq[4] = -((T)2/(T)3)*j[0]; 00660 momentsEq[5] = j[1]; 00661 momentsEq[6] = -((T)2/3)*j[1]; 00662 momentsEq[7] = j[2]; 00663 momentsEq[8] = -((T)2/(T)3)*j[2]; 00664 momentsEq[9] = ((T)2*j[0]*j[0]-j[1]*j[1]-j[2]*j[2]); 00665 momentsEq[10] = (-j[0]*j[0]+(T)0.5*j[1]*j[1]+(T)0.5*j[2]*j[2]); 00666 momentsEq[11] = (j[1]*j[1]-j[2]*j[2]); 00667 momentsEq[12] = (-(T)0.5*j[1]*j[1]+(T)0.5*j[2]*j[2]); 00668 momentsEq[13] = j[1]*j[0]; 00669 momentsEq[14] = j[2]*j[1]; 00670 momentsEq[15] = j[2]*j[0]; 00671 momentsEq[16] = T(); 00672 momentsEq[17] = T(); 00673 momentsEq[18] = T(); 00674 } 00675 00677 static T quasiIncMrtCollision( Array<T,Descriptor::q>& f, 00678 const T &rhoBar, const Array<T,3> & j, 00679 const T invM_S[19][19] ) 00680 { 00681 00682 Array<T,19> moments, momentsEq; 00683 00684 computeMoments(moments,f); 00685 moments[0] = rhoBar; 00686 moments[3] = j[0]; 00687 moments[5] = j[1]; 00688 moments[7] = j[2]; 00689 00690 T jSqr = VectorTemplateImpl<T,3>::normSqr(j); 00691 00692 computeQuasiIncEquilibrium(momentsEq,rhoBar,j,jSqr); 00693 00694 T mom1 = moments[1] - momentsEq[1]; 00695 T mom2 = moments[2] - momentsEq[2]; 00696 T mom4 = moments[4] - momentsEq[4]; 00697 T mom6 = moments[6] - momentsEq[6]; 00698 T mom8 = moments[8] - momentsEq[8]; 00699 T mom9 = moments[9] - momentsEq[9]; 00700 T mom10 = moments[10] - momentsEq[10]; 00701 T mom11 = moments[11] - momentsEq[11]; 00702 T mom12 = moments[12] - momentsEq[12]; 00703 T mom13 = moments[13] - momentsEq[13]; 00704 T mom14 = moments[14] - momentsEq[14]; 00705 T mom15 = moments[15] - momentsEq[15]; 00706 T mom16 = moments[16]; 00707 T mom17 = moments[17]; 00708 T mom18 = moments[18]; 00709 00710 00711 f[0] -= invM_S[0][1]*mom1 00712 +invM_S[0][2]*mom2; 00713 00714 f[1] -= invM_S[1][1]*mom1 00715 +invM_S[1][2]*mom2 00716 +invM_S[1][4]*mom4 00717 +invM_S[1][9]*mom9 00718 +invM_S[1][10]*mom10; 00719 00720 f[2] -= invM_S[2][1]*mom1 00721 +invM_S[2][2]*mom2 00722 +invM_S[2][6]*mom6 00723 +invM_S[2][9]*mom9 00724 +invM_S[2][10]*mom10 00725 +invM_S[2][11]*mom11 00726 +invM_S[2][12]*mom12; 00727 00728 f[3] -= invM_S[3][1]*mom1 00729 +invM_S[3][2]*mom2 00730 +invM_S[3][8]*mom8 00731 +invM_S[3][9]*mom9 00732 +invM_S[3][10]*mom10 00733 +invM_S[3][11]*mom11 00734 +invM_S[3][12]*mom12; 00735 00736 f[4] -= invM_S[4][1]*mom1 00737 +invM_S[4][2]*mom2 00738 +invM_S[4][4]*mom4 00739 +invM_S[4][6]*mom6 00740 +invM_S[4][9]*mom9 00741 +invM_S[4][10]*mom10 00742 +invM_S[4][11]*mom11 00743 +invM_S[4][12]*mom12 00744 +invM_S[4][13]*mom13 00745 +invM_S[4][16]*mom16 00746 +invM_S[4][17]*mom17; 00747 00748 f[5] -= invM_S[5][1]*mom1 00749 +invM_S[5][2]*mom2 00750 +invM_S[5][4]*mom4 00751 +invM_S[5][6]*mom6 00752 +invM_S[5][9]*mom9 00753 +invM_S[5][10]*mom10 00754 +invM_S[5][11]*mom11 00755 +invM_S[5][12]*mom12 00756 +invM_S[5][13]*mom13 00757 +invM_S[5][16]*mom16 00758 +invM_S[5][17]*mom17; 00759 00760 f[6] -= invM_S[6][1]*mom1 00761 +invM_S[6][2]*mom2 00762 +invM_S[6][4]*mom4 00763 +invM_S[6][8]*mom8 00764 +invM_S[6][9]*mom9 00765 +invM_S[6][10]*mom10 00766 +invM_S[6][11]*mom11 00767 +invM_S[6][12]*mom12 00768 +invM_S[6][15]*mom15 00769 +invM_S[6][16]*mom16 00770 +invM_S[6][18]*mom18; 00771 00772 f[7] -= invM_S[7][1]*mom1 00773 +invM_S[7][2]*mom2 00774 +invM_S[7][4]*mom4 00775 +invM_S[7][8]*mom8 00776 +invM_S[7][9]*mom9 00777 +invM_S[7][10]*mom10 00778 +invM_S[7][11]*mom11 00779 +invM_S[7][12]*mom12 00780 +invM_S[7][15]*mom15 00781 +invM_S[7][16]*mom16 00782 +invM_S[7][18]*mom18; 00783 00784 f[8] -= invM_S[8][1]*mom1 00785 +invM_S[8][2]*mom2 00786 +invM_S[8][6]*mom6 00787 +invM_S[8][8]*mom8 00788 +invM_S[8][9]*mom9 00789 +invM_S[8][10]*mom10 00790 +invM_S[8][14]*mom14 00791 +invM_S[8][17]*mom17 00792 +invM_S[8][18]*mom18; 00793 00794 f[9] -= invM_S[9][1]*mom1 00795 +invM_S[9][2]*mom2 00796 +invM_S[9][6]*mom6 00797 +invM_S[9][8]*mom8 00798 +invM_S[9][9]*mom9 00799 +invM_S[9][10]*mom10 00800 +invM_S[9][14]*mom14 00801 +invM_S[9][17]*mom17 00802 +invM_S[9][18]*mom18; 00803 00804 f[10] -= invM_S[10][1]*mom1 00805 +invM_S[10][2]*mom2 00806 +invM_S[10][4]*mom4 00807 +invM_S[10][9]*mom9 00808 +invM_S[10][10]*mom10; 00809 00810 f[11] -= invM_S[11][1]*mom1 00811 +invM_S[11][2]*mom2 00812 +invM_S[11][6]*mom6 00813 +invM_S[11][9]*mom9 00814 +invM_S[11][10]*mom10 00815 +invM_S[11][11]*mom11 00816 +invM_S[11][12]*mom12; 00817 00818 f[12] -= invM_S[12][1]*mom1 00819 +invM_S[12][2]*mom2 00820 +invM_S[12][8]*mom8 00821 +invM_S[12][9]*mom9 00822 +invM_S[12][10]*mom10 00823 +invM_S[12][11]*mom11 00824 +invM_S[12][12]*mom12; 00825 00826 f[13] -= invM_S[13][1]*mom1 00827 +invM_S[13][2]*mom2 00828 +invM_S[13][4]*mom4 00829 +invM_S[13][6]*mom6 00830 +invM_S[13][9]*mom9 00831 +invM_S[13][10]*mom10 00832 +invM_S[13][11]*mom11 00833 +invM_S[13][12]*mom12 00834 +invM_S[13][13]*mom13 00835 +invM_S[13][16]*mom16 00836 +invM_S[13][17]*mom17; 00837 00838 f[14] -= invM_S[14][1]*mom1 00839 +invM_S[14][2]*mom2 00840 +invM_S[14][4]*mom4 00841 +invM_S[14][6]*mom6 00842 +invM_S[14][9]*mom9 00843 +invM_S[14][10]*mom10 00844 +invM_S[14][11]*mom11 00845 +invM_S[14][12]*mom12 00846 +invM_S[14][13]*mom13 00847 +invM_S[14][16]*mom16 00848 +invM_S[14][17]*mom17; 00849 00850 f[15] -= invM_S[15][1]*mom1 00851 +invM_S[15][2]*mom2 00852 +invM_S[15][4]*mom4 00853 +invM_S[15][8]*mom8 00854 +invM_S[15][9]*mom9 00855 +invM_S[15][10]*mom10 00856 +invM_S[15][11]*mom11 00857 +invM_S[15][12]*mom12 00858 +invM_S[15][15]*mom15 00859 +invM_S[15][16]*mom16 00860 +invM_S[15][18]*mom18; 00861 00862 f[16] -= invM_S[16][1]*mom1 00863 +invM_S[16][2]*mom2 00864 +invM_S[16][4]*mom4 00865 +invM_S[16][8]*mom8 00866 +invM_S[16][9]*mom9 00867 +invM_S[16][10]*mom10 00868 +invM_S[16][11]*mom11 00869 +invM_S[16][12]*mom12 00870 +invM_S[16][15]*mom15 00871 +invM_S[16][16]*mom16 00872 +invM_S[16][18]*mom18; 00873 00874 f[17] -= invM_S[17][1]*mom1 00875 +invM_S[17][2]*mom2 00876 +invM_S[17][6]*mom6 00877 +invM_S[17][8]*mom8 00878 +invM_S[17][9]*mom9 00879 +invM_S[17][10]*mom10 00880 +invM_S[17][14]*mom14 00881 +invM_S[17][17]*mom17 00882 +invM_S[17][18]*mom18; 00883 00884 f[18] -= invM_S[18][1]*mom1 00885 +invM_S[18][2]*mom2 00886 +invM_S[18][6]*mom6 00887 +invM_S[18][8]*mom8 00888 +invM_S[18][9]*mom9 00889 +invM_S[18][10]*mom10 00890 +invM_S[18][14]*mom14 00891 +invM_S[18][17]*mom17 00892 +invM_S[18][18]*mom18; 00893 00894 return jSqr; 00895 } 00896 00897 }; 00898 00899 00900 } // namespace plb 00901 00902 #endif
1.6.3
1.6.3