/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2019 Zeljko Tukovic, FSB Zagreb. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . Class Foam::interfaceTrackingFvMesh Description The interfaceTrackingFvMesh SourceFiles interfaceTrackingFvMesh.C \*---------------------------------------------------------------------------*/ #ifndef interfaceTrackingFvMesh_H #define interfaceTrackingFvMesh_H #include "dynamicMotionSolverFvMesh.H" #include "regIOobject.H" #include "faCFD.H" #include "volFields.H" #include "surfaceFields.H" #include "surfactantProperties.H" #include "singlePhaseTransportModel.H" #include "demandDrivenData.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class interfaceTrackingFvMesh Declaration \*---------------------------------------------------------------------------*/ class interfaceTrackingFvMesh : public dynamicMotionSolverFvMesh { // Private Data //- Finite area mesh autoPtr aMeshPtr_; //- Free surface patch index label fsPatchIndex_; //- Free surface faPatch-es which do not move wordList fixedFreeSurfacePatches_; //- Free surface faPatch-es where wave shuld not reflect wordList nonReflectingFreeSurfacePatches_; //- Free surface patches for which point normals must be corrected wordList pointNormalsCorrectionPatches_; //- Is it free-surface points displacement direction // parallel with free-surface point normals Switch normalMotionDir_; //- Free-surface points displacement direction // if not normal motion direction vector motionDir_; //- Interface smoothing at the begining of time step Switch smoothing_; //- Pure free-surface Switch pureFreeSurface_; //- Rigid free-surface Switch rigidFreeSurface_; //- Correct contact line point normals Switch correctContactLineNormals_; //- Surface tension coefficient of pure free-surface dimensionedScalar sigma0_; //- Fluid density dimensionedScalar rho_; //- Current interface tracking time index label timeIndex_; //- Free-surface velocity field mutable areaVectorField* UsPtr_; //- Points which are attached to the free-surface A side faces // and which defines the free-surface shape mutable vectorIOField* controlPointsPtr_; //- Field which additionally determines // the motion of free-surface points mutable labelList* motionPointsMaskPtr_; //- Displacement direction of free-surface points mutable vectorField* pointsDisplacementDirPtr_; //- Displacement direction of free-surface control points mutable vectorField* facesDisplacementDirPtr_; //- Free-surface net flux mutable areaScalarField* fsNetPhiPtr_; //- Free-surface flux mutable edgeScalarField* phisPtr_; //- Free-surface surfactant concetration mutable areaScalarField* surfactConcPtr_; //- Volume surfactant concetration mutable volScalarField* bulkSurfactConcPtr_; //- Surface tension field mutable areaScalarField* surfaceTensionPtr_; //- Surfactant properties mutable surfactantProperties* surfactantPtr_; //- Contact angle mutable areaScalarField* contactAnglePtr_; // Private Member Functions // Make demand-driven data //- Create free surface velocity field void makeUs() const; //- Create control points void makeControlPoints(); //- Create motion points mask void makeMotionPointsMask(); //- Create points and control point motion direction void makeDirections(); //- Create free surface net flux void makeFsNetPhi() const; //- Create free-surface flux void makePhis(); //- Create surfactant volume concentration field void makeBulkSurfactConc() const; //- Create surfactant concentration field void makeSurfactConc() const; //- Create surface tension field void makeSurfaceTension() const; //- Create surfactant properties void makeSurfactant() const; //- Create contact angle void makeContactAngle(); //- No copy construct interfaceTrackingFvMesh(const interfaceTrackingFvMesh&) = delete; //- No copy assignment void operator=(const interfaceTrackingFvMesh&) = delete; //- Initialize data void initializeData(); //- Update control points end displacement directions void updateDisplacementDirections(); //- Initialize control points position void initializeControlPointsPosition(); //- Calculate free surface points displacement // for given new control points position tmp pointDisplacement(); //- Calc least sqare plane point and normal tmp lsPlanePointAndNormal ( const vectorField& points, const vector& origin, const vector& axis ) const; //- Smooth free-surface mesh void smoothFreeSurfaceMesh(); //- Update free-surface flux void updateSurfaceFlux(); //- Update free-surface surfactant concentration void updateSurfactantConcentration(); //- Calculate total pressure force vector totalPressureForce() const; //- Calculate total viscous force vector totalViscousForce() const; //- Calculate total surface tension force vector totalSurfaceTensionForce() const; //- Maximal surface tension based Courant number scalar maxCourantNumber(); //- Update properties void updateProperties(); //- Correct free surface point normals at contact line void correctContactLinePointNormals(); //- Correct free surface point displacement next to fixed contact line void correctPointDisplacement ( const scalarField& sweptVolCorr, vectorField& displacement ); public: //- Runtime type information TypeName("interfaceTrackingFvMesh"); // Constructors //- Construct from IOobject interfaceTrackingFvMesh(const IOobject& io); //- Construct from components without boundary. // Boundary is added using addFvPatches() member function interfaceTrackingFvMesh ( const IOobject& io, pointField&& points, faceList&& faces, labelList&& allOwner, labelList&& allNeighbour, const bool syncPar = true ); //- Destructor ~interfaceTrackingFvMesh(); // Member Functions fvMesh& mesh() { return *this; } const fvMesh& mesh() const { return *this; } //- Return reference to finite area mesh faMesh& aMesh() { return aMeshPtr_(); } //- Return reference to finite area mesh const faMesh& aMesh() const { return aMeshPtr_(); } const label& fsPatchIndex() const { return fsPatchIndex_; } //- Pure free-surface const Switch& pureFreeSurface() const { return pureFreeSurface_; } //- Rigid free-surface const Switch& rigidFreeSurface() const { return rigidFreeSurface_; } //- Rigid free-surface Switch& rigidFreeSurface() { return rigidFreeSurface_; } //- Correct contact line point normals const Switch& correctContactLineNormals() const { return correctContactLineNormals_; } //- Correct contact line point normals Switch& correctContactLineNormals() { return correctContactLineNormals_; } //- Surface tension coefficient of pure free-surface const dimensionedScalar& sigma() const { return sigma0_; } //- Return free-surface velocity field areaVectorField& Us(); //- Return free-surface velocity field const areaVectorField& Us() const; //- Return free-surface net flux const areaScalarField& fsNetPhi() const; //- Return free-surface net flux areaScalarField& fsNetPhi(); //- Correct surface velocity boundary conditions void correctUsBoundaryConditions(); //- Update free-surface velocity field void updateUs(); //- Return constant reference to velocity field const volVectorField& U() const; //- Return constant reference to pressure field const volScalarField& p() const; //- Return constant reference to velocity field const surfaceScalarField& phi() const; //- Return free surface normal derivative of velocity tmp freeSurfaceSnGradU(); //- Return free surface normal derivative of normal velocity comp tmp freeSurfaceSnGradUn(); //- Return free surface pressure jump tmp freeSurfacePressureJump(); //- Return control points vectorField& controlPoints(); //- Return reference to motion points mask field labelList& motionPointsMask(); //- Return reference to point displacement direction field vectorField& pointsDisplacementDir(); //- Return reference to control points displacement direction field vectorField& facesDisplacementDir(); //- Motion direction swithc bool normalMotionDir() const { return normalMotionDir_; } //- Return free-surface fluid flux field edgeScalarField& Phis(); //- Return free-surface surfactant concentration field areaScalarField& surfactantConcentration(); //- Return free-surface surfactant concentration field const areaScalarField& surfactantConcentration() const; //- Return volume surfactant concentration field volScalarField& bulkSurfactantConcentration(); //- Return volume surfactant concentration field const volScalarField& bulkSurfactantConcentration() const; //- Return surface tension field areaScalarField& surfaceTension(); //- Return surface tension field const areaScalarField& surfaceTension() const; //- Return surface tension gradient tmp surfaceTensionGrad(); //- Return surfactant properties const surfactantProperties& surfactant() const; //- Update the mesh for both mesh motion and topology change virtual bool update(); //- Clear control points void clearControlPoints() { deleteDemandDrivenData(controlPointsPtr_); } //- Write VTK freeSurface mesh void writeVTK() const; //- Write VTK freeSurface control points void writeVTKControlPoints(); }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //