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

fdFunctional2D.h

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 
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