$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 00029 #ifndef GENERALIZED_BOUNDARY_DYNAMICS_HH 00030 #define GENERALIZED_BOUNDARY_DYNAMICS_HH 00031 00032 #include "generalizedBoundaryDynamics.h" 00033 #include "generalizedBoundaryDynamicsSolvers.h" 00034 #include "generalizedBoundaryDynamicsSolvers.hh" 00035 #include "generalizedIncompressibleBoundaryTemplates.h" 00036 #include "generalizedCompressibleBoundaryTemplates.h" 00037 #include "core/cell.h" 00038 #include "core/dynamicsIdentifiers.h" 00039 #include "latticeBoltzmann/indexTemplates.h" 00040 #include <Eigen3/Core> 00041 #include <Eigen3/LU> 00042 #include <Eigen3/Cholesky> 00043 00044 namespace plb { 00045 00046 /* *************** Class GeneralizedVelocityBoundaryDynamics ************* */ 00047 00048 template<typename T, template<typename U> class Descriptor> 00049 int GeneralizedVelocityBoundaryDynamics<T,Descriptor>::id = 00050 meta::registerGeneralDynamics<T,Descriptor,GeneralizedVelocityBoundaryDynamics<T,Descriptor> > 00051 ("Boundary_GeneralizedVelocity"); 00052 00053 template<typename T, template<typename U> class Descriptor> 00054 GeneralizedVelocityBoundaryDynamics<T,Descriptor>:: 00055 GeneralizedVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00056 std::vector<plint> missingIndices_, 00057 bool automaticPrepareCollision) 00058 : StoreVelocityDynamics<T,Descriptor>(baseDynamics_,automaticPrepareCollision), 00059 missingIndices(missingIndices_) 00060 { 00061 knownIndices = indexTemplates::remainingIndexes<Descriptor<T> >(missingIndices); 00062 } 00063 00064 template<typename T, template<typename U> class Descriptor> 00065 GeneralizedVelocityBoundaryDynamics<T,Descriptor>:: 00066 GeneralizedVelocityBoundaryDynamics(HierarchicUnserializer& unserializer) 00067 : StoreVelocityDynamics<T,Descriptor>(0, false) 00068 { 00069 unserialize(unserializer); 00070 } 00071 00072 template<typename T, template<typename U> class Descriptor> 00073 GeneralizedVelocityBoundaryDynamics<T,Descriptor>* 00074 GeneralizedVelocityBoundaryDynamics<T,Descriptor>::clone() const 00075 { 00076 return new GeneralizedVelocityBoundaryDynamics<T,Descriptor>(*this); 00077 } 00078 00079 template<typename T, template<typename U> class Descriptor> 00080 int GeneralizedVelocityBoundaryDynamics<T,Descriptor>::getId() const { 00081 return id; 00082 } 00083 00084 template<typename T, template<typename U> class Descriptor> 00085 void GeneralizedVelocityBoundaryDynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const 00086 { 00087 serializer.addValue((int)(missingIndices.size())); 00088 serializer.addValues(missingIndices); 00089 serializer.addValue((int)(knownIndices.size())); 00090 serializer.addValues(knownIndices); 00091 StoreVelocityDynamics<T,Descriptor>::serialize(serializer); 00092 } 00093 00094 template<typename T, template<typename U> class Descriptor> 00095 void GeneralizedVelocityBoundaryDynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer) 00096 { 00097 PLB_PRECONDITION( unserializer.getId() == this->getId() ); 00098 missingIndices.resize(unserializer.readValue<int>()); 00099 unserializer.readValues(missingIndices); 00100 knownIndices.resize(unserializer.readValue<int>()); 00101 unserializer.readValues(knownIndices); 00102 StoreVelocityDynamics<T,Descriptor>::unserialize(unserializer); 00103 } 00104 00105 template<typename T, template<typename U> class Descriptor> 00106 void GeneralizedVelocityBoundaryDynamics<T,Descriptor>:: 00107 computeUlb(Cell<T,Descriptor> const& cell, Array<T,Descriptor<T>::d> &uLb) const { 00108 00109 this -> computeVelocity(cell, uLb); 00110 for (plint iDim = 0; iDim < Descriptor<T>::d; ++iDim) { 00111 uLb[iDim] -= 0.5*getExternalForceComponent(cell,iDim); 00112 } 00113 } 00114 00115 template<typename T, template<typename U> class Descriptor> 00116 void GeneralizedVelocityBoundaryDynamics<T,Descriptor>:: 00117 completePopulations(Cell<T,Descriptor>& cell) const 00118 { 00119 Array<T,Descriptor<T>::d> uLb; 00120 computeUlb(cell, uLb); 00121 00122 DirichletVelocityBoundarySolver<T,Descriptor> bc(missingIndices, knownIndices, uLb); 00123 bc.apply(cell,this->getBaseDynamics()); 00124 } 00125 00126 /* *************** Class GeneralizedMassConservingVelocityBoundaryDynamics ************* */ 00127 00128 template<typename T, template<typename U> class Descriptor> 00129 int GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>::id = 00130 meta::registerGeneralDynamics<T,Descriptor,GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor> > 00131 ("Boundary_MassConservingGeneralizedVelocity"); 00132 00133 template<typename T, template<typename U> class Descriptor> 00134 GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>:: 00135 GeneralizedMassConservingVelocityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00136 std::vector<plint> missingIndices_, 00137 std::vector<plint> knownIndices_, 00138 std::vector<plint> inGoingIndices_, 00139 bool automaticPrepareCollision) 00140 : StoreVelocityDynamics<T,Descriptor>(baseDynamics_,automaticPrepareCollision), 00141 missingIndices(missingIndices_), knownIndices(knownIndices_), inGoingIndices(inGoingIndices_) 00142 { } 00143 00144 template<typename T, template<typename U> class Descriptor> 00145 GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>:: 00146 GeneralizedMassConservingVelocityBoundaryDynamics(HierarchicUnserializer& unserializer) 00147 : StoreVelocityDynamics<T,Descriptor>(0, false) 00148 { 00149 unserialize(unserializer); 00150 } 00151 00152 template<typename T, template<typename U> class Descriptor> 00153 GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>* 00154 GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>::clone() const 00155 { 00156 return new GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>(*this); 00157 } 00158 00159 template<typename T, template<typename U> class Descriptor> 00160 int GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>::getId() const { 00161 return id; 00162 } 00163 00164 template<typename T, template<typename U> class Descriptor> 00165 void GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const 00166 { 00167 serializer.addValue((int)(missingIndices.size())); 00168 serializer.addValues(missingIndices); 00169 serializer.addValue((int)(knownIndices.size())); 00170 serializer.addValues(knownIndices); 00171 serializer.addValue((int)(inGoingIndices.size())); 00172 serializer.addValues(inGoingIndices); 00173 StoreVelocityDynamics<T,Descriptor>::serialize(serializer); 00174 } 00175 00176 template<typename T, template<typename U> class Descriptor> 00177 void GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer) 00178 { 00179 PLB_PRECONDITION( unserializer.getId() == this->getId() ); 00180 missingIndices.resize(unserializer.readValue<int>()); 00181 unserializer.readValues(missingIndices); 00182 knownIndices.resize(unserializer.readValue<int>()); 00183 unserializer.readValues(knownIndices); 00184 inGoingIndices.resize(unserializer.readValue<int>()); 00185 unserializer.readValues(inGoingIndices); 00186 StoreVelocityDynamics<T,Descriptor>::unserialize(unserializer); 00187 } 00188 00189 template<typename T, template<typename U> class Descriptor> 00190 void GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>:: 00191 computeUlb(Cell<T,Descriptor> const& cell, Array<T,Descriptor<T>::d> &uLb) const { 00192 00193 this -> computeVelocity(cell, uLb); 00194 for (plint iDim = 0; iDim < Descriptor<T>::d; ++iDim) { 00195 uLb[iDim] -= 0.5*getExternalForceComponent(cell,iDim); 00196 } 00197 } 00198 00199 template<typename T, template<typename U> class Descriptor> 00200 void GeneralizedMassConservingVelocityBoundaryDynamics<T,Descriptor>:: 00201 completePopulations(Cell<T,Descriptor>& cell) const 00202 { 00203 Array<T,Descriptor<T>::d> uLb; 00204 computeUlb(cell, uLb); 00205 00206 DirichletMassConservingVelocityBoundarySolver<T,Descriptor> bc(missingIndices, knownIndices, 00207 inGoingIndices, uLb); 00208 bc.apply(cell,this->getBaseDynamics()); 00209 } 00210 00211 /* *************** Class GeneralizedDensityBoundaryDynamics ************* */ 00212 00213 template<typename T, template<typename U> class Descriptor, 00214 int direction, int orientation> 00215 int GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>::id = 00216 meta::registerGeneralDynamics<T,Descriptor, GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation> > 00217 ( std::string("Boundary_GeneralizedDensity_")+util::val2str(direction) + 00218 std::string("_")+util::val2str(orientation) ); 00219 00220 template<typename T, template<typename U> class Descriptor, 00221 int direction, int orientation> 00222 GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>:: 00223 GeneralizedDensityBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00224 std::vector<plint> missingIndices_, 00225 bool automaticPrepareCollision_) 00226 : DensityDirichletBoundaryDynamics<T,Descriptor,direction,orientation>(baseDynamics_, automaticPrepareCollision_), 00227 missingIndices(missingIndices_) 00228 { 00229 knownIndices = indexTemplates::remainingIndexes<Descriptor<T> >(missingIndices); 00230 } 00231 00232 template<typename T, template<typename U> class Descriptor, 00233 int direction, int orientation> 00234 GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>:: 00235 GeneralizedDensityBoundaryDynamics(HierarchicUnserializer& unserializer) 00236 : DensityDirichletBoundaryDynamics<T,Descriptor,direction,orientation>(0, false) 00237 { 00238 unserialize(unserializer); 00239 } 00240 00241 template<typename T, template<typename U> class Descriptor, 00242 int direction, int orientation> 00243 GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>* 00244 GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>::clone() const 00245 { 00246 return new GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>(*this); 00247 } 00248 00249 template<typename T, template<typename U> class Descriptor, 00250 int direction, int orientation> 00251 int GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>::getId() const { 00252 return id; 00253 } 00254 00255 template<typename T, template<typename U> class Descriptor, 00256 int direction, int orientation> 00257 void GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>::serialize(HierarchicSerializer& serializer) const 00258 { 00259 serializer.addValue((int)(missingIndices.size())); 00260 serializer.addValues(missingIndices); 00261 serializer.addValue((int)(knownIndices.size())); 00262 serializer.addValues(knownIndices); 00263 // serializer.addValues(u); 00264 // serializer.addValues(PiNeq); 00265 DensityDirichletBoundaryDynamics<T,Descriptor,direction,orientation>::serialize(serializer); 00266 } 00267 00268 template<typename T, template<typename U> class Descriptor, 00269 int direction, int orientation> 00270 void GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>::unserialize(HierarchicUnserializer& unserializer) 00271 { 00272 PLB_PRECONDITION( unserializer.getId() == this->getId() ); 00273 missingIndices.resize(unserializer.readValue<int>()); 00274 unserializer.readValues(missingIndices); 00275 knownIndices.resize(unserializer.readValue<int>()); 00276 unserializer.readValues(knownIndices); 00277 // unserializer.readValues(u); 00278 // unserializer.readValues(PiNeq); 00279 DensityDirichletBoundaryDynamics<T,Descriptor,direction,orientation>::unserialize(unserializer); 00280 } 00281 00282 template<typename T, template<typename U> class Descriptor, 00283 int direction, int orientation> 00284 void GeneralizedDensityBoundaryDynamics<T,Descriptor,direction,orientation>:: 00285 completePopulations(Cell<T,Descriptor>& cell) const 00286 { 00287 T rhoBar; 00288 Array<T,Descriptor<T>::d> u,j; 00289 this -> computeRhoBarJ(cell, rhoBar, j); 00290 T rho = Descriptor<T>::fullRho(rhoBar); 00291 T invRho = Descriptor<T>::invRho(rhoBar); 00292 u = invRho * j; 00293 00294 Array<T,SymmetricTensor<T,Descriptor>::n> PiNeq; 00295 PiNeq.resetToZero(); 00296 00297 DirichletDensityBoundarySolver<T,Descriptor,direction> bc(missingIndices, knownIndices, rho, u, PiNeq, 1.0e-7); 00298 bc.apply(cell,this->getBaseDynamics()); 00299 00300 } 00301 00302 /* ********** Class GeneralizedVelocityTemperatureBoundaryDynamics ********* */ 00303 00304 template<typename T, template<typename U> class Descriptor> 00305 int GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>::id = 00306 meta::registerGeneralDynamics<T,Descriptor,GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor> > 00307 ("Boundary_GeneralizedVelocityTemperature"); 00308 00309 template<typename T, template<typename U> class Descriptor> 00310 GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>:: 00311 GeneralizedVelocityTemperatureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00312 std::vector<plint> missingIndices_, bool massConserving_, 00313 bool automaticPrepareCollision) 00314 : StoreTemperatureAndVelocityDynamics<T,Descriptor>(baseDynamics_,automaticPrepareCollision), 00315 missingIndices(missingIndices_), massConserving(massConserving_) 00316 { 00317 knownIndices = indexTemplates::remainingIndexes<Descriptor<T> >(missingIndices); 00318 } 00319 00320 template<typename T, template<typename U> class Descriptor> 00321 GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>:: 00322 GeneralizedVelocityTemperatureBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00323 std::vector<plint> missingIndices_, std::vector<plint> knownIndices_, 00324 bool massConserving_, 00325 bool automaticPrepareCollision) 00326 : StoreTemperatureAndVelocityDynamics<T,Descriptor>(baseDynamics_,automaticPrepareCollision), 00327 missingIndices(missingIndices_), knownIndices(knownIndices_), massConserving(massConserving_) 00328 { } 00329 00330 template<typename T, template<typename U> class Descriptor> 00331 GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>:: 00332 GeneralizedVelocityTemperatureBoundaryDynamics(HierarchicUnserializer& unserializer) 00333 : StoreTemperatureAndVelocityDynamics<T,Descriptor>(0, false) 00334 { 00335 this->unserialize(unserializer); 00336 } 00337 00338 template<typename T, template<typename U> class Descriptor> 00339 GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>* 00340 GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>::clone() const 00341 { 00342 return new GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>(*this); 00343 } 00344 00345 template<typename T, template<typename U> class Descriptor> 00346 int GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>::getId() const { 00347 return id; 00348 } 00349 00350 template<typename T, template<typename U> class Descriptor> 00351 void GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const 00352 { 00353 serializer.addValue((int)(missingIndices.size())); 00354 serializer.addValues(missingIndices); 00355 serializer.addValue((int)(knownIndices.size())); 00356 serializer.addValues(knownIndices); 00357 serializer.addValue(massConserving); 00358 StoreTemperatureAndVelocityDynamics<T,Descriptor>::serialize(serializer); 00359 } 00360 00361 template<typename T, template<typename U> class Descriptor> 00362 void GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer) 00363 { 00364 PLB_PRECONDITION( unserializer.getId() == this->getId() ); 00365 missingIndices.resize(unserializer.readValue<int>()); 00366 unserializer.readValues(missingIndices); 00367 knownIndices.resize(unserializer.readValue<int>()); 00368 unserializer.readValues(knownIndices); 00369 massConserving = unserializer.readValue<bool>(); 00370 StoreTemperatureAndVelocityDynamics<T,Descriptor>::unserialize(unserializer); 00371 } 00372 00373 template<typename T, template<typename U> class Descriptor> 00374 void GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>:: 00375 computeUlb(Cell<T,Descriptor> const& cell, Array<T,Descriptor<T>::d> &uLb) const { 00376 00377 this -> computeVelocity(cell, uLb); 00378 for (plint iDim = 0; iDim < Descriptor<T>::d; ++iDim) { 00379 uLb[iDim] -= 0.5*getExternalForceComponent(cell,iDim); 00380 } 00381 } 00382 00383 template<typename T, template<typename U> class Descriptor> 00384 void GeneralizedVelocityTemperatureBoundaryDynamics<T,Descriptor>:: 00385 completePopulations(Cell<T,Descriptor>& cell) const 00386 { 00387 Array<T,Descriptor<T>::d> uLb; 00388 computeUlb(cell, uLb); 00389 T thetaBar = this->computeTemperature(cell)*Descriptor<T>::invCs2-(T)1; 00390 00391 T rho; 00392 Array<T,SymmetricTensor<T,Descriptor>::n> PiNeq; 00393 Array<T,SymmetricRankThreeTensor<T,Descriptor>::n> qNeq; 00394 // generalizedComprTempBoundaryTemplates<T,Descriptor>:: 00395 // solveLinearSystemTrLessPiNeq(cell, uLb, thetaBar,missingIndices, knownIndices, rho, PiNeq, qNeq, massConserving); 00396 00397 generalizedComprTempBoundaryTemplates<T,Descriptor>:: 00398 solveLinearSystem(cell, uLb, thetaBar,missingIndices, knownIndices, rho, PiNeq, qNeq, massConserving); 00399 00400 T rhoBar = Descriptor<T>::rhoBar(rho); 00401 00402 Array<T,Descriptor<T>::d> j; 00403 for (plint iDim = 0; iDim < Descriptor<T>::d; ++iDim) { 00404 j[iDim] = rho * uLb[iDim]; 00405 } 00406 T jSqr = VectorTemplate<T,Descriptor>::normSqr(j); 00407 00408 // TODO not elegant. Regularize functions should be made more generic 00409 typedef Descriptor<T> L; 00410 Array<T,Descriptor<T>::q> f, feq; 00411 for (plint iPop=0; iPop < L::q; ++iPop) { 00412 cell[iPop] = this->computeEquilibrium(iPop, rhoBar, j, jSqr, thetaBar); 00413 cell[iPop] += offEquilibriumTemplates<T,Descriptor>::fromPiAndQtoFneq(iPop, PiNeq, qNeq); 00414 } 00415 } 00416 00417 /* *************** Class GeneralizedNextToWallBoundaryDynamics ************* */ 00418 00419 template<typename T, template<typename U> class Descriptor> 00420 int GeneralizedNextToBoundaryDynamics<T,Descriptor>::id = 00421 meta::registerGeneralDynamics<T,Descriptor,GeneralizedNextToBoundaryDynamics<T,Descriptor> > 00422 ("Boundary_GeneralizedNextToBoundaryDynamics"); 00423 00424 template<typename T, template<typename U> class Descriptor> 00425 GeneralizedNextToBoundaryDynamics<T,Descriptor>:: 00426 GeneralizedNextToBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00427 std::vector<plint> missingIndices_, 00428 bool automaticPrepareCollision) 00429 : BoundaryCompositeDynamics<T,Descriptor>(baseDynamics_,automaticPrepareCollision), 00430 missingIndices(missingIndices_) 00431 { 00432 knownIndices = indexTemplates::remainingIndexes<Descriptor<T> >(missingIndices); 00433 00434 rho = (T)1; 00435 thetaBar = T(); 00436 u.resetToZero(); 00437 PiNeq.resetToZero(); 00438 Qneq.resetToZero(); 00439 } 00440 00441 template<typename T, template<typename U> class Descriptor> 00442 GeneralizedNextToBoundaryDynamics<T,Descriptor>:: 00443 GeneralizedNextToBoundaryDynamics(Dynamics<T,Descriptor>* baseDynamics_, 00444 std::vector<plint> missingIndices_, 00445 std::vector<plint> knownIndices_, 00446 bool automaticPrepareCollision) 00447 : BoundaryCompositeDynamics<T,Descriptor>(baseDynamics_,automaticPrepareCollision), 00448 missingIndices(missingIndices_), knownIndices(knownIndices_) 00449 { } 00450 00451 template<typename T, template<typename U> class Descriptor> 00452 GeneralizedNextToBoundaryDynamics<T,Descriptor>:: 00453 GeneralizedNextToBoundaryDynamics(HierarchicUnserializer& unserializer) 00454 : BoundaryCompositeDynamics<T,Descriptor>(0, false) 00455 { 00456 this->unserialize(unserializer); 00457 } 00458 00459 template<typename T, template<typename U> class Descriptor> 00460 GeneralizedNextToBoundaryDynamics<T,Descriptor>* 00461 GeneralizedNextToBoundaryDynamics<T,Descriptor>::clone() const 00462 { 00463 return new GeneralizedNextToBoundaryDynamics<T,Descriptor>(*this); 00464 } 00465 00466 template<typename T, template<typename U> class Descriptor> 00467 int GeneralizedNextToBoundaryDynamics<T,Descriptor>::getId() const { 00468 return id; 00469 } 00470 00471 template<typename T, template<typename U> class Descriptor> 00472 void GeneralizedNextToBoundaryDynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const 00473 { 00474 serializer.addValue((int)(missingIndices.size())); 00475 serializer.addValues(missingIndices); 00476 serializer.addValue((int)(knownIndices.size())); 00477 serializer.addValues(knownIndices); 00478 BoundaryCompositeDynamics<T,Descriptor>::serialize(serializer); 00479 } 00480 00481 template<typename T, template<typename U> class Descriptor> 00482 void GeneralizedNextToBoundaryDynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer) 00483 { 00484 PLB_PRECONDITION( unserializer.getId() == this->getId() ); 00485 missingIndices.resize(unserializer.readValue<int>()); 00486 unserializer.readValues(missingIndices); 00487 knownIndices.resize(unserializer.readValue<int>()); 00488 unserializer.readValues(knownIndices); 00489 BoundaryCompositeDynamics<T,Descriptor>::unserialize(unserializer); 00490 } 00491 00492 template<typename T, template<typename U> class Descriptor> 00493 void GeneralizedNextToBoundaryDynamics<T,Descriptor>:: 00494 completePopulations(Cell<T,Descriptor>& cell) 00495 { 00496 00497 T epsilon = 1.0e-10; 00498 T resSum; 00499 bool converged = generalizedComprTempBoundaryTemplates<T,Descriptor>:: 00500 iterativelySolveSystem(cell, rho, u, thetaBar, PiNeq, Qneq, knownIndices, missingIndices, epsilon, resSum); 00501 // bool converged = generalizedComprTempBoundaryTemplates<T,Descriptor>:: 00502 // iterativelySolveSystemTrLessPiNeq(cell, rho, u, thetaBar, PiNeq, Qneq, knownIndices, missingIndices, epsilon, resSum); 00503 if (!converged) { 00504 pcout << "Never converged... Exiting." << std::endl; 00505 exit(-1); 00506 } 00507 Array<T,Descriptor<T>::d> j; 00508 j = rho*u; 00509 T rhoBar = Descriptor<T>::rhoBar(rho); 00510 T jSqr = VectorTemplate<T,Descriptor>::normSqr(j); 00511 for (plint iPop=0; iPop < Descriptor<T>::q; ++iPop) { 00512 cell[iPop] = this->computeEquilibrium(iPop, rhoBar, j, jSqr, thetaBar); 00513 cell[iPop] += offEquilibriumTemplates<T,Descriptor>::fromPiAndQtoFneq(iPop, PiNeq, Qneq); 00514 } 00515 } 00516 00517 } // namespace plb 00518 00519 #endif // GENERALIZED_BOUNDARY_DYNAMICS_HH
1.6.3
1.6.3