FreeFOAM The Cross-Platform CFD Toolkit
Hosted by SourceForge:
Get FreeFOAM at SourceForge.net.
            Fast, secure and Free Open Source software downloads

displacementLaplacianFvMotionSolver.C

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002   =========                 |
00003   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
00004    \\    /   O peration     |
00005     \\  /    A nd           | Copyright (C) 1991-2010 OpenCFD Ltd.
00006      \\/     M anipulation  |
00007 -------------------------------------------------------------------------------
00008 License
00009     This file is part of OpenFOAM.
00010 
00011     OpenFOAM is free software: you can redistribute it and/or modify it
00012     under the terms of the GNU General Public License as published by
00013     the Free Software Foundation, either version 3 of the License, or
00014     (at your option) any later version.
00015 
00016     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
00017     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00018     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
00019     for more details.
00020 
00021     You should have received a copy of the GNU General Public License
00022     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
00023 
00024 \*---------------------------------------------------------------------------*/
00025 
00026 #include "displacementLaplacianFvMotionSolver.H"
00027 #include <fvMotionSolvers/motionDiffusivity.H>
00028 #include <finiteVolume/fvmLaplacian.H>
00029 #include <OpenFOAM/addToRunTimeSelectionTable.H>
00030 #include <OpenFOAM/OFstream.H>
00031 #include <meshTools/meshTools.H>
00032 #include <OpenFOAM/mapPolyMesh.H>
00033 #include <finiteVolume/volPointInterpolation.H>
00034 
00035 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
00036 
00037 namespace Foam
00038 {
00039     defineTypeNameAndDebug(displacementLaplacianFvMotionSolver, 0);
00040 
00041     addToRunTimeSelectionTable
00042     (
00043         fvMotionSolver,
00044         displacementLaplacianFvMotionSolver,
00045         dictionary
00046     );
00047 }
00048 
00049 
00050 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
00051 
00052 Foam::displacementLaplacianFvMotionSolver::displacementLaplacianFvMotionSolver
00053 (
00054     const polyMesh& mesh,
00055     Istream& is
00056 )
00057 :
00058     displacementFvMotionSolver(mesh, is),
00059     pointDisplacement_
00060     (
00061         IOobject
00062         (
00063             "pointDisplacement",
00064             fvMesh_.time().timeName(),
00065             fvMesh_,
00066             IOobject::MUST_READ,
00067             IOobject::AUTO_WRITE
00068         ),
00069         pointMesh::New(fvMesh_)
00070     ),
00071     cellDisplacement_
00072     (
00073         IOobject
00074         (
00075             "cellDisplacement",
00076             mesh.time().timeName(),
00077             mesh,
00078             IOobject::READ_IF_PRESENT,
00079             IOobject::AUTO_WRITE
00080         ),
00081         fvMesh_,
00082         dimensionedVector
00083         (
00084             "cellDisplacement",
00085             pointDisplacement_.dimensions(),
00086             vector::zero
00087         ),
00088         cellMotionBoundaryTypes<vector>(pointDisplacement_.boundaryField())
00089     ),
00090     pointLocation_(NULL),
00091     diffusivityPtr_
00092     (
00093         motionDiffusivity::New(*this, lookup("diffusivity"))
00094     ),
00095     frozenPointsZone_
00096     (
00097         found("frozenPointsZone")
00098       ? fvMesh_.pointZones().findZoneID(lookup("frozenPointsZone"))
00099       : -1
00100     )
00101 {
00102     IOobject io
00103     (
00104         "pointLocation",
00105         fvMesh_.time().timeName(),
00106         fvMesh_,
00107         IOobject::MUST_READ,
00108         IOobject::AUTO_WRITE
00109     );
00110 
00111     if (debug)
00112     {
00113         Info<< "displacementLaplacianFvMotionSolver:" << nl
00114             << "    diffusivity       : " << diffusivityPtr_().type() << nl
00115             << "    frozenPoints zone : " << frozenPointsZone_ << endl;
00116     }
00117 
00118 
00119     if (io.headerOk())
00120     {
00121         pointLocation_.reset
00122         (
00123             new pointVectorField
00124             (
00125                 io,
00126                 pointMesh::New(fvMesh_)
00127             )
00128         );
00129 
00130         if (debug)
00131         {
00132             Info<< "displacementLaplacianFvMotionSolver :"
00133                 << " Read pointVectorField "
00134                 << io.name() << " to be used for boundary conditions on points."
00135                 << nl
00136                 << "Boundary conditions:"
00137                 << pointLocation_().boundaryField().types() << endl;
00138         }
00139     }
00140 }
00141 
00142 
00143 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
00144 
00145 Foam::displacementLaplacianFvMotionSolver::
00146 ~displacementLaplacianFvMotionSolver()
00147 {}
00148 
00149 
00150 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
00151 
00152 Foam::tmp<Foam::pointField>
00153 Foam::displacementLaplacianFvMotionSolver::curPoints() const
00154 {
00155     volPointInterpolation::New(fvMesh_).interpolate
00156     (
00157         cellDisplacement_,
00158         pointDisplacement_
00159     );
00160 
00161     if (pointLocation_.valid())
00162     {
00163         if (debug)
00164         {
00165             Info<< "displacementLaplacianFvMotionSolver : applying "
00166                 << " boundary conditions on " << pointLocation_().name()
00167                 << " to new point location."
00168                 << endl;
00169         }
00170 
00171         pointLocation_().internalField() =
00172             points0()
00173           + pointDisplacement_.internalField();
00174 
00175         pointLocation_().correctBoundaryConditions();
00176 
00177         // Implement frozen points
00178         if (frozenPointsZone_ != -1)
00179         {
00180             const pointZone& pz = fvMesh_.pointZones()[frozenPointsZone_];
00181 
00182             forAll(pz, i)
00183             {
00184                 pointLocation_()[pz[i]] = points0()[pz[i]];
00185             }
00186         }
00187 
00188         twoDCorrectPoints(pointLocation_().internalField());
00189 
00190         return tmp<pointField>(pointLocation_().internalField());
00191     }
00192     else
00193     {
00194         tmp<pointField> tcurPoints
00195         (
00196             points0() + pointDisplacement_.internalField()
00197         );
00198 
00199         // Implement frozen points
00200         if (frozenPointsZone_ != -1)
00201         {
00202             const pointZone& pz = fvMesh_.pointZones()[frozenPointsZone_];
00203 
00204             forAll(pz, i)
00205             {
00206                 tcurPoints()[pz[i]] = points0()[pz[i]];
00207             }
00208         }
00209 
00210         twoDCorrectPoints(tcurPoints());
00211 
00212         return tcurPoints;
00213     }
00214 }
00215 
00216 
00217 void Foam::displacementLaplacianFvMotionSolver::solve()
00218 {
00219     // The points have moved so before interpolation update
00220     // the fvMotionSolver accordingly
00221     movePoints(fvMesh_.points());
00222 
00223     diffusivityPtr_->correct();
00224     pointDisplacement_.boundaryField().updateCoeffs();
00225 
00226     Foam::solve
00227     (
00228         fvm::laplacian
00229         (
00230             diffusivityPtr_->operator()(),
00231             cellDisplacement_,
00232             "laplacian(diffusivity,cellDisplacement)"
00233         )
00234     );
00235 }
00236 
00237 
00238 void Foam::displacementLaplacianFvMotionSolver::updateMesh
00239 (
00240     const mapPolyMesh& mpm
00241 )
00242 {
00243     displacementFvMotionSolver::updateMesh(mpm);
00244 
00245     // Update diffusivity. Note two stage to make sure old one is de-registered
00246     // before creating/registering new one.
00247     diffusivityPtr_.reset(NULL);
00248     diffusivityPtr_ = motionDiffusivity::New(*this, lookup("diffusivity"));
00249 }
00250 
00251 
00252 // ************************ vim: set sw=4 sts=4 et: ************************ //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines