From bc430ccdef7512eec45fff604016583b1ccf362c Mon Sep 17 00:00:00 2001 From: sergio <sergio> Date: Tue, 29 Jan 2019 11:06:35 -0800 Subject: [PATCH] ENH: New vibro-acoustic model suite - New solver: `acousticFoam` - New base finite-area region class: `regionFaModel` - New base shell model classes: - `vibrationShellModel` - `thermalShellModel` - New shell models: - A vibration-shell model: `KirchhoffShell` - A thermal-shell model: `thermalShell` - New finite-area/finite-volume boundary conditions: - `clampedPlate` - `timeVaryingFixedValue` - `acousticWaveTransmissive` - New base classes for `fvOption` of finite-area methods: `faOption` - New `faOption`s: - `contactHeatFluxSource` - `externalFileSource` - `externalHeatFluxSource` - `jouleHeatingSource` - New tutorial: `compressible/acousticFoam/obliqueAirJet` Signed-off-by: Kutalmis Bercin <kutalmis.bercin@esi-group.com> --- .../solvers/acoustic/acousticFoam/Make/files | 3 + .../acoustic/acousticFoam/Make/options | 14 + .../acoustic/acousticFoam/acousticFoam.C | 99 ++++ .../acoustic/acousticFoam/createFields.H | 15 + .../acousticFoam/createRegionControls.H | 8 + .../solvers/acoustic/acousticFoam/paEqn.H | 15 + .../acousticFoam/readTransportProperties.H | 23 + .../chtMultiRegionSimpleFoam/Make/options | 10 +- src/Allwmake | 4 +- src/OpenFOAM/algorithms/subCycle/subCycle.H | 31 +- src/OpenFOAM/db/Time/subCycleTime.C | 18 +- src/faOptions/Make/files | 16 + src/faOptions/Make/options | 22 + src/faOptions/faOption/faOption.C | 291 ++++++++++++ src/faOptions/faOption/faOption.H | 441 ++++++++++++++++++ src/faOptions/faOption/faOptionI.H | 108 +++++ src/faOptions/faOption/faOptionIO.C | 64 +++ src/faOptions/faOption/faOptionList.C | 178 +++++++ src/faOptions/faOption/faOptionList.H | 250 ++++++++++ .../faOption/faOptionListTemplates.C | 290 ++++++++++++ src/faOptions/faOption/faOptions.C | 144 ++++++ src/faOptions/faOption/faOptions.H | 112 +++++ src/faOptions/faOption/makeFaOption.H | 54 +++ src/faOptions/faceSetOption/faceSetOption.C | 246 ++++++++++ src/faOptions/faceSetOption/faceSetOption.H | 241 ++++++++++ src/faOptions/faceSetOption/faceSetOptionI.H | 93 ++++ .../contactHeatFluxSource.C | 204 ++++++++ .../contactHeatFluxSource.H | 196 ++++++++ .../externalFileSource/externalFileSource.C | 130 ++++++ .../externalFileSource/externalFileSource.H | 169 +++++++ .../externalHeatFluxSource.C | 208 +++++++++ .../externalHeatFluxSource.H | 241 ++++++++++ .../jouleHeatingSource/jouleHeatingSource.C | 193 ++++++++ .../jouleHeatingSource/jouleHeatingSource.H | 265 +++++++++++ .../jouleHeatingSourceTemplates.C | 140 ++++++ src/finiteArea/Make/files | 4 +- .../faMesh/faPatches/faPatch/faPatch.C | 23 +- .../faMesh/faPatches/faPatch/faPatch.H | 22 +- .../clampedPlate/clampedPlateFaPatchField.C | 179 +++++++ .../clampedPlate/clampedPlateFaPatchField.H | 214 +++++++++ .../clampedPlateFaPatchFields.C} | 6 +- .../clampedPlateFaPatchFields.H} | 10 +- .../clampedPlateFaPatchFieldsFwd.H | 52 +++ ...imeVaryingUniformFixedValueFaPatchField.C} | 55 ++- ...imeVaryingUniformFixedValueFaPatchField.H} | 112 +++-- ...imeVaryingUniformFixedValueFaPatchFields.C | 46 ++ ...imeVaryingUniformFixedValueFaPatchFields.H | 52 +++ ...VaryingUniformFixedValueFaPatchFieldsFwd.H | 54 +++ .../faPatchFields/faPatchField/faPatchField.H | 39 +- .../faPatchField/faPatchFieldNew.C | 9 +- src/finiteArea/finiteArea/fam/famSup.C | 14 +- .../edgeInterpolation/edgeInterpolate.C | 1 + .../edgeInterpolation/edgeInterpolation.C | 38 +- .../skewCorrectedEdgeInterpolation.H | 219 +++++++++ .../skewCorrectedEdgeInterpolationMake.C | 39 ++ .../volSurfaceMapping/volSurfaceMapping.C | 72 ++- .../volSurfaceMapping/volSurfaceMapping.H | 38 +- src/finiteVolume/Make/files | 1 + .../acousticWaveTransmissiveFvPatchField.C | 119 +++++ .../acousticWaveTransmissiveFvPatchField.H | 192 ++++++++ .../acousticWaveTransmissiveFvPatchFields.C | 46 ++ .../acousticWaveTransmissiveFvPatchFields.H | 51 ++ ...cousticWaveTransmissiveFvPatchFieldsFwd.H} | 9 +- .../KirchhoffShell/KirchhoffShell.C | 319 +++++++++++++ .../KirchhoffShell/KirchhoffShell.H | 217 +++++++++ src/regionFaModels/Make/files | 16 + src/regionFaModels/Make/options | 16 + .../doc/thermalBaffleBoundaryConditionsDoc.H | 34 ++ .../thermalShellFvPatchScalarField.C | 152 ++++++ .../thermalShellFvPatchScalarField.H | 184 ++++++++ .../vibrationShellFvPatchScalarField.C | 169 +++++++ .../vibrationShellFvPatchScalarField.H | 172 +++++++ .../regionFaModel/regionFaModel.C | 172 +++++++ .../regionFaModel/regionFaModel.H | 256 ++++++++++ .../regionFaModel/regionFaModelI.H | 118 +++++ .../thermalShell/thermalShell.C | 232 +++++++++ .../thermalShell/thermalShell.H | 208 +++++++++ .../thermalShellModel/thermalShellModel.C | 121 +++++ .../thermalShellModel/thermalShellModel.H | 205 ++++++++ .../thermalShellModel/thermalShellModelNew.C | 69 +++ .../vibrationShellModel/vibrationShellModel.C | 148 ++++++ .../vibrationShellModel/vibrationShellModel.H | 218 +++++++++ .../vibrationShellModelNew.C | 68 +++ .../boundaryData/boundaryDataSurfaceWriter.H | 3 + .../solidProperties/C/C.C | 2 +- .../solidProperties/CaCO3/CaCO3.C | 2 +- .../solidProperties/ash/ash.C | 2 +- .../solidProperties/solidProperties.C | 18 +- .../solidProperties/solidProperties.H | 16 +- .../solidProperties/solidPropertiesI.H | 13 + .../acousticFoam/obliqueAirJet/Allclean | 10 + .../obliqueAirJet/Allrun-parallel | 13 + .../main/0.orig/h_vibrationShell | 30 ++ .../acousticFoam/obliqueAirJet/main/0.orig/pa | 67 +++ .../main/0.orig/ps_vibrationShell | 30 ++ .../main/0.orig/ws_vibrationShell | 31 ++ .../acousticFoam/obliqueAirJet/main/Allclean | 12 + .../obliqueAirJet/main/Allrun-parallel | 14 + .../obliqueAirJet/main/Allrun.pre | 12 + .../main/constant/faMesh/faMeshDefinition | 30 ++ .../main/constant/transportProperties | 21 + .../constant/triSurface/window_box.stl.gz | Bin 0 -> 51747 bytes .../obliqueAirJet/main/system/blockMeshDict | 46 ++ .../obliqueAirJet/main/system/controlDict | 48 ++ .../main/system/decomposeParDict | 22 + .../obliqueAirJet/main/system/faOptions | 31 ++ .../obliqueAirJet/main/system/faSchemes | 54 +++ .../obliqueAirJet/main/system/faSolution | 37 ++ .../obliqueAirJet/main/system/fvSchemes | 59 +++ .../obliqueAirJet/main/system/fvSolution | 43 ++ .../main/system/snappyHexMeshDict | 136 ++++++ .../obliqueAirJet/precursor/0.orig/T | 45 ++ .../obliqueAirJet/precursor/0.orig/U | 42 ++ .../obliqueAirJet/precursor/0.orig/alphat | 43 ++ .../obliqueAirJet/precursor/0.orig/nuTilda | 44 ++ .../obliqueAirJet/precursor/0.orig/nut | 43 ++ .../obliqueAirJet/precursor/0.orig/p | 43 ++ .../obliqueAirJet/precursor/Allclean | 12 + .../obliqueAirJet/precursor/Allrun-parallel | 20 + .../obliqueAirJet/precursor/Allrun.pre | 14 + .../constant/thermophysicalProperties | 52 +++ .../precursor/constant/turbulenceProperties | 36 ++ .../precursor/system/blockMeshDict | 231 +++++++++ .../precursor/system/changeDictionaryDict | 27 ++ .../precursor/system/controlDict | 86 ++++ .../precursor/system/createPatchDict | 41 ++ .../precursor/system/decomposeParDict | 22 + .../precursor/system/extrudeMeshDict | 44 ++ .../obliqueAirJet/precursor/system/fvSchemes | 63 +++ .../obliqueAirJet/precursor/system/fvSolution | 65 +++ .../precursor/system/topoSetDict | 29 ++ 131 files changed, 10959 insertions(+), 191 deletions(-) create mode 100644 applications/solvers/acoustic/acousticFoam/Make/files create mode 100644 applications/solvers/acoustic/acousticFoam/Make/options create mode 100644 applications/solvers/acoustic/acousticFoam/acousticFoam.C create mode 100644 applications/solvers/acoustic/acousticFoam/createFields.H create mode 100644 applications/solvers/acoustic/acousticFoam/createRegionControls.H create mode 100644 applications/solvers/acoustic/acousticFoam/paEqn.H create mode 100644 applications/solvers/acoustic/acousticFoam/readTransportProperties.H create mode 100644 src/faOptions/Make/files create mode 100644 src/faOptions/Make/options create mode 100644 src/faOptions/faOption/faOption.C create mode 100644 src/faOptions/faOption/faOption.H create mode 100644 src/faOptions/faOption/faOptionI.H create mode 100644 src/faOptions/faOption/faOptionIO.C create mode 100644 src/faOptions/faOption/faOptionList.C create mode 100644 src/faOptions/faOption/faOptionList.H create mode 100644 src/faOptions/faOption/faOptionListTemplates.C create mode 100644 src/faOptions/faOption/faOptions.C create mode 100644 src/faOptions/faOption/faOptions.H create mode 100644 src/faOptions/faOption/makeFaOption.H create mode 100644 src/faOptions/faceSetOption/faceSetOption.C create mode 100644 src/faOptions/faceSetOption/faceSetOption.H create mode 100644 src/faOptions/faceSetOption/faceSetOptionI.H create mode 100644 src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C create mode 100644 src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H create mode 100644 src/faOptions/sources/derived/externalFileSource/externalFileSource.C create mode 100644 src/faOptions/sources/derived/externalFileSource/externalFileSource.H create mode 100644 src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C create mode 100644 src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H create mode 100644 src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C create mode 100644 src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H create mode 100644 src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C create mode 100755 src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C create mode 100755 src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchFields.C => clampedPlate/clampedPlateFaPatchFields.C} (95%) mode change 100644 => 100755 rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchFields.H => clampedPlate/clampedPlateFaPatchFields.H} (90%) mode change 100644 => 100755 create mode 100755 src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchField.C => timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C} (65%) rename src/finiteArea/fields/faPatchFields/derived/{uniformFixedValue/uniformFixedValueFaPatchField.H => timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H} (56%) create mode 100644 src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C create mode 100644 src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H create mode 100644 src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H create mode 100644 src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H create mode 100644 src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H rename src/{finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H => finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H} (88%) create mode 100644 src/regionFaModels/KirchhoffShell/KirchhoffShell.C create mode 100644 src/regionFaModels/KirchhoffShell/KirchhoffShell.H create mode 100644 src/regionFaModels/Make/files create mode 100644 src/regionFaModels/Make/options create mode 100644 src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H create mode 100644 src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C create mode 100644 src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H create mode 100644 src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C create mode 100644 src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H create mode 100644 src/regionFaModels/regionFaModel/regionFaModel.C create mode 100644 src/regionFaModels/regionFaModel/regionFaModel.H create mode 100644 src/regionFaModels/regionFaModel/regionFaModelI.H create mode 100644 src/regionFaModels/thermalShell/thermalShell.C create mode 100644 src/regionFaModels/thermalShell/thermalShell.H create mode 100644 src/regionFaModels/thermalShellModel/thermalShellModel.C create mode 100644 src/regionFaModels/thermalShellModel/thermalShellModel.H create mode 100644 src/regionFaModels/thermalShellModel/thermalShellModelNew.C create mode 100644 src/regionFaModels/vibrationShellModel/vibrationShellModel.C create mode 100644 src/regionFaModels/vibrationShellModel/vibrationShellModel.H create mode 100644 src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/Allclean create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/triSurface/window_box.stl.gz create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel create mode 100755 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution create mode 100644 tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict diff --git a/applications/solvers/acoustic/acousticFoam/Make/files b/applications/solvers/acoustic/acousticFoam/Make/files new file mode 100644 index 00000000000..897caa0f26e --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/Make/files @@ -0,0 +1,3 @@ +acousticFoam.C + +EXE = $(FOAM_APPBIN)/acousticFoam diff --git a/applications/solvers/acoustic/acousticFoam/Make/options b/applications/solvers/acoustic/acousticFoam/Make/options new file mode 100644 index 00000000000..c12930f5c0a --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/Make/options @@ -0,0 +1,14 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/fvOption/lnInclude \ + -I$(LIB_SRC)/regionFaModels/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/transportModels/compressible/lnInclude + +EXE_LIBS = \ + -lfiniteVolume \ + -lfvOptions \ + -lmeshTools \ + -lsampling \ + -lregionFaModels diff --git a/applications/solvers/acoustic/acousticFoam/acousticFoam.C b/applications/solvers/acoustic/acousticFoam/acousticFoam.C new file mode 100644 index 00000000000..ab12a827f2c --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/acousticFoam.C @@ -0,0 +1,99 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Application + acousticFoam + +Group + grpAcousticSolvers + +Description + Acoustic solver solving the acoustic pressure wave equation. + + \f[ + \ddt2{pa} - c^2 \laplacian{pa} = 0 + \f] + + where + \vartable + c | Sound speed + pa | Acoustic pressure + \endvartable + +SourceFiles + acousticFoam.C + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "fvOptions.H" +#include "pimpleControl.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + argList::addNote + ( + "Acoustic solver solving the acoustic pressure wave equation." + ); + + #include "postProcess.H" + + #include "addCheckCaseOptions.H" + #include "setRootCaseLists.H" + #include "createTime.H" + #include "createMesh.H" + #include "createControl.H" + #include "createRegionControls.H" + + #include "readTransportProperties.H" + #include "createFields.H" + + Info<< "\nStarting time loop\n" << endl; + + while (runTime.run()) + { + ++runTime; + + Info<< "Time = " << runTime.timeName() << nl << endl; + + while (pimple.correct()) + { + #include "paEqn.H" + } + + runTime.write(); + + runTime.printExecutionTime(Info); + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/acoustic/acousticFoam/createFields.H b/applications/solvers/acoustic/acousticFoam/createFields.H new file mode 100644 index 00000000000..3a1eaa069fe --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/createFields.H @@ -0,0 +1,15 @@ + +Info << "\nReading pa" << endl; + +volScalarField pa +( + IOobject + ( + "pa", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); diff --git a/applications/solvers/acoustic/acousticFoam/createRegionControls.H b/applications/solvers/acoustic/acousticFoam/createRegionControls.H new file mode 100644 index 00000000000..a1888eead75 --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/createRegionControls.H @@ -0,0 +1,8 @@ +fvSolution solutionDict(runTime); + +const dictionary& pimpleDict = solutionDict.subDict("PIMPLE"); + +bool solvePrimaryRegion +( + pimpleDict.getOrDefault("solvePrimaryRegion", true) +); diff --git a/applications/solvers/acoustic/acousticFoam/paEqn.H b/applications/solvers/acoustic/acousticFoam/paEqn.H new file mode 100644 index 00000000000..d80eb80929a --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/paEqn.H @@ -0,0 +1,15 @@ + +fvScalarMatrix paEqn +( + fvm::d2dt2(pa) - sqr(c0)*fvc::laplacian(pa) +); + +if (solvePrimaryRegion) +{ + paEqn.relax(); + paEqn.solve(); +} +else +{ + pa.correctBoundaryConditions(); +} diff --git a/applications/solvers/acoustic/acousticFoam/readTransportProperties.H b/applications/solvers/acoustic/acousticFoam/readTransportProperties.H new file mode 100644 index 00000000000..5ff526af53f --- /dev/null +++ b/applications/solvers/acoustic/acousticFoam/readTransportProperties.H @@ -0,0 +1,23 @@ +Info<< "\nReading transportProperties" << endl; + +IOdictionary transportProperties +( + IOobject + ( + "transportProperties", + runTime.constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE + ) +); + +dimensionedScalar c0("c0", dimVelocity, transportProperties); + +dimensionedScalar rho("rho", dimDensity, transportProperties); + +scalar MaxCo = + max(mesh.surfaceInterpolation::deltaCoeffs()*c0).value() + *runTime.deltaT().value(); + +Info<< "Max acoustic Courant Number = " << MaxCo << endl; diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options index 14bbcc2cee2..241a4ff1a64 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/Make/options @@ -14,7 +14,9 @@ EXE_INC = \ -I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \ -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \ - -I$(LIB_SRC)/regionModels/regionModel/lnInclude + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/regionModels/regionModel/lnInclude \ + -I$(LIB_SRC)/regionFaModels/lnInclude EXE_LIBS = \ -lfiniteVolume \ @@ -28,4 +30,8 @@ EXE_LIBS = \ -lturbulenceModels \ -lcompressibleTurbulenceModels \ -lradiationModels \ - -lregionModels + -lfvOptions \ + -lfaOptions \ + -lregionModels \ + -lsampling \ + -lregionFaModels diff --git a/src/Allwmake b/src/Allwmake index 15a09cdc0a5..a2109cae24d 100755 --- a/src/Allwmake +++ b/src/Allwmake @@ -49,6 +49,7 @@ wmake $targetType fileFormats wmake $targetType surfMesh wmake $targetType meshTools +wmake $targetType finiteArea wmake $targetType finiteVolume wmake $targetType mesh/blockMesh @@ -85,7 +86,9 @@ regionModels/Allwmake $targetType $* lagrangian/Allwmake $targetType $* wmake $targetType fvOptions +wmake $targetType faOptions wmake $targetType fvMotionSolver +wmake $targetType regionFaModels wmake $targetType overset @@ -97,7 +100,6 @@ wmake $targetType waveModels wmake $targetType engine -wmake $targetType finiteArea wmake $targetType genericPatchFields conversion/Allwmake $targetType $* diff --git a/src/OpenFOAM/algorithms/subCycle/subCycle.H b/src/OpenFOAM/algorithms/subCycle/subCycle.H index 6de416d94b0..5024c7d8d6d 100644 --- a/src/OpenFOAM/algorithms/subCycle/subCycle.H +++ b/src/OpenFOAM/algorithms/subCycle/subCycle.H @@ -59,7 +59,12 @@ class subCycleField GeometricField& gf0_; //- Copy of the "real" old-time value of the field - GeometricField gf_0_; + tmp<GeometricField> gf_0_; + + GeometricField& gf00_; + + //- Copy of the "real" old-old-time value of the field + tmp<GeometricField> gf_00_; public: @@ -71,19 +76,28 @@ public: : gf_(gf), gf0_(gf.oldTime()), - gf_0_(gf0_.name() + "_", gf0_) - {} + gf00_(gf.oldTime().oldTime()) + { + { + gf_0_ = GeometricField::New(gf0_.name() + "_", gf0_); + gf_00_ = GeometricField::New(gf00_.name() + "_", gf00_); + } + } //- Destructor ~subCycleField() { - // Reset the old-time field - gf0_ = gf_0_; + if (gf_0_.valid()) + { + // Reset the old-time field + gf0_ = gf_0_; + + gf00_ = gf_00_; // Correct the time index of the field to correspond to the global time - gf_.timeIndex() = gf_.time().timeIndex(); - gf0_.timeIndex() = gf_.time().timeIndex(); + gf_.timeIndex() = gf_.time().timeIndex(); + } } @@ -96,7 +110,8 @@ public: void updateTimeIndex() { gf_.timeIndex() = gf_.time().timeIndex() + 1; - gf0_.timeIndex() = gf_.time().timeIndex() + 1; + gf0_.timeIndex() = gf0_.time().timeIndex() + 1; + gf00_.timeIndex() = gf00_.time().timeIndex() + 1; } }; diff --git a/src/OpenFOAM/db/Time/subCycleTime.C b/src/OpenFOAM/db/Time/subCycleTime.C index fc21130645d..32dee009156 100644 --- a/src/OpenFOAM/db/Time/subCycleTime.C +++ b/src/OpenFOAM/db/Time/subCycleTime.C @@ -36,7 +36,10 @@ Foam::subCycleTime::subCycleTime(Time& runTime, const label nCycles) total_(nCycles) { // Could avoid 0 or 1 nCycles here on construction - time_.subCycle(nCycles); + if (nCycles > 1) + { + time_.subCycle(nCycles); + } } @@ -64,7 +67,10 @@ bool Foam::subCycleTime::end() const void Foam::subCycleTime::endSubCycle() { - time_.endSubCycle(); + if (total_ > 1) + { + time_.endSubCycle(); + } // If called manually, ensure status() will return false @@ -89,8 +95,12 @@ bool Foam::subCycleTime::loop() Foam::subCycleTime& Foam::subCycleTime::operator++() { - ++time_; - ++index_; + if (total_ > 1) + { + time_++; + } + + index_++; // Register index change with Time, in case someone wants this information time_.subCycleIndex(index_); diff --git a/src/faOptions/Make/files b/src/faOptions/Make/files new file mode 100644 index 00000000000..cd8c59745df --- /dev/null +++ b/src/faOptions/Make/files @@ -0,0 +1,16 @@ +faOption/faOption.C +faOption/faOptionIO.C +faOption/faOptionList.C +faOption/faOptions.C + +faceSetOption/faceSetOption.C + +/* Sources */ +derivedSources=sources/derived + +$(derivedSources)/externalHeatFluxSource/externalHeatFluxSource.C +$(derivedSources)/jouleHeatingSource/jouleHeatingSource.C +$(derivedSources)/contactHeatFluxSource/contactHeatFluxSource.C +$(derivedSources)/externalFileSource/externalFileSource.C + +LIB = $(FOAM_LIBBIN)/libfaOptions diff --git a/src/faOptions/Make/options b/src/faOptions/Make/options new file mode 100644 index 00000000000..46c960d614b --- /dev/null +++ b/src/faOptions/Make/options @@ -0,0 +1,22 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteArea/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/solidThermo/lnInclude \ + -I$(LIB_SRC)/transportModels \ + -I$(LIB_SRC)/transportModels/compressible/lnInclude \ + -I$(LIB_SRC)/transportModels/incompressible/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude + +LIB_LIBS = \ + -lfiniteArea \ + -lfiniteVolume \ + -lsampling \ + -lmeshTools \ + -lturbulenceModels \ + -lincompressibleTurbulenceModels \ + -lcompressibleTurbulenceModels diff --git a/src/faOptions/faOption/faOption.C b/src/faOptions/faOption/faOption.C new file mode 100644 index 00000000000..708f7388511 --- /dev/null +++ b/src/faOptions/faOption/faOption.C @@ -0,0 +1,291 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faOption.H" +#include "areaFields.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + namespace fa + { + defineTypeNameAndDebug(option, 0); + defineRunTimeSelectionTable(option, dictionary); + } +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +void Foam::fa::option::constructMeshObjects() +{ + regionMeshPtr_.reset(new faMesh(mesh_)); + + vsmPtr_.reset(new volSurfaceMapping(regionMeshPtr_())); +} + + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::option::option +( + const word& name, + const word& modelType, + const dictionary& dict, + const fvPatch& patch +) +: + name_(name), + modelType_(modelType), + mesh_(patch.boundaryMesh().mesh()), + patch_(patch), + dict_(dict), + coeffs_(dict.optionalSubDict(modelType + "Coeffs")), + active_(dict.getOrDefault<Switch>("active", true)), + fieldNames_(), + applied_(), + regionName_(dict.get<word>("region")), + regionMeshPtr_(nullptr), + vsmPtr_(nullptr) +{ + constructMeshObjects(); + + Info<< incrIndent << indent << "Source: " << name_ << endl << decrIndent; +} + + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +Foam::autoPtr<Foam::fa::option> Foam::fa::option::New +( + const word& name, + const dictionary& coeffs, + const fvPatch& patch +) +{ + const word modelType(coeffs.get<word>("type")); + + Info<< indent + << "Selecting finite area options type " << modelType << endl; + + const_cast<Time&>(patch.boundaryMesh().mesh().time()).libs().open + ( + coeffs, + "libs", + dictionaryConstructorTablePtr_ + ); + + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); + + if (!cstrIter.found()) + { + FatalErrorInFunction + << "Unknown faOption model type " + << modelType << nl << nl + << "Valid faOption types are:" << nl + << dictionaryConstructorTablePtr_->sortedToc() + << exit(FatalError); + } + + return autoPtr<option>(cstrIter()(name, modelType, coeffs, patch)); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::fa::option::isActive() +{ + return active_; +} + + +Foam::label Foam::fa::option::applyToField(const word& fieldName) const +{ + return fieldNames_.find(fieldName); +} + + +void Foam::fa::option::checkApplied() const +{ + forAll(applied_, i) + { + if (!applied_[i]) + { + WarningInFunction + << "Source " << name_ << " defined for field " + << fieldNames_[i] << " but never used" << endl; + } + } +} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + faMatrix<scalar>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + faMatrix<vector>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + faMatrix<sphericalTensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + faMatrix<symmTensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + faMatrix<tensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<vector>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<sphericalTensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<symmTensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<tensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::constrain(faMatrix<scalar>& eqn, const label fieldi) +{} + + +void Foam::fa::option::constrain(faMatrix<vector>& eqn, const label fieldi) +{} + + +void Foam::fa::option::constrain +( + faMatrix<sphericalTensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::constrain +( + faMatrix<symmTensor>& eqn, + const label fieldi +) +{} + + +void Foam::fa::option::constrain(faMatrix<tensor>& eqn, const label fieldi) +{} + + +void Foam::fa::option::correct(areaScalarField& field) +{} + + +void Foam::fa::option::correct(areaVectorField& field) +{} + + +void Foam::fa::option::correct(areaSphericalTensorField& field) +{} + + +void Foam::fa::option::correct(areaSymmTensorField& field) +{} + + +void Foam::fa::option::correct(areaTensorField& field) +{} + + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOption.H b/src/faOptions/faOption/faOption.H new file mode 100644 index 00000000000..253c26e2b15 --- /dev/null +++ b/src/faOptions/faOption/faOption.H @@ -0,0 +1,441 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::option + +Description + Base abstract class for handling finite area options (i.e. \c faOption). + +Usage + Minimal example by using \c constant/faOptions: + \verbatim + <userDefinedName1> + { + // Mandatory entries (unmodifiable) + type <faOptionName>; + + // Mandatory entries (runtime modifiable) + region <regionName>; + + // Optional entries (unmodifiable/runtime modifiable) + <faOption>Coeffs + { + // subdictionary entries + } + + // Optional entries (runtime modifiable) + active true; + log true; + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Name of operand faOption | word | yes | - + region | Name of operand region | word | yes | - + \<faOption\>Coeffs | Dictionary containing settings of <!-- + --> the selected faOption settings | dictionary | no | - + active | Flag to (de)activate faOption | bool | no | true + log | Flag to log faOption-related info | bool | no | true + \endtable + +Note + - Source/sink options are to be added to the right-hand side of equations. + +SourceFiles + faOption.C + faOptionIO.C + +\*---------------------------------------------------------------------------*/ + +#ifndef faOption_H +#define faOption_H + +#include "faMatrices.H" +#include "areaFields.H" +#include "dictionary.H" +#include "Switch.H" +#include "runTimeSelectionTables.H" +#include "fvMesh.H" +#include "volSurfaceMapping.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class option Declaration +\*---------------------------------------------------------------------------*/ + +class option +{ + // Private Member Functions + + //- Construct region mesh and fields + void constructMeshObjects(); + + +protected: + + // Protected Data + + //- Source name + const word name_; + + //- Model type + const word modelType_; + + //- Reference to the mesh database + const fvMesh& mesh_; + + //- Reference to the patch + const fvPatch& patch_; + + //- Top level source dictionary + dictionary dict_; + + //- Dictionary containing source coefficients + dictionary coeffs_; + + //- Source active flag + Switch active_; + + //- Field names to apply source to - populated by derived models + wordList fieldNames_; + + //- Applied flag list - corresponds to each fieldNames_ entry + List<bool> applied_; + + //- Region name + word regionName_; + + //- Pointer to the region mesh database + autoPtr<faMesh> regionMeshPtr_; + + //-Volume-to surface mapping + autoPtr<volSurfaceMapping> vsmPtr_; + + +public: + + //- Runtime type information + TypeName("option"); + + + // Declare run-time constructor selection table + + declareRunTimeSelectionTable + ( + autoPtr, + option, + dictionary, + ( + const word& name, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ), + (name, modelType, dict, patch) + ); + + + // Constructors + + //- Construct from components + option + ( + const word& name, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ); + + //- Return clone + autoPtr<option> clone() const + { + NotImplemented; + return nullptr; + } + + //- Return pointer to new faOption object created + //- on the freestore from an Istream + class iNew + { + + //- Reference to the patch + const fvPatch& patch_; + + //- Name + const word& name_; + + public: + + iNew + ( + const fvPatch& patch, + const word& name + ) + : + patch_(patch), + name_(name) + {} + + autoPtr<option> operator()(Istream& is) const + { + const dictionary dict(is); + + return autoPtr<option> + ( + option::New(name_, dict, patch_) + ); + } + }; + + + // Selectors + + //- Return a reference to the selected faOption model + static autoPtr<option> New + ( + const word& name, + const dictionary& dict, + const fvPatch& patch + ); + + + //- Destructor + virtual ~option() = default; + + + // Member Functions + + // Access + + //- Return const access to the source name + inline const word& name() const; + + //- Return const access to the mesh database + inline const fvMesh& mesh() const; + + //- Return const access to fvPatch + inline const fvPatch& patch() const; + + //- Return dictionary + inline const dictionary& coeffs() const; + + //- Return const access to the source active flag + inline bool active() const; + + //- Set the applied flag to true for field index fieldi + inline void setApplied(const label fieldi); + + //- Return the region mesh database + inline const faMesh& regionMesh() const; + + //- Return volSurfaceMapping + inline const volSurfaceMapping& vsm() const; + + //- Region name + inline const word& regionName() const; + + + // Edit + + //- Return access to the source active flag + inline Switch& active(); + + + // Checks + + //- Is the source active? + virtual bool isActive(); + + //- Return index of field name if found in fieldNames list + virtual label applyToField(const word& fieldName) const; + + //- Check that the source has been applied + virtual void checkApplied() const; + + + // Evaluation + + // Explicit and implicit sources + + virtual void addSup + ( + const areaScalarField& h, + faMatrix<scalar>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + faMatrix<vector>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + faMatrix<symmTensor>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + faMatrix<sphericalTensor>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + faMatrix<tensor>& eqn, + const label fieldi + ); + + + // Explicit and implicit sources for compressible equations + + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<vector>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<symmTensor>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<sphericalTensor>& eqn, + const label fieldi + ); + + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<tensor>& eqn, + const label fieldi + ); + + + // Constraints + + virtual void constrain + ( + faMatrix<scalar>& eqn, + const label fieldi + ); + + virtual void constrain + ( + faMatrix<vector>& eqn, + const label fieldi + ); + + virtual void constrain + ( + faMatrix<sphericalTensor>& eqn, + const label fieldi + ); + + virtual void constrain + ( + faMatrix<symmTensor>& eqn, + const label fieldi + ); + + virtual void constrain + ( + faMatrix<tensor>& eqn, + const label fieldi + ); + + + // Correction + + virtual void correct(areaScalarField& field); + virtual void correct(areaVectorField& field); + virtual void correct(areaSphericalTensorField& field); + virtual void correct(areaSymmTensorField& field); + virtual void correct(areaTensorField& field); + + + // IO + + //- Write the source header information + virtual void writeHeader(Ostream&) const; + + //- Write the source footer information + virtual void writeFooter(Ostream&) const; + + //- Write the source properties + virtual void writeData(Ostream&) const; + + //- Read source dictionary + virtual bool read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "faOptionI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptionI.H b/src/faOptions/faOption/faOptionI.H new file mode 100644 index 00000000000..a541123f275 --- /dev/null +++ b/src/faOptions/faOption/faOptionI.H @@ -0,0 +1,108 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline const Foam::word& Foam::fa::option::name() const +{ + return name_; +} + + +inline const Foam::fvMesh& Foam::fa::option::mesh() const +{ + return mesh_; +} + + +inline const Foam::fvPatch& Foam::fa::option::patch() const +{ + return patch_; +} + + +inline const Foam::dictionary& Foam::fa::option::coeffs() const +{ + return coeffs_; +} + + +inline bool Foam::fa::option::active() const +{ + return active_; +} + + +inline void Foam::fa::option::setApplied(const label fieldi) +{ + applied_[fieldi] = true; +} + + +inline Foam::Switch& Foam::fa::option::active() +{ + return active_; +} + + +inline const Foam::word& Foam::fa::option::regionName() const +{ + return regionName_; +} + + +inline const Foam::faMesh& Foam::fa::option::regionMesh() const +{ + if (regionMeshPtr_.valid()) + { + return regionMeshPtr_(); + } + else + { + FatalErrorInFunction + << "Region mesh not available" << abort(FatalError); + } + return *(new faMesh(mesh_)); +} + + +inline const Foam::volSurfaceMapping& Foam::fa::option::vsm() const +{ + if (vsmPtr_.valid()) + { + return vsmPtr_(); + } + else + { + FatalErrorInFunction + << "vsmPtr not available" << abort(FatalError); + } + return *(new volSurfaceMapping(regionMeshPtr_())); +} + + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptionIO.C b/src/faOptions/faOption/faOptionIO.C new file mode 100644 index 00000000000..1cb2ab70f20 --- /dev/null +++ b/src/faOptions/faOption/faOptionIO.C @@ -0,0 +1,64 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faOption.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fa::option::writeHeader(Ostream& os) const +{ + os.beginBlock(name_); +} + + +void Foam::fa::option::writeFooter(Ostream& os) const +{ + os.endBlock(); +} + + +void Foam::fa::option::writeData(Ostream& os) const +{ + os.writeEntry("type", type()); + os.writeEntry("active", active_); + + os << nl; + coeffs_.writeEntry(word(type() + "Coeffs"), os); +} + + +bool Foam::fa::option::read(const dictionary& dict) +{ + dict.readIfPresent("active", active_); + + coeffs_ = dict.optionalSubDict(modelType_ + "Coeffs"); + + return true; +} + + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptionList.C b/src/faOptions/faOption/faOptionList.C new file mode 100644 index 00000000000..80de3cf682e --- /dev/null +++ b/src/faOptions/faOption/faOptionList.C @@ -0,0 +1,178 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faOptionList.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + defineTypeNameAndDebug(optionList, 0); +} +} + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +const Foam::dictionary& Foam::fa::optionList::optionsDict +( + const dictionary& dict +) const +{ + if (dict.found("options")) + { + return dict.subDict("options"); + } + else + { + return dict; + } +} + + +bool Foam::fa::optionList::readOptions(const dictionary& dict) +{ + checkTimeIndex_ = mesh_.time().timeIndex() + 2; + + bool allOk = true; + forAll(*this, i) + { + option& bs = this->operator[](i); + bool ok = bs.read(dict.subDict(bs.name())); + allOk = (allOk && ok); + } + return allOk; +} + + +void Foam::fa::optionList::checkApplied() const +{ + if (mesh_.time().timeIndex() == checkTimeIndex_) + { + forAll(*this, i) + { + const option& bs = this->operator[](i); + bs.checkApplied(); + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::optionList::optionList +( + const fvPatch& p, + const dictionary& dict +) +: + PtrList<option>(), + mesh_(p.boundaryMesh().mesh()), + patch_(p), + checkTimeIndex_(mesh_.time().startTimeIndex() + 2) +{ + reset(optionsDict(dict)); +} + + +Foam::fa::optionList::optionList(const fvPatch& p) +: + PtrList<option>(), + mesh_(p.boundaryMesh().mesh()), + patch_(p), + checkTimeIndex_(mesh_.time().startTimeIndex() + 2) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fa::optionList::reset(const dictionary& dict) +{ + // Count number of active faOptions + label count = 0; + for (const entry& dEntry : dict) + { + if (dEntry.isDict()) + { + ++count; + } + } + + this->resize(count); + + count = 0; + for (const entry& dEntry : dict) + { + if (dEntry.isDict()) + { + const word& name = dEntry.keyword(); + const dictionary& sourceDict = dEntry.dict(); + + this->set + ( + count++, + option::New(name, sourceDict, patch_) + ); + } + } +} + + +bool Foam::fa::optionList::read(const dictionary& dict) +{ + return readOptions(optionsDict(dict)); +} + + +bool Foam::fa::optionList::writeData(Ostream& os) const +{ + // Write list contents + forAll(*this, i) + { + os << nl; + this->operator[](i).writeHeader(os); + this->operator[](i).writeData(os); + this->operator[](i).writeFooter(os); + } + + // Check state of IOstream + return os.good(); +} + + +// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<<(Ostream& os, const fa::optionList& options) +{ + options.writeData(os); + return os; +} + + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptionList.H b/src/faOptions/faOption/faOptionList.H new file mode 100644 index 00000000000..290dc794a65 --- /dev/null +++ b/src/faOptions/faOption/faOptionList.H @@ -0,0 +1,250 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::optionList + +Description + List of finite volume options + +SourceFile + optionList.C + +\*---------------------------------------------------------------------------*/ + +#ifndef faOptionList_H +#define faOptionList_H + +#include "faOption.H" +#include "PtrList.H" +#include "GeometricField.H" +#include "geometricOneField.H" +#include "faPatchField.H" +#include "fvMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of friend functions and operators +namespace fa +{ + class optionList; +} + +Ostream& operator<<(Ostream& os, const fa::optionList& options); + +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class optionList Declaration +\*---------------------------------------------------------------------------*/ + +class optionList +: + public PtrList<option> +{ +protected: + + // Protected Data + + //- Reference to the mesh database + const fvMesh& mesh_; + + //- Reference to the patch + const fvPatch& patch_; + + //- Time index to check that all defined sources have been applied + label checkTimeIndex_; + + + // Protected Member Functions + + //- Return the "options" sub-dictionary if present otherwise return dict + const dictionary& optionsDict(const dictionary& dict) const; + + //- Read options dictionary + bool readOptions(const dictionary& dict); + + //- Check that all sources have been applied + void checkApplied() const; + + //- Return source for equation with specified name and dimensions + template<class Type> + tmp<faMatrix<Type>> source + ( + GeometricField<Type, faPatchField, areaMesh>& field, + const areaScalarField& h, + const word& fieldName, + const dimensionSet& ds + ); + + //- No copy construct + optionList(const optionList&) = delete; + + //- No copy assignment + void operator=(const optionList&) = delete; + + +public: + + //- Runtime type information + TypeName("optionList"); + + + // Constructors + + //- Construct null + optionList(const fvPatch& p); + + //- Construct from mesh and dictionary + optionList(const fvPatch&, const dictionary& ); + + + //- Destructor + virtual ~optionList() + {} + + + // Member Functions + + //- Reset the source list + void reset(const dictionary& dict); + + + // Sources + + //- Return source for equation + template<class Type> + tmp<faMatrix<Type>> operator() + ( + const areaScalarField& h, + GeometricField<Type, faPatchField, areaMesh>& field + ); + + //- Return source for equation with specified name + template<class Type> + tmp<faMatrix<Type>> operator() + ( + const areaScalarField& h, + GeometricField<Type, faPatchField, areaMesh>& field, + const word& fieldName + ); + + //- Return source for equation + template<class Type> + tmp<faMatrix<Type>> operator() + ( + const areaScalarField& h, + const areaScalarField& rho, + GeometricField<Type, faPatchField, areaMesh>& field + ); + + //- Return source for equation with specified name + template<class Type> + tmp<faMatrix<Type>> operator() + ( + const areaScalarField& h, + const areaScalarField& rho, + GeometricField<Type, faPatchField, areaMesh>& field, + const word& fieldName + ); + + + //- Return source for equation with specified name and dimensios + template<class Type> + tmp<faMatrix<Type>> operator() + ( + const areaScalarField& rho, + GeometricField<Type, faPatchField, areaMesh>& field, + const dimensionSet& ds + ); + + + //- Return source for equation with second time derivative + template<class Type> + tmp<faMatrix<Type>> d2dt2 + ( + GeometricField<Type, faPatchField, areaMesh>& field + ); + + //- Return source for equation with second time derivative + template<class Type> + tmp<faMatrix<Type>> d2dt2 + ( + GeometricField<Type, faPatchField, areaMesh>& field, + const word& fieldName + ); + + + // Constraints + + //- Apply constraints to equation + template<class Type> + void constrain(faMatrix<Type>& eqn); + + + // Correction + + //- Apply correction to field + template<class Type> + void correct(GeometricField<Type, faPatchField, areaMesh>& field); + + + // IO + + //- Read dictionary + virtual bool read(const dictionary& dict); + + //- Write data to Ostream + virtual bool writeData(Ostream& os) const; + + //- Ostream operator + friend Ostream& operator<< + ( + Ostream& os, + const optionList& options + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "faOptionListTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptionListTemplates.C b/src/faOptions/faOption/faOptionListTemplates.C new file mode 100644 index 00000000000..1a954bcce45 --- /dev/null +++ b/src/faOptions/faOption/faOptionListTemplates.C @@ -0,0 +1,290 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "profiling.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::source +( + GeometricField<Type, faPatchField, areaMesh>& field, + const areaScalarField& h, + const word& fieldName, + const dimensionSet& ds +) +{ + checkApplied(); + + tmp<faMatrix<Type>> tmtx(new faMatrix<Type>(field, ds)); + faMatrix<Type>& mtx = tmtx.ref(); + + forAll(*this, i) + { + option& source = this->operator[](i); + + label fieldi = source.applyToField(fieldName); + + if (fieldi != -1) + { + addProfiling(faopt, "faOption()." + source.name()); + + source.setApplied(fieldi); + + if (source.isActive()) + { + if (debug) + { + Info<< "Applying source " << source.name() << " to field " + << fieldName << endl; + } + + source.addSup(h, mtx, fieldi); + } + } + } + + return tmtx; +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator() +( + const areaScalarField& h, + GeometricField<Type, faPatchField, areaMesh>& field +) +{ + return this->operator()(h, field, field.name()); +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator() +( + const areaScalarField& h, + GeometricField<Type, faPatchField, areaMesh>& field, + const word& fieldName +) +{ + return source(field, h, fieldName, field.dimensions()/dimTime*dimArea); +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator() +( + const areaScalarField& h, + const areaScalarField& rho, + GeometricField<Type, faPatchField, areaMesh>& field +) +{ + return this->operator()(h, rho, field, field.name()); +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator() +( + const areaScalarField& h, + const areaScalarField& rho, + GeometricField<Type, faPatchField, areaMesh>& field, + const word& fieldName +) +{ + checkApplied(); + + const dimensionSet ds + ( + rho.dimensions()*field.dimensions()/dimTime*dimArea + ); + + tmp<faMatrix<Type>> tmtx(new faMatrix<Type>(field, ds)); + faMatrix<Type>& mtx = tmtx.ref(); + + forAll(*this, i) + { + option& source = this->operator[](i); + + label fieldi = source.applyToField(fieldName); + + if (fieldi != -1) + { + addProfiling(faopt, "faOption()." + source.name()); + + source.setApplied(fieldi); + + if (source.isActive()) + { + if (debug) + { + Info<< "Applying source " << source.name() << " to field " + << fieldName << endl; + } + + source.addSup(h, rho, mtx, fieldi); + } + } + } + + return tmtx; +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::operator() +( + const areaScalarField& rho, + GeometricField<Type, faPatchField, areaMesh>& field, + const dimensionSet& ds +) +{ + checkApplied(); + + const dimensionSet dsMat(ds*dimArea); + + tmp<faMatrix<Type>> tmtx(new faMatrix<Type>(field, dsMat)); + faMatrix<Type>& mtx = tmtx.ref(); + + forAll(*this, i) + { + option& source = this->operator[](i); + + label fieldi = source.applyToField(field.name()); + + if (fieldi != -1) + { + addProfiling(faopt, "faOption()." + source.name()); + + source.setApplied(fieldi); + + if (source.isActive()) + { + if (debug) + { + Info<< "Applying source " << source.name() << " to field " + << field.name() << endl; + } + + source.addSup(rho, mtx, fieldi); + } + } + } + + return tmtx; +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::d2dt2 +( + GeometricField<Type, faPatchField, areaMesh>& field +) +{ + return this->d2dt2(field, field.name()); +} + + +template<class Type> +Foam::tmp<Foam::faMatrix<Type>> Foam::fa::optionList::d2dt2 +( + GeometricField<Type, faPatchField, areaMesh>& field, + const word& fieldName +) +{ + return source(field, fieldName, field.dimensions()/sqr(dimTime)*dimArea); +} + + +template<class Type> +void Foam::fa::optionList::constrain(faMatrix<Type>& eqn) +{ + checkApplied(); + + forAll(*this, i) + { + option& source = this->operator[](i); + + label fieldi = source.applyToField(eqn.psi().name()); + + if (fieldi != -1) + { + addProfiling(faopt, "faOption::constrain." + eqn.psi().name()); + + source.setApplied(fieldi); + + if (source.isActive()) + { + if (debug) + { + Info<< "Applying constraint " << source.name() + << " to field " << eqn.psi().name() << endl; + } + + source.constrain(eqn, fieldi); + } + } + } +} + + +template<class Type> +void Foam::fa::optionList::correct +( + GeometricField<Type, faPatchField, areaMesh>& field +) +{ + const word& fieldName = field.name(); + + forAll(*this, i) + { + option& source = this->operator[](i); + + label fieldi = source.applyToField(fieldName); + + if (fieldi != -1) + { + addProfiling(faopt, "faOption::correct." + source.name()); + + source.setApplied(fieldi); + + if (source.isActive()) + { + if (debug) + { + Info<< "Correcting source " << source.name() + << " for field " << fieldName << endl; + } + + source.correct(field); + } + } + } +} + + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptions.C b/src/faOptions/faOption/faOptions.C new file mode 100644 index 00000000000..ef6e465813d --- /dev/null +++ b/src/faOptions/faOption/faOptions.C @@ -0,0 +1,144 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faOptions.H" +#include "faMesh.H" +#include "Time.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + namespace fa + { + defineTypeNameAndDebug(options, 0); + } +} + + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +Foam::IOobject Foam::fa::options::createIOobject +( + const fvMesh& mesh +) const +{ + IOobject io + ( + typeName, + mesh.time().constant(), + mesh, + IOobject::MUST_READ, + IOobject::NO_WRITE + ); + + if (io.typeHeaderOk<IOdictionary>(true)) + { + Info<< "Creating finite area options from " + << io.instance()/io.name() << nl + << endl; + + io.readOpt() = IOobject::MUST_READ_IF_MODIFIED; + return io; + } + else + { + // Check if the faOptions file is in system + io.instance() = mesh.time().system(); + + if (io.typeHeaderOk<IOdictionary>(true)) + { + Info<< "Creating finite area options from " + << io.instance()/io.name() << nl + << endl; + + io.readOpt() = IOobject::MUST_READ_IF_MODIFIED; + return io; + } + else + { + io.readOpt() = IOobject::NO_READ; + return io; + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::options::options +( + const fvPatch& p +) +: + IOdictionary(createIOobject(p.boundaryMesh().mesh())), + optionList(p, *this) +{} + + +Foam::fa::options& Foam::fa::options::New(const fvPatch& p) +{ + const fvMesh& mesh = p.boundaryMesh().mesh(); + + if (mesh.thisDb().foundObject<options>(typeName)) + { + return const_cast<options&> + ( + mesh.lookupObject<options>(typeName) + ); + } + else + { + if (debug) + { + InfoInFunction + << "Constructing " << typeName + << " for region " << mesh.name() << endl; + } + + options* objectPtr = new options(p); + regIOobject::store(objectPtr); + return *objectPtr; + } +} + + +bool Foam::fa::options::read() +{ + if (IOdictionary::regIOobject::read()) + { + optionList::read(*this); + return true; + } + else + { + return false; + } +} + + +// ************************************************************************* // diff --git a/src/faOptions/faOption/faOptions.H b/src/faOptions/faOption/faOptions.H new file mode 100644 index 00000000000..a80969885cc --- /dev/null +++ b/src/faOptions/faOption/faOptions.H @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::options + +Description + Finite-area options + +SourceFiles + faOptions.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fa_options_H +#define fa_options_H + +#include "faOptionList.H" +#include "IOdictionary.H" +#include "autoPtr.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class options Declaration +\*---------------------------------------------------------------------------*/ + +class options +: + public IOdictionary, + public optionList +{ + // Private Member Functions + + //- Create IO object if dictionary is present + IOobject createIOobject(const fvMesh& mesh) const; + + //- No copy construct + options(const options&) = delete; + + //- No copy assignment + void operator=(const options&) = delete; + + +public: + + // Declare name of the class and its debug switch + ClassName("faOptions"); + + + // Constructors + + //- Construct from components with list of field names + options(const fvPatch& p); + + //- Construct faOptions and register to database if not present + //- otherwise lookup and return + static options& New(const fvPatch& p); + + + //- Destructor + virtual ~options() + {} + + + // Member Functions + + //- Inherit read from optionList + using optionList::read; + + //- Read dictionary + virtual bool read(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/faOption/makeFaOption.H b/src/faOptions/faOption/makeFaOption.H new file mode 100644 index 00000000000..64a12e46919 --- /dev/null +++ b/src/faOptions/faOption/makeFaOption.H @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------ +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef makeFaOption_H +#define makeFaOption_H + +#include "faOption.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#define makeFaOption(Option, Type) \ + \ + defineTemplateTypeNameAndDebugWithName \ + ( \ + Foam::fa::Option<Foam::Type>, \ + #Type#Option, \ + 0 \ + ); \ + \ + Foam::fa::option::adddictionaryConstructorToTable \ + <Foam::fa::Option<Foam::Type>> \ + add##Option##Type##dictionary##ConstructorTooptionTable_ + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/faceSetOption/faceSetOption.C b/src/faOptions/faceSetOption/faceSetOption.C new file mode 100644 index 00000000000..24e176e56da --- /dev/null +++ b/src/faOptions/faceSetOption/faceSetOption.C @@ -0,0 +1,246 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faceSetOption.H" +#include "areaFields.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + namespace fa + { + defineTypeNameAndDebug(faceSetOption, 0); + } +} + + +const Foam::Enum +< + Foam::fa::faceSetOption::selectionModeType +> +Foam::fa::faceSetOption::selectionModeTypeNames_ +({ + { selectionModeType::smAll, "all" }, + { selectionModeType::smVolFaceZone, "volFaceZone" } +}); + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +void Foam::fa::faceSetOption::setSelection(const dictionary& dict) +{ + switch (selectionMode_) + { + case smAll: + { + break; + } + case smVolFaceZone: + { + dict.readEntry("faceZone", faceSetName_); + break; + } + default: + { + FatalErrorInFunction + << "Unknown selectionMode " + << selectionModeTypeNames_[selectionMode_] + << ". Valid selectionMode types : " + << selectionModeTypeNames_ + << exit(FatalError); + } + } +} + + +void Foam::fa::faceSetOption::setArea() +{ + // Set area information + + scalar sumArea = 0.0; + for (const label facei : faces_) + { + sumArea += regionMesh().S()[facei]; + } + reduce(sumArea, sumOp<scalar>()); + + const scalar AOld = A_; + A_ = sumArea; + + // Convert both areas to representation using current writeprecision + word AOldName(Time::timeName(AOld, IOstream::defaultPrecision())); + word AName(Time::timeName(A_, IOstream::defaultPrecision())); + + if (AName != AOldName) + { + Info<< indent + << "- selected " << returnReduce(faces_.size(), sumOp<label>()) + << " face(s) with area " << A_ << endl; + } +} + + +void Foam::fa::faceSetOption::setFaceSet() +{ + switch (selectionMode_) + { + case smVolFaceZone: + { + Info<< indent + << "- selecting faces using volume-mesh faceZone " + << faceSetName_ << endl; + + label zoneID = mesh_.faceZones().findZoneID(faceSetName_); + if (zoneID == -1) + { + FatalErrorInFunction + << "Cannot find faceZone " << faceSetName_ << endl + << "Valid faceZones are " << mesh_.faceZones().names() + << exit(FatalError); + } + + const faceZone& addr = mesh_.faceZones()[zoneID]; + + const bitSet isZoneFace(mesh_.nFaces(), addr); + + // Do we loop over faMesh faces or over faceZone faces? + const labelUList& faceLabels = regionMesh().faceLabels(); + + label n = 0; + for (const label facei : faceLabels) + { + if (isZoneFace[facei]) + { + n++; + } + } + faces_.setSize(n); + n = 0; + for (const label facei : faceLabels) + { + if (isZoneFace[facei]) + { + faces_[n++] = facei; + } + } + break; + } + + case smAll: + { + Info<< indent << "- selecting all faces" << endl; + faces_ = identity(regionMesh().nFaces()); + + break; + } + default: + { + FatalErrorInFunction + << "Unknown selectionMode " + << selectionModeTypeNames_[selectionMode_] + << ". Valid selectionMode types are " + << selectionModeTypeNames_ + << exit(FatalError); + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::faceSetOption::faceSetOption +( + const word& name, + const word& modelType, + const dictionary& dict, + const fvPatch& patch +) +: + option(name, modelType, dict, patch), + timeStart_(-1.0), + duration_(0.0), + selectionMode_(selectionModeTypeNames_.get("selectionMode", coeffs_)), + faceSetName_("none"), + A_(0.0) +{ + if (isActive()) + { + Info<< incrIndent; + read(dict); + setSelection(coeffs_); + setFaceSet(); + setArea(); + Info<< decrIndent; + } +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::fa::faceSetOption::isActive() +{ + if (option::isActive() && inTimeLimits(mesh_.time().value())) + { + // Update the face set if the mesh is changing + if (mesh_.changing()) + { + if (mesh_.topoChanging()) + { + setArea(); + // Force printing of new set area + A_ = -GREAT; + } + + // Report new area (if changed) + setArea(); + } + + return true; + } + + return false; +} + + +bool Foam::fa::faceSetOption::read(const dictionary& dict) +{ + if (option::read(dict)) + { + if (coeffs_.readIfPresent("timeStart", timeStart_)) + { + coeffs_.readEntry("duration", duration_); + } + + return true; + } + + return false; +} + + +// ************************************************************************* // diff --git a/src/faOptions/faceSetOption/faceSetOption.H b/src/faOptions/faceSetOption/faceSetOption.H new file mode 100644 index 00000000000..edbf26ed53b --- /dev/null +++ b/src/faOptions/faceSetOption/faceSetOption.H @@ -0,0 +1,241 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::faceSetOption + +Description + Intermediate abstract class for handling + face-set options for the derived faOptions. + +Usage + Minimal example by using \c constant/faOptions: + \verbatim + <userDefinedName1> + { + // Mandatory/Optional (inherited) entries + ... + + // Mandatory entries (unmodifiable) + selectionMode all; + + // Optional entries (runtime modifiable) + timeStart 1.0; + + // Conditional mandatory entries (runtime modifiable) + + // when timeStart entry is present + duration 1.4; + + // when selectionMode=volFaceZone + faceZone <faceZoneName>; + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + selectionMode | Mode of face selection - see below | word | yes | - + timeStart | Start time of faOption | scalar | no | -1 + duration | Duration of faOption execution <!-- + --> starting from timeStart | scalar | cndtnl | 0 + faceZone | Name of operand faceZone | word | cndtnl | - + \endtable + + Options for the \c selectionMode entry: + \verbatim + all | Use all faces in the computational domain + faceZone | Use a given faceZone + \endverbatim + + The inherited entries are elaborated in: + - \link faOption.H \endlink + +Note + - Source/sink options are to be added to the right-hand side of equations. + +SourceFiles + faceSetOption.C + +\*---------------------------------------------------------------------------*/ + +#ifndef faceSetOption_H +#define faceSetOption_H + +#include "faOption.H" +#include "faceSet.H" +#include "faMesh.H" +#include "Time.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class faceSetOption Declaration +\*---------------------------------------------------------------------------*/ + +class faceSetOption +: + public option +{ +public: + + // Public Enumeration + + //- Enumeration for selection mode types + enum selectionModeType + { + smAll, + smVolFaceZone + }; + + //- List of selection mode type names + static const Enum<selectionModeType> selectionModeTypeNames_; + + +protected: + + // Protected Data + + //- Time start + scalar timeStart_; + + //- Duration + scalar duration_; + + //- Face selection mode + selectionModeType selectionMode_; + + //- Name of zone for "faceZone" selectionMode + word faceSetName_; + + //- Set of faces to apply source to + labelList faces_; + + //- Sum of face area + scalar A_; + + + // Protected Functions + + //- Set the face selection + void setSelection(const dictionary& dict); + + //- Set the face set based on the user input selection mode + void setFaceSet(); + + //- Recalculate the area + void setArea(); + + +public: + + //- Runtime type information + TypeName("faceSetOption"); + + + // Constructors + + //- Construct from components + faceSetOption + ( + const word& name, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ); + + + //- Destructor + virtual ~faceSetOption() = default; + + + // Member Functions + + // Access + + //- Return const access to the time start + inline scalar timeStart() const; + + //- Return const access to the duration + inline scalar duration() const; + + //- Return true if within time limits + inline bool inTimeLimits(const scalar time) const; + + //- Return const access to the face selection mode + inline const selectionModeType& selectionMode() const; + + //- Return const access to the name of face set for "faceZone" + //- selectionMode + inline const word& faceSetName() const; + + //- Return const access to the total face area + inline scalar A() const; + + //- Return const access to the face set + inline const labelList& faces() const; + + + // Edit + + //- Return access to the time start + inline scalar& timeStart(); + + //- Return access to the duration + inline scalar& duration(); + + + // Checks + + //- Is the source active? + virtual bool isActive(); + + + // IO + + //- Read source dictionary + virtual bool read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "faceSetOptionI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/faceSetOption/faceSetOptionI.H b/src/faOptions/faceSetOption/faceSetOptionI.H new file mode 100644 index 00000000000..d63ee885604 --- /dev/null +++ b/src/faOptions/faceSetOption/faceSetOptionI.H @@ -0,0 +1,93 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline Foam::scalar Foam::fa::faceSetOption::timeStart() const +{ + return timeStart_; +} + + +inline Foam::scalar Foam::fa::faceSetOption::duration() const +{ + return duration_; +} + + +inline bool Foam::fa::faceSetOption::inTimeLimits(const scalar time) const +{ + return + ( + (timeStart_ < 0) + || + ( + (mesh_.time().value() >= timeStart_) + && (mesh_.time().value() <= (timeStart_ + duration_)) + ) + ); +} + + +inline const Foam::fa::faceSetOption::selectionModeType& +Foam::fa::faceSetOption::selectionMode() const +{ + return selectionMode_; +} + + +inline const Foam::word& Foam::fa::faceSetOption::faceSetName() const +{ + return faceSetName_; +} + + +inline Foam::scalar Foam::fa::faceSetOption::A() const +{ + return A_; +} + + +inline const Foam::labelList& Foam::fa::faceSetOption::faces() const +{ + return faces_; +} + + +inline Foam::scalar& Foam::fa::faceSetOption::timeStart() +{ + return timeStart_; +} + + +inline Foam::scalar& Foam::fa::faceSetOption::duration() +{ + return duration_; +} + + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C new file mode 100644 index 00000000000..e9a4133d7a9 --- /dev/null +++ b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.C @@ -0,0 +1,204 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "contactHeatFluxSource.H" +#include "faMatrices.H" +#include "addToRunTimeSelectionTable.H" +#include "volFields.H" +#include "famSup.H" +#include "zeroGradientFaPatchFields.H" + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + defineTypeNameAndDebug(contactHeatFluxSource, 0); + addToRunTimeSelectionTable(option, contactHeatFluxSource, dictionary); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::contactHeatFluxSource::contactHeatFluxSource +( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch +) +: + faceSetOption(sourceName, modelType, dict, patch), + temperatureCoupledBase(patch, dict), + TName_(dict.getOrDefault<word>("T", "T")), + TprimaryName_(dict.get<word>("Tprimary")), + Tp_(mesh().lookupObject<volScalarField>(TprimaryName_)), + Tw1_ + ( + IOobject + ( + "Tw1_" + sourceName, + mesh().time().timeName(), + mesh(), + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(dimTemperature, Zero), + zeroGradientFaPatchScalarField::typeName + ), + thicknessLayers_(Zero), + kappaLayers_(Zero), + contactRes_(0), + curTimeIndex_(-1) +{ + fieldNames_.setSize(1, TName_); + + applied_.setSize(fieldNames_.size(), false); + + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::areaScalarField> Foam::fa::contactHeatFluxSource::htc() const +{ + IOobject io + ( + "thtc", + mesh().time().timeName(), + mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ); + + tmp<areaScalarField> thtc + ( + new areaScalarField + ( + io, + regionMesh(), + dimensionedScalar(dimPower/dimArea/dimTemperature, Zero) + ) + ); + + areaScalarField& htc = thtc.ref(); + + const volScalarField::Boundary& vfb = Tp_.boundaryField(); + + htc.primitiveFieldRef() = + temperatureCoupledBase::kappa + ( + vsm().mapInternalToSurface<scalar>(vfb)() + )*patch().deltaCoeffs(); + + if (contactRes_ != 0) + { + tmp<areaScalarField> tcontact + ( + new areaScalarField + ( + io, + regionMesh(), + dimensionedScalar + ( + "contact", + dimPower/dimArea/dimTemperature, + contactRes_ + ) + ) + ); + areaScalarField& contact = tcontact.ref(); + htc.primitiveFieldRef() += contact.primitiveField(); + } + + return thtc; +} + + +void Foam::fa::contactHeatFluxSource::addSup +( + const areaScalarField& h, + const areaScalarField& rhoCph, + faMatrix<scalar>& eqn, + const label fieldi +) +{ + if (isActive()) + { + DebugInfo<< name() << ": applying source to " << eqn.psi().name() + << endl; + + if (curTimeIndex_ != mesh().time().timeIndex()) + { + const volScalarField::Boundary& vfb = Tp_.boundaryField(); + + Tw1_.primitiveFieldRef() = + this->vsm().mapInternalToSurface<scalar>(vfb); + + tmp<areaScalarField> htcw = htc(); + + eqn += -fam::Sp(htcw(), eqn.psi()) + htcw()*Tw1_; + + curTimeIndex_ = mesh().time().timeIndex(); + } + } +} + + +bool Foam::fa::contactHeatFluxSource::read(const dictionary& dict) +{ + if (option::read(dict)) + { + coeffs_.readIfPresent("T", TName_); + + if (dict.readIfPresent("thicknessLayers", thicknessLayers_)) + { + dict.readEntry("kappaLayers", kappaLayers_); + + if (thicknessLayers_.size() > 0) + { + // Calculate effective thermal resistance by harmonic averaging + forAll(thicknessLayers_, iLayer) + { + contactRes_ += thicknessLayers_[iLayer]/kappaLayers_[iLayer]; + } + contactRes_ = scalar(1)/contactRes_; + } + } + + return true; + } + + return false; +} + + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H new file mode 100644 index 00000000000..699c5214c0c --- /dev/null +++ b/src/faOptions/sources/derived/contactHeatFluxSource/contactHeatFluxSource.H @@ -0,0 +1,196 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::contactHeatFluxSource + +Group + grpFaOptionsSources + +Description + Applies contact heat flux between specified \c faMesh + and \c fvMesh within a specified region for compressible flows. + +Usage + Minimal example by using \c constant/faOptions: + \verbatim + contactHeatFluxSource1 + { + // Mandatory entries (unmodifiable) + type contactHeatFluxSource; + Tprimary <TprimaryFieldName>; + + // Optional entries (runtime modifiable) + T <Tname>; + thicknessLayers (<layer1> <layer2> ... <layerN>); + + // Conditional optional entries (runtime modifiable) + + // when the entry "thicknessLayers" is present + kappaLayers (<layer1> <layer2> ... <layerN>); + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: contactHeatFluxSource | word | yes | - + Tprimary | Name of primary temperature field | word | yes | - + T | Name of operand temperature field | word | no | T + thicknessLayers | List of thicknesses of layers | scalarList | no | - + kappaLayers | List of conductivities of layers | scalarList | cndtnl | - + \endtable + + The inherited entries are elaborated in: + - \link faOption.H \endlink + - \link faceSetOption.H \endlink + - \link temperatureCoupledBase.H \endlink + +SourceFiles + contactHeatFluxSource.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fa_contactHeatFluxSource_H +#define fa_contactHeatFluxSource_H + +#include "faOption.H" +#include "Function1.H" +#include "areaFields.H" +#include "faceSetOption.H" +#include "temperatureCoupledBase.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class contactHeatFluxSource Declaration +\*---------------------------------------------------------------------------*/ + +class contactHeatFluxSource +: + public faceSetOption, + public temperatureCoupledBase +{ + // Private Data + + //- Name of temperature field + word TName_; + + //- Name of primary temperature field + word TprimaryName_; + + //- Primary region temperature + const volScalarField& Tp_; + + //- Temperature - wall [K] + areaScalarField Tw1_; + + //- Thickness of layers + scalarList thicknessLayers_; + + //- Conductivity of layers + scalarList kappaLayers_; + + //- Total contact resistance + scalar contactRes_; + + //- Current time index (used for updating) + label curTimeIndex_; + + + // Private Member Functions + + //- Return htc from the primary region + tmp<areaScalarField> htc() const; + + +public: + + //- Runtime type information + TypeName("contactHeatFluxSource"); + + + // Constructors + + //- Construct from explicit source name and mesh + contactHeatFluxSource + ( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ); + + //- No copy construct + contactHeatFluxSource(const contactHeatFluxSource&) = delete; + + //- No copy assignment + void operator=(const contactHeatFluxSource&) = delete; + + + //- Destructor + virtual ~contactHeatFluxSource() = default; + + + // Member Functions + + // Evaluation + + //- Add explicit contribution to compressible momentum equation + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi + ); + + + // IO + + //- Read source dictionary + virtual bool read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/externalFileSource/externalFileSource.C b/src/faOptions/sources/derived/externalFileSource/externalFileSource.C new file mode 100644 index 00000000000..f5a95479d23 --- /dev/null +++ b/src/faOptions/sources/derived/externalFileSource/externalFileSource.C @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "externalFileSource.H" +#include "faMatrices.H" +#include "faCFD.H" +#include "zeroGradientFaPatchFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + defineTypeNameAndDebug(externalFileSource, 0); + addToRunTimeSelectionTable(option, externalFileSource, dictionary); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::externalFileSource::externalFileSource +( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& p +) +: + faceSetOption(sourceName, modelType, dict, p), + fieldName_(dict.get<word>("fieldName")), + tableName_(dict.get<word>("tableName")), + pExt_ + ( + IOobject + ( + "pExt", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar("pExt", dimPressure, Zero), + zeroGradientFaPatchScalarField::typeName + ), + value_ + ( + new PatchFunction1Types::MappedFile<scalar> + ( + p.patch(), + "uniformValue", + dict, + tableName_, // field table name + true // face values + ) + ), + curTimeIndex_(-1) +{ + fieldNames_.setSize(1, fieldName_); + + applied_.setSize(fieldNames_.size(), false); + + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fa::externalFileSource::addSup +( + const areaScalarField& solidMass, + faMatrix<scalar>& eqn, + const label fieldi +) +{ + const scalar t = mesh().time().value(); + + if (isActive() && t > timeStart() && t < (timeStart() + duration())) + { + DebugInfo<< name() << ": applying source to " << eqn.psi().name()<<endl; + + if (curTimeIndex_ != mesh().time().timeIndex()) + { + pExt_.field() = value_->value(t); + eqn += pExt_/solidMass; + curTimeIndex_ = mesh().time().timeIndex(); + } + } +} + + +bool Foam::fa::externalFileSource::read(const dictionary& dict) +{ + if (option::read(dict)) + { + return true; + } + + return false; +} + + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/externalFileSource/externalFileSource.H b/src/faOptions/sources/derived/externalFileSource/externalFileSource.H new file mode 100644 index 00000000000..6d6c0ec2dad --- /dev/null +++ b/src/faOptions/sources/derived/externalFileSource/externalFileSource.H @@ -0,0 +1,169 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::externalFileSource + +Group + grpFaOptionsSources + +Description + Applies sources on a specified field within a specified region + by using an external table file for compressible flows. + +Usage + Minimal example by using \c constant/faOptions: + \verbatim + externalFileSource1 + { + // Mandatory entries (unmodifiable) + type externalFileSource; + fieldName <fieldName>; + tableName <tableFileName.dat>; + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: externalFileSource | word | yes | - + fieldName | Name of operand field | word | yes | - + tableName | Name of operand table file | word | yes | - + \endtable + + The inherited entries are elaborated in: + - \link faOption.H \endlink + - \link faceSetOption.H \endlink + +See also + - Foam::PatchFunction1Types + +SourceFiles + externalFileSource.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fa_externalFileSource_H +#define fa_externalFileSource_H + +#include "faOption.H" +#include "areaFields.H" +#include "faceSetOption.H" +#include "MappedFile.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class externalFileSource Declaration +\*---------------------------------------------------------------------------*/ + +class externalFileSource +: + public faceSetOption +{ + // Private Data + + //- Name of the field to apply this source + word fieldName_; + + //- Name of the table + word tableName_; + + //- External pressure field + areaScalarField pExt_; + + //- Mapped data from file + autoPtr<PatchFunction1Types::MappedFile<scalar>> value_; + + //- Current time index (used for updating) + label curTimeIndex_; + + +public: + + //- Runtime type information + TypeName("externalFileSource"); + + + // Constructors + + //- Construct from explicit source name and mesh + externalFileSource + ( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ); + + //- No copy construct + externalFileSource(const externalFileSource&) = delete; + + //- No copy assignment + void operator=(const externalFileSource&) = delete; + + + //- Destructor + virtual ~externalFileSource() = default; + + + // Member Functions + + // Evaluation + + //- Add explicit contribution to compressible momentum equation + virtual void addSup + ( + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi + ); + + + // IO + + //- Read source dictionary + virtual bool read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C new file mode 100644 index 00000000000..478fc81b5ce --- /dev/null +++ b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.C @@ -0,0 +1,208 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "externalHeatFluxSource.H" +#include "addToRunTimeSelectionTable.H" +#include "physicoChemicalConstants.H" +#include "zeroGradientFaPatchFields.H" +#include "addToRunTimeSelectionTable.H" + +using Foam::constant::physicoChemical::sigma; + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + defineTypeNameAndDebug(externalHeatFluxSource, 0); + addToRunTimeSelectionTable(option, externalHeatFluxSource, dictionary); +} +} + + +const Foam::Enum +< + Foam::fa::externalHeatFluxSource::operationMode +> +Foam::fa::externalHeatFluxSource::operationModeNames +({ + { operationMode::fixedPower, "power" }, + { operationMode::fixedHeatFlux, "flux" }, + { operationMode::fixedHeatTransferCoeff, "coefficient" }, +}); + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::externalHeatFluxSource::externalHeatFluxSource +( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch +) +: + faceSetOption(sourceName, modelType, dict, patch), + mode_(operationModeNames.get("mode", dict)), + TName_(dict.getOrDefault<word>("T", "T")), + Q_(0), + q_(0), + h_(0), + Ta_(), + emissivity_(dict.getOrDefault<scalar>("emissivity", 0)) +{ + fieldNames_.setSize(1, TName_); + + applied_.setSize(fieldNames_.size(), false); + + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fa::externalHeatFluxSource::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi +) +{ + if (isActive()) + { + DebugInfo<< name() << ": applying source to " + << eqn.psi().name() << endl; + + IOobject io + ( + "Q", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ); + + auto tQ = new areaScalarField + ( + io, + regionMesh(), + dimensionedScalar("q", dimPower/sqr(dimLength), 0), + zeroGradientFaPatchScalarField::typeName + ); + areaScalarField& Q = *tQ; + + switch (mode_) + { + case fixedPower: + { + Q.primitiveFieldRef() = Q_/regionMesh().S().field(); + eqn += Q; + + break; + } + case fixedHeatFlux: + { + Q.primitiveFieldRef() = q_; + eqn += Q; + break; + } + case fixedHeatTransferCoeff: + { + const dimensionedScalar Ta + ( + "Ta", + dimTemperature, + Ta_->value(mesh_.time().timeOutputValue()) + ); + + areaScalarField hp + ( + io, + regionMesh(), + dimensionedScalar + ( + "h", + dimPower/sqr(dimLength)/dimTemperature, + h_ + ) + ); + + const areaScalarField hpTa(hp*Ta); + + if (emissivity_ > 0) + { + hp -= emissivity_*sigma.value()*pow3(eqn.psi()); + } + + eqn -= fam::SuSp(hp, eqn.psi()) - hpTa; + + } + } + } +} + + +bool Foam::fa::externalHeatFluxSource::read(const dictionary& dict) +{ + if (option::read(dict)) + { + dict.readIfPresent("T", TName_); + dict.readIfPresent("emissivity", emissivity_); + + mode_ = operationModeNames.get("mode", dict); + + switch (mode_) + { + case fixedPower: + { + dict.readEntry("Q", Q_); + break; + } + case fixedHeatFlux: + { + dict.readEntry("q", q_); + break; + } + case fixedHeatTransferCoeff: + { + dict.readEntry("h", h_); + Ta_ = Function1<scalar>::New("Ta", dict); + break; + } + } + + return true; + } + + return false; +} + + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H new file mode 100644 index 00000000000..97873b29ffd --- /dev/null +++ b/src/faOptions/sources/derived/externalHeatFluxSource/externalHeatFluxSource.H @@ -0,0 +1,241 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::externalHeatFluxSource + +Group + grpFaOptionsSources + +Description + Applies a heat flux condition for a specified \c faMesh region + to temperature on an external wall for compressible flows + in one of three modes: + + - fixed power: supply \c Q + - fixed heat flux: supply \c q + - fixed heat transfer coefficient: supply \c h and \c Ta + + where + \vartable + Q | Power [W] + q | Heat flux [W/m^2] + h | Heat transfer coefficient [W/m^2/K] + Ta | Ambient temperature [K] + \endvartable + + The ambient temperature \c Ta is specified + as a \c Foam::Function1 of time but uniform in space. + +Usage + Minimal example by using \c constant/faOptions: + \verbatim + externalHeatFluxSource1 + { + // Mandatory entries (unmodifiable) + type externalHeatFluxSource; + + // Mandatory entries (runtime modifiable) + mode <mode>; + + // Optional entries (runtime modifiable) + T <Tname>; + emissivity 0; + + // Conditional mandatory entries (runtime modifiable) + + // when mode=power + Q 1.0; + + // when mode=flux + q 1.0; + + // when mode=coefficient + h 1.0; + Ta <Function1>; + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: externalHeatFluxSource | word | yes | - + mode | Mode of heat flux condition | word | yes | - + T | Name of operand temperature field | word | no | T + emissivity | Surface emissivity for radiative flux to ambient <!-- + --> | scalar | no | 0 + Q | Fixed heat power [W] | scalar | cndtnl | - + q | Fixed heat flux [W/m2] | scalar | cndtnl | - + h | Heat transfer coefficient [W/m^2/K] | scalar | cndtnl | - + Ta | Ambient temperature [K] | Function1 | cndtnl | - + \endtable + + The inherited entries are elaborated in: + - \link faOption.H \endlink + - \link faceSetOption.H \endlink + + Options for the \c mode entry: + \verbatim + power | Use fixed power (supply Q) + flux | Use fixed heat flux (supply q) + coefficient | Use fixes heat transfer coefficient (supply h and T) + \endverbatim + +See also + - Foam::Function1 + +SourceFiles + externalHeatFluxSource.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fa_externalHeatFluxSource_H +#define fa_externalHeatFluxSource_H + +#include "faOption.H" +#include "Function1.H" +#include "areaFields.H" +#include "faceSetOption.H" +#include "faCFD.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class externalHeatFluxSource Declaration +\*---------------------------------------------------------------------------*/ + +class externalHeatFluxSource +: + public faceSetOption +{ +public: + + // Public Enumeration + + //- Options for the heat transfer condition mode + enum operationMode + { + fixedPower, //!< Fixed heat power [W] + fixedHeatFlux, //!< Fixed heat flux [W/m2] + fixedHeatTransferCoeff, //!< Fixed heat transfer coefficient + }; + + //- Names for operationMode + static const Enum<operationMode> operationModeNames; + + +private: + + // Private Data + + //- Operation mode + operationMode mode_; + + //- Name of temperature field + word TName_; + + //- Heat power [W] + scalar Q_; + + //- Heat flux [W/m2] + scalar q_; + + //- Heat transfer coefficient [W/m2K] + scalar h_; + + //- Ambient temperature [K] + autoPtr<Function1<scalar>> Ta_; + + //- Optional surface emissivity for radiative transfer to ambient + scalar emissivity_; + + +public: + + //- Runtime type information + TypeName("externalHeatFluxSource"); + + + // Constructors + + //- Construct from explicit source name and mesh + externalHeatFluxSource + ( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ); + + //- No copy construct + externalHeatFluxSource(const externalHeatFluxSource&) = delete; + + //- No copy assignment + void operator=(const externalHeatFluxSource&) = delete; + + + //- Destructor + virtual ~externalHeatFluxSource() = default; + + + // Member Functions + + // Evaluation + + //- Add explicit contribution to compressible momentum equation + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi + ); + + + // IO + + //- Read source dictionary + virtual bool read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C new file mode 100644 index 00000000000..2d9cfc63218 --- /dev/null +++ b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.C @@ -0,0 +1,193 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "jouleHeatingSource.H" +#include "faMatrices.H" +#include "faCFD.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + defineTypeNameAndDebug(jouleHeatingSource, 0); + addToRunTimeSelectionTable(option, jouleHeatingSource, dictionary); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::fa::jouleHeatingSource::jouleHeatingSource +( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch +) +: + faceSetOption(sourceName, modelType, dict, patch), + TName_(dict.getOrDefault<word>("T", "T")), + V_ + ( + IOobject + ( + typeName + ":V_" + regionName_, + mesh().time().timeName(), + mesh(), + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + regionMesh() + ), + scalarSigmaVsTPtr_(nullptr), + tensorSigmaVsTPtr_(nullptr), + curTimeIndex_(-1), + nIter_(1), + anisotropicElectricalConductivity_(false) +{ + fieldNames_.setSize(1, TName_); + + applied_.setSize(fieldNames_.size(), false); + + if (anisotropicElectricalConductivity_) + { + Info<< " Using tensor electrical conductivity" << endl; + + initialiseSigma(coeffs_, tensorSigmaVsTPtr_); + } + else + { + Info<< " Using scalar electrical conductivity" << endl; + + initialiseSigma(coeffs_, scalarSigmaVsTPtr_); + } + + read(dict); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::fa::jouleHeatingSource::addSup +( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi +) +{ + if (isActive()) + { + DebugInfo<< name() << ": applying source to " << eqn.psi().name() + << endl; + + if (curTimeIndex_ != mesh().time().timeIndex()) + { + for (label i = 0; i < nIter_; ++i) + { + if (anisotropicElectricalConductivity_) + { + // Update sigma as a function of T if required + const areaTensorField& sigma = + updateSigma(tensorSigmaVsTPtr_); + + // Solve the electrical potential equation + faScalarMatrix VEqn(fam::laplacian(h*sigma, V_)); + VEqn.relax(); + VEqn.solve(); + } + else + { + // Update sigma as a function of T if required + const areaScalarField& sigma = + updateSigma(scalarSigmaVsTPtr_); + + // Solve the electrical potential equation + faScalarMatrix VEqn(fam::laplacian(h*sigma, V_)); + VEqn.relax(); + VEqn.solve(); + } + } + + curTimeIndex_ = mesh().time().timeIndex(); + } + + // Add the Joule heating contribution + areaVectorField gradV("gradV", fac::grad(V_)); + + if (anisotropicElectricalConductivity_) + { + const auto& sigma = + mesh_.lookupObject<areaTensorField> + ( + typeName + ":sigma_" + regionName_ + ); + + eqn += (h*sigma & gradV) & gradV; + } + else + { + const auto& sigma = + mesh_.lookupObject<areaScalarField> + ( + typeName + ":sigma_" + regionName_ + ); + + eqn += (h*sigma*gradV) & gradV; + + if (mesh().time().outputTime() && debug) + { + areaScalarField qgradV("gradVSource", (gradV & gradV)); + qgradV.write(); + } + } + } +} + + +bool Foam::fa::jouleHeatingSource::read(const dictionary& dict) +{ + if (option::read(dict)) + { + dict.readIfPresent("T", TName_); + + dict.readIfPresent("nIter", nIter_); + + anisotropicElectricalConductivity_ = + dict.get<bool>("anisotropicElectricalConductivity"); + + return true; + } + + return false; +} + + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H new file mode 100644 index 00000000000..4a5a279a145 --- /dev/null +++ b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSource.H @@ -0,0 +1,265 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::fa::jouleHeatingSource + +Group + grpFaOptionsSources + +Description + Evolves an electrical potential equation + + \f[ + \grad \left( \sigma \grad V \right) + \f] + + where \f$ V \f$ is electrical potential + and \f$\sigma\f$ is the electrical current. + + To provide a Joule heating contribution according to: + + Differential form of Joule heating - power per unit volume: + + \f[ + \frac{d(P)}{d(V)} = J \cdot E + \f] + + where \f$ J \f$ is the current density and \f$ E \f$ the electric field. + If no magnetic field is present: + + \f[ + J = \sigma E + \f] + + The electric field given by + + \f[ + E = \grad V + \f] + + Therefore: + + \f[ + \frac{d(P)}{d(V)} = J \cdot E + = (sigma E) \cdot E + = (sigma \grad V) \cdot \grad V + \f] + +Usage + Minimal example by using \c constant/faOptions: + \verbatim + jouleHeatingSource1 + { + // Mandatory entries (unmodifiable) + type jouleHeatingSource; + + // Mandatory entries (runtime modifiable) + anisotropicElectricalConductivity true; + + // Optional entries (runtime modifiable) + T <Tname>; + nIter -1; + + // Conditional mandatory entries (runtime modifiable) + + // when the entry "sigma" is present + sigma <Function1>; + + // when when the entry "sigma" is not present + // read "sigma" from file + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: jouleHeatingSource | word | yes | - + anisotropicElectricalConductivity | Flag to indicate that <!-- + --> if the electrical conductivity is anisotropic <!-- + --> | bool | yes | - + T | Name of operand temperature field | word | no | T + sigma | Electrical conductivity as a function of temperature <!-- + --> | table | no | - + nIter | Number of iterations for electrical potential equation <!-- + --> solution | label | no | -1 + \endtable + + The inherited entries are elaborated in: + - \link faOption.H \endlink + - \link faceSetOption.H \endlink + +Note + - \c anisotropicElectricalConductivity=true enables + anisotropic (tensorial) electrical conductivity. + - \c anisotropicElectricalConductivity=false enables + isotropic (scalar) electrical conductivity. + - The electrical conductivity can be specified using either: + - If the \c sigma entry is present the electrical conductivity is specified + as a function of temperature using a \c Function1 type. + - If not present the \c sigma field will be read from file. + - If the \c anisotropicElectricalConductivity flag is set to \c true, + \c sigma should be specified as a tensor quantity. + +See also + - Foam::Function1 + +SourceFiles + jouleHeatingSource.C + jouleHeatingSourceTemplates.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fa_jouleHeatingSource_H +#define fa_jouleHeatingSource_H + +#include "faOption.H" +#include "Function1.H" +#include "areaFields.H" +#include "faceSetOption.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class jouleHeatingSource Declaration +\*---------------------------------------------------------------------------*/ + +class jouleHeatingSource +: + public faceSetOption +{ + // Private Data + + //- Name of temperature field + word TName_; + + //- Electrical potential field / [V] + areaScalarField V_; + + //- Electrical conductivity as a scalar function of temperature + autoPtr<Function1<scalar>> scalarSigmaVsTPtr_; + + //- Electrical conductivity as a tensor function of temperature + autoPtr<Function1<tensor>> tensorSigmaVsTPtr_; + + //- Current time index (used for updating) + label curTimeIndex_; + + //- Number of iterations for electrical potential equation solution + label nIter_; + + //- Flag to indicate that the electrical conductivity is anisotropic + bool anisotropicElectricalConductivity_; + + + // Private Member Functions + + //- Initialise the electrical conductivity field + template<class Type> + void initialiseSigma + ( + const dictionary& dict, + autoPtr<Function1<Type>>& sigmaVsTPtr + ); + + //- Update the electrical conductivity field + template<class Type> + const GeometricField<Type, faPatchField, areaMesh>& + updateSigma(const autoPtr<Function1<Type>>& sigmaVsTPtr) const; + + +public: + + //- Runtime type information + TypeName("jouleHeatingSource"); + + + // Constructors + + //- Construct from explicit source name and mesh + jouleHeatingSource + ( + const word& sourceName, + const word& modelType, + const dictionary& dict, + const fvPatch& patch + ); + + //- No copy construct + jouleHeatingSource(const jouleHeatingSource&) = delete; + + //- No copy assignment + void operator=(const jouleHeatingSource&) = delete; + + + //- Destructor + virtual ~jouleHeatingSource() = default; + + + // Member Functions + + // Evaluation + + //- Add explicit contribution to compressible momentum equation + virtual void addSup + ( + const areaScalarField& h, + const areaScalarField& rho, + faMatrix<scalar>& eqn, + const label fieldi + ); + + + // IO + + //- Read source dictionary + virtual bool read(const dictionary& dict); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "jouleHeatingSourceTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C new file mode 100644 index 00000000000..55f8b8da199 --- /dev/null +++ b/src/faOptions/sources/derived/jouleHeatingSource/jouleHeatingSourceTemplates.C @@ -0,0 +1,140 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "emptyFaPatch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template<class Type> +void Foam::fa::jouleHeatingSource::initialiseSigma +( + const dictionary& dict, + autoPtr<Function1<Type>>& sigmaVsTPtr +) +{ + typedef GeometricField<Type, faPatchField, areaMesh> AreaFieldType; + + if (dict.found("sigma")) + { + // Sigma to be defined using a Function1 type + sigmaVsTPtr = Function1<Type>::New("sigma", dict); + + auto tsigma = tmp<AreaFieldType>::New + ( + IOobject + ( + typeName + ":sigma_" + regionName_, + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + regionMesh(), + dimensioned<Type>(sqr(dimCurrent)/dimPower/dimLength, Zero) + ); + + mesh_.objectRegistry::store(tsigma.ptr()); + + Info<< " Conductivity 'sigma' read from dictionary as f(T)" + << nl << endl; + } + else + { + // Sigma to be defined by user input + auto tsigma = tmp<AreaFieldType>::New + ( + IOobject + ( + typeName + ":sigma_" + regionName_, + mesh().time().timeName(), + mesh(), + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + regionMesh() + ); + + mesh().objectRegistry::store(tsigma.ptr()); + + Info<< " Conductivity 'sigma' read from file" << nl << endl; + } +} + + +template<class Type> +const Foam::GeometricField<Type, Foam::faPatchField, Foam::areaMesh>& +Foam::fa::jouleHeatingSource::updateSigma +( + const autoPtr<Function1<Type>>& sigmaVsTPtr +) const +{ + typedef GeometricField<Type, faPatchField, areaMesh> AreaFieldType; + + auto& sigma = + mesh().lookupObjectRef<AreaFieldType> + ( + typeName + ":sigma_" + regionName_ + ); + + if (!sigmaVsTPtr.valid()) + { + // Electrical conductivity field, sigma, was specified by the user + return sigma; + } + + const auto& T = mesh().lookupObject<areaScalarField>(TName_); + + // Internal field + forAll(sigma, i) + { + sigma[i] = sigmaVsTPtr->value(T[i]); + } + + + // Boundary field + typename AreaFieldType::Boundary& bf = sigma.boundaryFieldRef(); + forAll(bf, patchi) + { + faPatchField<Type>& pf = bf[patchi]; + if (!isA<emptyFaPatch>(bf[patchi])) + { + const scalarField& Tbf = T.boundaryField()[patchi]; + forAll(pf, facei) + { + pf[facei] = sigmaVsTPtr->value(Tbf[facei]); + } + } + } + + // Update processor patches + sigma.correctBoundaryConditions(); + + return sigma; +} + + +// ************************************************************************* // diff --git a/src/finiteArea/Make/files b/src/finiteArea/Make/files index 631570b62c0..a61dab59417 100644 --- a/src/finiteArea/Make/files +++ b/src/finiteArea/Make/files @@ -48,7 +48,8 @@ $(derivedFaPatchFields)/fixedValueOutflow/fixedValueOutflowFaPatchFields.C $(derivedFaPatchFields)/inletOutlet/inletOutletFaPatchFields.C $(derivedFaPatchFields)/slip/slipFaPatchFields.C $(derivedFaPatchFields)/edgeNormalFixedValue/edgeNormalFixedValueFaPatchVectorField.C -$(derivedFaPatchFields)/uniformFixedValue/uniformFixedValueFaPatchFields.C +$(derivedFaPatchFields)/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C +$(derivedFaPatchFields)/clampedPlate/clampedPlateFaPatchFields.C faePatchFields = fields/faePatchFields $(faePatchFields)/faePatchField/faePatchFields.C @@ -81,6 +82,7 @@ $(schemes)/upwind/upwindEdgeInterpolationMake.C $(schemes)/linearUpwind/linearUpwindEdgeInterpolationMake.C $(schemes)/Gamma/GammaEdgeInterpolationMake.C $(schemes)/blended/blendedEdgeInterpolationMake.C +$(schemes)/skewCorrected/skewCorrectedEdgeInterpolationMake.C finiteArea/fa/fa.C finiteArea/faSchemes/faSchemes.C diff --git a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C index 2c954b2eea8..52f7a3ba624 100644 --- a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C +++ b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.C @@ -343,8 +343,8 @@ Foam::tmp<Foam::vectorField> Foam::faPatch::ngbPolyPatchPointNormals() const const labelListList& pntEdges = pointEdges(); - tmp<vectorField> tpN(new vectorField(pntEdges.size(), Zero)); - vectorField& pN = tpN.ref(); + auto tpN = tmp<vectorField>::New(pntEdges.size(), Zero); + auto& pN = tpN.ref(); const vectorField faceNormals(ngbPolyPatchFaceNormals()); @@ -406,8 +406,8 @@ Foam::tmp<Foam::vectorField> Foam::faPatch::edgeNormals() const Foam::tmp<Foam::vectorField> Foam::faPatch::edgeFaceCentres() const { - tmp<vectorField> tfc(new vectorField(size())); - vectorField& fc = tfc.ref(); + auto tfc = tmp<vectorField>::New(size()); + auto& fc = tfc.ref(); // get reference to global face centres const vectorField& gfc = @@ -427,13 +427,22 @@ Foam::tmp<Foam::vectorField> Foam::faPatch::edgeFaceCentres() const Foam::tmp<Foam::vectorField> Foam::faPatch::delta() const { return edgeNormals()*(edgeNormals() & (edgeCentres() - edgeFaceCentres())); - //return edgeCentres() - edgeFaceCentres(); } void Foam::faPatch::makeDeltaCoeffs(scalarField& dc) const { - dc = 1.0/(edgeNormals() & delta()); + dc = scalar(1)/(edgeNormals() & delta()); +} + + +void Foam::faPatch::makeCorrectionVectors(vectorField& k) const +{ + vectorField unitDelta(delta()/mag(delta())); + vectorField edgeNormMag(edgeNormals()/mag(edgeNormals())); + scalarField dn(edgeNormals() & delta()); + + k = edgeNormMag - (scalar(1)/(unitDelta & edgeNormMag))*unitDelta; } @@ -445,7 +454,7 @@ const Foam::scalarField& Foam::faPatch::deltaCoeffs() const void Foam::faPatch::makeWeights(scalarField& w) const { - w = 1.0; + w = scalar(1); } diff --git a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H index a3d6239faa5..52fb33e613a 100644 --- a/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H +++ b/src/finiteArea/faMesh/faPatches/faPatch/faPatch.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -35,7 +36,9 @@ Author SourceFiles faPatch.C - newFaPatch.C + faPatchNew.C + faPatchTemplates.C + faPatchFaMeshTemplates.C \*---------------------------------------------------------------------------*/ @@ -68,9 +71,7 @@ class faPatch public labelList, public patchIdentifier { -private: - - // Private data + // Private Data //- Neighbour polyPatch index const label ngbPolyPatchIndex_; @@ -106,6 +107,8 @@ private: protected: + // Protected Member Functions + //- The faPatch geometry initialisation is called by faBoundaryMesh friend class faBoundaryMesh; @@ -143,7 +146,6 @@ public: typedef faBoundaryMesh BoundaryMesh; - //- Runtime type information TypeName("patch"); @@ -189,7 +191,7 @@ public: faPatch(const faPatch&, const faBoundaryMesh&); //- Construct and return a clone, resetting the edge list - // and boundary mesh + //- and boundary mesh virtual autoPtr<faPatch> clone ( const faBoundaryMesh& bm, @@ -207,7 +209,7 @@ public: // Selectors //- Return a pointer to a new patch created - // on freestore from dictionary + //- on freestore from dictionary static autoPtr<faPatch> New ( const word& name, @@ -320,6 +322,8 @@ public: //- Make patch edge - neighbour face distances virtual void makeDeltaCoeffs(scalarField&) const; + void makeCorrectionVectors(vectorField&) const; + //- Return patch edge - neighbour face distances const scalarField& deltaCoeffs() const; @@ -330,7 +334,7 @@ public: void resetEdges(const labelList&); - // Evaluation functions + // Evaluation //- Return given internal field next to patch as patch field template<class Type> @@ -344,7 +348,7 @@ public: ) const; //- Lookup and return the patchField of the named field from the - // local objectRegistry. + //- local objectRegistry. // N.B. The dummy pointer arguments are used if this function is // instantiated within a templated function to avoid a bug in gcc. // See inletOutletFvPatchField.C and outletInletFvPatchField.C diff --git a/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C new file mode 100755 index 00000000000..d4f257b80e7 --- /dev/null +++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.C @@ -0,0 +1,179 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/> + +\*---------------------------------------------------------------------------*/ + +#include "clampedPlateFaPatchField.H" +#include "areaFields.H" +#include "uniformDimensionedFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +clampedPlateFaPatchField<Type>::clampedPlateFaPatchField +( + const faPatch& p, + const DimensionedField<Type, areaMesh>& iF +) +: + faPatchField<Type>(p, iF) +{} + + +template<class Type> +clampedPlateFaPatchField<Type>::clampedPlateFaPatchField +( + const faPatch& p, + const DimensionedField<Type, areaMesh>& iF, + const dictionary& dict +) +: + faPatchField<Type>(p, iF) +{ + faPatchField<Type>::operator=(this->patchInternalField()); +} + + +template<class Type> +clampedPlateFaPatchField<Type>::clampedPlateFaPatchField +( + const clampedPlateFaPatchField<Type>& ptf, + const faPatch& p, + const DimensionedField<Type, areaMesh>& iF, + const faPatchFieldMapper& mapper +) +: + faPatchField<Type>(ptf, p, iF, mapper) +{} + + +template<class Type> +clampedPlateFaPatchField<Type>::clampedPlateFaPatchField +( + const clampedPlateFaPatchField<Type>& ptf +) +: + faPatchField<Type>(ptf) +{} + + +template<class Type> +clampedPlateFaPatchField<Type>::clampedPlateFaPatchField +( + const clampedPlateFaPatchField<Type>& ptf, + const DimensionedField<Type, areaMesh>& iF +) +: + faPatchField<Type>(ptf, iF) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +void clampedPlateFaPatchField<Type>::evaluate(const Pstream::commsTypes) +{ + notImplemented(type() + "::evaluate(const Pstream::commsType)"); +} + + +template<> +void clampedPlateFaPatchField<scalar>::evaluate(const Pstream::commsTypes) +{ + if (!this->updated()) + { + this->updateCoeffs(); + } + + Field<scalar>::operator=(pTraits<scalar>::zero); + + const labelUList& edgeFaces = this->patch().edgeFaces(); + forAll(edgeFaces, edgeID) + { + label faceID = edgeFaces[edgeID]; + const_cast<Field<scalar>&>(this->primitiveField())[faceID] = + pTraits<scalar>::zero; + } + + faPatchField<scalar>::evaluate(); +} + + +template<class Type> +tmp<Field<Type> > clampedPlateFaPatchField<Type>::valueInternalCoeffs +( + const tmp<scalarField>& +) const +{ + return tmp<Field<Type>> + (new Field<Type>(this->size(), pTraits<Type>::zero)); +} + + +template<class Type> +tmp<Field<Type> > clampedPlateFaPatchField<Type>::valueBoundaryCoeffs +( + const tmp<scalarField>& +) const +{ + return *this; +} + + +template<class Type> +tmp<Field<Type> > +clampedPlateFaPatchField<Type>::gradientInternalCoeffs() const +{ + return -Type(pTraits<Type>::one)*this->patch().deltaCoeffs(); +} + + +template<class Type> +tmp<Field<Type> > +clampedPlateFaPatchField<Type>::gradientBoundaryCoeffs() const +{ + return this->patch().deltaCoeffs()*(*this); +} + + +template<class Type> +void clampedPlateFaPatchField<Type>::write(Ostream& os) const +{ + faPatchField<Type>::write(os); + this->writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H new file mode 100755 index 00000000000..4178ffb782f --- /dev/null +++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchField.H @@ -0,0 +1,214 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::clampedPlateFaPatchField + +Description + This BC provides a clamped BC. It sets zero fixe value and zeroGradient. + +Usage + Example of the boundary condition specification: + \verbatim + <patchName> + { + // Mandatory entries (unmodifiable) + type clampedPlate; + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: clampedPlate | word | yes | - + \endtable + + The inherited entries are elaborated in: + - \link faPatchFields.H \endlink + +SourceFiles + clampedPlateFaPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef clampedPlateFaPatchField_H +#define clampedPlateFaPatchField_H + +#include "faPatchField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class clampedPlateFaPatch Declaration +\*---------------------------------------------------------------------------*/ + +template<class Type> +class clampedPlateFaPatchField +: + public faPatchField<Type> +{ +public: + + //- Runtime type information + TypeName("clampedPlate"); + + + // Constructors + + //- Construct from patch and internal field + clampedPlateFaPatchField + ( + const faPatch&, + const DimensionedField<Type, areaMesh>& + ); + + //- Construct from patch, internal field and dictionary + clampedPlateFaPatchField + ( + const faPatch&, + const DimensionedField<Type, areaMesh>&, + const dictionary& + ); + + //- Construct by mapping the given clampedPlateFaPatchField<Type> + //- onto a new patch + clampedPlateFaPatchField + ( + const clampedPlateFaPatchField<Type>&, + const faPatch&, + const DimensionedField<Type, areaMesh>&, + const faPatchFieldMapper& + ); + + //- Construct as copy + clampedPlateFaPatchField + ( + const clampedPlateFaPatchField<Type>& + ); + + //- Construct and return a clone + virtual tmp<faPatchField<Type>> clone() const + { + return tmp<faPatchField<Type>> + ( + new clampedPlateFaPatchField<Type>(*this) + ); + } + + //- Construct as copy setting internal field reference + clampedPlateFaPatchField + ( + const clampedPlateFaPatchField<Type>&, + const DimensionedField<Type, areaMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<faPatchField<Type> > clone + ( + const DimensionedField<Type, areaMesh>& iF + ) const + { + return tmp<faPatchField<Type> > + ( + new clampedPlateFaPatchField<Type>(*this, iF) + ); + } + + + //- Destructor + virtual ~clampedPlateFaPatchField() + {} + + + // Member Functions + + // Evaluation + + //- Return gradient at boundary + virtual tmp<Field<Type>> snGrad() const + { + return tmp<Field<Type>> + ( + new Field<Type>(this->size(), Zero) + ); + } + + //- Evaluate the patch field + virtual void evaluate + ( + const Pstream::commsTypes commsType=Pstream::commsTypes::blocking + ); + + //- Return the matrix diagonal coefficients corresponding to the + //- evaluation of the value of this patchField with given weights + virtual tmp<Field<Type> > valueInternalCoeffs + ( + const tmp<scalarField>& + ) const; + + //- Return the matrix source coefficients corresponding to the + //- evaluation of the value of this patchField with given weights + virtual tmp<Field<Type> > valueBoundaryCoeffs + ( + const tmp<scalarField>& + ) const; + + //- Return the matrix diagonal coefficients corresponding to the + //- evaluation of the gradient of this patchField + virtual tmp<Field<Type> > gradientInternalCoeffs() const; + + //- Return the matrix source coefficients corresponding to the + //- evaluation of the gradient of this patchField + virtual tmp<Field<Type> > gradientBoundaryCoeffs() const; + + + // IO + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "clampedPlateFaPatchField.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.C b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.C old mode 100644 new mode 100755 similarity index 95% rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.C rename to src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.C index 0647d784cc4..a2bb02c72d6 --- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.C +++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.C @@ -21,11 +21,11 @@ License for more details. You should have received a copy of the GNU General Public License - along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/> \*---------------------------------------------------------------------------*/ -#include "uniformFixedValueFaPatchFields.H" +#include "clampedPlateFaPatchFields.H" #include "addToRunTimeSelectionTable.H" #include "areaFields.H" @@ -36,7 +36,7 @@ namespace Foam // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // -makeFaPatchFields(uniformFixedValue); +makeFaPatchFields(clampedPlate); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.H b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.H old mode 100644 new mode 100755 similarity index 90% rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.H rename to src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.H index 17b020ae6dd..4a3a0549074 --- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFields.H +++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFields.H @@ -21,14 +21,14 @@ License for more details. You should have received a copy of the GNU General Public License - along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/> \*---------------------------------------------------------------------------*/ -#ifndef uniformFixedValueFaPatchFields_H -#define uniformFixedValueFaPatchFields_H +#ifndef clampedPlateFaPatchFields_H +#define clampedPlateFaPatchFields_H -#include "uniformFixedValueFaPatchField.H" +#include "clampedPlateFaPatchField.H" #include "fieldTypes.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -38,7 +38,7 @@ namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -makeFaPatchTypeFieldTypedefs(uniformFixedValue) +makeFaPatchTypeFieldTypedefs(clampedPlate) // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H new file mode 100755 index 00000000000..949f510afc3 --- /dev/null +++ b/src/finiteArea/fields/faPatchFields/derived/clampedPlate/clampedPlateFaPatchFieldsFwd.H @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/> + +\*---------------------------------------------------------------------------*/ + +#ifndef clampedPlateFaPatchFieldsFwd_H +#define clampedPlateFaPatchFieldsFwd_H + +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template<class Type> class clampedPlateFaPatchField; + +makeFaPatchTypeFieldTypedefs(clampedPlate) + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.C b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C similarity index 65% rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.C rename to src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C index 4de3a60c888..1bba29333b6 100644 --- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.C +++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2016-2017 Wikki Ltd ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,24 +25,27 @@ License \*---------------------------------------------------------------------------*/ -#include "uniformFixedValueFaPatchField.H" +#include "timeVaryingUniformFixedValueFaPatchField.H" +#include "Time.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class Type> -Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField +Foam::timeVaryingUniformFixedValueFaPatchField<Type>:: +timeVaryingUniformFixedValueFaPatchField ( const faPatch& p, const DimensionedField<Type, areaMesh>& iF ) : fixedValueFaPatchField<Type>(p, iF), - uniformValue_(nullptr) + timeSeries_() {} template<class Type> -Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField +Foam::timeVaryingUniformFixedValueFaPatchField<Type>:: +timeVaryingUniformFixedValueFaPatchField ( const faPatch& p, const DimensionedField<Type, areaMesh>& iF, @@ -50,83 +53,85 @@ Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField ) : fixedValueFaPatchField<Type>(p, iF), - uniformValue_(Function1<Type>::New("uniformValue", dict)) + timeSeries_(dict) { if (dict.found("value")) { - faPatchField<Type>::operator== - ( - Field<Type>("value", dict, p.size()) - ); + faPatchField<Type>::operator==(Field<Type>("value", dict, p.size())); } else { - this->evaluate(); + updateCoeffs(); } } template<class Type> -Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField +Foam::timeVaryingUniformFixedValueFaPatchField<Type>:: +timeVaryingUniformFixedValueFaPatchField ( - const uniformFixedValueFaPatchField<Type>& ptf, + const timeVaryingUniformFixedValueFaPatchField<Type>& ptf, const faPatch& p, const DimensionedField<Type, areaMesh>& iF, const faPatchFieldMapper& mapper ) : fixedValueFaPatchField<Type>(ptf, p, iF, mapper), - uniformValue_(ptf.uniformValue_.clone()) + timeSeries_(ptf.timeSeries_) {} template<class Type> -Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField +Foam::timeVaryingUniformFixedValueFaPatchField<Type>:: +timeVaryingUniformFixedValueFaPatchField ( - const uniformFixedValueFaPatchField<Type>& ptf + const timeVaryingUniformFixedValueFaPatchField<Type>& ptf ) : fixedValueFaPatchField<Type>(ptf), - uniformValue_(ptf.uniformValue_.clone()) + timeSeries_(ptf.timeSeries_) {} template<class Type> -Foam::uniformFixedValueFaPatchField<Type>::uniformFixedValueFaPatchField +Foam::timeVaryingUniformFixedValueFaPatchField<Type>:: +timeVaryingUniformFixedValueFaPatchField ( - const uniformFixedValueFaPatchField<Type>& ptf, + const timeVaryingUniformFixedValueFaPatchField<Type>& ptf, const DimensionedField<Type, areaMesh>& iF ) : fixedValueFaPatchField<Type>(ptf, iF), - uniformValue_(ptf.uniformValue_.clone()) + timeSeries_(ptf.timeSeries_) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template<class Type> -void Foam::uniformFixedValueFaPatchField<Type>::updateCoeffs() +void Foam::timeVaryingUniformFixedValueFaPatchField<Type>::updateCoeffs() { if (this->updated()) { return; } - const scalar t = this->db().time().timeOutputValue(); - faPatchField<Type>::operator==(uniformValue_->value(t)); + faPatchField<Type>::operator== + ( + timeSeries_(this->db().time().timeOutputValue()) + ); fixedValueFaPatchField<Type>::updateCoeffs(); } template<class Type> -void Foam::uniformFixedValueFaPatchField<Type>::write +void Foam::timeVaryingUniformFixedValueFaPatchField<Type>::write ( Ostream& os ) const { faPatchField<Type>::write(os); - uniformValue_->writeData(os); + timeSeries_.write(os); this->writeEntry("value", os); } diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.H b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H similarity index 56% rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.H rename to src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H index cf75c75e166..70154cc728a 100644 --- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchField.H +++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchField.H @@ -5,6 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- + Copyright (C) 2016-2017 Wikki Ltd Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -24,42 +25,59 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Class - Foam::uniformFixedValueFaPatchField + Foam::timeVaryingUniformFixedValueFaPatchField Description - This finiteArea boundary condition - provides a uniform fixed value condition, which can also be time-varying. + A time-varying form of a uniform fixed value finite area + boundary condition. Usage - \table - Property | Description | Required | Default - uniformValue | uniform value | yes | - \endtable - Example of the boundary condition specification: \verbatim <patchName> { - type uniformFixedValue; - uniformValue constant 0.2; + // Mandatory entries (unmodifiable) + type timeVaryingUniformFixedValue; + fileName "<case>/time-series"; + outOfBounds clamp; // (error|warn|clamp|repeat) + + // Mandatory/Optional (inherited) entries + ... } \endverbatim + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: timeVaryingUniformFixedValue | word | yes | - + fileName | Name of operand file | word | yes | - + \endtable + + The inherited entries are elaborated in: + - \link faPatchFields.H \endlink + +Author + Zeljko Tukovic, FMENA + Hrvoje Jasak, Wikki Ltd. + +Note + This class is derived directly from a fixedValue patch rather than from + a uniformFixedValue patch. + See also - Foam::Function1Types - Foam::fixedValueFvPatchField - Foam::uniformFixedValueFvPatchField.C + - Foam::interpolationTable + - Foam::fixedValueFaPatchField SourceFiles - uniformFixedValueFaPatchField.C + timeVaryingUniformFixedValueFaPatchField.C \*---------------------------------------------------------------------------*/ -#ifndef uniformFixedValueFaPatchField_H -#define uniformFixedValueFaPatchField_H +#ifndef timeVaryingUniformFixedValueFaPatchField_H +#define timeVaryingUniformFixedValueFaPatchField_H #include "fixedValueFaPatchField.H" -#include "Function1.H" +#include "interpolationTable.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -67,56 +85,56 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class uniformFixedValueFaPatch Declaration + Class timeVaryingUniformFixedValueFaPatch Declaration \*---------------------------------------------------------------------------*/ template<class Type> -class uniformFixedValueFaPatchField +class timeVaryingUniformFixedValueFaPatchField : public fixedValueFaPatchField<Type> { // Private Data - //- Value - autoPtr<Function1<Type>> uniformValue_; + //- The time series being used, including the bounding treatment + interpolationTable<Type> timeSeries_; public: //- Runtime type information - TypeName("uniformFixedValue"); + TypeName("timeVaryingUniformFixedValue"); // Constructors //- Construct from patch and internal field - uniformFixedValueFaPatchField + timeVaryingUniformFixedValueFaPatchField ( const faPatch&, const DimensionedField<Type, areaMesh>& ); //- Construct from patch, internal field and dictionary - uniformFixedValueFaPatchField + timeVaryingUniformFixedValueFaPatchField ( const faPatch&, const DimensionedField<Type, areaMesh>&, const dictionary& ); - //- Construct by mapping onto a new patch - uniformFixedValueFaPatchField + //- Construct by mapping given patch field onto a new patch + timeVaryingUniformFixedValueFaPatchField ( - const uniformFixedValueFaPatchField<Type>&, + const timeVaryingUniformFixedValueFaPatchField<Type>&, const faPatch&, const DimensionedField<Type, areaMesh>&, const faPatchFieldMapper& ); - //- Copy construct - uniformFixedValueFaPatchField + //- Construct as copy + timeVaryingUniformFixedValueFaPatchField ( - const uniformFixedValueFaPatchField<Type>& + const timeVaryingUniformFixedValueFaPatchField<Type>& ); //- Construct and return a clone @@ -124,14 +142,14 @@ public: { return tmp<faPatchField<Type>> ( - new uniformFixedValueFaPatchField<Type>(*this) + new timeVaryingUniformFixedValueFaPatchField<Type>(*this) ); } //- Construct as copy setting internal field reference - uniformFixedValueFaPatchField + timeVaryingUniformFixedValueFaPatchField ( - const uniformFixedValueFaPatchField<Type>&, + const timeVaryingUniformFixedValueFaPatchField<Type>&, const DimensionedField<Type, areaMesh>& ); @@ -143,22 +161,36 @@ public: { return tmp<faPatchField<Type>> ( - new uniformFixedValueFaPatchField<Type>(*this, iF) + new timeVaryingUniformFixedValueFaPatchField<Type>(*this, iF) ); } //- Destructor - virtual ~uniformFixedValueFaPatchField() = default; + virtual ~timeVaryingUniformFixedValueFaPatchField() = default; // Member Functions - //- Update the coefficients associated with the patch field - virtual void updateCoeffs(); + // Access + + //- Return the time series used + const interpolationTable<Type>& timeSeries() const + { + return timeSeries_; + } + + + // Evaluation + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + + // IO - //- Write - virtual void write(Ostream& os) const; + //- Write + virtual void write(Ostream&) const; }; @@ -169,7 +201,7 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #ifdef NoRepository - #include "uniformFixedValueFaPatchField.C" + #include "timeVaryingUniformFixedValueFaPatchField.C" #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C new file mode 100644 index 00000000000..fa19e8c9d89 --- /dev/null +++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.C @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "timeVaryingUniformFixedValueFaPatchFields.H" +#include "addToRunTimeSelectionTable.H" +#include "areaFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +makeFaPatchFields(timeVaryingUniformFixedValue); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H new file mode 100644 index 00000000000..46bfc57c736 --- /dev/null +++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFields.H @@ -0,0 +1,52 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef timeVaryingUniformFixedValueFaPatchFields_H +#define timeVaryingUniformFixedValueFaPatchFields_H + +#include "timeVaryingUniformFixedValueFaPatchField.H" +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makeFaPatchTypeFieldTypedefs(timeVaryingUniformFixedValue) + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H new file mode 100644 index 00000000000..6691ec7fc24 --- /dev/null +++ b/src/finiteArea/fields/faPatchFields/derived/timeVaryingUniformFixedValue/timeVaryingUniformFixedValueFaPatchFieldsFwd.H @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef timeVaryingUniformFixedValueFaPatchFieldsFwd_H +#define timeVaryingUniformFixedValueFaPatchFieldsFwd_H + +#include "faPatchField.H" +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template<class Type> class timeVaryingUniformFixedValueFaPatchField; + +makeFaPatchTypeFieldTypedefs(timeVaryingUniformFixedValue); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H index 3818dcb2ffa..389510504c9 100644 --- a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H +++ b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchField.H @@ -81,7 +81,7 @@ class faPatchField : public Field<Type> { - // Private data + // Private Data //- Reference to a patch const faPatch& patch_; @@ -94,8 +94,8 @@ class faPatchField bool updated_; //- Optional patch type, used to allow specified boundary conditions - // to be applied to constraint patches by providing the constraint - // patch type as 'patchType' + //- to be applied to constraint patches by providing the constraint + //- patch type as 'patchType' word patchType_; @@ -217,7 +217,7 @@ public: // Selectors //- Return a pointer to a new patchField created on freestore given - // patch and internal field + //- patch and internal field // (does not set the patch field values) static tmp<faPatchField<Type>> New ( @@ -228,7 +228,7 @@ public: ); //- Return a pointer to a new patchField created on freestore given - // patch and internal field + //- patch and internal field // (does not set the patch field values) static tmp<faPatchField<Type>> New ( @@ -238,7 +238,7 @@ public: ); //- Return a pointer to a new patchField created on freestore from - // a given faPatchField mapped onto a new patch + //- a given faPatchField mapped onto a new patch static tmp<faPatchField<Type>> New ( const faPatchField<Type>&, @@ -248,7 +248,7 @@ public: ); //- Return a pointer to a new patchField created on freestore - // from dictionary + //- from dictionary static tmp<faPatchField<Type>> New ( const faPatch&, @@ -257,7 +257,7 @@ public: ); //- Return a pointer to a new calculatedFaPatchField created on - // freestore without setting patchField values + //- freestore without setting patchField values template<class Type2> static tmp<faPatchField<Type>> NewCalculatedType ( @@ -269,7 +269,7 @@ public: virtual ~faPatchField<Type>() = default; - // Member functions + // Member Functions // Access @@ -330,7 +330,7 @@ public: } - // Mapping functions + // Mapping //- Map (and resize as needed) from self given a mapping object virtual void autoMap @@ -346,7 +346,7 @@ public: ); - // Evaluation functions + // Evaluation //- Return patch-normal gradient virtual tmp<Field<Type>> snGrad() const; @@ -383,9 +383,8 @@ public: Pstream::commsTypes::blocking ); - //- Return the matrix diagonal coefficients corresponding to the - // evaluation of the value of this patchField with given weights + //- evaluation of the value of this patchField with given weights virtual tmp<Field<Type>> valueInternalCoeffs ( const tmp<Field<scalar>>& @@ -396,7 +395,7 @@ public: } //- Return the matrix source coefficients corresponding to the - // evaluation of the value of this patchField with given weights + //- evaluation of the value of this patchField with given weights virtual tmp<Field<Type>> valueBoundaryCoeffs ( const tmp<Field<scalar>>& @@ -407,7 +406,7 @@ public: } //- Return the matrix diagonal coefficients corresponding to the - // evaluation of the gradient of this patchField + //- evaluation of the gradient of this patchField virtual tmp<Field<Type>> gradientInternalCoeffs() const { NotImplemented; @@ -415,7 +414,7 @@ public: } //- Return the matrix source coefficients corresponding to the - // evaluation of the gradient of this patchField + //- evaluation of the gradient of this patchField virtual tmp<Field<Type>> gradientBoundaryCoeffs() const { NotImplemented; @@ -423,8 +422,10 @@ public: } - //- Write - virtual void write(Ostream&) const; + // IO + + //- Write + virtual void write(Ostream&) const; // Check @@ -433,7 +434,7 @@ public: void check(const faPatchField<Type>&) const; - // Member operators + // Member Operators virtual void operator=(const UList<Type>&); diff --git a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C index 55768d7d6c2..04550acbb1c 100644 --- a/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C +++ b/src/finiteArea/fields/faPatchFields/faPatchField/faPatchFieldNew.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -37,7 +37,12 @@ Foam::tmp<Foam::faPatchField<Type>> Foam::faPatchField<Type>::New const DimensionedField<Type, areaMesh>& iF ) { - DebugInFunction << "Constructing faPatchField<Type>" << endl; + DebugInFunction + << "Constructing faPatchField<Type> " + << "patchFieldType:" << patchFieldType + << "actualPatchType:" << actualPatchType + << "p.Type():" << p.type() + << endl; auto cstrIter = patchConstructorTablePtr_->cfind(patchFieldType); diff --git a/src/finiteArea/finiteArea/fam/famSup.C b/src/finiteArea/finiteArea/fam/famSup.C index ec63e51f196..b0ad234b9a1 100644 --- a/src/finiteArea/finiteArea/fam/famSup.C +++ b/src/finiteArea/finiteArea/fam/famSup.C @@ -165,9 +165,19 @@ SuSp ); faMatrix<Type>& fam = tfam.ref(); - fam.diag() += mesh.S()*max(sp.internalField(), scalar(0)); + fam.diag() += + mesh.S()*max + ( + sp.internalField(), + dimensionedScalar("0", sp.dimensions(), Zero) + ); - fam.source() -= mesh.S()*min(sp.internalField(), scalar(0)) + fam.source() -= + mesh.S()*min + ( + sp.internalField(), + dimensionedScalar("0", sp.dimensions(), Zero) + ) *vf.internalField(); return tfam; diff --git a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C index 15a284e1b94..54dcd271b14 100644 --- a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C +++ b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolate.C @@ -281,6 +281,7 @@ Foam::fac::interpolate tmp<GeometricField<Type, faePatchField, edgeMesh>> tsf = interpolate(tvf()); tvf.clear(); + return tsf; } diff --git a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C index dbfe6c04321..9e14d5cbb6d 100644 --- a/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C +++ b/src/finiteArea/interpolation/edgeInterpolation/edgeInterpolation.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -47,8 +48,6 @@ void Foam::edgeInterpolation::clearOut() deleteDemandDrivenData(differenceFactors_); deleteDemandDrivenData(correctionVectors_); deleteDemandDrivenData(skewCorrectionVectors_); -// deleteDemandDrivenData(leastSquarePvectors_); -// deleteDemandDrivenData(leastSquareNvectors_); } @@ -64,8 +63,6 @@ Foam::edgeInterpolation::edgeInterpolation(const faMesh& fam) correctionVectors_(nullptr), skew_(true), skewCorrectionVectors_(nullptr) -// leastSquarePvectors_(nullptr), -// leastSquareNvectors_(nullptr) {} @@ -161,30 +158,6 @@ Foam::edgeInterpolation::skewCorrectionVectors() const } -// const Foam::edgeVectorField& -// Foam::edgeInterpolation::leastSquarePvectors() const -// { -// if (!leastSquarePvectors_) -// { -// makeLeastSquareVectors(); -// } -// -// return (*leastSquarePvectors_); -// } - - -// const Foam::edgeVectorField& -// Foam::edgeInterpolation::leastSquareNvectors() const -// { -// if (!leastSquareNvectors_) -// { -// makeLeastSquareVectors(); -// } -// -// return (*leastSquareNvectors_); -// } - - bool Foam::edgeInterpolation::movePoints() const { deleteDemandDrivenData(lPN_); @@ -197,9 +170,6 @@ bool Foam::edgeInterpolation::movePoints() const skew_ = true; deleteDemandDrivenData(skewCorrectionVectors_); -// deleteDemandDrivenData(leastSquarePvectors_); -// deleteDemandDrivenData(leastSquareNvectors_); - return true; } @@ -527,10 +497,12 @@ void Foam::edgeInterpolation::makeCorrectionVectors() const - deltaCoeffs[edgeI]*unitDelta; } + edgeVectorField::Boundary& CorrVecsbf = CorrVecs.boundaryFieldRef(); - for (faePatchVectorField& patchCorrVecs : CorrVecsbf) + + forAll(CorrVecs.boundaryField(), patchI) { - patchCorrVecs = vector::zero; + mesh().boundary()[patchI].makeCorrectionVectors(CorrVecsbf[patchI]); } scalar NonOrthogCoeff = 0.0; diff --git a/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H new file mode 100644 index 00000000000..da63c64444d --- /dev/null +++ b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolation.H @@ -0,0 +1,219 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::skewCorrectedEdgeInterpolation + +Description + Linear/upwind blended differencing scheme + +SourceFiles + skewCorrectedEdgeInterpolationMake.C + +\*---------------------------------------------------------------------------*/ + +#ifndef skewCorrectedEdgeInterpolation_H +#define skewCorrectedEdgeInterpolation_H + +#include "edgeInterpolationScheme.H" +#include "linearEdgeInterpolation.H" +#include "gaussFaGrad.H" +#include "areaFields.H" +#include "zeroGradientFaPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class skewCorrectedEdgeInterpolation Declaration +\*---------------------------------------------------------------------------*/ + +template<class Type> +class skewCorrectedEdgeInterpolation +: + virtual public edgeInterpolationScheme<Type> +{ + // Private Data + + tmp<edgeInterpolationScheme<Type>> tScheme_; + + +public: + + //- Runtime type information + TypeName("skewCorrected"); + + + // Constructors + + //- Construct from Istream + skewCorrectedEdgeInterpolation(const faMesh& mesh, Istream& is) + : + edgeInterpolationScheme<Type>(mesh), + tScheme_ + ( + edgeInterpolationScheme<Type>::New(mesh, is) + ) + {} + + //- Construct from mesh, faceFlux and blendingFactor + skewCorrectedEdgeInterpolation + ( + const faMesh& mesh, + const edgeScalarField& faceFlux, + Istream& is + ) + : + edgeInterpolationScheme<Type>(mesh), + tScheme_ + ( + edgeInterpolationScheme<Type>::New(mesh, faceFlux, is) + ) + {} + + //- No copy construct + skewCorrectedEdgeInterpolation(const skewCorrectedEdgeInterpolation&) = + delete; + + //- No copy assignment + void operator=(const skewCorrectedEdgeInterpolation&) = delete; + + + // Member Functions + + //- Return the interpolation weighting factors + virtual tmp<edgeScalarField> weights + ( + const GeometricField<Type, faPatchField, areaMesh>& vf + ) const + { + return tScheme_().weights(vf); + } + + //- Return true if this scheme uses an explicit correction + virtual bool corrected() const + { + return + tScheme_().corrected() || (this->mesh()).skew(); + } + + tmp<GeometricField<Type, faePatchField, edgeMesh>> + skewCorrection + ( + const GeometricField<Type, faPatchField, areaMesh>& vf + ) const + { + const faMesh& mesh = this->mesh(); + + const edgeVectorField& scv = mesh.skewCorrectionVectors(); + + tmp<GeometricField<Type, faePatchField, edgeMesh>> tsfCorr + ( + new GeometricField<Type, faePatchField, edgeMesh> + ( + IOobject + ( + "skewCorrected::skewCorrection(" + vf.name() + ')', + vf.instance(), + vf.db() + ), + mesh, + dimensioned<Type>(vf.dimensions(), Zero) + ) + ); + + GeometricField<Type, faePatchField, edgeMesh>& corr = tsfCorr.ref(); + + for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; ++cmpt) + { + corr.replace + ( + cmpt, + scv & linearEdgeInterpolation + < + typename outerProduct + < + vector, + typename pTraits<Type>::cmptType + >::type + >(mesh).interpolate + ( + fa::gaussGrad<typename pTraits<Type>::cmptType> + (mesh).grad(vf.component(cmpt)) + ) + ); + } + + return tsfCorr; + } + + + //- Return the explicit correction to the face-interpolate + virtual tmp<GeometricField<Type, faePatchField, edgeMesh>> + correction + ( + const GeometricField<Type, faPatchField, areaMesh>& vf + ) const + { + if + ( + tScheme_().corrected() + && (this->mesh()).skew() + ) + { + return tScheme_().correction(vf) + skewCorrection(vf); + } + else if (tScheme_().corrected()) + { + return tScheme_().correction(vf); + } + else if ((this->mesh()).skew()) + { + return skewCorrection(vf); + } + else + { + return + tmp<GeometricField<Type, faePatchField, edgeMesh>> + ( + nullptr + ); + } + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C new file mode 100644 index 00000000000..70c9e674621 --- /dev/null +++ b/src/finiteArea/interpolation/edgeInterpolation/schemes/skewCorrected/skewCorrectedEdgeInterpolationMake.C @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "faMesh.H" +#include "skewCorrectedEdgeInterpolation.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makeEdgeInterpolationScheme(skewCorrectedEdgeInterpolation) +} + +// ************************************************************************* // diff --git a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C index 4f814a9cd49..e8123536495 100644 --- a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C +++ b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd + Copyright (C) 2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -38,11 +39,8 @@ Foam::tmp<Foam::Field<Type>> Foam::volSurfaceMapping::mapToSurface // Grab labels for all faces in faMesh const labelList& faceLabels = mesh_.faceLabels(); - tmp<Field<Type>> tresult - ( - new Field<Type>(faceLabels.size(), Zero) - ); - Field<Type>& result = tresult.ref(); + auto tresult = tmp<Field<Type>>::New(faceLabels.size(), Zero); + auto& result = tresult.ref(); // Get reference to volume mesh const polyMesh& pMesh = mesh_(); @@ -67,6 +65,41 @@ Foam::tmp<Foam::Field<Type>> Foam::volSurfaceMapping::mapToSurface } +template<class Type> +Foam::tmp<Foam::Field<Type>> Foam::volSurfaceMapping::mapInternalToSurface +( + const typename GeometricField<Type, fvPatchField, volMesh>::Boundary& df +) const +{ + // Grab labels for all faces in faMesh + const labelList& faceLabels = mesh_.faceLabels(); + + auto tresult = tmp<Field<Type>>::New(faceLabels.size(), Zero); + auto& result = tresult.ref(); + + // Get reference to volume mesh + const polyMesh& pMesh = mesh_(); + const polyBoundaryMesh& bm = pMesh.boundaryMesh(); + + label patchID, faceID; + + // Grab droplet cloud source by identifying patch and face + forAll(faceLabels, i) + { + // Escape if face is beyond active faces, eg belongs to a face zone + if (faceLabels[i] < pMesh.nFaces()) + { + patchID = bm.whichPatch(faceLabels[i]); + faceID = bm[patchID].whichFace(faceLabels[i]); + + result[i] = df[patchID].patchInternalField()()[faceID]; + } + } + + return tresult; +} + + template<class Type> void Foam::volSurfaceMapping::mapToVolume ( @@ -103,7 +136,7 @@ template<class Type> void Foam::volSurfaceMapping::mapToVolume ( const tmp<GeometricField<Type, faPatchField, areaMesh>>& taf, - typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf + typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf ) const { mapToVolume(taf(), bf); @@ -112,4 +145,31 @@ void Foam::volSurfaceMapping::mapToVolume } +template<class Type> +void Foam::volSurfaceMapping::mapToField +( + const GeometricField<Type, faPatchField, areaMesh>& af, + Field<Type>& f +) const +{ + const labelList& faceLabels = mesh_.faceLabels(); + + const polyMesh& pMesh = mesh_(); + const polyBoundaryMesh& bm = pMesh.boundaryMesh(); + label patchID, faceID; + + const Field<Type>& afi = af.internalField(); + + forAll(faceLabels, i) + { + if (faceLabels[i] < pMesh.nFaces()) + { + patchID = bm.whichPatch(faceLabels[i]); + faceID = bm[patchID].whichFace(faceLabels[i]); + f[faceID] = afi[i]; + } + } +} + + // ************************************************************************* // diff --git a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H index 43f7be6e6e1..5b428f099c1 100644 --- a/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H +++ b/src/finiteArea/interpolation/volSurfaceMapping/volSurfaceMapping.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -56,21 +56,12 @@ template<class Type> class fvPatchField; class volSurfaceMapping { - // Private data + // Private Data //- Reference to mesh const faMesh& mesh_; - // Private Member Functions - - //- No copy construct - volSurfaceMapping(const volSurfaceMapping&) = delete; - - //- No copy assignment - void operator=(const volSurfaceMapping&) = delete; - - public: // Constructors @@ -81,6 +72,12 @@ public: mesh_(mesh) {} + //- No copy construct + volSurfaceMapping(const volSurfaceMapping&) = delete; + + //- No copy assignment + void operator=(const volSurfaceMapping&) = delete; + //- Destructor ~volSurfaceMapping() = default; @@ -96,6 +93,15 @@ public: GeometricField<Type, fvPatchField, volMesh>::Boundary& df ) const; + + //- Map patch internal field to surface + template<class Type> + tmp<Field<Type>> mapInternalToSurface + ( + const typename + GeometricField<Type, fvPatchField, volMesh>::Boundary& df + ) const; + //- Map surface field to volume boundary field template<class Type> void mapToVolume @@ -104,12 +110,22 @@ public: typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf ) const; + //- Map surface tmp field to volume boundary field template<class Type> void mapToVolume ( const tmp<GeometricField<Type, faPatchField, areaMesh>>& taf, typename GeometricField<Type, fvPatchField, volMesh>::Boundary& bf ) const; + + //- Map surface field to field assumes Field + //- faces in the same order as Boundary + template<class Type> + void mapToField + ( + const GeometricField<Type, faPatchField, areaMesh>& af, + Field<Type>& f + ) const; }; diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index b4db8e8f3b3..1f175aafaa4 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -227,6 +227,7 @@ $(derivedFvPatchFields)/fixedProfile/fixedProfileFvPatchFields.C $(derivedFvPatchFields)/plenumPressure/plenumPressureFvPatchScalarField.C $(derivedFvPatchFields)/interfaceCompression/interfaceCompressionFvPatchScalarField.C $(derivedFvPatchFields)/swirlFanVelocity/swirlFanVelocityFvPatchField.C +$(derivedFvPatchFields)/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C $(derivedFvPatchFields)/mappedMixed/mappedMixedFvPatchFields.C $(derivedFvPatchFields)/mappedField/Sampled/makeSampledPatchFunction1s.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C new file mode 100644 index 00000000000..9ebb26fbd5f --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.C @@ -0,0 +1,119 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "acousticWaveTransmissiveFvPatchField.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" +#include "EulerDdtScheme.H" +#include "CrankNicolsonDdtScheme.H" +#include "backwardDdtScheme.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Type> +Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField +( + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF +) +: + advectiveFvPatchField<Type>(p, iF), + advectiveU_(0) +{} + + +template<class Type> +Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField +( + const acousticWaveTransmissiveFvPatchField& ptf, + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + advectiveFvPatchField<Type>(ptf, p, iF, mapper), + advectiveU_(ptf.advectiveU_) +{} + + +template<class Type> +Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField +( + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF, + const dictionary& dict +) +: + advectiveFvPatchField<Type>(p, iF, dict), + advectiveU_(dict.get<scalar>("advectiveSpeed")) +{} + + +template<class Type> +Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField +( + const acousticWaveTransmissiveFvPatchField& ptpsf +) +: + advectiveFvPatchField<Type>(ptpsf), + advectiveU_(ptpsf.advectiveU_) +{} + + +template<class Type> +Foam::acousticWaveTransmissiveFvPatchField<Type>::acousticWaveTransmissiveFvPatchField +( + const acousticWaveTransmissiveFvPatchField& ptpsf, + const DimensionedField<Type, volMesh>& iF +) +: + advectiveFvPatchField<Type>(ptpsf, iF), + advectiveU_(ptpsf.advectiveU_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +Foam::tmp<Foam::scalarField> +Foam::acousticWaveTransmissiveFvPatchField<Type>::advectionSpeed() const +{ + return tmp<scalarField>::New(this->size(), advectiveU_); +} + + +template<class Type> +void Foam::acousticWaveTransmissiveFvPatchField<Type>::write(Ostream& os) const +{ + fvPatchField<Type>::write(os); + os.writeEntry("advectiveSpeed", advectiveU_); + this->writeEntry("value", os); +} + + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H new file mode 100644 index 00000000000..f0f31cfefb3 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchField.H @@ -0,0 +1,192 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::acousticWaveTransmissiveFvPatchField + +Group + grpOutletBoundaryConditions + +Description + This boundary condition provides a wave transmissive outflow condition, + based on solving DDt(W, field) = 0 at the boundary \c W is the wave velocity + and \c field is the field to which this boundary condition is applied. + The wave speed is input in the BC. + +Usage + Example of the boundary condition specification: + \verbatim + <patchName> + { + // Mandatory entries (unmodifiable) + type acousticWaveTransmissive; + advectiveSpeed 50.0; + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: acousticWaveTransmissive | word | yes | - + advectiveSpeed | Advective speed value | scalar | yes | - + \endtable + + The inherited entries are elaborated in: + - \link advectiveFvPatchField.H \endlink + +See also + - Foam::advectiveFvPatchFields + +SourceFiles + acousticWaveTransmissiveFvPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef acousticWaveTransmissiveFvPatchField_H +#define acousticWaveTransmissiveFvPatchField_H + +#include "advectiveFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class acousticWaveTransmissiveFvPatchField Declaration +\*---------------------------------------------------------------------------*/ + +template<class Type> +class acousticWaveTransmissiveFvPatchField +: + public advectiveFvPatchField<Type> +{ + // Private Data + + //- Advection speed value + scalar advectiveU_; + + +public: + + //- Runtime type information + TypeName("acousticWaveTransmissive"); + + + // Constructors + + //- Construct from patch and internal field + acousticWaveTransmissiveFvPatchField + ( + const fvPatch&, + const DimensionedField<Type, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + acousticWaveTransmissiveFvPatchField + ( + const fvPatch&, + const DimensionedField<Type, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given acousticWaveTransmissiveFvPatchField + //- onto a new patch + acousticWaveTransmissiveFvPatchField + ( + const acousticWaveTransmissiveFvPatchField<Type>&, + const fvPatch&, + const DimensionedField<Type, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + acousticWaveTransmissiveFvPatchField + ( + const acousticWaveTransmissiveFvPatchField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchField<Type>> clone() const + { + return tmp<fvPatchField<Type>> + ( + new acousticWaveTransmissiveFvPatchField<Type>(*this) + ); + } + + //- Construct as copy setting internal field reference + acousticWaveTransmissiveFvPatchField + ( + const acousticWaveTransmissiveFvPatchField&, + const DimensionedField<Type, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchField<Type>> clone + ( + const DimensionedField<Type, volMesh>& iF + ) const + { + return tmp<fvPatchField<Type>> + ( + new acousticWaveTransmissiveFvPatchField<Type>(*this, iF) + ); + } + + + // Member Functions + + // Evaluation + + //- Calculate and return the advection speed at the boundary + virtual tmp<scalarField> advectionSpeed() const; + + + // IO + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "acousticWaveTransmissiveFvPatchField.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C new file mode 100644 index 00000000000..c1c37ed4361 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.C @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "volFields.H" +#include "surfaceFields.H" +#include "acousticWaveTransmissiveFvPatchFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +makePatchFields(acousticWaveTransmissive); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H new file mode 100644 index 00000000000..9c13ce1790f --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFields.H @@ -0,0 +1,51 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#ifndef acousticWaveTransmissiveFvPatchFields_H +#define acousticWaveTransmissiveFvPatchFields_H + +#include "acousticWaveTransmissiveFvPatchField.H" +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeFieldTypedefs(acousticWaveTransmissive); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H similarity index 88% rename from src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H rename to src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H index 9facb8dce2d..cf54c570983 100644 --- a/src/finiteArea/fields/faPatchFields/derived/uniformFixedValue/uniformFixedValueFaPatchFieldsFwd.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/acousticWaveTransmissive/acousticWaveTransmissiveFvPatchFieldsFwd.H @@ -25,10 +25,9 @@ License \*---------------------------------------------------------------------------*/ -#ifndef uniformFixedValueFaPatchFieldsFwd_H -#define uniformFixedValueFaPatchFieldsFwd_H +#ifndef acousticWaveTransmissiveFvPatchFieldsFwd_H +#define acousticWaveTransmissiveFvPatchFieldsFwd_H -#include "faPatchField.H" #include "fieldTypes.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -38,9 +37,9 @@ namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -template<class Type> class uniformFixedValueFaPatchField; +template<class Type> class acousticWaveTransmissiveFvPatchField; -makeFaPatchTypeFieldTypedefs(uniformFixedValue); +makePatchTypeFieldTypedefs(acousticWaveTransmissive); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/regionFaModels/KirchhoffShell/KirchhoffShell.C b/src/regionFaModels/KirchhoffShell/KirchhoffShell.C new file mode 100644 index 00000000000..577a5262e11 --- /dev/null +++ b/src/regionFaModels/KirchhoffShell/KirchhoffShell.C @@ -0,0 +1,319 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "KirchhoffShell.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFields.H" +#include "zeroGradientFaPatchFields.H" +#include "subCycle.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(KirchhoffShell, 0); + +addToRunTimeSelectionTable(vibrationShellModel, KirchhoffShell, dictionary); + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +bool KirchhoffShell::read(const dictionary& dict) +{ + this->solution().readEntry("nNonOrthCorr", nNonOrthCorr_); + return true; +} + + +void KirchhoffShell::solveDisplacement() +{ + if (debug) + { + InfoInFunction << endl; + } + + const Time& time = primaryMesh().time(); + + areaScalarField solidMass(rho()*h_); + areaScalarField solidD(D()/solidMass); + + // Save old times + areaScalarField w0(w_.oldTime()); + areaScalarField w00(w_.oldTime().oldTime()); + + if (nSubCycles_ > 1) + { + // Restore the oldTime in sub-cycling + w_.oldTime() = w0_; + w_.oldTime().oldTime() = w00_; + laplaceW_.oldTime() = laplaceW0_; + laplace2W_.oldTime() = laplace2W0_; + } + + for + ( + subCycleTime wSubCycle + ( + const_cast<Time&>(time), + nSubCycles_ + ); + !(++wSubCycle).end(); + ) + { + + laplaceW_ = fac::laplacian(w_); + laplace2W_ = fac::laplacian(laplaceW_); + + faScalarMatrix wEqn + ( + fam::d2dt2(w_) + + f1_*fam::ddt(w_) + - f0_*sqrt(solidD)*fac::ddt(laplaceW_) + + solidD*(laplace2W_ + f2_*fac::ddt(laplace2W_)) + == + ps_/solidMass + + faOptions()(solidMass, w_, dimLength/sqr(dimTime)) + ); + + faOptions().constrain(wEqn); + + wEqn.solve(); + + Info<< "w min/max = " << min(w_) << ", " << max(w_) << endl; + + if (wSubCycle.index() >= wSubCycle.nSubCycles()) + { + // Cache oldTimes inside the sub-cycling + w0_ = w_.oldTime(); + w00_ = w_.oldTime().oldTime(); + laplaceW0_ = laplaceW_.oldTime(); + laplace2W0_ = laplace2W_.oldTime(); + + // Update shell acceleration + a_ = fac::d2dt2(w_); + } + } + + // Restore old time in main time + w_.oldTime() = w0; + w_.oldTime().oldTime() = w00; + + faOptions().correct(w_); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +KirchhoffShell::KirchhoffShell +( + const word& modelType, + const fvPatch& patch, + const dictionary& dict +) +: + vibrationShellModel(modelType, patch, dict), + f0_("f0", dimless, dict), + f1_("f1", inv(dimTime), dict), + f2_("f2", dimTime, dict), + nNonOrthCorr_(1), + nSubCycles_(1), + ps_ + ( + IOobject + ( + "ps_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(dimPressure, Zero) + ), + h_ + ( + IOobject + ( + "h_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + regionMesh() + ), + laplaceW_ + ( + IOobject + ( + "laplaceW_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(inv(dimLength), Zero) + ), + laplace2W_ + ( + IOobject + ( + "laplace2W_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(inv(pow3(dimLength)), Zero) + ), + w0_ + ( + IOobject + ( + "w0_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(dimLength, Zero) + ), + w00_ + ( + IOobject + ( + "w00_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(dimLength, Zero) + ), + laplaceW0_ + ( + IOobject + ( + "laplaceW0_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(inv(dimLength), Zero) + ), + laplace2W0_ + ( + IOobject + ( + "laplace2W0_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(inv(pow3(dimLength)), Zero) + ) +{ + init(); +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void KirchhoffShell::init() +{} + + +void KirchhoffShell::preEvolveRegion() +{} + + +void KirchhoffShell::evolveRegion() +{ + nNonOrthCorr_ = solution().get<label>("nNonOrthCorr"); + nSubCycles_ = solution().get<label>("nSubCycles"); + + for (int nonOrth=0; nonOrth<=nNonOrthCorr_; nonOrth++) + { + solveDisplacement(); + } +} + + +const tmp<areaScalarField> KirchhoffShell::D() const +{ + const dimensionedScalar E("E", dimForce/dimArea , solid().E()); + const dimensionedScalar nu("nu", dimless, solid().nu()); + + return tmp<areaScalarField>(E*pow3(h_)/(12*(1 - sqr(nu)))); +} + + +const tmp<areaScalarField> KirchhoffShell::rho() const +{ + return tmp<areaScalarField> + ( + new areaScalarField + ( + IOobject + ( + "rhos", + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + regionMesh(), + dimensionedScalar("rho", dimDensity, solid().rho()), + zeroGradientFaPatchScalarField::typeName + ) + ); +} + + +void KirchhoffShell::info() +{} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/regionFaModels/KirchhoffShell/KirchhoffShell.H b/src/regionFaModels/KirchhoffShell/KirchhoffShell.H new file mode 100644 index 00000000000..0a7762bedb4 --- /dev/null +++ b/src/regionFaModels/KirchhoffShell/KirchhoffShell.H @@ -0,0 +1,217 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::regionFaModels::KirchhoffShell + +Description + +Usage + Example of the boundary condition specification: + \verbatim + <patchName> + { + // Mandatory/Optional (inherited) entries + ... + + // Mandatory entries (unmodifiable) + vibrationShellModel KirchhoffShell; + f0 0.04; + f1 0.0; + f2 0.0; + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + vibrationShellModel | Type name: KirchhoffShell | word | yes | - + f0 | Damping coefficient [1/s] | scalar | yes | - + f1 | Damping coefficient [1/s] | scalar | yes | - + f2 | Damping coefficient [1/s] | scalar | yes | - + \endtable + + The inherited entries are elaborated in: + - \link vibrationShellModel.H \endlink + +SourceFiles + KirchhoffShell.C + +\*---------------------------------------------------------------------------*/ + +#ifndef KirchhoffShell_H +#define KirchhoffShell_H + +#include "volFieldsFwd.H" +#include "vibrationShellModel.H" +#include "faMesh.H" +#include "faCFD.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +/*---------------------------------------------------------------------------*\ + Class KirchhoffShell Declaration +\*---------------------------------------------------------------------------*/ + +class KirchhoffShell +: + public vibrationShellModel +{ + // Private Data + + //- Damping coefficients [1/s] + dimensionedScalar f0_; + dimensionedScalar f1_; + dimensionedScalar f2_; + + + // Private Member Functions + + //- Initialize KirchhoffShell + void init(); + + +protected: + + // Protected Data + + // Solution parameters + + //- Number of non orthogonal correctors + label nNonOrthCorr_; + + //- Sub cycles + label nSubCycles_; + + + // Source term fields + + //- External surface source [Pa] + areaScalarField ps_; + + //- Thickness [m] + areaScalarField h_; + + //- Laplace of the displacement + areaScalarField laplaceW_; + + //- Laplace of the Laplace for the displacement + areaScalarField laplace2W_; + + //- Cache w.oldTime() in sub-cycling + areaScalarField w0_; + + //- Cache w.oldTime.oldTime() in sub-cycling + areaScalarField w00_; + + //- Cache laplaceW.oldTime() in sub-cycling + areaScalarField laplaceW0_; + + //- Cache laplace2.oldTime() in sub-cycling + areaScalarField laplace2W0_; + + + // Protected Member Functions + + //- Read control parameters from dictionary + virtual bool read(const dictionary& dict); + + + // Equations + + //- Solve energy equation + void solveDisplacement(); + + +public: + + //- Runtime type information + TypeName("KirchhoffShell"); + + + // Constructors + + //- Construct from components and dict + KirchhoffShell + ( + const word& modelType, + const fvPatch& patch, + const dictionary& dict + ); + + //- No copy construct + KirchhoffShell(const KirchhoffShell&) = delete; + + //- No copy assignment + void operator=(const KirchhoffShell&) = delete; + + + //- Destructor + virtual ~KirchhoffShell() = default; + + + // Member Functions + + // Fields + + //- Return stiffness + const tmp<areaScalarField> D() const; + + //- Return density [Kg/m3] + const tmp<areaScalarField> rho() const; + + + // Evolution + + //- Pre-evolve thermal baffle + virtual void preEvolveRegion(); + + //- Evolve the thermal baffle + virtual void evolveRegion(); + + + // IO + + //- Provide some feedback + virtual void info(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/Make/files b/src/regionFaModels/Make/files new file mode 100644 index 00000000000..3a3b9a4addd --- /dev/null +++ b/src/regionFaModels/Make/files @@ -0,0 +1,16 @@ +/* Region models */ +regionFaModel/regionFaModel.C +thermalShellModel/thermalShellModel.C +thermalShellModel/thermalShellModelNew.C +vibrationShellModel/vibrationShellModel.C +vibrationShellModel/vibrationShellModelNew.C + +/* Shell models */ +thermalShell/thermalShell.C +KirchhoffShell/KirchhoffShell.C + +/* Boundary conditions */ +derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C +derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C + +LIB = $(FOAM_LIBBIN)/libregionFaModels diff --git a/src/regionFaModels/Make/options b/src/regionFaModels/Make/options new file mode 100644 index 00000000000..cd4795b38d0 --- /dev/null +++ b/src/regionFaModels/Make/options @@ -0,0 +1,16 @@ +EXE_INC = \ + -I$(LIB_SRC)/faOptions/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/finiteArea/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/thermophysicalProperties/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude + +LIB_LIBS = \ + -lfiniteVolume \ + -lfiniteArea \ + -lmeshTools \ + -lthermophysicalProperties \ + -lspecie \ + -lfaOptions diff --git a/src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H b/src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H new file mode 100644 index 00000000000..2ea5aee695f --- /dev/null +++ b/src/regionFaModels/derivedFvPatchFields/doc/thermalBaffleBoundaryConditionsDoc.H @@ -0,0 +1,34 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +\defgroup grpThermoBaffleBoundaryConditions Thermo baffle boundary conditions +@{ + \ingroup grpThermoBoundaryConditions + This group contains thermo baffle model boundary conditions +@} + +\*---------------------------------------------------------------------------*/ diff --git a/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C new file mode 100644 index 00000000000..6b1db5d3bbf --- /dev/null +++ b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.C @@ -0,0 +1,152 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "thermalShellFvPatchScalarField.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace compressible +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +thermalShellFvPatchScalarField::thermalShellFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + fixedValueFvPatchField<scalar>(p, iF), + baffle_(), + dict_(dictionary::null) +{} + + +thermalShellFvPatchScalarField::thermalShellFvPatchScalarField +( + const thermalShellFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + fixedValueFvPatchField<scalar> + ( + ptf, + p, + iF, + mapper + ), + baffle_(), + dict_(ptf.dict_) +{} + + +thermalShellFvPatchScalarField::thermalShellFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + fixedValueFvPatchField<scalar>(p, iF, dict), + baffle_(), + dict_(dict) +{ + typedef regionModels::thermalShellModel baffle; + + if (!baffle_) + { + baffle_.reset(baffle::New(p, dict).ptr()); + } +} + + +thermalShellFvPatchScalarField::thermalShellFvPatchScalarField +( + const thermalShellFvPatchScalarField& ptf, + const DimensionedField<scalar, volMesh>& iF +) +: + fixedValueFvPatchField<scalar>(ptf, iF), + baffle_(), + dict_(ptf.dict_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void thermalShellFvPatchScalarField::updateCoeffs() +{ + if (this->updated()) + { + return; + } + + baffle_->evolve(); + + volScalarField::Boundary& vfb = + db().lookupObjectRef<volScalarField> + ( + this->internalField().name() + ).boundaryFieldRef(); + + baffle_->vsm().mapToVolume(baffle_->T(), vfb); + + fixedValueFvPatchField<scalar>::updateCoeffs(); +} + + +void thermalShellFvPatchScalarField::write(Ostream& os) const +{ + fixedValueFvPatchField<scalar>::write(os); + + // Remove value and type already written by fixedValueFvPatchField + dict_.remove("value"); + dict_.remove("type"); + dict_.write(os, false); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeField +( + fvPatchScalarField, + thermalShellFvPatchScalarField +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace compressible +} // End namespace Foam + + +// ************************************************************************* // diff --git a/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H new file mode 100644 index 00000000000..4a9e01b52f3 --- /dev/null +++ b/src/regionFaModels/derivedFvPatchFields/thermalShell/thermalShellFvPatchScalarField.H @@ -0,0 +1,184 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::compressible::thermalShellFvPatchScalarField + +Group + grpThermoBoundaryConditions + +Description + This boundary condition provides a coupled temperature condition between + a primary region (3D mesh) and a thermal shell model (2D mesh). + + The primary region boundary creates the finite area region + and evolves its energy equation. + +Usage + Example of the boundary condition specification: + \verbatim + <masterPatchName> + { + // Mandatory entries (unmodifiable) + type compressible::thermalShell; + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: compressible::thermalShell | word | yes | - + \endtable + + The inherited entries are elaborated in: + - \link fixedValueFvPatchField.H \endlink + - \link thermalShellModel.H \endlink + +Note + - The two-dimensional area mesh needs to be + generated in the pre-processing steps. + +SourceFiles + thermalShellFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef thermalShellFvPatchScalarField_H +#define thermalShellFvPatchScalarField_H + +#include "autoPtr.H" +#include "thermalShellModel.H" +#include "fixedValueFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace compressible +{ + +/*---------------------------------------------------------------------------*\ + Class thermalShellFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class thermalShellFvPatchScalarField +: + public fixedValueFvPatchField<scalar> +{ + // Private Data + + //- Thermal baffle + autoPtr<regionModels::thermalShellModel> baffle_; + + //- Dictionary + mutable dictionary dict_; + + +public: + + //- Runtime type information + TypeName("compressible::thermalShell"); + + + // Constructors + + //- Construct from patch and internal field + thermalShellFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + thermalShellFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given + //- thermalShellFvPatchScalarField onto a new patch + thermalShellFvPatchScalarField + ( + const thermalShellFvPatchScalarField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new thermalShellFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + thermalShellFvPatchScalarField + ( + const thermalShellFvPatchScalarField&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchScalarField> clone + ( + const DimensionedField<scalar, volMesh>& iF + ) const + { + return tmp<fvPatchScalarField> + ( + new thermalShellFvPatchScalarField(*this, iF) + ); + } + + + // Member Functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace compressible +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C new file mode 100644 index 00000000000..8b91815f80c --- /dev/null +++ b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.C @@ -0,0 +1,169 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "vibrationShellFvPatchScalarField.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchField<scalar>(p, iF), + baffle_(), + dict_(dictionary::null) +{ + refValue() = 0; + refGrad() = 0; + valueFraction() = 1; +} + + +vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField +( + const vibrationShellFvPatchScalarField& ptf, + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchField<scalar> + ( + ptf, + p, + iF, + mapper + ), + baffle_(), + dict_(ptf.dict_) +{} + + +vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField +( + const fvPatch& p, + const DimensionedField<scalar, volMesh>& iF, + const dictionary& dict +) +: + mixedFvPatchField<scalar>(p, iF), + baffle_(), + dict_(dict) +{ + fvPatchScalarField::operator=(scalarField("value", dict, p.size())); + + if (dict.found("refValue")) + { + // Full restart + refValue() = scalarField("refValue", dict, p.size()); + refGrad() = scalarField("refGradient", dict, p.size()); + valueFraction() = scalarField("valueFraction", dict, p.size()); + } + else + { + // Start from user entered data. Assume fixedValue. + refValue() = *this; + refGrad() = 0; + valueFraction() = 1; + } + + if (!baffle_) + { + baffle_.reset(regionModels::vibrationShellModel::New(p, dict).ptr()); + } +} + + +vibrationShellFvPatchScalarField::vibrationShellFvPatchScalarField +( + const vibrationShellFvPatchScalarField& ptf, + const DimensionedField<scalar, volMesh>& iF +) +: + mixedFvPatchField<scalar>(ptf, iF), + baffle_(), + dict_(ptf.dict_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void vibrationShellFvPatchScalarField::updateCoeffs() +{ + if (this->updated()) + { + return; + } + + baffle_->evolve(); + + const auto& transportProperties = + db().lookupObject<IOdictionary>("transportProperties"); + + dimensionedScalar rho("rho", dimDensity, transportProperties); + + const areaScalarField aRho(rho*baffle_->a()); + + baffle_->vsm().mapToField(aRho, this->refGrad()); + + this->refValue() = Zero; + this->valueFraction() = Zero; + + mixedFvPatchField<scalar>::updateCoeffs(); +} + + +void vibrationShellFvPatchScalarField::write(Ostream& os) const +{ + mixedFvPatchField<scalar>::write(os); + + dict_.write(os, false); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeField +( + fvPatchScalarField, + vibrationShellFvPatchScalarField +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + + +// ************************************************************************* // diff --git a/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H new file mode 100644 index 00000000000..ae742242c7e --- /dev/null +++ b/src/regionFaModels/derivedFvPatchFields/vibrationShell/vibrationShellFvPatchScalarField.H @@ -0,0 +1,172 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::compressible::vibrationShellFvPatchScalarField + +Group + grpVibrationBoundaryConditions + +Description + +Usage + Example of the boundary condition specification: + \verbatim + <masterPatchName> + { + // Mandatory entries (unmodifiable) + type vibrationShell; + + // Mandatory/Optional (inherited) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + type | Type name: vibrationShell | word | yes | - + \endtable + + The inherited entries are elaborated in: + - \link mixedFvPatchField.H \endlink + - \link vibrationShellModel.H \endlink + +SourceFiles + vibrationShellFvPatchScalarField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef vibrationShellFvPatchScalarField_H +#define vibrationShellFvPatchScalarField_H + +#include "autoPtr.H" +#include "vibrationShellModel.H" +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class vibrationShellFvPatchScalarField Declaration +\*---------------------------------------------------------------------------*/ + +class vibrationShellFvPatchScalarField +: + public mixedFvPatchField<scalar> +{ + // Private Data + + //- Thermal baffle + autoPtr<regionModels::vibrationShellModel> baffle_; + + //- Dictionary + mutable dictionary dict_; + + +public: + + //- Runtime type information + TypeName("vibrationShell"); + + + // Constructors + + //- Construct from patch and internal field + vibrationShellFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + vibrationShellFvPatchScalarField + ( + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given + //- vibrationShellFvPatchScalarField onto a new patch + vibrationShellFvPatchScalarField + ( + const vibrationShellFvPatchScalarField&, + const fvPatch&, + const DimensionedField<scalar, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct and return a clone + virtual tmp<fvPatchScalarField> clone() const + { + return tmp<fvPatchScalarField> + ( + new vibrationShellFvPatchScalarField(*this) + ); + } + + //- Construct as copy setting internal field reference + vibrationShellFvPatchScalarField + ( + const vibrationShellFvPatchScalarField&, + const DimensionedField<scalar, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchScalarField> clone + ( + const DimensionedField<scalar, volMesh>& iF + ) const + { + return tmp<fvPatchScalarField> + ( + new vibrationShellFvPatchScalarField(*this, iF) + ); + } + + + // Member Functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/regionFaModel/regionFaModel.C b/src/regionFaModels/regionFaModel/regionFaModel.C new file mode 100644 index 00000000000..9a7078e036c --- /dev/null +++ b/src/regionFaModels/regionFaModel/regionFaModel.C @@ -0,0 +1,172 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "regionFaModel.H" +#include "faMesh.H" +#include "Time.H" +#include "mappedWallPolyPatch.H" +#include "zeroGradientFvPatchFields.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + defineTypeNameAndDebug(regionFaModel, 0); +} +} + +// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // + +void Foam::regionModels::regionFaModel::constructMeshObjects() +{ + regionMeshPtr_.reset + ( + new faMesh(primaryMesh_) + ); +} + + +void Foam::regionModels::regionFaModel::initialise() +{ + if (debug) + { + Pout<< "regionFaModel::initialise()" << endl; + } + + vsmPtr_.reset(new volSurfaceMapping(regionMeshPtr_())); +} + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +bool Foam::regionModels::regionFaModel::read(const dictionary& dict) +{ + if (active_) + { + if (const dictionary* dictptr = dict.findDict(modelName_ + "Coeffs")) + { + coeffs_ <<= *dictptr; + } + + infoOutput_.readIfPresent("infoOutput", dict); + + return true; + } + + return false; +} + + +// * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * // + +const Foam::volSurfaceMapping& Foam::regionModels::regionFaModel::vsm() const +{ + return vsmPtr_(); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::regionModels::regionFaModel::regionFaModel +( + const fvPatch& patch, + const word& regionType, + const word& modelName, + const dictionary& dict, + bool readFields +) +: + primaryMesh_(patch.boundaryMesh().mesh()), + patch_(patch), + time_(patch.boundaryMesh().mesh().time()), + active_(dict.get<Switch>("active")), + infoOutput_(false), + modelName_(modelName), + regionMeshPtr_(nullptr), + coeffs_(dict.subOrEmptyDict(modelName + "Coeffs")), + vsmPtr_(nullptr), + patchID_(patch.index()), + regionName_(dict.lookup("region")) +{ + if (active_) + { + constructMeshObjects(); + initialise(); + + if (readFields) + { + read(dict); + } + } +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void Foam::regionModels::regionFaModel::evolve() +{ + if (active_) + { + Info<< "\nEvolving " << modelName_ << " for region " + << regionMesh().name() << endl; + + preEvolveRegion(); + + evolveRegion(); + + postEvolveRegion(); + + // Provide some feedback + if (infoOutput_) + { + Info<< incrIndent; + info(); + Info<< endl << decrIndent; + } + } +} + + +void Foam::regionModels::regionFaModel::preEvolveRegion() +{} + + +void Foam::regionModels::regionFaModel::evolveRegion() +{} + + +void Foam::regionModels::regionFaModel::postEvolveRegion() +{} + + +void Foam::regionModels::regionFaModel::info() +{} + + +// ************************************************************************* // diff --git a/src/regionFaModels/regionFaModel/regionFaModel.H b/src/regionFaModels/regionFaModel/regionFaModel.H new file mode 100644 index 00000000000..48cb985339b --- /dev/null +++ b/src/regionFaModels/regionFaModel/regionFaModel.H @@ -0,0 +1,256 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::regionModels::regionFaModel + +Description + Base class for area region models. + +Usage + Example of the model specification: + \verbatim + <patchName> + { + // Mandatory entries (runtime modifiable) + region <regionName>; + active true; + + // Optional entries (runtime modifiable) + infoOutput false; + <model>Coeffs + { + // subdictionary entries + } + + // Mandatory/Optional (derived) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + region | Name of operand region | word | yes | - + active | Flag to activate the model | bool | yes | - + infoOutput | Flag to activate information output | bool | no | false + \endtable + +SourceFiles + regionFaModelI.H + regionFaModel.C + +\*---------------------------------------------------------------------------*/ + +#ifndef regionFaModel_H +#define regionFaModel_H + +#include "volMesh.H" +#include "IOdictionary.H" +#include "Switch.H" +#include "labelList.H" +#include "areaFields.H" +#include "faMesh.H" +#include "volSurfaceMapping.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +namespace regionModels +{ + +/*---------------------------------------------------------------------------*\ + Class regionFaModel Declaration +\*---------------------------------------------------------------------------*/ + +class regionFaModel +{ + // Private Member Functions + + //- Construct region mesh and fields + void constructMeshObjects(); + + //- Initialise the region + void initialise(); + + +protected: + + // Protected Data + + //- Reference to the primary mesh database + const fvMesh& primaryMesh_; + + //- Reference to fvPatch + const fvPatch& patch_; + + //- Reference to the time database + const Time& time_; + + //- Active flag + Switch active_; + + //- Active information output + Switch infoOutput_; + + //- Model name + const word modelName_; + + //- Pointer to the region mesh database + autoPtr<faMesh> regionMeshPtr_; + + //- Model coefficients dictionary + dictionary coeffs_; + + //-Volume-to surface mapping + autoPtr<volSurfaceMapping> vsmPtr_; + + + // Addressing + + //- Patch IDs on the primary region coupled to this region + label patchID_; + + + //- Region name + word regionName_; + + + // Protected Member Functions + + //- Read control parameters from dictionary + virtual bool read(const dictionary& dict); + + +public: + + //- Runtime type information + TypeName("regionFaModel"); + + + // Constructors + + //- Construct from mesh and name and dict + regionFaModel + ( + const fvPatch& patch, + const word& regionType, + const word& modelName, + const dictionary& dict, + bool readFields = true + ); + + //- No copy construct + regionFaModel(const regionFaModel&) = delete; + + //- No copy assignment + void operator=(const regionFaModel&) = delete; + + + //- Destructor + virtual ~regionFaModel() = default; + + + // Member Functions + + // Access + + //- Return the reference to the primary mesh database + inline const fvMesh& primaryMesh() const; + + //- Return the reference to the time database + inline const Time& time() const; + + //- Return the active flag + inline const Switch& active() const; + + //- Return the information flag + inline const Switch& infoOutput() const; + + //- Return the model name + inline const word& modelName() const; + + //- Return the region mesh database + inline const faMesh& regionMesh() const; + + //- Return the region mesh database for manipulation + inline faMesh& regionMesh(); + + //- Return the model coefficients dictionary + inline const dictionary& coeffs() const; + + //- Return the solution dictionary + inline const dictionary& solution() const; + + //- Return volSurfaceMapping + const volSurfaceMapping& vsm() const; + + + // Addressing + + //- Return the list of patch IDs on the primary region coupled + //- to this region + inline label patchID(); + + + // Evolution + + //- Main driver routing to evolve the region - calls other evolves + virtual void evolve(); + + //- Pre-evolve region + virtual void preEvolveRegion(); + + //- Evolve the region + virtual void evolveRegion(); + + //- Post-evolve region + virtual void postEvolveRegion(); + + + // IO + + //- Provide some feedback + virtual void info(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionFaModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "regionFaModelI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/regionFaModel/regionFaModelI.H b/src/regionFaModels/regionFaModel/regionFaModelI.H new file mode 100644 index 00000000000..35fe64d4997 --- /dev/null +++ b/src/regionFaModels/regionFaModel/regionFaModelI.H @@ -0,0 +1,118 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "regionFaModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +inline const Foam::fvMesh& +Foam::regionModels::regionFaModel::primaryMesh() const +{ + return primaryMesh_; +} + + +inline const Foam::Time& Foam::regionModels::regionFaModel::time() const +{ + return time_; +} + + +inline const Foam::Switch& Foam::regionModels::regionFaModel::active() const +{ + return active_; +} + + +inline const Foam::Switch& Foam::regionModels::regionFaModel::infoOutput() const +{ + return infoOutput_; +} + + +inline const Foam::word& Foam::regionModels::regionFaModel::modelName() const +{ + return modelName_; +} + + +inline const Foam::faMesh& Foam::regionModels::regionFaModel::regionMesh() const +{ + const auto* regionPtr = time_.findObject<faMesh>(regionName_); + + if (regionPtr) + { + return *regionPtr; + } + else if (!regionMeshPtr_.valid()) + { + FatalErrorInFunction + << "Region mesh not available" << abort(FatalError); + } + + return *regionMeshPtr_; +} + + +inline Foam::faMesh& Foam::regionModels::regionFaModel::regionMesh() +{ + auto* regionPtr = time_.getObjectPtr<faMesh>(regionName_); + + if (regionPtr) + { + return *regionPtr; + } + else if (!regionMeshPtr_.valid()) + { + FatalErrorInFunction + << "Region mesh not available" << abort(FatalError); + } + + return *regionMeshPtr_; +} + + +inline const Foam::dictionary& Foam::regionModels::regionFaModel::coeffs() const +{ + return coeffs_; +} + + +inline const Foam::dictionary& +Foam::regionModels::regionFaModel::solution() const +{ + return regionMesh().solutionDict(); +} + + +inline Foam::label Foam::regionModels::regionFaModel::patchID() +{ + return patchID_; +} + + +// ************************************************************************* // diff --git a/src/regionFaModels/thermalShell/thermalShell.C b/src/regionFaModels/thermalShell/thermalShell.C new file mode 100644 index 00000000000..797de7e2d5e --- /dev/null +++ b/src/regionFaModels/thermalShell/thermalShell.C @@ -0,0 +1,232 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "thermalShell.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFields.H" +#include "zeroGradientFaPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(thermalShell, 0); + +addToRunTimeSelectionTable(thermalShellModel, thermalShell, dictionary); + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +bool thermalShell::read(const dictionary& dict) +{ + this->solution().readEntry("nNonOrthCorr", nNonOrthCorr_); + + return true; +} + + +void thermalShell::solveEnergy() +{ + if (debug) + { + InfoInFunction << endl; + } + + const areaScalarField rhoCph(Cp()*rho()*h_); + + faScalarMatrix TEqn + ( + fam::ddt(rhoCph, T_) + - fam::laplacian(kappa()*h_, T_) + == + qs_ + //+ q(T_) handled by faOption contactHeatFlux + + faOptions()(h_, rhoCph, T_) + ); + + TEqn.relax(); + + faOptions().constrain(TEqn); + + TEqn.solve(); + + faOptions().correct(T_); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +thermalShell::thermalShell +( + const word& modelType, + const fvPatch& patch, + const dictionary& dict +) +: + thermalShellModel(modelType, patch, dict), + nNonOrthCorr_(1), + thermo_(dict.subDict("thermo")), + qs_ + ( + IOobject + ( + "qs_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + regionMesh(), + dimensionedScalar(dimPower/dimArea, Zero) + ), + h_ + ( + IOobject + ( + "h_" + regionName_, + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + regionMesh() + ) +{ + init(); +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void thermalShell::init() +{} + + +void thermalShell::preEvolveRegion() +{} + + +void thermalShell::evolveRegion() +{ + nNonOrthCorr_ = solution().get<label>("nNonOrthCorr"); + + for (int nonOrth = 0; nonOrth <= nNonOrthCorr_; ++nonOrth) + { + solveEnergy(); + } + + Info<< "T min/max = " << min(T_) << ", " << max(T_) << endl; +} + + +const tmp<areaScalarField> thermalShell::Cp() const +{ + return tmp<areaScalarField> + ( + new areaScalarField + ( + IOobject + ( + "Cps", + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + regionMesh(), + dimensionedScalar(dimEnergy/dimTemperature/dimMass, thermo_.Cp()), + zeroGradientFaPatchScalarField::typeName + ) + ); +} + + +const tmp<areaScalarField> thermalShell::rho() const +{ + return tmp<areaScalarField> + ( + new areaScalarField + ( + IOobject + ( + "rhos", + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + regionMesh(), + dimensionedScalar(dimDensity, thermo_.rho()), + zeroGradientFaPatchScalarField::typeName + ) + ); +} + + +const tmp<areaScalarField> thermalShell::kappa() const +{ + return tmp<areaScalarField> + ( + new areaScalarField + ( + IOobject + ( + "kappas", + primaryMesh().time().timeName(), + primaryMesh(), + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + regionMesh(), + dimensionedScalar + ( + dimPower/dimLength/dimTemperature, + thermo_.kappa() + ), + zeroGradientFaPatchScalarField::typeName + ) + ); +} + + +void thermalShell::info() +{} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/regionFaModels/thermalShell/thermalShell.H b/src/regionFaModels/thermalShell/thermalShell.H new file mode 100644 index 00000000000..6160855c130 --- /dev/null +++ b/src/regionFaModels/thermalShell/thermalShell.H @@ -0,0 +1,208 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::regionFaModels::thermalShell + +Description + Thermal-shell finite-area model. It solves the energy + equation in 2D. The coupling with the 3D region is done through + the \c temperatureCoupledBase, plus \c faOption is available to + add extra sources on the shell such as \c externalHeatFluxSource etc. + +Usage + Example of the boundary condition specification: + \verbatim + <patchName> + { + // Mandatory/Optional (inherited) entries + ... + + // Mandatory entries (unmodifiable) + thermalShellModel thermalShell; + thermo + { + // subdictionary entries + } + + // Mandatory/Optional (derived) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + thermalShellModel | Type name: thermalShell | word | yes | - + thermo | Solid thermal properties | dictionary | yes | - + \endtable + + The inherited entries are elaborated in: + - \link thermalShellModel.H \endlink + +See also + - Foam::regionModels::thermalShellModels::thermalShellModel + +SourceFiles + thermalShell.C + thermalShellI.H + +\*---------------------------------------------------------------------------*/ + +#ifndef thermalShell_H +#define thermalShell_H + +#include "volFieldsFwd.H" +#include "thermalShellModel.H" +#include "solidProperties.H" +#include "faMesh.H" +#include "faCFD.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +/*---------------------------------------------------------------------------*\ + Class thermalShell Declaration +\*---------------------------------------------------------------------------*/ + +class thermalShell +: + public thermalShellModel +{ + // Private Member Functions + + //- Initialize thermalShell + void init(); + + +protected: + + // Protected Data + + // Solution parameters + + //- Number of non orthogonal correctors + label nNonOrthCorr_; + + + // Thermo properties + + //- Solid properties + solidProperties thermo_; + + + // Source term fields + + //- External surface energy source / [J/m2/s] + areaScalarField qs_; + + //- Thickness + areaScalarField h_; + + + // Protected Member Functions + + //- Read control parameters from dictionary + virtual bool read(const dictionary& dict); + + + // Equations + + //- Solve energy equation + void solveEnergy(); + + +public: + + //- Runtime type information + TypeName("thermalShell"); + + + // Constructors + + //- Construct from components and dict + thermalShell + ( + const word& modelType, + const fvPatch& patch, + const dictionary& dict + ); + + //- No copy construct + thermalShell(const thermalShell&) = delete; + + //- No copy assignment + void operator=(const thermalShell&) = delete; + + + //- Destructor + virtual ~thermalShell() = default; + + + // Member Functions + + // Fields + + //- Return the film specific heat capacity [J/kg/K] + const tmp<areaScalarField> Cp() const; + + //- Return density [Kg/m3] + const tmp<areaScalarField> rho() const; + + //- Return thermal conductivity [W/m/K] + const tmp<areaScalarField> kappa() const; + + + // Evolution + + //- Pre-evolve thermal baffle + virtual void preEvolveRegion(); + + //- Evolve the thermal baffle + virtual void evolveRegion(); + + + // IO + + //- Provide some feedback + virtual void info(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/thermalShellModel/thermalShellModel.C b/src/regionFaModels/thermalShellModel/thermalShellModel.C new file mode 100644 index 00000000000..4ee3c206e35 --- /dev/null +++ b/src/regionFaModels/thermalShellModel/thermalShellModel.C @@ -0,0 +1,121 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "thermalShellModel.H" +#include "faMesh.H" +#include "fvMesh.H" +#include "fvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(thermalShellModel, 0); + +defineRunTimeSelectionTable(thermalShellModel, dictionary); + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +bool thermalShellModel::read(const dictionary& dict) +{ + if (regionFaModel::read(dict)) + { + return true; + } + + return false; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +thermalShellModel::thermalShellModel +( + const word& modelType, + const fvPatch& p, + const dictionary& dict +) +: + regionFaModel(p, "thermalShell", modelType, dict, true), + TName_(dict.get<word>("T")), + Tp_(p.boundaryMesh().mesh().lookupObject<volScalarField>(TName_)), + T_ + ( + IOobject + ( + "Ts_" + regionName_, + p.boundaryMesh().mesh().time().timeName(), + p.boundaryMesh().mesh(), + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + regionMesh() + ), + faOptions_(Foam::fa::options::New(p)) +{ + if (!faOptions_.optionList::size()) + { + Info << "No finite area options present" << endl; + } +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void thermalShellModel::preEvolveRegion() +{} + + +const Foam::volScalarField& thermalShellModel::Tp() const +{ + return Tp_; +} + + +const Foam::areaScalarField& thermalShellModel::T() const +{ + return T_; +} + + +Foam::fa::options& thermalShellModel::faOptions() +{ + return faOptions_; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/regionFaModels/thermalShellModel/thermalShellModel.H b/src/regionFaModels/thermalShellModel/thermalShellModel.H new file mode 100644 index 00000000000..2b2e9ec2829 --- /dev/null +++ b/src/regionFaModels/thermalShellModel/thermalShellModel.H @@ -0,0 +1,205 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::regionModels::thermalShellModels::thermalShellModel + +Description + Intermediate class for thermal-shell finite-area models. + +Usage + Example of the boundary condition specification: + \verbatim + <patchName> + { + // Mandatory/Optional (inherited) entries + ... + + // Mandatory entries (unmodifiable) + T <Tname>; + + // Optional entries (unmodifiable) + thermalShellModel <thermalShellModelName>; + + // Mandatory/Optional (derived) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + T | Name of operand temperature field | word | yes | - + thermalShellModel | Name of thermal-shell model <!-- + --> | word | no | thermalShell + \endtable + + The inherited entries are elaborated in: + - \link regionFaModel.H \endlink + +SourceFiles + thermalShellModel.C + thermalShellModelNew.C + +\*---------------------------------------------------------------------------*/ + +#ifndef thermalShellModel_H +#define thermalShellModel_H + +#include "runTimeSelectionTables.H" +#include "autoPtr.H" +#include "areaFieldsFwd.H" +#include "volFieldsFwd.H" +#include "regionFaModel.H" +#include "faOptions.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +/*---------------------------------------------------------------------------*\ + Class thermalShellModel Declaration +\*---------------------------------------------------------------------------*/ + +class thermalShellModel +: + public regionFaModel +{ + // Private Member Functions + + //- Initialize thermal Baffle + void init(); + + +protected: + + // Protected Data + + //- Name of the temperature field + word TName_; + + //- Primary region temperature + const volScalarField& Tp_; + + //- Shell temperature + areaScalarField T_; + + //- Pointer to faOptions + Foam::fa::options& faOptions_; + + + // Protected Member Functions + + //- Read control parameters from dictionary + virtual bool read(const dictionary&); + + +public: + + //- Runtime type information + TypeName("thermalShellModel"); + + + // Declare runtime constructor selection tables + + declareRunTimeSelectionTable + ( + autoPtr, + thermalShellModel, + dictionary, + ( + const word& modelType, + const fvPatch& patch, + const dictionary& dict + ), + (modelType, patch, dict) + ); + + + // Constructors + + //- Construct from type name and mesh and dict + thermalShellModel + ( + const word& modelType, + const fvPatch& patch, + const dictionary& dict + ); + + //- No copy construct + thermalShellModel(const thermalShellModel&) = delete; + + //- No copy assignment + void operator=(const thermalShellModel&) = delete; + + + // Selectors + + //- Return a reference to the selected model using dictionary + static autoPtr<thermalShellModel> New + ( + const fvPatch& patch, + const dictionary& dict + ); + + + //- Destructor + virtual ~thermalShellModel() = default; + + + // Member Functions + + // Access + + //- Return primary region temperature + const volScalarField& Tp() const; + + //- Return shell temperature + const areaScalarField& T() const; + + //- Return faOptions + Foam::fa::options& faOptions(); + + + // Evolution + + //- Pre-evolve region + virtual void preEvolveRegion(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/thermalShellModel/thermalShellModelNew.C b/src/regionFaModels/thermalShellModel/thermalShellModelNew.C new file mode 100644 index 00000000000..71848973d93 --- /dev/null +++ b/src/regionFaModels/thermalShellModel/thermalShellModelNew.C @@ -0,0 +1,69 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "thermalShellModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +autoPtr<thermalShellModel> thermalShellModel::New +( + const fvPatch& p, + const dictionary& dict +) +{ + const word modelType = + dict.getOrDefault<word>("thermalShellModel", "thermalShell"); + + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); + + if (!cstrIter.found()) + { + FatalErrorInFunction + << "Unknown thermalShellModel type " + << modelType << nl << nl + << "Valid thermalShellModel types :" << nl + << dictionaryConstructorTablePtr_->sortedToc() + << exit(FatalError); + } + + return autoPtr<thermalShellModel>(cstrIter()(modelType, p, dict)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/regionFaModels/vibrationShellModel/vibrationShellModel.C b/src/regionFaModels/vibrationShellModel/vibrationShellModel.C new file mode 100644 index 00000000000..ea309868a0d --- /dev/null +++ b/src/regionFaModels/vibrationShellModel/vibrationShellModel.C @@ -0,0 +1,148 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "vibrationShellModel.H" +#include "faMesh.H" +#include "fvMesh.H" +#include "fvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +defineTypeNameAndDebug(vibrationShellModel, 0); + +defineRunTimeSelectionTable(vibrationShellModel, dictionary); + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +bool vibrationShellModel::read(const dictionary& dict) +{ + if (regionFaModel::read(dict)) + { + return true; + } + + return false; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +vibrationShellModel::vibrationShellModel +( + const word& modelType, + const fvPatch& p, + const dictionary& dict +) +: + regionFaModel(p, "vibratingShell", modelType, dict, true), + pName_(dict.get<word>("p")), + pa_(p.boundaryMesh().mesh().lookupObject<volScalarField>(pName_)), + w_ + ( + IOobject + ( + "ws_" + regionName_, + p.boundaryMesh().mesh().time().timeName(), + p.boundaryMesh().mesh(), + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + regionMesh() + ), + a_ + ( + IOobject + ( + "as_" + regionName_, + p.boundaryMesh().mesh().time().timeName(), + p.boundaryMesh().mesh(), + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + regionMesh(), + dimensionedScalar(dimAcceleration, Zero) + ), + faOptions_(Foam::fa::options::New(p)), + solid_(dict.subDict("solid")) +{ + if (!faOptions_.optionList::size()) + { + Info << "No finite area options present" << endl; + } +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +void vibrationShellModel::preEvolveRegion() +{} + + +const Foam::volScalarField& vibrationShellModel::pa() const +{ + return pa_; +} + + +const Foam::areaScalarField& vibrationShellModel::w() const +{ + return w_; +} + + +const Foam::areaScalarField& vibrationShellModel::a() const +{ + return a_; +} + + +Foam::fa::options& vibrationShellModel::faOptions() +{ + return faOptions_; +} + + +const Foam::solidProperties& vibrationShellModel::solid() const +{ + return solid_; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/regionFaModels/vibrationShellModel/vibrationShellModel.H b/src/regionFaModels/vibrationShellModel/vibrationShellModel.H new file mode 100644 index 00000000000..566d4fd2bd0 --- /dev/null +++ b/src/regionFaModels/vibrationShellModel/vibrationShellModel.H @@ -0,0 +1,218 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::regionModels::thermalShellModels::vibrationShellModel + +Description + Intermediate class for vibration-shell finite-area models. + +Usage + Example of the boundary condition specification: + \verbatim + <patchName> + { + // Mandatory/Optional (inherited) entries + ... + + // Mandatory entries (unmodifiable) + vibrationShellModel <thermalShellModelName>; + p <pName>; + + solid + { + // subdictionary entries + } + + // Mandatory/Optional (derived) entries + ... + } + \endverbatim + + where the entries mean: + \table + Property | Description | Type | Reqd | Dflt + vibrationShellModel | Name of vibration-shell model | word | yes | - + p | Name of the coupled field in the primary <!-- + --> region | word | yes | - + solid | Solid properties | dictionary | yes | - + \endtable + + The inherited entries are elaborated in: + - \link regionFaModel.H \endlink + +SourceFiles + vibrationShellModel.C + +\*---------------------------------------------------------------------------*/ + +#ifndef thermalShellModel_H +#define thermalShellModel_H + +#include "runTimeSelectionTables.H" +#include "autoPtr.H" +#include "areaFieldsFwd.H" +#include "volFieldsFwd.H" +#include "regionFaModel.H" +#include "faOptions.H" +#include "solidProperties.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +/*---------------------------------------------------------------------------*\ + Class vibrationShellModel Declaration +\*---------------------------------------------------------------------------*/ + +class vibrationShellModel +: + public regionFaModel +{ + // Private Member Functions + + //- No copy construct + vibrationShellModel(const vibrationShellModel&) = delete; + + //- No copy assignment + void operator=(const vibrationShellModel&) = delete; + + +protected: + + // Protected Data + + //- Name of the coupled field in the primary region + word pName_; + + //- Primary region acoustic pressure + const volScalarField& pa_; + + //- Shell displacement + areaScalarField w_; + + //- Shell acceleration + areaScalarField a_; + + //- Pointer to faOptions + Foam::fa::options& faOptions_; + + //- Solid properties + solidProperties solid_; + + + // Protected Member Functions + + //- Read control parameters from dictionary + virtual bool read(const dictionary&); + + +public: + + //- Runtime type information + TypeName("vibrationShellModel"); + + + // Declare runtime constructor selection tables + + declareRunTimeSelectionTable + ( + autoPtr, + vibrationShellModel, + dictionary, + ( + const word& modelType, + const fvPatch& patch, + const dictionary& dict + ), + (modelType, patch, dict) + ); + + + // Constructors + + //- Construct from type name and mesh and dict + vibrationShellModel + ( + const word& modelType, + const fvPatch& patch, + const dictionary& dict + ); + + + // Selectors + + //- Return a reference to the selected model using dictionary + static autoPtr<vibrationShellModel> New + ( + const fvPatch& patch, + const dictionary& dict + ); + + + //- Destructor + virtual ~vibrationShellModel() = default; + + + // Member Functions + + // Access + + //- Return primary region pa + const volScalarField& pa() const; + + //- Return shell displacement + const areaScalarField& w() const; + + //- Return shell acceleration + const areaScalarField& a() const; + + //- Return faOptions + Foam::fa::options& faOptions(); + + //- Return solid properties + const solidProperties& solid() const; + + + // Evolution + + //- Pre-evolve region + virtual void preEvolveRegion(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C b/src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C new file mode 100644 index 00000000000..01234e34511 --- /dev/null +++ b/src/regionFaModels/vibrationShellModel/vibrationShellModelNew.C @@ -0,0 +1,68 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2019-2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "vibrationShellModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace regionModels +{ + +// * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * * // + +autoPtr<vibrationShellModel> vibrationShellModel::New +( + const fvPatch& p, + const dictionary& dict +) +{ + const word modelType = dict.get<word>("vibrationShellModel"); + + auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType); + + if (!cstrIter.found()) + { + FatalErrorInFunction + << "Unknown vibrationShellModel type " + << modelType << nl << nl + << "Valid vibrationShellModel types :" << nl + << dictionaryConstructorTablePtr_->sortedToc() + << exit(FatalError); + } + + return autoPtr<vibrationShellModel>(cstrIter()(modelType, p, dict)); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace regionModels +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H b/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H index f8628882fed..65beade5915 100644 --- a/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H +++ b/src/surfMesh/writers/boundaryData/boundaryDataSurfaceWriter.H @@ -159,6 +159,9 @@ class boundaryDataWriter // Private Member Functions + //- Write option (default: IOstream::ASCII) + IOstream::streamFormat writeFormat_; + //- Templated write field operation template<class Type> fileName writeTemplate diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C index 173eddf86d7..95315348a63 100644 --- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C +++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/C/C.C @@ -42,7 +42,7 @@ namespace Foam Foam::C::C() : - solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011) + solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011, 0.0, 0.0) { if (debug) { diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C index 03fae10e830..c4e2eae0b9c 100644 --- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C +++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/CaCO3/CaCO3.C @@ -42,7 +42,7 @@ namespace Foam Foam::CaCO3::CaCO3() : - solidProperties(2710, 850, 1.3, 0.0, 1.0, 100.086) + solidProperties(2710, 850, 1.3, 0.0, 1.0, 100.086, 0.0, 0.0) { if (debug) { diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C index cd41a4824ba..e6ace630763 100644 --- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C +++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/ash/ash.C @@ -42,7 +42,7 @@ namespace Foam Foam::ash::ash() : - solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011) + solidProperties(2010, 710, 0.04, 0.0, 1.0, 12.011, 0.0, 0.0) { if (debug) { diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C index d2afd3e5ec6..443c4c91978 100644 --- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C +++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.C @@ -47,7 +47,9 @@ Foam::solidProperties::solidProperties scalar kappa, scalar Hf, scalar emissivity, - scalar W + scalar W, + scalar nu, + scalar E ) : rho_(rho), @@ -55,7 +57,9 @@ Foam::solidProperties::solidProperties kappa_(kappa), Hf_(Hf), emissivity_(emissivity), - W_(W) + W_(W), + nu_(nu), + E_(E) {} @@ -66,7 +70,9 @@ Foam::solidProperties::solidProperties(const dictionary& dict) kappa_(dict.getCompat<scalar>("kappa", {{"K", 1612}})), Hf_(dict.get<scalar>("Hf")), emissivity_(dict.get<scalar>("emissivity")), - W_(dict.get<scalar>("W")) + W_(dict.get<scalar>("W")), + nu_(dict.getOrDefault<scalar>("nu", 0.0)), + E_(dict.getOrDefault<scalar>("E", 0.0)) {} @@ -80,6 +86,8 @@ void Foam::solidProperties::readIfPresent(const dictionary& dict) dict.readIfPresent("Hf", Hf_); dict.readIfPresent("emissivity", emissivity_); dict.readIfPresent("W", W_); + dict.readIfPresent("nu", nu_); + dict.readIfPresent("E", E_); } @@ -90,7 +98,9 @@ void Foam::solidProperties::writeData(Ostream& os) const << kappa_ << token::SPACE << Hf_ << token::SPACE << emissivity_ << token::SPACE - << W_; + << W_ << token::SPACE + << nu_ << token::SPACE + << E_; } diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H index 7c089ae0e44..3d8729acc36 100644 --- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H +++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidProperties.H @@ -74,6 +74,12 @@ class solidProperties //- Molar weight [Kg/Kmol] scalar W_; + //- Poisson ration + scalar nu_; + + //- Young Modulus [N/m2] + scalar E_; + public: @@ -112,7 +118,9 @@ public: scalar kappa, scalar Hf, scalar emissivity, - scalar W + scalar W, + scalar nu, + scalar E ); //- Construct from dictionary @@ -163,6 +171,12 @@ public: //- Molar weight [Kg/Kmol] inline scalar W() const; + //- Poissons + inline scalar nu() const; + + //- Young modulus [N/m2] + inline scalar E() const; + // I-O diff --git a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H index 16189b52b3d..0f6148bdef6 100644 --- a/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H +++ b/src/thermophysicalModels/thermophysicalProperties/solidProperties/solidProperties/solidPropertiesI.H @@ -65,10 +65,23 @@ inline Foam::scalar Foam::solidProperties::emissivity() const return emissivity_; } + inline Foam::scalar Foam::solidProperties::W() const { return W_; } +inline Foam::scalar Foam::solidProperties::nu() const +{ + return nu_; +} + + +inline Foam::scalar Foam::solidProperties::E() const +{ + return E_; +} + + // ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/Allclean b/tutorials/compressible/acousticFoam/obliqueAirJet/Allclean new file mode 100755 index 00000000000..87adb1f6be7 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/Allclean @@ -0,0 +1,10 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions +#------------------------------------------------------------------------------ + +(cd precursor && ./Allclean) + +(cd main && ./Allclean) + +# ----------------------------------------------------------------------------- diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel b/tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel new file mode 100755 index 00000000000..b3bcb07bffc --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/Allrun-parallel @@ -0,0 +1,13 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +# Run a precursor init case +(cd main && ./Allrun.pre) +(cd precursor && ./Allrun-parallel) + +# Run the main case +(cd main && ./Allrun-parallel) + +# ----------------------------------------------------------------------------- diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell new file mode 100644 index 00000000000..7c4124634b0 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/h_vibrationShell @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class areaScalarField; + object h_ceilingShell; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform 0.00485; + +boundaryField +{ + ".*" + { + type zeroGradient; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa new file mode 100644 index 00000000000..0128164ecc9 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/pa @@ -0,0 +1,67 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object pa; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + box + { + type acousticWaveTransmissive; + advectiveSpeed 340; + value $internalField; + } + + window + { + type vibrationShell; + active true; + p pa; + + solid + { + W 20; //Not used + rho 2500; + + kappa 200; + Cp 600; + Hf 0; + emissivity 0; + + E 7e10; + nu 0.22; + } + + region vibrationShell; + vibrationShellModel KirchhoffShell; + + f0 0.04; + f1 0; + f2 0; + + value $internalField; + } + + wall + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell new file mode 100644 index 00000000000..e708286b16c --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ps_vibrationShell @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class areaScalarField; + object ps; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + ".*" + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell new file mode 100644 index 00000000000..94a7f4b43f5 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/0.orig/ws_vibrationShell @@ -0,0 +1,31 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class areaScalarField; + object wS; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform 0.0; + +boundaryField +{ + sealing + { + type clampedPlate; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean new file mode 100755 index 00000000000..25241a589c0 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allclean @@ -0,0 +1,12 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions +#------------------------------------------------------------------------------ + +cleanCase0 + +rm -rf constant/boundaryData +rm -f constant/faMesh/faceLabels +rm -f constant/faMesh/faBoundary + +# ----------------------------------------------------------------------------- diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel new file mode 100755 index 00000000000..28d05965c37 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun-parallel @@ -0,0 +1,14 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +restore0Dir + +runApplication decomposePar -force + +runParallel $(getApplication) + +runApplication reconstructPar + +#------------------------------------------------------------------------------ diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre new file mode 100755 index 00000000000..8ac85a8f173 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/Allrun.pre @@ -0,0 +1,12 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +runApplication blockMesh + +runApplication snappyHexMesh -overwrite + +runApplication makeFaMesh + +#------------------------------------------------------------------------------ diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition new file mode 100644 index 00000000000..ed7eb31b732 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/faMesh/faMeshDefinition @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faMeshDefinition; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +polyMeshPatches 1(window); + +boundary +{ + sealing + { + type patch; + ownerPolyPatch window; + neighbourPolyPatch fixedWall; + } +} + + +// ************************************************************************** // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties new file mode 100644 index 00000000000..6697be20ead --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/transportProperties @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +c0 340.; +rho 1.2; + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/triSurface/window_box.stl.gz b/tutorials/compressible/acousticFoam/obliqueAirJet/main/constant/triSurface/window_box.stl.gz new file mode 100644 index 0000000000000000000000000000000000000000..06a030747e5659792b09eeac0ea5e7795267b000 GIT binary patch literal 51747 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 literal 0 HcmV?d00001 diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict new file mode 100644 index 00000000000..cba6a4a543f --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/blockMeshDict @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +scale 1; + +vertices +( + (-.2 -.3 -.2) + (2.2 -.3 -.2) + (2.2 1.3 -.2) + (-.2 1.3 -.2) + + (-.2 -.3 2.2) + (2.2 -.3 2.2) + (2.2 1.3 2.2) + (-.2 1.3 2.2) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (15 10 15) simpleGrading (1 1 1) +); + +edges +( +); + +patches +( +); + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict new file mode 100644 index 00000000000..2b7179b5179 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/controlDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application acousticFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.03; + +deltaT 1e-6; + +writeControl timeStep; + +writeInterval 200; + +purgeWrite 0; + +writeFormat binary; + +writePrecision 12; + +timeFormat general; + +timePrecision 12; + +runTimeModifiable yes; + +adjustTimeStep no; + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict new file mode 100644 index 00000000000..1a5866caf17 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/decomposeParDict @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 6; + +method scotch; + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions new file mode 100644 index 00000000000..2388c160641 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faOptions @@ -0,0 +1,31 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faOptions; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +pressure +{ + type externalFileSource; + fieldName ws_vibrationShell; + tableName p; + active true; + timeStart 0.001; + duration 0.03; + region vibrationShell; + selectionMode all; + format binary; +} + + +//************************************************************************** // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes new file mode 100644 index 00000000000..173abaa2794 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSchemes @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +d2dt2Schemes +{ + default Euler; +} + +gradSchemes +{ + default leastSquares; + grad(ws_vibrationShell) leastSquares; +} + +divSchemes +{ + default Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution new file mode 100644 index 00000000000..14d0babd74d --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/faSolution @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object faSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + ws_vibrationShell + { + solver diagonal; + preconditioner DILU; + tolerance 1e-08; + relTol 0; + } +} + +nNonOrthCorr 0; +nSubCycles 2; + +relaxationFactors +{ + w_vibrationShell 1; +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes new file mode 100644 index 00000000000..33b28299b63 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSchemes @@ -0,0 +1,59 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +d2dt2Schemes +{ + default Euler; +} + +gradSchemes +{ + default leastSquares; +} + +divSchemes +{ + default Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear orthogonal; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default orthogonal; +} + +wallDist +{ + method meshWave; + nRequired yes; +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution new file mode 100644 index 00000000000..3e50abb3c3a --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/fvSolution @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + pa + { + solver GAMG; + tolerance 0; + relTol 0.01; + smoother DICGaussSeidel; + } + + paFinal + { + $p; + tolerance 1e-6; + relTol 0; + } +} + +PIMPLE +{ + nOuterCorrectors 3; + nCOrrectors 1; + nNonOrthogonalCorrectors 0; +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict new file mode 100644 index 00000000000..57c81d26cf2 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/main/system/snappyHexMeshDict @@ -0,0 +1,136 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object snappyHexMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +castellatedMesh true; +snap true; +addLayers false; + +geometry +{ + "window_box.stl" + { + type triSurfaceMesh; + name window_box; + regions + { + window {name window;} + box {name box;} + wall {name fixedWall;} + } + } + rbox_f + { + type searchableBox; + min (0.7 0 0.7); + max (1.3 0.5 1.3); + } + rbox_c + { + type searchableBox; + min (0 0 0); + max (2 1 2); + } +}; + + +castellatedMeshControls +{ + maxLocalCells 300000000; + maxGlobalCells 300000000; + minRefinementCells 10; + maxLoadUnbalance 0.10; + nCellsBetweenLevels 1; + + features + ( + ); + + refinementSurfaces + { + window_box + { + level (2 2); + regions + { + window{ level (3 3); } + } + } + } + + resolveFeatureAngle 30; + + refinementRegions + { + rbox_f + { + mode inside; + levels ((3 3)); + } + rbox_c + { + mode inside; + levels ((2 2)); + } + } + + locationInMesh (1.0134 0.543 1.0765); + + allowFreeStandingZoneFaces false; +} + + +snapControls +{ + nSmoothPatch 3; + tolerance 4.0; + nSolveIter 10; + nRelaxIter 5; + nFeatureSnapIter 10; + + explicitFeatureSnap false; + implicitFeatureSnap true; +} + + +addLayersControls +{} + + +meshQualityControls +{ + maxNonOrtho 65; + maxBoundarySkewness 20; + maxInternalSkewness 4; + maxConcave 80; + minVol 1e-13; + minTetQuality -1; + minArea -1; + minTwist 0.02; + minDeterminant 0.001; + minFaceWeight 0.05; + minVolRatio 0.01; + minTriangleTwist -1; + + nSmoothScale 4; + errorReduction 0.75; +} + +debug 0; + +mergeTolerance 1e-8; + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T new file mode 100644 index 00000000000..92b10989cd6 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/T @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object T; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Tinlet 293; + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform $Tinlet; + +boundaryField +{ + inlet + { + type fixedValue; + value uniform $Tinlet; + } + + "(window|fixedWall)" + { + type zeroGradient; + } + + box + { + type inletOutlet; + inletValue uniform $Tinlet; + value uniform $Tinlet; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U new file mode 100644 index 00000000000..6cecc4d7471 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/U @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + inlet + { + type fixedValue; + value uniform (0 -1 20); + } + + "(window|fixedWall)" + { + type noSlip; + } + + box + { + type pressureInletOutletVelocity; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat new file mode 100644 index 00000000000..0d666dc61cd --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/alphat @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object alphat; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + inlet + { + type calculated; + value $internalField; + } + + "(window|fixedWall)" + { + type compressible::alphatWallFunction; + value $internalField; + } + + box + { + type zeroGradient; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda new file mode 100644 index 00000000000..4801adb0ddb --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nuTilda @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object nuTilda; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 1.51e-05; + +boundaryField +{ + inlet + { + type fixedValue; + value $internalField; + } + + "(window|fixedWall)" + { + type zeroGradient; + value $internalField; + } + + box + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut new file mode 100644 index 00000000000..bfe0450f34d --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/nut @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object nut; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 1e-5; + +boundaryField +{ + inlet + { + type calculated; + value $internalField; + } + + "(window|fixedWall)" + { + type nutUSpaldingWallFunction; + value $internalField; + } + + box + { + type calculated; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p new file mode 100644 index 00000000000..7036695e94c --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/0.orig/p @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 1e5; + +boundaryField +{ + "(inlet|window|fixedWall)" + { + type zeroGradient; + } + + box + { + type waveTransmissive; + field p; + phi phi; + rho rho; + psi thermo:psi; + gamma 1.4; + fieldInf 1e5; + lInf 5.0; + value $internalField; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean new file mode 100755 index 00000000000..91099c43c02 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allclean @@ -0,0 +1,12 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions +#------------------------------------------------------------------------------ + +vibroAcousticCase="../main" + +cleanCase0 + +rm -rf $vibroAcousticCase/constant/boundaryData + +# ----------------------------------------------------------------------------- diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel new file mode 100755 index 00000000000..98c9f3495c8 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun-parallel @@ -0,0 +1,20 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +[[ -d constant/polyMesh ]] || runApplication ./Allrun.pre + +restore0Dir + +runApplication decomposePar + +runParallel $(getApplication) + +vibroAcousticCase="../main" +dataDir="postProcessing/surfaces/window" + +mkdir -p "$vibroAcousticCase/constant/boundaryData" +cp -rf "$dataDir" "$vibroAcousticCase/constant/boundaryData/window" + +# ----------------------------------------------------------------------------- diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre new file mode 100755 index 00000000000..8a256108197 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/Allrun.pre @@ -0,0 +1,14 @@ +#!/bin/sh +cd "${0%/*}" || exit # Run from this directory +. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions +#------------------------------------------------------------------------------ + +runApplication extrudeMesh + +runApplication changeDictionary -constant + +runApplication topoSet + +runApplication createPatch -overwrite + +# ----------------------------------------------------------------------------- diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties new file mode 100644 index 00000000000..9490a621cfd --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/thermophysicalProperties @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object thermophysicalProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +thermoType +{ + type hePsiThermo; + mixture pureMixture; + transport const; + thermo hConst; + equationOfState perfectGas; + specie specie; + energy sensibleEnthalpy; +} + +mixture // air at room temperature (293 K) +{ + equationOfState + { + p0 103308.85730683322; + T0 225.24440406165331; + } + specie + { + molWeight 28.9; + } + thermodynamics + { + Cp 1005; + Hf 0; + } + transport + { + mu 1.82e-05; + Pr 0.71; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties new file mode 100644 index 00000000000..130f0d86b87 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/constant/turbulenceProperties @@ -0,0 +1,36 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType LES; + +LES +{ + LESModel SpalartAllmarasDDES; + turbulence on; + printCoeffs on; + delta vanDriest; + vanDriestCoeffs + { + delta cubeRootVol; + cubeRootVolCoeffs + { + deltaCoeff 2.0; + } + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict new file mode 100644 index 00000000000..b0368fe2979 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/blockMeshDict @@ -0,0 +1,231 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +scale 1; + +x_up 2.5; +x_down 3.5; +y_pad 4.0; +z_pad 1.0; + +x0 0.0; +x1 $x_up; +x2 #eval{ $x1 + 1.0 }; +x3 #eval{ $x2 + $x_down }; + +y0 0.0; +y1 $y_pad; +y2 #eval{ $y1 + 1.0 }; +y3 #eval{ $y2 + $y_pad }; + +z0 0.0; +z1 1.0; +z2 #eval{ $z1 + $z_pad }; + +nx1 40; +nx2 40; +nx3 80; +ny1 30; +ny2 $nx2; +ny3 $ny1; +nz1 $nx2; +nz2 40; + +vertices +( + ($x0 $y0 $z0) // 0 + ($x1 $y0 $z0) // 1 + ($x2 $y0 $z0) // 2 + ($x3 $y0 $z0) // 3 + ($x0 $y0 $z1) // 4 + ($x1 $y0 $z1) // 5 + ($x2 $y0 $z1) // 6 + ($x3 $y0 $z1) // 7 + ($x0 $y0 $z2) // 8 + ($x1 $y0 $z2) // 9 + ($x2 $y0 $z2) // 10 + ($x3 $y0 $z2) // 11 + + ($x0 $y1 $z0) // 12 + ($x1 $y1 $z0) // 13 + ($x2 $y1 $z0) // 14 + ($x3 $y1 $z0) // 15 + ($x0 $y1 $z1) // 16 + ($x1 $y1 $z1) // 17 + ($x2 $y1 $z1) // 18 + ($x3 $y1 $z1) // 19 + ($x0 $y1 $z2) // 20 + ($x1 $y1 $z2) // 21 + ($x2 $y1 $z2) // 22 + ($x3 $y1 $z2) // 23 + + ($x0 $y2 $z0) // 24 + ($x1 $y2 $z0) // 25 + ($x2 $y2 $z0) // 26 + ($x3 $y2 $z0) // 27 + ($x0 $y2 $z1) // 28 + ($x1 $y2 $z1) // 29 + ($x2 $y2 $z1) // 30 + ($x3 $y2 $z1) // 31 + ($x0 $y2 $z2) // 32 + ($x1 $y2 $z2) // 33 + ($x2 $y2 $z2) // 34 + ($x3 $y2 $z2) // 35 + + ($x0 $y3 $z0) // 36 + ($x1 $y3 $z0) // 37 + ($x2 $y3 $z0) // 38 + ($x3 $y3 $z0) // 39 + ($x0 $y3 $z1) // 40 + ($x1 $y3 $z1) // 41 + ($x2 $y3 $z1) // 42 + ($x3 $y3 $z1) // 43 + ($x0 $y3 $z2) // 44 + ($x1 $y3 $z2) // 45 + ($x2 $y3 $z2) // 46 + ($x3 $y3 $z2) // 47 +); + +edges +( +); + +x_up ((0.4 0.25 0.5)(0.3 0.25 0.75)(0.3 0.5 0.2)); +x_down ((0.15 0.45 3)(0.25 0.35 1.5)(0.6 0.2 5)); +z_top ((0.2 0.25 4)(0.6 0.5 1)(0.2 0.25 0.25)); +z_bottom ((0.2 0.25 4)(0.6 0.5 1)(0.2 0.25 0.25)); +y_side1 ((0.4 0.1 0.5)(0.4 0.2 0.5)(0.3 0.7 0.1)); +y_side2 ((0.3 0.7 10)(0.4 0.2 2)(0.4 0.1 2)); + +blocks +( + hex ( 0 1 13 12 4 5 17 16) ($nx1 $ny1 $nz1) simpleGrading ( $x_up $y_side1 $z_bottom) + hex ( 1 2 14 13 5 6 18 17) ($nx2 $ny1 $nz1) simpleGrading ( 1 $y_side1 $z_bottom) + hex ( 2 3 15 14 6 7 19 18) ($nx3 $ny1 $nz1) simpleGrading ($x_down $y_side1 $z_bottom) + hex ( 4 5 17 16 8 9 21 20) ($nx1 $ny1 $nz2) simpleGrading ( $x_up $y_side1 $z_top) + hex ( 5 6 18 17 9 10 22 21) ($nx2 $ny1 $nz2) simpleGrading ( 1 $y_side1 $z_top) + hex ( 6 7 19 18 10 11 23 22) ($nx3 $ny1 $nz2) simpleGrading ($x_down $y_side1 $z_top) + + hex (12 13 25 24 16 17 29 28) ($nx1 $ny2 $nz1) simpleGrading ($x_up 1 $z_bottom) + hex (14 15 27 26 18 19 31 30) ($nx3 $ny2 $nz1) simpleGrading ($x_down 1 $z_bottom) + hex (16 17 29 28 20 21 33 32) ($nx1 $ny2 $nz2) simpleGrading ($x_up 1 $z_top) + hex (17 18 30 29 21 22 34 33) ($nx2 $ny2 $nz2) simpleGrading (1 1 $z_top) + hex (18 19 31 30 22 23 35 34) ($nx3 $ny2 $nz2) simpleGrading ($x_down 1 $z_top) + + hex (24 25 37 36 28 29 41 40) ($nx1 $ny3 $nz1) simpleGrading ($x_up $y_side2 $z_bottom) + hex (25 26 38 37 29 30 42 41) ($nx2 $ny3 $nz1) simpleGrading (1 $y_side2 $z_bottom) + hex (26 27 39 38 30 31 43 42) ($nx3 $ny3 $nz1) simpleGrading ($x_down $y_side2 $z_bottom) + hex (28 29 41 40 32 33 45 44) ($nx1 $ny3 $nz2) simpleGrading ($x_up $y_side2 $z_top) + hex (29 30 42 41 33 34 46 45) ($nx2 $ny3 $nz2) simpleGrading (1 $y_side2 $z_top) + hex (30 31 43 42 34 35 47 46) ($nx3 $ny3 $nz2) simpleGrading ($x_down $y_side2 $z_top) +); + +boundary +( + cube + { + type wall; + faces + ( + (13 17 18 14) + (14 18 30 26) + (25 29 30 26) + (13 25 29 17) + (17 29 30 18) + ); + } + topAndBottom + { + type wall; + faces + ( + // floor + ( 0 12 13 1) + ( 1 13 14 2) + ( 2 14 15 3) + (12 24 25 13) + (14 26 27 15) + (24 36 37 25) + (25 37 38 26) + (26 38 39 27) + + // top + ( 8 9 21 20) + ( 9 10 22 21) + (10 11 23 22) + (20 21 33 32) + (21 22 34 33) + (22 23 35 34) + (32 33 45 44) + (33 34 46 45) + (34 35 47 46) + ); + } + + sides + { + type patch; + faces + ( + // minY + ( 0 1 5 4) + ( 1 2 6 5) + ( 2 3 7 6) + ( 4 5 9 8) + ( 5 6 10 9) + ( 6 7 11 10) + + // maxY + (36 40 41 37) + (37 41 42 38) + (38 42 43 39) + (40 44 45 41) + (41 45 46 42) + (42 46 47 43) + ); + } + + inlet + { + type patch; + faces + ( + ( 0 4 16 12) + (12 16 28 24) + (24 28 40 36) + ( 4 8 20 16) + (16 20 32 28) + (28 32 44 40) + ); + } + + outlet + { + type patch; + faces + ( + ( 3 15 19 7) + (15 27 31 19) + (27 39 43 31) + ( 7 19 23 11) + (19 31 35 23) + (31 43 47 35) + ); + } +); + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict new file mode 100644 index 00000000000..c4df534a859 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/changeDictionaryDict @@ -0,0 +1,27 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object changeDictionaryDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +boundary +{ + box + { + type patch; + inGroups 1 ( patch ); + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict new file mode 100644 index 00000000000..0879c268809 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/controlDict @@ -0,0 +1,86 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application rhoPimpleAdiabaticFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.05; + +deltaT 1e-5; + +writeControl timeStep; + +writeInterval 500; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +adjustTimeStep no; + +maxCo 0.5; + +graphFormat raw; + +functions +{ + surfaces + { + type surfaces; + surfaceFormat boundaryData; + writeControl timeStep; + writeInterval 10; + interpolationScheme cell; + fields + ( + p + ); + formatOptions + { + boundaryData + { + format binary; + } + } + surfaces + { + window + { + type patch; + patches (window); + interpolate false; + } + } + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict new file mode 100644 index 00000000000..0c80268fa72 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/createPatchDict @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object createPatchDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +pointSync false; + +// Patches to create. +patches +( + { + // Name of new patch + name inlet; + + // Dictionary to construct new patch from + patchInfo + { + type patch; + } + + // How to construct: either from 'patches' or 'set' + constructFrom set; + + // If constructFrom = set : name of faceSet + set f0; + } +); + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict new file mode 100644 index 00000000000..59827275570 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/decomposeParDict @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 6; + +method scotch; + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict new file mode 100644 index 00000000000..430caf8b89a --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/extrudeMeshDict @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrudeMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +constructFrom patch; + +// If construct from patch/mesh: +sourceCase "../main"; +sourcePatches (fixedWall window); + +exposedPatchName fixedWall; + +flipNormals false; + +extrudeModel linearDirection; + +nLayers 100; + +expansionRatio 1.0; + +linearDirectionCoeffs +{ + direction (0 -1 0); + thickness 1; +} + +mergeFaces false; + +mergeTol 0; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes new file mode 100644 index 00000000000..073db380a0b --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSchemes @@ -0,0 +1,63 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default backward 1; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss LUST grad(U); + div(phi,h) Gauss LUST grad(h); + div(phi,K) Gauss linear; + div(phiv,p) Gauss linear; + div(phi,k) Gauss limitedLinear 1; + div(phi,B) Gauss limitedLinear 1; + div(phi,nuTilda) Gauss limitedLinear 1; + div(B) Gauss linear; + div(phi,epsilon) Gauss limitedLinear 1; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +wallDist +{ + method meshWave; +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution new file mode 100644 index 00000000000..46875004477 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/fvSolution @@ -0,0 +1,65 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "(p|rho)" + { + solver PBiCGStab; + preconditioner DIC; + tolerance 1e-9; + relTol 0.01; + } + + "(p|rho)Final" + { + $p; + relTol 0; + } + + "(U|h|k|nuTilda|epsilon)" + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0.01; + } + + "(U|h|k|nuTilda|epsilon)Final" + { + $U; + relTol 0; + } +} + +PIMPLE +{ + momentumPredictor yes; + nOuterCorrectors 1; + nCorrectors 2; + nNonOrthogonalCorrectors 0; +} + +relaxationFactors +{ + equations + { + ".*" 1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict new file mode 100644 index 00000000000..37f685b78b4 --- /dev/null +++ b/tutorials/compressible/acousticFoam/obliqueAirJet/precursor/system/topoSetDict @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v2011 | +| \\ / A nd | Website: www.openfoam.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name f0; + type faceSet; + action new; + source boxToFace; + box (1 -0.7 -0.01)(1.5 -0.2 0.01); + } +); + + +// ************************************************************************* // -- GitLab