$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 /* 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
1.6.3
1.6.3