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

gridRefinementDynamics.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 /* Main author: Daniel Lagrava
00026  **/
00027 
00031 #ifndef GRID_REFINEMENT_DYNAMICS_HH
00032 #define GRID_REFINEMENT_DYNAMICS_HH
00033 
00034 #include "multiGrid/gridRefinementDynamics.h"
00035 
00036 namespace plb {
00037 
00038 /* *************** Class FineGridBoundaryDynamics *************************** */
00039 
00040 template<typename T, template<typename U> class Descriptor>
00041 int FineGridBoundaryDynamics<T,Descriptor>::id =
00042     meta::registerGeneralDynamics<T,Descriptor,FineGridBoundaryDynamics<T,Descriptor> >("Boundary_FineGrid");
00043 
00044 template<typename T, template<typename U> class Descriptor>
00045 FineGridBoundaryDynamics<T,Descriptor>::FineGridBoundaryDynamics (
00046         Dynamics<T,Descriptor>* baseDynamics_,
00047         TimeCounter const& timeCounter_,
00048         plint numTimeSteps_,
00049         plint orderOfDecomposition_)
00050     : BoundaryCompositeDynamics<T,Descriptor>(baseDynamics_),
00051       timeCounter(timeCounter_),
00052       numTimeSteps(numTimeSteps_),
00053       orderOfDecomposition(orderOfDecomposition_),
00054       decomposedValuesT0(),
00055       decomposedValuesT1()
00056 { }
00057 
00058 template<typename T, template<typename U> class Descriptor>
00059 FineGridBoundaryDynamics<T,Descriptor>::FineGridBoundaryDynamics(HierarchicUnserializer& unserializer)
00060     : BoundaryCompositeDynamics<T,Descriptor>(0, false),
00061       timeCounter(0),
00062       numTimeSteps(0),
00063       orderOfDecomposition(0),
00064       decomposedValuesT0(),
00065       decomposedValuesT1()
00066 {
00067     unserialize(unserializer);
00068 }
00069 
00070 template<typename T, template<typename U> class Descriptor>
00071 void FineGridBoundaryDynamics<T,Descriptor>::serialize(HierarchicSerializer& serializer) const
00072 {
00073     serializer.addValue(timeCounter);
00074     serializer.addValue(numTimeSteps);
00075     serializer.addValue(orderOfDecomposition);
00076     serializer.addValue(decomposedValuesT0.size());
00077     serializer.addValues(decomposedValuesT0);
00078     serializer.addValue(decomposedValuesT1.size());
00079     serializer.addValues(decomposedValuesT1);
00080     BoundaryCompositeDynamics<T,Descriptor>::serialize(serializer);
00081 }
00082 
00083 template<typename T, template<typename U> class Descriptor>
00084 void FineGridBoundaryDynamics<T,Descriptor>::unserialize(HierarchicUnserializer& unserializer)
00085 {
00086     unserializer.readValue(timeCounter);
00087     unserializer.readValue(numTimeSteps);
00088     unserializer.readValue(orderOfDecomposition);
00089 
00090     typename std::vector<T>::size_type t0Size, t1Size;
00091     unserializer.readValue(t0Size);
00092     decomposedValuesT0.resize(t0Size);
00093     unserializer.readValues(decomposedValuesT0);
00094 
00095     unserializer.readValue(t1Size);
00096     decomposedValuesT1.resize(t1Size);
00097     unserializer.readValues(decomposedValuesT1);
00098 
00099     BoundaryCompositeDynamics<T,Descriptor>::unserialize(unserializer);
00100 }
00101 
00102 template<typename T, template<typename U> class Descriptor>
00103 FineGridBoundaryDynamics<T,Descriptor>*
00104     FineGridBoundaryDynamics<T,Descriptor>::clone() const
00105 {
00106     return new FineGridBoundaryDynamics<T,Descriptor>(*this);
00107 }
00108 
00113 template<typename T, template<typename U> class Descriptor>
00114 bool FineGridBoundaryDynamics<T,Descriptor>::isComposeable() const
00115 {
00116     return false;
00117 }
00118 
00119 template<typename T, template<typename U> class Descriptor>
00120 int FineGridBoundaryDynamics<T,Descriptor>::getId() const {
00121     return id;
00122 }
00123 
00124 template<typename T, template<typename U> class Descriptor>
00125 void FineGridBoundaryDynamics<T,Descriptor>::completePopulations(Cell<T,Descriptor>& cell) const
00126 {
00127     // Get current iteration time from the lattice
00128     size_t relativeTime = timeCounter.getTime()%numTimeSteps;
00129     
00130     // At time t0, simply recompose the corresponding decomposed values ...
00131     if (relativeTime==0) {
00132 //         pcout << "copy from t0\n";
00133         if ((plint)decomposedValuesT0.size() !=
00134                     cell.getDynamics().numDecomposedVariables(orderOfDecomposition)){
00135         }
00136         PLB_ASSERT( (plint)decomposedValuesT0.size() ==
00137                     cell.getDynamics().numDecomposedVariables(orderOfDecomposition) );
00138         cell.getDynamics().recompose(cell, decomposedValuesT0, orderOfDecomposition);
00139     }
00140     // ... and at all other times, interpolate value between t0 and t1
00141     else {
00142 //         pcout << "interpolate between t0 and t1\n";
00143         PLB_ASSERT( (plint)decomposedValuesT0.size() ==
00144                     cell.getDynamics().numDecomposedVariables(orderOfDecomposition) );
00145         PLB_ASSERT( (plint)decomposedValuesT1.size() ==
00146                     cell.getDynamics().numDecomposedVariables(orderOfDecomposition) );
00147         T timeFraction = (T)relativeTime/(T)numTimeSteps;
00148         std::vector<T> decomposedValues(decomposedValuesT0.size());
00149         for (pluint iVal=0; iVal<decomposedValues.size(); ++iVal) {
00150             decomposedValues[iVal] =
00151                 fd::linearInterpolate(decomposedValuesT0[iVal], decomposedValuesT1[iVal], timeFraction);
00152         }
00153         // recompose everything in the cell 
00154         cell.getDynamics().recompose(cell, decomposedValues, orderOfDecomposition);
00155     }
00156 }
00157 
00158 template<typename T, template<typename U> class Descriptor>
00159 std::vector<T>& FineGridBoundaryDynamics<T,Descriptor>::getDecomposedValues(plint whichTime)
00160 {
00161     PLB_PRECONDITION( whichTime==0 || whichTime==1);
00162     return whichTime==0 ? decomposedValuesT0 : decomposedValuesT1;
00163 }
00164 
00165 template<typename T, template<typename U> class Descriptor>
00166 
00167 
00168 std::vector<T> const& FineGridBoundaryDynamics<T,Descriptor>::getDecomposedValues(plint whichTime) const
00169 {
00170     PLB_PRECONDITION( whichTime==0 || whichTime==1);
00171     return whichTime==0 ? decomposedValuesT0 : decomposedValuesT1;
00172 }
00173 
00174 }  // namespace plb
00175 
00176 #endif  // GRID_REFINEMENT_DYNAMICS_HH