$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 00028 #ifndef FINITE_DIFFERENCE_FUNCTIONAL_2D_H 00029 #define FINITE_DIFFERENCE_FUNCTIONAL_2D_H 00030 00031 #include "core/globalDefs.h" 00032 #include "atomicBlock/dataProcessingFunctional2D.h" 00033 #include "atomicBlock/reductiveDataProcessingFunctional2D.h" 00034 00035 namespace plb { 00036 00037 /* *************** Central finite-difference schemes ***************** */ 00038 00039 template<typename T> 00040 class BoxXderivativeFunctional2D : public BoundedBoxProcessingFunctional2D_SS<T,T> 00041 { 00042 public: 00043 virtual void processBulk( Box2D domain, ScalarField2D<T>& value, ScalarField2D<T>& derivative ); 00044 virtual void processEdge( int direction, int orientation, Box2D domain, 00045 ScalarField2D<T>& value, ScalarField2D<T>& derivative ); 00046 virtual void processCorner( int normalX, int normalY, Box2D domain, 00047 ScalarField2D<T>& value, ScalarField2D<T>& derivative ); 00048 virtual BoxXderivativeFunctional2D<T>* clone() const; 00049 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00050 virtual BlockDomain::DomainT appliesTo() const; 00051 }; 00052 00053 00054 template<typename T> 00055 class BoxYderivativeFunctional2D : public BoundedBoxProcessingFunctional2D_SS<T,T> 00056 { 00057 public: 00058 virtual void processBulk( Box2D domain, ScalarField2D<T>& value, ScalarField2D<T>& derivative ); 00059 virtual void processEdge( int direction, int orientation, Box2D domain, 00060 ScalarField2D<T>& value, ScalarField2D<T>& derivative ); 00061 virtual void processCorner( int normalX, int normalY, Box2D domain, 00062 ScalarField2D<T>& value, ScalarField2D<T>& derivative ); 00063 virtual BoxYderivativeFunctional2D<T>* clone() const; 00064 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00065 virtual BlockDomain::DomainT appliesTo() const; 00066 }; 00067 00068 template<typename T> 00069 class BoxGradientNormFunctional2D : public BoundedBoxProcessingFunctional2D_SS<T,T> 00070 { 00071 public: 00072 virtual void processBulk( Box2D domain, ScalarField2D<T>& value, ScalarField2D<T>& grNorm ); 00073 virtual void processEdge( int direction, int orientation, Box2D domain, 00074 ScalarField2D<T>& value, ScalarField2D<T>& grNorm); 00075 virtual void processCorner( int normalX, int normalY, Box2D domain, 00076 ScalarField2D<T>& value, ScalarField2D<T>& grNorm ); 00077 virtual BoxGradientNormFunctional2D<T>* clone() const; 00078 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00079 virtual BlockDomain::DomainT appliesTo() const; 00080 }; 00081 00082 00083 /* *************** SOR iterations to solve a Poisson equation ******** */ 00084 00085 template<typename T> 00086 class BoxPoissonIteration2D : public BoundedScalarFieldBoxProcessingFunctional2D<T> 00087 { 00088 public: 00089 BoxPoissonIteration2D(T beta_); 00090 virtual void processBulk( Box2D domain, std::vector<ScalarField2D<T>*> scalarFields); 00091 virtual void processEdge( int direction, int orientation, Box2D domain, 00092 std::vector<ScalarField2D<T>*> scalarFields ); 00093 virtual void processCorner( int normalX, int normalY, Box2D domain, 00094 std::vector<ScalarField2D<T>*> scalarFields ); 00095 virtual BoxPoissonIteration2D<T>* clone() const; 00096 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00097 virtual BlockDomain::DomainT appliesTo() const; 00098 private: 00099 T beta; //< Relaxation parameter 00100 }; 00101 00102 /* *************** One Jacobi iteration ************* */ 00103 template<typename T> 00104 class JacobiIteration2D : public BoundedScalarFieldBoxProcessingFunctional2D<T> 00105 { 00106 public: 00107 virtual void processBulk( Box2D domain, std::vector<ScalarField2D<T>*> scalarFields); 00108 virtual void processEdge( int direction, int orientation, Box2D domain, 00109 std::vector<ScalarField2D<T>*> scalarFields ); 00110 virtual void processCorner( int normalX, int normalY, Box2D domain, 00111 std::vector<ScalarField2D<T>*> scalarFields ); 00112 virtual JacobiIteration2D<T>* clone() const; 00113 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00114 virtual BlockDomain::DomainT appliesTo() const; 00115 }; 00116 00117 /* *************** Gauss-Seidel iterative schema step ****************** */ 00118 template<typename T> 00119 class GaussSeidelIteration2D : public BoundedScalarFieldBoxProcessingFunctional2D<T> 00120 { 00121 public: 00122 virtual void processBulk( Box2D domain, std::vector<ScalarField2D<T>*> scalarFields); 00123 virtual void processEdge( int direction, int orientation, Box2D domain, 00124 std::vector<ScalarField2D<T>*> scalarFields ); 00125 virtual void processCorner( int normalX, int normalY, Box2D domain, 00126 std::vector<ScalarField2D<T>*> scalarFields ); 00127 virtual GaussSeidelIteration2D<T>* clone() const; 00128 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00129 virtual BlockDomain::DomainT appliesTo() const; 00130 }; 00131 00132 /* *************** Gauss-Seidel defect (d_h) ****************** */ 00135 template<typename T> 00136 class GaussSeidelDefect2D : public BoundedScalarFieldBoxProcessingFunctional2D<T> 00137 { 00138 public: 00139 virtual void processBulk( Box2D domain, std::vector<ScalarField2D<T>*> scalarFields); 00140 virtual void processEdge( int direction, int orientation, Box2D domain, 00141 std::vector<ScalarField2D<T>*> scalarFields ); 00142 virtual void processCorner( int normalX, int normalY, Box2D domain, 00143 std::vector<ScalarField2D<T>*> scalarFields ); 00144 virtual GaussSeidelDefect2D<T>* clone() const; 00145 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const; 00146 virtual BlockDomain::DomainT appliesTo() const; 00147 }; 00148 00149 /* *************** Max of Gauss-Seidel defect (max(d_h)) ****************** */ 00152 template<typename T> 00153 class GaussSeidelMaxDefectFunctional2D : public ReductiveBoxProcessingFunctional2D_SS<T,T> 00154 { 00155 public: 00156 GaussSeidelMaxDefectFunctional2D(); 00157 virtual void process(Box2D domain, ScalarField2D<T>& u_h, ScalarField2D<T>& rhs); 00158 virtual GaussSeidelMaxDefectFunctional2D<T>* clone() const; 00159 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00160 modified[0] = modif::nothing; 00161 modified[1] = modif::nothing; 00162 } 00163 T getMaxResidual() const; 00164 private: 00165 plint maxResidueId; 00166 }; 00167 00168 00169 00170 template<typename T> 00171 class BoxPoissonResidueFunctional2D : public ReductiveBoxProcessingFunctional2D_SS<T,T> 00172 { 00173 public: 00174 BoxPoissonResidueFunctional2D(); 00175 virtual void process(Box2D domain, ScalarField2D<T>& pressure, ScalarField2D<T>& rhs); 00176 virtual BoxPoissonResidueFunctional2D<T>* clone() const; 00177 virtual void getTypeOfModification(std::vector<modif::ModifT>& modified) const { 00178 modified[0] = modif::nothing; 00179 modified[1] = modif::nothing; 00180 } 00181 T getMaxResidue() const; 00182 private: 00183 plint maxResidueId; 00184 }; 00185 00186 } // namespace plb 00187 00188 #endif // FINITE_DIFFERENCE_FUNCTIONAL_2D_H
1.6.3
1.6.3