From fd665b4a3cbde35df54da095593c7e8af8d59dac Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Wed, 14 Jun 2017 09:51:02 +0100 Subject: [PATCH] ENH: overset: Initial release of overset capability. Adds overset discretisation to selected physics: - diffusion : overLaplacianDyMFoam - incompressible steady : overSimpleFoam - incompressible transient : overPimpleDyMFoam - compressible transient: overRhoPimpleDyMFoam - two-phase VOF: overInterDyMFoam The overset method chosen is a parallel, fully implicit implementation whereby the interpolation (from donor to acceptor) is inserted as an adapted discretisation on the donor cells, such that the resulting matrix can be solved using the standard linear solvers. Above solvers come with a set of tutorials, showing how to create and set-up simple simulations from scratch. --- README.md | 2 +- .../overLaplacianDyMFoam/Make/files | 3 + .../overLaplacianDyMFoam/Make/options | 8 + .../overLaplacianDyMFoam/createFields.H | 53 + .../overLaplacianDyMFoam/laplacianDyMFoam.C | 110 + .../overLaplacianDyMFoam/write.H | 46 + .../overRhoPimpleDyMFoam/Make/files | 3 + .../overRhoPimpleDyMFoam/Make/options | 25 + .../overRhoPimpleDyMFoam/correctPhi.H | 11 + .../overRhoPimpleDyMFoam/createControls.H | 11 + .../overRhoPimpleDyMFoam/createFields.H | 117 + .../rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H | 123 + .../overRhoPimpleDyMFoam/readControls.H | 6 + .../overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C | 173 ++ .../pimpleFoam/overPimpleDyMFoam/CourantNo.H | 50 + .../pimpleFoam/overPimpleDyMFoam/Make/files | 3 + .../pimpleFoam/overPimpleDyMFoam/Make/options | 24 + .../pimpleFoam/overPimpleDyMFoam/UEqn.H | 24 + .../overPimpleDyMFoam/continuityErrs.H | 48 + .../pimpleFoam/overPimpleDyMFoam/correctPhi.H | 113 + .../overPimpleDyMFoam/createControls.H | 26 + .../overPimpleDyMFoam/createFields.H | 70 + .../overPimpleDyMFoam/interpolatedFaces.H | 269 +++ .../pimpleFoam/overPimpleDyMFoam/pEqn.H | 109 + .../overPimpleDyMFoam/pimpleDyMFoam.C | 157 ++ .../overPimpleDyMFoam/readControls.H | 10 + .../simpleFoam/overSimpleFoam/Make/files | 3 + .../simpleFoam/overSimpleFoam/Make/options | 25 + .../simpleFoam/overSimpleFoam/UEqn.H | 21 + .../overSimpleFoam/continuityErrs.H | 48 + .../simpleFoam/overSimpleFoam/createFields.H | 47 + .../overSimpleFoam/createOversetFields.H | 34 + .../createUpdatedDynamicFvMesh.H | 22 + .../simpleFoam/overSimpleFoam/pEqn.H | 57 + .../simpleFoam/overSimpleFoam/simpleFoam.C | 125 + .../interFoam/overInterDyMFoam/CourantNo.H | 53 + .../interFoam/overInterDyMFoam/Make/files | 3 + .../interFoam/overInterDyMFoam/Make/options | 31 + .../interFoam/overInterDyMFoam/UEqn.H | 33 + .../overInterDyMFoam/continuityErrs.H | 48 + .../interFoam/overInterDyMFoam/correctPhi.H | 125 + .../overInterDyMFoam/createDyMControls.H | 25 + .../interFoam/overInterDyMFoam/createFields.H | 171 ++ .../interFoam/overInterDyMFoam/interDyMFoam.C | 209 ++ .../interFoam/overInterDyMFoam/pEqn.H | 96 + .../interFoam/overInterDyMFoam/readControls.H | 15 + applications/test/parallelOverset/Make/files | 3 + .../test/parallelOverset/Make/options | 12 + .../test/parallelOverset/createFields.H | 53 + .../test/parallelOverset/heatTransfer/0.org/T | 49 + .../heatTransfer/0.org/pointDisplacement | 44 + .../parallelOverset/heatTransfer/0.org/zoneID | 39 + .../parallelOverset/heatTransfer/Allclean | 13 + .../parallelOverset/heatTransfer/Allrun.pre | 17 + .../heatTransfer/constant/dynamicMeshDict | 33 + .../heatTransfer/constant/transportProperties | 41 + .../heatTransfer/system/blockMeshDict | 126 + .../heatTransfer/system/controlDict | 57 + .../heatTransfer/system/decomposeParDict | 44 + .../heatTransfer/system/fvSchemes | 85 + .../heatTransfer/system/fvSolution | 77 + .../heatTransfer/system/postProcessingDict | 35 + .../heatTransfer/system/processorField | 32 + .../heatTransfer/system/setFieldsDict | 48 + .../heatTransfer/system/topoSetDict | 80 + .../test/parallelOverset/laplacianDyMFoam.C | 125 + applications/test/parallelOverset/write.H | 46 + applications/test/wallDistDyM/Make/files | 3 + applications/test/wallDistDyM/Make/options | 9 + .../test/wallDistDyM/Test-wallDistDyM.C | 69 + .../mergeOrSplitBaffles/mergeOrSplitBaffles.C | 6 +- etc/caseDicts/setConstraintTypes | 5 + src/Allwmake | 2 + .../LduInterfaceField/LduInterfaceField.H | 2 + .../matrices/LduMatrix/LduMatrix/LduMatrix.H | 2 + .../LduMatrix/LduMatrix/LduMatrixATmul.C | 22 +- .../LduMatrixUpdateMatrixInterfaces.C | 8 + .../GaussSeidel/TGaussSeidelSmoother.C | 18 +- .../lduMatrix/lduAddressing/lduAddressing.C | 10 +- .../lduMatrix/lduAddressing/lduAddressing.H | 5 +- .../lduInterfaceField/lduInterfaceField.H | 25 +- .../lduInterfaceFieldTemplates.C | 56 + .../matrices/lduMatrix/lduMatrix/lduMatrix.H | 2 + .../lduMatrix/lduMatrix/lduMatrixATmul.C | 22 +- .../lduMatrixUpdateMatrixInterfaces.C | 10 + .../GaussSeidel/GaussSeidelSmoother.C | 32 +- .../nonBlockingGaussSeidelSmoother.C | 29 +- .../symGaussSeidel/symGaussSeidelSmoother.C | 32 +- .../algebraicPairGAMGAgglomeration.C | 2 +- .../solvers/GAMG/GAMGSolverInterpolate.C | 2 + .../lduMatrix/solvers/GAMG/GAMGSolverSolve.C | 2 +- .../cyclicGAMGInterfaceField.C | 8 +- .../cyclicGAMGInterfaceField.H | 1 + .../processorGAMGInterfaceField.C | 14 +- .../processorGAMGInterfaceField.H | 2 + .../meshes/lduMesh/lduPrimitiveMesh.H | 32 +- .../polyMeshTetDecomposition.C | 4 +- ...reRadCoupledMixedFvPatchScalarField.H.orig | 219 -- .../displacementInterpolationMotionSolver.H | 2 +- .../displacementLayeredMotionMotionSolver.H | 2 +- .../basic/coupled/coupledFvPatchField.H | 2 + .../constraint/cyclic/cyclicFvPatchField.C | 16 +- .../constraint/cyclic/cyclicFvPatchField.H | 2 + .../cyclicACMI/cyclicACMIFvPatchField.C | 16 +- .../cyclicACMI/cyclicACMIFvPatchField.H | 2 + .../cyclicAMI/cyclicAMIFvPatchField.C | 16 +- .../cyclicAMI/cyclicAMIFvPatchField.H | 2 + .../jumpCyclic/jumpCyclicFvPatchField.C | 8 +- .../jumpCyclic/jumpCyclicFvPatchField.H | 3 + .../jumpCyclic/jumpCyclicFvPatchFields.C | 7 +- .../jumpCyclicAMI/jumpCyclicAMIFvPatchField.C | 8 +- .../jumpCyclicAMI/jumpCyclicAMIFvPatchField.H | 3 + .../jumpCyclicAMIFvPatchFields.C | 7 +- .../processor/processorFvPatchField.C | 28 +- .../processor/processorFvPatchField.H | 4 + .../processor/processorFvPatchScalarField.C | 14 +- .../processor/processorFvPatchScalarField.H | 2 + .../fvMatrices/fvMatrix/fvMatrix.C | 42 +- .../fvMatrices/fvMatrix/fvMatrix.H | 33 +- .../fvMatrices/fvMatrix/fvMatrixSolve.C | 53 +- src/finiteVolume/fvMesh/fvMesh.C | 46 + src/finiteVolume/fvMesh/fvMesh.H | 88 +- .../Poisson/PoissonPatchDistMethod.C | 15 +- .../advectionDiffusionPatchDistMethod.C | 7 +- ...lacementComponentLaplacianFvMotionSolver.C | 8 +- ...velocityComponentLaplacianFvMotionSolver.C | 8 +- .../displacementSBRStressFvMotionSolver.C | 6 +- .../displacementLaplacianFvMotionSolver.C | 8 +- .../surfaceAlignedSBRStressFvMotionSolver.C | 3 +- .../velocityLaplacianFvMotionSolver.C | 6 +- .../cyclicACMIGAMGInterfaceField.C | 8 +- .../cyclicACMIGAMGInterfaceField.H | 1 + .../cyclicAMIGAMGInterfaceField.C | 8 +- .../cyclicAMIGAMGInterfaceField.H | 1 + .../regionCoupledGAMGInterfaceField.H | 1 + .../regionCoupledWallGAMGInterfaceField.H | 1 + src/overset/Make/files | 31 + src/overset/Make/options | 15 + .../cellCellStencil/cellCellStencil.C | 276 +++ .../cellCellStencil/cellCellStencil.H | 198 ++ .../cellCellStencil/cellCellStencilObject.C | 37 + .../cellCellStencil/cellCellStencilObject.H | 168 ++ .../cellVolumeWeightCellCellStencil.C | 1107 +++++++++ .../cellVolumeWeightCellCellStencil.H | 242 ++ .../inverseDistanceCellCellStencil.C | 2059 +++++++++++++++++ .../inverseDistanceCellCellStencil.H | 334 +++ .../inverseDistance/meshToMeshData.C | 50 + .../inverseDistance/meshToMeshData.H | 248 ++ .../inverseDistance/meshToMeshDataI.H | 242 ++ .../inverseDistance/waveMethod.C | 215 ++ .../inverseDistance/waveMethod.H | 107 + .../trackingInverseDistanceCellCellStencil.C | 930 ++++++++ .../trackingInverseDistanceCellCellStencil.H | 162 ++ .../trackingInverseDistance/voxelMeshSearch.C | 432 ++++ .../trackingInverseDistance/voxelMeshSearch.H | 203 ++ .../voxelMeshSearchTemplates.C | 156 ++ .../dynamicOversetFvMesh.C | 354 +++ .../dynamicOversetFvMesh.H | 314 +++ .../dynamicOversetFvMeshTemplates.C | 506 ++++ .../fvMeshPrimitiveLduAddressing.C | 267 +++ .../fvMeshPrimitiveLduAddressing.H | 172 ++ src/overset/include/createCellMask.H | 53 + src/overset/include/createInterpolatedCells.H | 53 + src/overset/include/setCellMask.H | 51 + src/overset/include/setInterpolatedCells.H | 48 + .../lduPrimitiveProcessorInterface.C | 97 + .../lduPrimitiveProcessorInterface.H | 193 ++ .../oversetAdjustPhi/oversetAdjustPhi.C | 291 +++ .../oversetAdjustPhi/oversetAdjustPhi.H | 61 + src/overset/oversetPolyPatch/oversetFvPatch.C | 115 + src/overset/oversetPolyPatch/oversetFvPatch.H | 169 ++ .../oversetPolyPatch/oversetFvPatchField.C | 354 +++ .../oversetPolyPatch/oversetFvPatchField.H | 217 ++ .../oversetPolyPatch/oversetFvPatchFields.C | 43 + .../oversetPolyPatch/oversetFvPatchFields.H | 49 + .../oversetPolyPatch/oversetFvsPatchFields.C | 79 + .../oversetPolyPatch/oversetGAMGInterface.C | 264 +++ .../oversetPolyPatch/oversetGAMGInterface.H | 202 ++ .../oversetGAMGInterfaceField.C | 152 ++ .../oversetGAMGInterfaceField.H | 124 + .../oversetPolyPatch/oversetLduInterface.C | 42 + .../oversetPolyPatch/oversetLduInterface.H | 111 + .../oversetPolyPatch/oversetPointPatch.C | 49 + .../oversetPointPatchFields.C | 78 + .../oversetPolyPatch/oversetPolyPatch.C | 159 ++ .../oversetPolyPatch/oversetPolyPatch.H | 185 ++ src/overset/regionsToCell/findRefCells.C | 274 +++ src/overset/regionsToCell/findRefCells.H | 74 + src/overset/regionsToCell/regionsToCell.C | 484 ++++ src/overset/regionsToCell/regionsToCell.H | 173 ++ .../energyRegionCoupledFvPatchScalarField.C | 9 +- .../energyRegionCoupledFvPatchScalarField.H | 2 + src/sampling/meshToMesh/meshToMesh.C | 75 +- src/sampling/meshToMesh/meshToMesh.H | 22 +- src/sampling/meshToMesh/meshToMeshI.H | 16 +- src/waveModels/waveModel/waveModel.C | 2 +- .../overLaplacianDyMFoam/heatTransfer/0.org/T | 49 + .../heatTransfer/0.org/pointDisplacement | 43 + .../heatTransfer/0.org/zoneID | 39 + .../heatTransfer/Allclean | 13 + .../overLaplacianDyMFoam/heatTransfer/Allrun | 13 + .../heatTransfer/Allrun.pre | 17 + .../heatTransfer/README.txt | 4 + .../heatTransfer/constant/dynamicMeshDict | 33 + .../heatTransfer/constant/transportProperties | 41 + .../heatTransfer/system/blockMeshDict | 126 + .../heatTransfer/system/controlDict | 51 + .../heatTransfer/system/decomposeParDict | 29 + .../heatTransfer/system/fvSchemes | 85 + .../heatTransfer/system/fvSolution | 77 + .../heatTransfer/system/setFieldsDict | 48 + .../heatTransfer/system/topoSetDict | 80 + .../overPimpleDyMFoam/cylinder/Allclean | 10 + .../overPimpleDyMFoam/cylinder/Allrun | 8 + .../overPimpleDyMFoam/cylinder/Allrun.pre | 8 + .../overPimpleDyMFoam/cylinder/README.txt | 8 + .../cylinder/cylinderAndBackground/0.org/U | 58 + .../cylinderAndBackground/0.org/epsilon | 59 + .../0.org/include/fixedInlet | 15 + .../0.org/include/initialConditions | 15 + .../cylinder/cylinderAndBackground/0.org/k | 54 + .../cylinder/cylinderAndBackground/0.org/nut | 44 + .../cylinder/cylinderAndBackground/0.org/p | 55 + .../0.org/pointDisplacement | 42 + .../cylinderAndBackground/0.org/zoneID | 37 + .../cylinder/cylinderAndBackground/Allclean | 14 + .../cylinder/cylinderAndBackground/Allrun | 7 + .../cylinder/cylinderAndBackground/Allrun.pre | 20 + .../constant/dynamicMeshDict | 33 + .../constant/transportProperties | 39 + .../constant/turbulenceProperties | 30 + .../system/blockMeshDict | 83 + .../cylinderAndBackground/system/controlDict | 51 + .../system/decomposeParDict | 30 + .../cylinderAndBackground/system/fvSchemes | 72 + .../cylinderAndBackground/system/fvSolution | 100 + .../system/setFieldsDict | 48 + .../cylinderAndBackground/system/topoSetDict | 48 + .../cylinder/cylinderMesh/Allrun.pre | 8 + .../constant/triSurface/cylinder.vtk | 221 ++ .../cylinder/cylinderMesh/system/controlDict | 50 + .../cylinderMesh/system/createPatchDict | 112 + .../cylinderMesh/system/extrudeMeshDict | 136 ++ .../cylinder/cylinderMesh/system/fvSchemes | 58 + .../cylinder/cylinderMesh/system/fvSolution | 51 + .../overPimpleDyMFoam/simpleRotor/0.org/U | 62 + .../simpleRotor/0.org/epsilon | 52 + .../overPimpleDyMFoam/simpleRotor/0.org/k | 51 + .../simpleRotor/0.org/nuTilda | 37 + .../overPimpleDyMFoam/simpleRotor/0.org/nut | 50 + .../overPimpleDyMFoam/simpleRotor/0.org/p | 64 + .../simpleRotor/0.org/pointDisplacement | 41 + .../simpleRotor/0.org/zoneID | 38 + .../overPimpleDyMFoam/simpleRotor/Allclean | 14 + .../overPimpleDyMFoam/simpleRotor/Allrun | 6 + .../overPimpleDyMFoam/simpleRotor/Allrun.pre | 19 + .../simpleRotor/constant/RASProperties | 23 + .../simpleRotor/constant/dynamicMeshDict | 49 + .../simpleRotor/constant/transportProperties | 39 + .../simpleRotor/constant/turbulenceProperties | 19 + .../simpleRotor/system/blockMeshDict | 97 + .../simpleRotor/system/controlDict | 55 + .../simpleRotor/system/decomposeParDict | 29 + .../simpleRotor/system/fvSchemes | 69 + .../simpleRotor/system/fvSolution | 96 + .../simpleRotor/system/setFieldsDict | 48 + .../simpleRotor/system/topoSetDict | 78 + .../overPimpleDyMFoam/twoSimpleRotors/0.org/U | 62 + .../overPimpleDyMFoam/twoSimpleRotors/0.org/p | 64 + .../twoSimpleRotors/0.org/pointDisplacement | 41 + .../twoSimpleRotors/0.org/zoneID | 37 + .../twoSimpleRotors/Allclean | 14 + .../overPimpleDyMFoam/twoSimpleRotors/Allrun | 14 + .../twoSimpleRotors/Allrun.pre | 17 + .../twoSimpleRotors/README.txt | 3 + .../twoSimpleRotors/constant/dynamicMeshDict | 51 + .../constant/transportProperties | 37 + .../constant/turbulenceProperties | 19 + .../twoSimpleRotors/system/blockMeshDict | 140 ++ .../twoSimpleRotors/system/controlDict | 53 + .../twoSimpleRotors/system/decomposeParDict | 30 + .../twoSimpleRotors/system/fvSchemes | 68 + .../twoSimpleRotors/system/fvSolution | 96 + .../twoSimpleRotors/system/setFieldsDict | 57 + .../twoSimpleRotors/system/topoSetDict | 116 + .../overSimpleFoam/aeroFoil/Allclean | 20 + .../overSimpleFoam/aeroFoil/Allrun | 10 + .../overSimpleFoam/aeroFoil/Allrun.pre | 12 + .../overSimpleFoam/aeroFoil/README.txt | 14 + .../aeroFoil/aeroFoil_overset/Allrun.pre | 10 + .../constant/transportProperties | 21 + .../constant/turbulenceProperties | 28 + .../aeroFoil_overset/system/controlDict | 65 + .../aeroFoil_overset/system/createPatchDict | 86 + .../aeroFoil_overset/system/extrudeMeshDict | 52 + .../aeroFoil_overset/system/fvSchemes | 58 + .../aeroFoil_overset/system/fvSolution | 77 + .../aeroFoil_snappyHexMesh/Allrun.pre | 9 + .../constant/triSurface/wing_5degrees.obj | 1054 +++++++++ .../system/blockMeshDict | 89 + .../aeroFoil_snappyHexMesh/system/controlDict | 49 + .../system/decomposeParDict | 39 + .../aeroFoil_snappyHexMesh/system/fvSchemes | 56 + .../aeroFoil_snappyHexMesh/system/fvSolution | 49 + .../system/snappyHexMeshDict | 300 +++ .../aeroFoil/background_overset/0.org/U | 49 + .../aeroFoil/background_overset/0.org/epsilon | 50 + .../include/frontBackTopBottomfreePatches | 14 + .../0.org/include/initialConditions | 16 + .../aeroFoil/background_overset/0.org/k | 51 + .../aeroFoil/background_overset/0.org/nuTilda | 32 + .../aeroFoil/background_overset/0.org/nut | 40 + .../aeroFoil/background_overset/0.org/omega | 50 + .../aeroFoil/background_overset/0.org/p | 48 + .../0.org/pointDisplacement | 36 + .../aeroFoil/background_overset/0.org/zoneID | 32 + .../aeroFoil/background_overset/Allclean | 14 + .../aeroFoil/background_overset/Allrun | 11 + .../aeroFoil/background_overset/Allrun.pre | 15 + .../background_overset/constant/RASProperties | 23 + .../constant/dynamicMeshDict | 33 + .../constant/transportProperties | 39 + .../constant/triSurface/wing_5degrees.obj | 1054 +++++++++ .../constant/turbulenceProperties | 28 + .../background_overset/system/blockMeshDict | 93 + .../background_overset/system/controlDict | 49 + .../background_overset/system/createPatchDict | 48 + .../system/decomposeParDict | 39 + .../background_overset/system/extrudeMeshDict | 52 + .../background_overset/system/fvSchemes | 95 + .../background_overset/system/fvSolution | 90 + .../system/postProcessingDict | 35 + .../background_overset/system/setFieldsDict | 48 + .../background_overset/system/topoSetDict | 48 + .../background_snappyHexMesh/Allrun.pre | 10 + .../constant/triSurface/wing_5degrees.obj | 1054 +++++++++ .../system/blockMeshDict | 93 + .../system/controlDict | 49 + .../background_snappyHexMesh/system/fvSchemes | 56 + .../system/fvSolution | 49 + .../system/snappyHexMeshDict | 290 +++ .../overInterDyMFoam/floatingBody/Allclean | 10 + .../overInterDyMFoam/floatingBody/Allrun | 10 + .../overInterDyMFoam/floatingBody/Allrun.pre | 8 + .../floatingBody/background/0.org/U | 45 + .../floatingBody/background/0.org/alpha.water | 44 + .../floatingBody/background/0.org/epsilon | 52 + .../floatingBody/background/0.org/k | 46 + .../floatingBody/background/0.org/nut | 51 + .../floatingBody/background/0.org/p_rgh | 53 + .../background/0.org/pointDisplacement | 54 + .../floatingBody/background/0.org/zoneID | 42 + .../floatingBody/background/Allclean | 11 + .../floatingBody/background/Allrun.pre | 17 + .../floatingBody/background/background.foam | 0 .../background/constant/dynamicMeshDict | 104 + .../floatingBody/background/constant/g | 22 + .../background/constant/transportProperties | 37 + .../background/constant/turbulenceProperties | 30 + .../background/system/blockMeshDict | 76 + .../background/system/controlDict | 57 + .../background/system/decomposeParDict | 29 + .../floatingBody/background/system/fvSchemes | 70 + .../floatingBody/background/system/fvSolution | 110 + .../background/system/setFieldsDict | 64 + .../background/system/topoSetDict | 48 + .../floatingBody/floatingBody/Allclean | 11 + .../floatingBody/floatingBody/Allrun.pre | 14 + .../floatingBody/system/blockMeshDict | 62 + .../floatingBody/system/controlDict | 54 + .../floatingBody/system/fvSchemes | 62 + .../floatingBody/system/fvSolution | 139 ++ .../floatingBody/system/setFieldsDict | 39 + .../floatingBody/system/topoSetDict | 38 + 374 files changed, 29369 insertions(+), 579 deletions(-) create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C create mode 100644 applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H create mode 100644 applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C create mode 100644 applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H create mode 100644 applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H create mode 100644 applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H create mode 100644 applications/test/parallelOverset/Make/files create mode 100644 applications/test/parallelOverset/Make/options create mode 100644 applications/test/parallelOverset/createFields.H create mode 100644 applications/test/parallelOverset/heatTransfer/0.org/T create mode 100644 applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement create mode 100644 applications/test/parallelOverset/heatTransfer/0.org/zoneID create mode 100755 applications/test/parallelOverset/heatTransfer/Allclean create mode 100755 applications/test/parallelOverset/heatTransfer/Allrun.pre create mode 100644 applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict create mode 100644 applications/test/parallelOverset/heatTransfer/constant/transportProperties create mode 100644 applications/test/parallelOverset/heatTransfer/system/blockMeshDict create mode 100644 applications/test/parallelOverset/heatTransfer/system/controlDict create mode 100644 applications/test/parallelOverset/heatTransfer/system/decomposeParDict create mode 100644 applications/test/parallelOverset/heatTransfer/system/fvSchemes create mode 100644 applications/test/parallelOverset/heatTransfer/system/fvSolution create mode 100644 applications/test/parallelOverset/heatTransfer/system/postProcessingDict create mode 100644 applications/test/parallelOverset/heatTransfer/system/processorField create mode 100644 applications/test/parallelOverset/heatTransfer/system/setFieldsDict create mode 100644 applications/test/parallelOverset/heatTransfer/system/topoSetDict create mode 100644 applications/test/parallelOverset/laplacianDyMFoam.C create mode 100644 applications/test/parallelOverset/write.H create mode 100644 applications/test/wallDistDyM/Make/files create mode 100644 applications/test/wallDistDyM/Make/options create mode 100644 applications/test/wallDistDyM/Test-wallDistDyM.C create mode 100644 src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C delete mode 100644 src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig create mode 100644 src/overset/Make/files create mode 100644 src/overset/Make/options create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C create mode 100644 src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H create mode 100644 src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C create mode 100644 src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H create mode 100644 src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C create mode 100644 src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H create mode 100644 src/overset/cellCellStencil/inverseDistance/meshToMeshData.C create mode 100644 src/overset/cellCellStencil/inverseDistance/meshToMeshData.H create mode 100644 src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H create mode 100644 src/overset/cellCellStencil/inverseDistance/waveMethod.C create mode 100644 src/overset/cellCellStencil/inverseDistance/waveMethod.H create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H create mode 100644 src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C create mode 100644 src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C create mode 100644 src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H create mode 100644 src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C create mode 100644 src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C create mode 100644 src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H create mode 100644 src/overset/include/createCellMask.H create mode 100644 src/overset/include/createInterpolatedCells.H create mode 100644 src/overset/include/setCellMask.H create mode 100644 src/overset/include/setInterpolatedCells.H create mode 100644 src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C create mode 100644 src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H create mode 100644 src/overset/oversetAdjustPhi/oversetAdjustPhi.C create mode 100644 src/overset/oversetAdjustPhi/oversetAdjustPhi.H create mode 100644 src/overset/oversetPolyPatch/oversetFvPatch.C create mode 100644 src/overset/oversetPolyPatch/oversetFvPatch.H create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchField.C create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchField.H create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchFields.C create mode 100644 src/overset/oversetPolyPatch/oversetFvPatchFields.H create mode 100644 src/overset/oversetPolyPatch/oversetFvsPatchFields.C create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterface.C create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterface.H create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C create mode 100644 src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H create mode 100644 src/overset/oversetPolyPatch/oversetLduInterface.C create mode 100644 src/overset/oversetPolyPatch/oversetLduInterface.H create mode 100644 src/overset/oversetPolyPatch/oversetPointPatch.C create mode 100644 src/overset/oversetPolyPatch/oversetPointPatchFields.C create mode 100644 src/overset/oversetPolyPatch/oversetPolyPatch.C create mode 100644 src/overset/oversetPolyPatch/oversetPolyPatch.H create mode 100644 src/overset/regionsToCell/findRefCells.C create mode 100644 src/overset/regionsToCell/findRefCells.H create mode 100644 src/overset/regionsToCell/regionsToCell.C create mode 100644 src/overset/regionsToCell/regionsToCell.H create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID create mode 100755 tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean create mode 100755 tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun create mode 100755 tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict create mode 100644 tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict create mode 100755 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes create mode 100644 tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID create mode 100755 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean create mode 100755 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun create mode 100755 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID create mode 100755 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean create mode 100755 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun create mode 100755 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict create mode 100644 tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict create mode 100755 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution create mode 100644 tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/background.foam create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean create mode 100755 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict create mode 100644 tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict diff --git a/README.md b/README.md index aec529e09f0..fed8a6e7584 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ OpenCFD Ltd grants use of the OpenFOAM trademark by Third Parties on a licence b Please [contact OpenCFD](http://www.openfoam.com/contact) if you have any questions on the use of the OpenFOAM trademark. -Violations of the Trademark are continuously monitored, and will be duly prosecuted. +Violations of the Trademark are continuously monitored, and will be duly prosecuted. # Useful Links diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files new file mode 100644 index 00000000000..0c6257a79d7 --- /dev/null +++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/files @@ -0,0 +1,3 @@ +laplacianDyMFoam.C + +EXE = $(FOAM_APPBIN)/overLaplacianDyMFoam diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options new file mode 100644 index 00000000000..149f9694b6d --- /dev/null +++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/Make/options @@ -0,0 +1,8 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/overset/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude + +EXE_LIBS = \ + -loverset diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H new file mode 100644 index 00000000000..d14935caab6 --- /dev/null +++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/createFields.H @@ -0,0 +1,53 @@ + Info<< "Reading field T\n" << endl; + + volScalarField T + ( + IOobject + ( + "T", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ); + + // Add overset specific interpolations + { + dictionary oversetDict; + oversetDict.add("T", true); + + const_cast<dictionary&> + ( + mesh.schemesDict() + ).add + ( + "oversetInterpolationRequired", + oversetDict, + true + ); + } + + + Info<< "Reading transportProperties\n" << endl; + + IOdictionary transportProperties + ( + IOobject + ( + "transportProperties", + runTime.constant(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + + Info<< "Reading diffusivity DT\n" << endl; + + dimensionedScalar DT + ( + transportProperties.lookup("DT") + ); diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C new file mode 100644 index 00000000000..7bcd6b6cb60 --- /dev/null +++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/laplacianDyMFoam.C @@ -0,0 +1,110 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 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 + laplacianFoam + +Group + grpBasicSolvers + +Description + Laplace equation solver for a scalar quantity. + + \heading Solver details + The solver is applicable to, e.g. for thermal diffusion in a solid. The + equation is given by: + + \f[ + \ddt{T} = \div \left( D_T \grad T \right) + \f] + + Where: + \vartable + T | Scalar field which is solved for, e.g. temperature + D_T | Diffusion coefficient + \endvartable + + \heading Required fields + \plaintable + T | Scalar field which is solved for, e.g. temperature + \endplaintable + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "fvOptions.H" +#include "simpleControl.H" +#include "dynamicFvMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #include "setRootCase.H" + + #include "createTime.H" + #include "createNamedDynamicFvMesh.H" + + simpleControl simple(mesh); + + #include "createFields.H" + #include "createFvOptions.H" + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nCalculating temperature distribution\n" << endl; + + while (simple.loop()) + { + Info<< "Time = " << runTime.timeName() << nl << endl; + + mesh.update(); + + while (simple.correctNonOrthogonal()) + { + fvScalarMatrix TEqn + ( + fvm::ddt(T) - fvm::laplacian(DT, T) + == + fvOptions(T) + ); + + fvOptions.constrain(TEqn); + TEqn.solve(); + fvOptions.correct(T); + } + + #include "write.H" + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H new file mode 100644 index 00000000000..47aa182c0a9 --- /dev/null +++ b/applications/solvers/basic/laplacianFoam/overLaplacianDyMFoam/write.H @@ -0,0 +1,46 @@ + if (runTime.outputTime()) + { + volVectorField gradT(fvc::grad(T)); + + volScalarField gradTx + ( + IOobject + ( + "gradTx", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + gradT.component(vector::X) + ); + + volScalarField gradTy + ( + IOobject + ( + "gradTy", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + gradT.component(vector::Y) + ); + + volScalarField gradTz + ( + IOobject + ( + "gradTz", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + gradT.component(vector::Z) + ); + + + runTime.write(); + } diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files new file mode 100644 index 00000000000..3d96a548d05 --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/files @@ -0,0 +1,3 @@ +rhoPimpleDyMFoam.C + +EXE = $(FOAM_APPBIN)/overRhoPimpleDyMFoam diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options new file mode 100644 index 00000000000..ca5b141675b --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/Make/options @@ -0,0 +1,25 @@ +EXE_INC = \ + -I.. \ + -I$(LIB_SRC)/transportModels/compressible/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \ + -I$(LIB_SRC)/finiteVolume/cfdTools \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/overset/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + +EXE_LIBS = \ + -lcompressibleTransportModels \ + -lfluidThermophysicalModels \ + -lspecie \ + -lturbulenceModels \ + -lcompressibleTurbulenceModels \ + -loverset \ + -lfvOptions \ + -ldynamicFvMesh \ + -ltopoChangerFvMesh diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H new file mode 100644 index 00000000000..37072312ff8 --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/correctPhi.H @@ -0,0 +1,11 @@ +CorrectPhi +( + U, + phi, + p, + rho, + psi, + dimensionedScalar("rAUf", dimTime, 1), + divrhoU, + pimple +); diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H new file mode 100644 index 00000000000..aed0e76956b --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createControls.H @@ -0,0 +1,11 @@ +#include "createTimeControls.H" + +bool correctPhi +( + pimple.dict().lookupOrDefault<Switch>("correctPhi", true) +); + +bool checkMeshCourantNo +( + pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false) +); diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H new file mode 100644 index 00000000000..27f568bce70 --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/createFields.H @@ -0,0 +1,117 @@ +Info<< "Reading thermophysical properties\n" << endl; + +autoPtr<psiThermo> pThermo +( + psiThermo::New(mesh) +); +psiThermo& thermo = pThermo(); +thermo.validate(args.executable(), "h", "e"); + +volScalarField& p = thermo.p(); +const volScalarField& psi = thermo.psi(); + +volScalarField rho +( + IOobject + ( + "rho", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + thermo.rho() +); + +Info<< "Reading field U\n" << endl; +volVectorField U +( + IOobject + ( + "U", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +#include "compressibleCreatePhi.H" + +dimensionedScalar rhoMax +( + dimensionedScalar::lookupOrDefault + ( + "rhoMax", + pimple.dict(), + dimDensity, + GREAT + ) +); + +dimensionedScalar rhoMin +( + dimensionedScalar::lookupOrDefault + ( + "rhoMin", + pimple.dict(), + dimDensity, + 0 + ) +); + +Info<< "Creating turbulence model\n" << endl; +autoPtr<compressible::turbulenceModel> turbulence +( + compressible::turbulenceModel::New + ( + rho, + U, + phi, + thermo + ) +); + +mesh.setFluxRequired(p.name()); + +Info<< "Creating field dpdt\n" << endl; +volScalarField dpdt +( + IOobject + ( + "dpdt", + runTime.timeName(), + mesh + ), + mesh, + dimensionedScalar("dpdt", p.dimensions()/dimTime, 0) +); + +Info<< "Creating field kinetic energy K\n" << endl; +volScalarField K("K", 0.5*magSqr(U)); + + +//- Overset specific + +// Add solver-specific interpolations +{ + dictionary oversetDict; + oversetDict.add("U", true); + oversetDict.add("p", true); + oversetDict.add("HbyA", true); + oversetDict.add("grad(p)", true); + + const_cast<dictionary&> + ( + mesh.schemesDict() + ).add + ( + "oversetInterpolationRequired", + oversetDict, + true + ); +} + +// Mask field for zeroing out contributions on hole cells +#include "createCellMask.H" diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H new file mode 100644 index 00000000000..5f1fc7451c2 --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/pEqn.H @@ -0,0 +1,123 @@ +rho = thermo.rho(); +rho = max(rho, rhoMin); +rho = min(rho, rhoMax); +rho.relax(); + +surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask)); + +volScalarField rAU(1.0/UEqn.A()); +surfaceScalarField rhorAUf("rhorAUf", faceMask*fvc::interpolate(rho*rAU)); +volVectorField HbyA("HbyA", constrainHbyA(rAU*UEqn.H(), U, p)); +//mesh.interpolate(HbyA); + +if (pimple.nCorrPISO() <= 1) +{ + tUEqn.clear(); +} + +if (pimple.transonic()) +{ + surfaceScalarField phid + ( + "phid", + fvc::interpolate(psi) + *( + fvc::flux(HbyA) + + rhorAUf*fvc::ddtCorr(rho, U, rhoUf)/fvc::interpolate(rho) + ) + ); + + fvc::makeRelative(phid, psi, U); + MRF.makeRelative(fvc::interpolate(psi), phid); + + while (pimple.correctNonOrthogonal()) + { + fvScalarMatrix pEqn + ( + fvm::ddt(psi, p) + + fvm::div(phid, p) + - fvm::laplacian(rhorAUf, p) + == + fvOptions(psi, p, rho.name()) + ); + + pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); + + if (pimple.finalNonOrthogonalIter()) + { + phi == pEqn.flux(); + } + } +} +else +{ + surfaceScalarField phiHbyA + ( + "phiHbyA", + fvc::flux(rho*HbyA) + + rhorAUf*fvc::ddtCorr(rho, U, rhoUf) + ); + + fvc::makeRelative(phiHbyA, rho, U); + MRF.makeRelative(fvc::interpolate(rho), phiHbyA); + + // Update the pressure BCs to ensure flux consistency + constrainPressure(p, rho, U, phiHbyA, rhorAUf, MRF); + + while (pimple.correctNonOrthogonal()) + { + // Pressure corrector + fvScalarMatrix pEqn + ( + fvm::ddt(psi, p) + + fvc::div(phiHbyA) + - fvm::laplacian(rhorAUf, p) + == + fvOptions(psi, p, rho.name()) + ); + + pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); + + if (pimple.finalNonOrthogonalIter()) + { + phi = phiHbyA + pEqn.flux(); + } + } +} + +#include "rhoEqn.H" +#include "compressibleContinuityErrs.H" + +// Explicitly relax pressure for momentum corrector +p.relax(); + +// Recalculate density from the relaxed pressure +rho = thermo.rho(); +rho = max(rho, rhoMin); +rho = min(rho, rhoMax); +rho.relax(); +Info<< "rho max/min : " << max(rho).value() + << " " << min(rho).value() << endl; + +volVectorField gradP(fvc::grad(p)); +//mesh.interpolate(gradP); +U = HbyA - rAU*cellMask*gradP; +U.correctBoundaryConditions(); +fvOptions.correct(U); +K = 0.5*magSqr(U); + +{ + rhoUf = fvc::interpolate(rho*U); + surfaceVectorField n(mesh.Sf()/mesh.magSf()); + rhoUf += n*(fvc::absolute(phi, rho, U)/mesh.magSf() - (n & rhoUf)); +} + +if (thermo.dpdt()) +{ + dpdt = fvc::ddt(p); + + if (mesh.moving()) + { + dpdt -= fvc::div(fvc::meshPhi(rho, U), p); + } +} diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H new file mode 100644 index 00000000000..ed2db49fb4d --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/readControls.H @@ -0,0 +1,6 @@ +#include "readTimeControls.H" + +correctPhi = pimple.dict().lookupOrDefault<Switch>("correctPhi", true); + +checkMeshCourantNo = + pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false); diff --git a/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C new file mode 100644 index 00000000000..0bbcefa14bc --- /dev/null +++ b/applications/solvers/compressible/rhoPimpleFoam/overRhoPimpleDyMFoam/rhoPimpleDyMFoam.C @@ -0,0 +1,173 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 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 + rhoPimpleFoam + +Group + grpCompressibleSolvers grpMovingMeshSolvers + +Description + Transient solver for laminar or turbulent flow of compressible fluids + for HVAC and similar applications. + + Uses the flexible PIMPLE (PISO-SIMPLE) solution for time-resolved and + pseudo-transient simulations. + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "dynamicFvMesh.H" +#include "psiThermo.H" +#include "turbulentFluidThermoModel.H" +#include "bound.H" +#include "pimpleControl.H" +#include "CorrectPhi.H" +#include "fvOptions.H" +#include "localEulerDdtScheme.H" +#include "fvcSmooth.H" +#include "cellCellStencilObject.H" +#include "localMin.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #include "setRootCase.H" + #include "createTime.H" + #include "createDynamicFvMesh.H" + + pimpleControl pimple(mesh); + + #include "createRDeltaT.H" + #include "initContinuityErrs.H" + #include "createFields.H" + #include "createMRF.H" + #include "createFvOptions.H" + #include "createRhoUf.H" + #include "createControls.H" + + turbulence->validate(); + + if (!LTS) + { + #include "compressibleCourantNo.H" + #include "setInitialDeltaT.H" + } + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nStarting time loop\n" << endl; + + while (runTime.run()) + { + #include "readControls.H" + + { + // Store divrhoU from the previous mesh so that it can be mapped + // and used in correctPhi to ensure the corrected phi has the + // same divergence + volScalarField divrhoU + ( + "divrhoU", + fvc::div(fvc::absolute(phi, rho, U)) + ); + + if (LTS) + { + #include "setRDeltaT.H" + } + else + { + #include "compressibleCourantNo.H" + #include "setDeltaT.H" + } + + runTime++; + + Info<< "Time = " << runTime.timeName() << nl << endl; + + // Store momentum to set rhoUf for introduced faces. + volVectorField rhoU("rhoU", rho*U); + + // Do any mesh changes + mesh.update(); + + if (mesh.changing()) + { + #include "setCellMask.H" + } + + if (mesh.changing() && correctPhi) + { + // Calculate absolute flux from the mapped surface velocity + phi = mesh.Sf() & rhoUf; + + #include "correctPhi.H" + + // Make the fluxes relative to the mesh-motion + fvc::makeRelative(phi, rho, U); + } + } + + if (mesh.changing() && checkMeshCourantNo) + { + #include "meshCourantNo.H" + } + + #include "rhoEqn.H" + Info<< "rhoEqn max/min : " << max(rho).value() + << " " << min(rho).value() << endl; + + // --- Pressure-velocity PIMPLE corrector loop + while (pimple.loop()) + { + #include "UEqn.H" + #include "EEqn.H" + + // --- Pressure corrector loop + while (pimple.correct()) + { + #include "pEqn.H" + } + + if (pimple.turbCorr()) + { + turbulence->correct(); + } + } + + runTime.write(); + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H new file mode 100644 index 00000000000..6353e7908fb --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/CourantNo.H @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016 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/>. + +Global + CourantNo + +Description + Calculates and outputs the mean and maximum Courant Numbers. + +\*---------------------------------------------------------------------------*/ + +scalar CoNum = 0.0; +scalar meanCoNum = 0.0; + +if (mesh.nInternalFaces()) +{ + surfaceScalarField phiMask(localMin<scalar>(mesh).interpolate(cellMask)); + + scalarField sumPhi(fvc::surfaceSum(mag(phiMask*phi))().internalField()); + + CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue(); + + meanCoNum = + 0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue(); +} + +Info<< "Courant Number mean: " << meanCoNum + << " max: " << CoNum << endl; + +// ************************************************************************* // diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files new file mode 100644 index 00000000000..7c557aba244 --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/files @@ -0,0 +1,3 @@ +pimpleDyMFoam.C + +EXE = $(FOAM_APPBIN)/overPimpleDyMFoam diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options new file mode 100644 index 00000000000..c538a99b574 --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/Make/options @@ -0,0 +1,24 @@ +EXE_INC = \ + -I.. \ + -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \ + -I$(LIB_SRC)/transportModels \ + -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/overset/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + +EXE_LIBS = \ + -lturbulenceModels \ + -lincompressibleTurbulenceModels \ + -lincompressibleTransportModels \ + -lfiniteVolume \ + -lfvOptions \ + -lsampling \ + -ldynamicFvMesh \ + -ltopoChangerFvMesh \ + -ldynamicMesh \ + -loverset diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H new file mode 100644 index 00000000000..aef0116f7b3 --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/UEqn.H @@ -0,0 +1,24 @@ +// Solve the Momentum equation + +MRF.correctBoundaryVelocity(U); + +tmp<fvVectorMatrix> tUEqn +( + fvm::ddt(U) + fvm::div(phi, U) + + MRF.DDt(U) + + turbulence->divDevReff(U) + == + fvOptions(U) +); +fvVectorMatrix& UEqn = tUEqn.ref(); + +UEqn.relax(); + +fvOptions.constrain(UEqn); + +if (pimple.momentumPredictor()) +{ + solve(UEqn == -cellMask*fvc::grad(p)); + + fvOptions.correct(U); +} diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H new file mode 100644 index 00000000000..c7870556230 --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/continuityErrs.H @@ -0,0 +1,48 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016 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/>. + +Global + continuityErrs + +Description + Calculates and prints the continuity errors. + +\*---------------------------------------------------------------------------*/ + +{ + volScalarField contErr(interpolatedCells*cellMask*fvc::div(phi)); + + scalar sumLocalContErr = runTime.deltaTValue()* + mag(contErr)().weightedAverage(mesh.V()).value(); + + scalar globalContErr = runTime.deltaTValue()* + contErr.weightedAverage(mesh.V()).value(); + cumulativeContErr += globalContErr; + + Info<< "time step continuity errors : sum local = " << sumLocalContErr + << ", global = " << globalContErr + << ", cumulative = " << cumulativeContErr + << endl; +} + +// ************************************************************************* // diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H new file mode 100644 index 00000000000..1951316f46a --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/correctPhi.H @@ -0,0 +1,113 @@ +if (mesh.changing()) +{ + volVectorField::Boundary& bfld = U.boundaryFieldRef(); + forAll(bfld, patchi) + { + if (bfld[patchi].fixesValue()) + { + bfld[patchi].initEvaluate(); + } + } + + surfaceScalarField::Boundary& phiBfld = phi.boundaryFieldRef(); + forAll(bfld, patchi) + { + if (bfld[patchi].fixesValue()) + { + bfld[patchi].evaluate(); + + phiBfld[patchi] = bfld[patchi] & mesh.Sf().boundaryField()[patchi]; + } + } +} + // Initialize BCs list for pcorr to zero-gradient + wordList pcorrTypes + ( + p.boundaryField().size(), + zeroGradientFvPatchScalarField::typeName + ); + + // Set BCs of pcorr to fixed-value for patches at which p is fixed + forAll(p.boundaryField(), patchi) + { + if (p.boundaryField()[patchi].fixesValue()) + { + pcorrTypes[patchi] = fixedValueFvPatchScalarField::typeName; + } + } + + volScalarField pcorr + ( + IOobject + ( + "pcorr", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar("pcorr", p.dimensions(), 0.0), + pcorrTypes + ); + +{ + dimensionedScalar rAUf("rAUf", dimTime, 1.0); + + const cellCellStencilObject& overlap = Stencil::New(mesh); + const labelList& cellTypes = overlap.cellTypes(); + const labelIOList& zoneIDs = overlap.zoneID(); + + while (pimple.correctNonOrthogonal()) + { + label nZones = gMax(zoneIDs)+1; + + //label refCellI2 = -1; + labelList refCells(nZones, -1); + labelList refZones(nZones, -1); + + forAll(zoneIDs, cellI) + { + label zoneId = zoneIDs[cellI]; + if + ( + refCells[zoneId] == -1 + && cellTypes[cellI] == cellCellStencil::CALCULATED + && refZones[zoneId] == -1 + ) + { + refCells[zoneId] = cellI; + refZones[zoneId] = zoneId; + } + } + + fvScalarMatrix pcorrEqn + ( + fvm::laplacian(rAUf, pcorr) == fvc::div(phi) + ); + + //pcorrEqn.setReference(refCellI2, 0.0, true); + scalarList values(nZones, 0.0); + pcorrEqn.setReferences(refCells, values, true); + + const dictionary& d = mesh.solver + ( + pcorr.select + ( + pimple.finalInnerIter() + ) + ); + mesh.fvMesh::solve(pcorrEqn, d); + + if (pimple.finalNonOrthogonalIter()) + { + phi -= pcorrEqn.flux(); + } + } + + if (runTime.outputTime()) + { + volScalarField("contPhiPcorr", fvc::div(phi)).write(); + pcorr.write(); + } +} diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H new file mode 100644 index 00000000000..53ed2009c74 --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createControls.H @@ -0,0 +1,26 @@ +#include "createTimeControls.H" + +bool correctPhi +( + pimple.dict().lookupOrDefault("correctPhi", false) +); + +bool checkMeshCourantNo +( + pimple.dict().lookupOrDefault("checkMeshCourantNo", false) +); + +bool massFluxInterpolation +( + pimple.dict().lookupOrDefault("massFluxInterpolation", false) +); + +bool adjustFringe +( + pimple.dict().lookupOrDefault("oversetAdjustPhi", false) +); + +bool ddtCorr +( + pimple.dict().lookupOrDefault("ddtCorr", true) +); diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H new file mode 100644 index 00000000000..ba991bfd484 --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/createFields.H @@ -0,0 +1,70 @@ +Info<< "Reading field p\n" << endl; +volScalarField p +( + IOobject + ( + "p", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +Info<< "Reading field U\n" << endl; +volVectorField U +( + IOobject + ( + "U", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +#include "createPhi.H" + + +label pRefCell = 0; +scalar pRefValue = 0.0; +setRefCell(p, pimple.dict(), pRefCell, pRefValue); +mesh.setFluxRequired(p.name()); + + +//- Overset specific + +// Add solver-specific interpolations +{ + dictionary oversetDict; + oversetDict.add("U", true); + oversetDict.add("p", true); + oversetDict.add("HbyA", true); + oversetDict.add("grad(p)", true); + + const_cast<dictionary&> + ( + mesh.schemesDict() + ).add + ( + "oversetInterpolationRequired", + oversetDict, + true + ); +} + +// Mask field for zeroing out contributions on hole cells +#include "createCellMask.H" + +// Create bool field with interpolated cells +#include "createInterpolatedCells.H" + +singlePhaseTransportModel laminarTransport(U, phi); + +autoPtr<incompressible::turbulenceModel> turbulence +( + incompressible::turbulenceModel::New(U, phi, laminarTransport) +); diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H new file mode 100644 index 00000000000..e13a2cc0a7c --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/interpolatedFaces.H @@ -0,0 +1,269 @@ +// Interpolation used +interpolationCellPoint<vector> UInterpolator(HbyA); + +// Determine faces on outside of interpolated cells +PackedBoolList isOwnerInterpolatedFace(mesh.nInternalFaces()); +PackedBoolList isNeiInterpolatedFace(mesh.nInternalFaces()); + +// Determine donor cells +labelListList donorCell(mesh.nInternalFaces()); + +scalarListList weightCellCells(mesh.nInternalFaces()); + +// Interpolated HbyA faces +vectorField UIntFaces(mesh.nInternalFaces(), vector::zero); + +// Determine receptor neighbourd cells +labelList receptorNeigCell(mesh.nInternalFaces(), -1); + +{ + const cellCellStencilObject& overlap = Stencil::New(mesh); + const labelList& cellTypes = overlap.cellTypes(); + const labelIOList& zoneID = overlap.zoneID(); + + label nZones = gMax(zoneID)+1; + PtrList<fvMeshSubset> meshParts(nZones); + labelList nCellsPerZone(nZones, 0); + + forAll(nCellsPerZone, zoneI) + { + meshParts.set(zoneI, new fvMeshSubset(mesh)); + meshParts[zoneI].setLargeCellSubset(zoneID, zoneI); + } + + for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) + { + label ownType = cellTypes[mesh.faceOwner()[faceI]]; + label neiType = cellTypes[mesh.faceNeighbour()[faceI]]; + if + ( + ownType == cellCellStencil::INTERPOLATED + && neiType == cellCellStencil::CALCULATED + ) + { + isOwnerInterpolatedFace[faceI] = true; + + const vector& fc = mesh.faceCentres()[faceI]; + + for (label zoneI = 0; zoneI < nZones; zoneI++) + { + if (zoneI != zoneID[mesh.faceOwner()[faceI]]) + { + const fvMesh& partMesh = meshParts[zoneI].subMesh(); + const labelList& cellMap = meshParts[zoneI].cellMap(); + label cellI = partMesh.findCell(fc); + + if (cellI != -1) + { + // Determine weights + labelList stencil(partMesh.cellCells()[cellI]); + + stencil.append(cellI); + + label st = stencil.size(); + + donorCell[faceI].setSize(st); + + weightCellCells[faceI].setSize(st); + + scalarField weights(st); + + forAll(stencil, i) + { + scalar d = mag + ( + partMesh.cellCentres()[stencil[i]] + - fc + ); + weights[i] = 1.0/d; + donorCell[faceI][i] = cellMap[stencil[i]]; + } + weights /= sum(weights); + + weightCellCells[faceI] = weights; + + forAll(stencil, i) + { + UIntFaces[faceI] += + weightCellCells[faceI][i] + *UInterpolator.interpolate + ( + fc, + donorCell[faceI][i] + ); + } + + break; + } + } + } + + receptorNeigCell[faceI] = mesh.faceNeighbour()[faceI]; + } + else if + ( + ownType == cellCellStencil::CALCULATED + && neiType == cellCellStencil::INTERPOLATED + ) + { + isNeiInterpolatedFace[faceI] = true; + + const vector& fc = mesh.faceCentres()[faceI]; + for (label zoneI = 0; zoneI < nZones; zoneI++) + { + if (zoneI != zoneID[mesh.faceNeighbour()[faceI]]) + { + const fvMesh& partMesh = meshParts[zoneI].subMesh(); + const labelList& cellMap = meshParts[zoneI].cellMap(); + label cellI = partMesh.findCell(fc); + + if (cellI != -1) + { + // Determine weights + labelList stencil(partMesh.cellCells()[cellI]); + + stencil.append(cellI); + + label st = stencil.size(); + + donorCell[faceI].setSize(st); + + weightCellCells[faceI].setSize(st); + + scalarField weights(st); + + forAll(stencil, i) + { + scalar d = mag + ( + partMesh.cellCentres()[stencil[i]] + - fc + ); + weights[i] = 1.0/d; + donorCell[faceI][i] = cellMap[stencil[i]]; + } + weights /= sum(weights); + + weightCellCells[faceI] = weights; + + forAll(stencil, i) + { + UIntFaces[faceI] += + weightCellCells[faceI][i] + *UInterpolator.interpolate + ( + fc, + donorCell[faceI][i] + ); + } + + break; + } + } + } + + receptorNeigCell[faceI] = mesh.faceOwner()[faceI]; + } + } +} + +// contravariant U +vectorField U1Contrav(mesh.nInternalFaces(), vector::zero); + +surfaceVectorField faceNormals(mesh.Sf()/mesh.magSf()); + +forAll(isNeiInterpolatedFace, faceI) +{ + label cellId = -1; + if (isNeiInterpolatedFace[faceI]) + { + cellId = mesh.faceNeighbour()[faceI]; + } + else if (isOwnerInterpolatedFace[faceI]) + { + cellId = mesh.faceOwner()[faceI]; + } + + if (cellId != -1) + { + const vector& n = faceNormals[faceI]; + vector n1 = vector::zero; + // 2-D cases + if (mesh.nSolutionD() == 2) + { + for (direction cmpt=0; cmpt<vector::nComponents; cmpt++) + { + if (mesh.geometricD()[cmpt] == -1) + { + switch (cmpt) + { + case vector::X: + { + n1 = vector(0, n.z(), -n.y()); + break; + } + + case vector::Y: + { + n1 = vector(n.z(), 0, -n.x()); + break; + } + + case vector::Z: + { + n1 = vector(n.y(), -n.x(), 0); + break; + } + } + } + } + } + else if (mesh.nSolutionD() == 3) + { + //Determine which is the primary direction + if (mag(n.x()) > mag(n.y()) && mag(n.x()) > mag(n.z())) + { + n1 = vector(n.y(), -n.x(), 0); + } + else if (mag(n.y()) > mag(n.z())) + { + n1 = vector(0, n.z(), -n.y()); + } + else + { + n1 = vector(-n.z(), 0, n.x()); + } + } + + n1 /= mag(n1); + + vector n2 = n ^ n1; + n2 /= mag(n2); + + tensor rot = + tensor + ( + n.x() ,n.y(), n.z(), + n1.x() ,n1.y(), n1.z(), + n2.x() ,n2.y(), n2.z() + ); + +// tensor rot = +// tensor +// ( +// n & x ,n & y, n & z, +// n1 & x ,n1 & y, n1 & z, +// n2 & x ,n2 & y, n2 & z +// ); + + U1Contrav[faceI].x() = + 2*transform(rot, UIntFaces[faceI]).x() + - transform(rot, HbyA[receptorNeigCell[faceI]]).x(); + + U1Contrav[faceI].y() = transform(rot, HbyA[cellId]).y(); + + U1Contrav[faceI].z() = transform(rot, HbyA[cellId]).z(); + + HbyA[cellId] = transform(inv(rot), U1Contrav[faceI]); + } +} diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H new file mode 100644 index 00000000000..028dfe4306b --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pEqn.H @@ -0,0 +1,109 @@ +volScalarField rAU(1.0/UEqn.A()); + +// Option 1: interpolate rAU, do not block out rAU on blocked cells +//mesh.interpolate(rAU, false); +//surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU)); + +// Option 2: do not interpolate rAU but block out rAU +//surfaceScalarField rAUf("rAUf", fvc::interpolate(blockedCells*rAU)); + + +// Option 3: do not interpolate rAU but zero out rAUf on faces on holes +// But what about: +// +// H +// H I C C C C +// H +// + +surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask)); +surfaceScalarField rAUf("rAUf", faceMask*fvc::interpolate(rAU)); + +volVectorField HbyA("HbyA", U); +HbyA = constrainHbyA(rAU*UEqn.H(), U, p); + +//mesh.interpolate(HbyA); +if (massFluxInterpolation) +{ + #include "interpolatedFaces.H" +} + +if (pimple.nCorrPISO() <= 1) +{ + tUEqn.clear(); +} + +surfaceScalarField phiHbyA("phiHbyA", fvc::flux(HbyA)); + +if (ddtCorr) +{ + phiHbyA += rAUf*fvc::ddtCorr(U, Uf); +} + +MRF.makeRelative(phiHbyA); + +if (p.needReference()) +{ + fvc::makeRelative(phiHbyA, U); + adjustPhi(phiHbyA, U, p); + fvc::makeAbsolute(phiHbyA, U); +} + +if (adjustFringe) +{ + fvc::makeRelative(phiHbyA, U); + oversetAdjustPhi(phiHbyA, U); + fvc::makeAbsolute(phiHbyA, U); +} + +if (runTime.outputTime()) +{ + volScalarField + ( + "div(phiHbyA)", + fvc::div(phiHbyA) + //interpolatedCells*cellMask*fvc::div(phiHbyA) + ).write(); +} + +while (pimple.correctNonOrthogonal()) +{ + fvScalarMatrix pEqn + ( + fvm::laplacian(rAUf, p) == fvc::div(phiHbyA) + ); + + pEqn.setReference(pRefCell, pRefValue); + + pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); + + if (pimple.finalNonOrthogonalIter()) + { + phi = phiHbyA - pEqn.flux(); + } +} + +#include "continuityErrs.H" + +// Explicitly relax pressure for momentum corrector +p.relax(); +volVectorField gradP(fvc::grad(p)); +//mesh.interpolate(gradP); + +// Option 1: leave velocity intact on blocked out cells +//U = HbyA - rAU*gradP; + +// Option 2: zero out velocity on blocked out cells +U = (HbyA - rAU*cellMask*gradP); +U.correctBoundaryConditions(); + +fvOptions.correct(U); + +{ + Uf = fvc::interpolate(U); + surfaceVectorField n(mesh.Sf()/mesh.magSf()); + Uf += n*(phi/mesh.magSf() - (n & Uf)); +} + +// Make the fluxes relative to the mesh motion +fvc::makeRelative(phi, U); diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C new file mode 100644 index 00000000000..f3dbd6a989c --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/pimpleDyMFoam.C @@ -0,0 +1,157 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 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 + pimpleDyMFoam.C + +Group + grpIncompressibleSolvers grpMovingMeshSolvers + +Description + Transient solver for incompressible, flow of Newtonian fluids + on a moving mesh using the PIMPLE (merged PISO-SIMPLE) algorithm. + + Turbulence modelling is generic, i.e. laminar, RAS or LES may be selected. + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "dynamicFvMesh.H" +#include "singlePhaseTransportModel.H" +#include "turbulentTransportModel.H" +#include "pimpleControl.H" +#include "fvOptions.H" + +#include "cellCellStencilObject.H" +#include "zeroGradientFvPatchFields.H" +#include "localMin.H" +#include "interpolationCellPoint.H" +#include "transform.H" +#include "fvMeshSubset.H" +#include "oversetAdjustPhi.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + argList::addNote + ( + "Experimental version of pimpleDyMFoam with support for overset meshes" + ); + #include "setRootCase.H" + #include "createTime.H" + #include "createDynamicFvMesh.H" + #include "initContinuityErrs.H" + + pimpleControl pimple(mesh); + + #include "createFields.H" + #include "createUf.H" + #include "createMRF.H" + #include "createFvOptions.H" + #include "createControls.H" + #include "CourantNo.H" + #include "setInitialDeltaT.H" + + turbulence->validate(); + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nStarting time loop\n" << endl; + + while (runTime.run()) + { + #include "readControls.H" + #include "CourantNo.H" + + #include "setDeltaT.H" + + runTime++; + + Info<< "Time = " << runTime.timeName() << nl << endl; + + bool changed = mesh.update(); + + if (changed) + { + #include "setCellMask.H" + #include "setInterpolatedCells.H" + } + + // Calculate absolute flux from the mapped surface velocity + phi = mesh.Sf() & Uf; + + if (runTime.outputTime()) + { + volScalarField + ( + "contPhi", + interpolatedCells*cellMask*fvc::div(phi) + ).write(); + } + + if (mesh.changing() && correctPhi) + { + #include "correctPhi.H" + } + + // Make the flux relative to the mesh motion + fvc::makeRelative(phi, U); + + if (mesh.changing() && checkMeshCourantNo) + { + #include "meshCourantNo.H" + } + + // --- Pressure-velocity PIMPLE corrector loop + while (pimple.loop()) + { + #include "UEqn.H" + + // --- Pressure corrector loop + while (pimple.correct()) + { + #include "pEqn.H" + } + + if (pimple.turbCorr()) + { + laminarTransport.correct(); + turbulence->correct(); + } + } + + runTime.write(); + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H new file mode 100644 index 00000000000..0141c85225b --- /dev/null +++ b/applications/solvers/incompressible/pimpleFoam/overPimpleDyMFoam/readControls.H @@ -0,0 +1,10 @@ +#include "readTimeControls.H" + +correctPhi = pimple.dict().lookupOrDefault("correctPhi", false); + +checkMeshCourantNo = pimple.dict().lookupOrDefault("checkMeshCourantNo", false); + +massFluxInterpolation = + pimple.dict().lookupOrDefault("massFluxInterpolation", false); + +ddtCorr = pimple.dict().lookupOrDefault("ddtCorr", true); diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files new file mode 100644 index 00000000000..3294949edde --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/files @@ -0,0 +1,3 @@ +simpleFoam.C + +EXE = $(FOAM_APPBIN)/overSimpleFoam diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options new file mode 100644 index 00000000000..639b94132a0 --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/Make/options @@ -0,0 +1,25 @@ +EXE_INC = \ + -I. \ + -I$(FOAM_SOLVERS)/incompressible/pimpleFoam/overPimpleDyMFoam \ + -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \ + -I$(LIB_SRC)/transportModels \ + -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/overset/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + +EXE_LIBS = \ + -lturbulenceModels \ + -lincompressibleTurbulenceModels \ + -lincompressibleTransportModels \ + -lfiniteVolume \ + -lfvOptions \ + -lsampling \ + -ldynamicFvMesh \ + -ltopoChangerFvMesh \ + -ldynamicMesh \ + -loverset diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H new file mode 100644 index 00000000000..5e9861ccc38 --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/UEqn.H @@ -0,0 +1,21 @@ + // Momentum predictor + + MRF.correctBoundaryVelocity(U); + + tmp<fvVectorMatrix> tUEqn + ( + fvm::div(phi, U) + + MRF.DDt(U) + + turbulence->divDevReff(U) + == + fvOptions(U) + ); + fvVectorMatrix& UEqn = tUEqn.ref(); + + UEqn.relax(); + + fvOptions.constrain(UEqn); + + solve(UEqn == -cellMask*fvc::grad(p)); + + fvOptions.correct(U); diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H new file mode 100644 index 00000000000..c7870556230 --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/continuityErrs.H @@ -0,0 +1,48 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016 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/>. + +Global + continuityErrs + +Description + Calculates and prints the continuity errors. + +\*---------------------------------------------------------------------------*/ + +{ + volScalarField contErr(interpolatedCells*cellMask*fvc::div(phi)); + + scalar sumLocalContErr = runTime.deltaTValue()* + mag(contErr)().weightedAverage(mesh.V()).value(); + + scalar globalContErr = runTime.deltaTValue()* + contErr.weightedAverage(mesh.V()).value(); + cumulativeContErr += globalContErr; + + Info<< "time step continuity errors : sum local = " << sumLocalContErr + << ", global = " << globalContErr + << ", cumulative = " << cumulativeContErr + << endl; +} + +// ************************************************************************* // diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H new file mode 100644 index 00000000000..b3d40776f4f --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createFields.H @@ -0,0 +1,47 @@ +Info<< "Reading field p\n" << endl; +volScalarField p +( + IOobject + ( + "p", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +Info<< "Reading field U\n" << endl; +volVectorField U +( + IOobject + ( + "U", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +#include "createPhi.H" + + +label pRefCell = 0; +scalar pRefValue = 0.0; +setRefCell(p, simple.dict(), pRefCell, pRefValue); +mesh.setFluxRequired(p.name()); + + +singlePhaseTransportModel laminarTransport(U, phi); + +autoPtr<incompressible::turbulenceModel> turbulence +( + incompressible::turbulenceModel::New(U, phi, laminarTransport) +); + +#include "createMRF.H" + +#include "createOversetFields.H" diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H new file mode 100644 index 00000000000..7eda905f506 --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createOversetFields.H @@ -0,0 +1,34 @@ +//- Overset specific + +// Add solver-specific interpolations +{ + dictionary oversetDict; + oversetDict.add("U", true); + oversetDict.add("p", true); + oversetDict.add("HbyA", true); + oversetDict.add("grad(p)", true); + + const_cast<dictionary&> + ( + mesh.schemesDict() + ).add + ( + "oversetInterpolationRequired", + oversetDict, + true + ); +} + +// Mask field for zeroing out contributions on hole cells +#include "createCellMask.H" + +#include "createInterpolatedCells.H" + +bool adjustFringe +( + simple.dict().lookupOrDefault("oversetAdjustPhi", false) +); +bool massFluxInterpolation +( + simple.dict().lookupOrDefault("massFluxInterpolation", false) +); diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H new file mode 100644 index 00000000000..db58f908280 --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/createUpdatedDynamicFvMesh.H @@ -0,0 +1,22 @@ + Info<< "Create dynamic mesh for time = " + << runTime.timeName() << nl << endl; + + autoPtr<dynamicFvMesh> meshPtr + ( + dynamicFvMesh::New + ( + IOobject + ( + dynamicFvMesh::defaultRegion, + runTime.timeName(), + runTime, + IOobject::MUST_READ + ) + ) + ); + + dynamicFvMesh& mesh = meshPtr(); + + // Calculate initial mesh-to-mesh mapping. Note that this should be + // done under the hood, e.g. as a MeshObject + mesh.update(); diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H new file mode 100644 index 00000000000..c64f92e33f7 --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/pEqn.H @@ -0,0 +1,57 @@ +{ + surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask)); + + volScalarField rAU(1.0/UEqn.A()); + surfaceScalarField rAUf("rAUf", faceMask*fvc::interpolate(rAU)); + + volVectorField HbyA("HbyA", U); + HbyA = constrainHbyA(rAU*UEqn.H(), U, p); + + //mesh.interpolate(HbyA); + if (massFluxInterpolation) + { + #include "interpolatedFaces.H" + } + + tUEqn.clear(); + + surfaceScalarField phiHbyA("phiHbyA", fvc::flux(HbyA)); + + adjustPhi(phiHbyA, U, p); + + if (adjustFringe) + { + oversetAdjustPhi(phiHbyA, U); + } + + // Non-orthogonal pressure corrector loop + while (simple.correctNonOrthogonal()) + { + fvScalarMatrix pEqn + ( + fvm::laplacian(rAUf, p) == fvc::div(phiHbyA) + ); + + pEqn.setReference(pRefCell, pRefValue); + + pEqn.solve(); + + if (simple.finalNonOrthogonalIter()) + { + phi = phiHbyA - pEqn.flux(); + } + } + + #include "continuityErrs.H" + + // Explicitly relax pressure for momentum corrector + p.relax(); + + // Momentum corrector + volVectorField gradP(fvc::grad(p)); + //mesh.interpolate(gradP); + + U = HbyA - rAU*cellMask*gradP; + U.correctBoundaryConditions(); + fvOptions.correct(U); +} diff --git a/applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C new file mode 100644 index 00000000000..4a7cf1315be --- /dev/null +++ b/applications/solvers/incompressible/simpleFoam/overSimpleFoam/simpleFoam.C @@ -0,0 +1,125 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 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 + simpleFoam + +Group + grpIncompressibleSolvers + +Description + Steady-state solver for incompressible flows with turbulence modelling. + + \heading Solver details + The solver uses the SIMPLE algorithm to solve the continuity equation: + + \f[ + \div \vec{U} = 0 + \f] + + and momentum equation: + + \f[ + \div \left( \vec{U} \vec{U} \right) - \div \gvec{R} + = - \grad p + \vec{S}_U + \f] + + Where: + \vartable + \vec{U} | Velocity + p | Pressure + \vec{R} | Stress tensor + \vec{S}_U | Momentum source + \endvartable + + \heading Required fields + \plaintable + U | Velocity [m/s] + p | Kinematic pressure, p/rho [m2/s2] + \<turbulence fields\> | As required by user selection + \endplaintable + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "singlePhaseTransportModel.H" +#include "turbulentTransportModel.H" +#include "simpleControl.H" +#include "fvOptions.H" + +#include "dynamicFvMesh.H" +#include "cellCellStencilObject.H" +#include "localMin.H" +#include "interpolationCellPoint.H" +#include "fvMeshSubset.H" +#include "transform.H" +#include "oversetAdjustPhi.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #define CREATE_MESH createUpdatedDynamicFvMesh.H + #include "postProcess.H" + + #include "setRootCase.H" + #include "createTime.H" + #include "createUpdatedDynamicFvMesh.H" + #include "createControl.H" + #include "createFields.H" + #include "createFvOptions.H" + #include "initContinuityErrs.H" + + turbulence->validate(); + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nStarting time loop\n" << endl; + + while (simple.loop()) + { + Info<< "Time = " << runTime.timeName() << nl << endl; + + // --- Pressure-velocity SIMPLE corrector + { + #include "UEqn.H" + #include "pEqn.H" + } + + laminarTransport.correct(); + turbulence->correct(); + + runTime.write(); + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H new file mode 100644 index 00000000000..4182f4e2093 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/CourantNo.H @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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/>. + +Global + CourantNo + +Description + Calculates and outputs the mean and maximum Courant Numbers. + +\*---------------------------------------------------------------------------*/ + +scalar CoNum = 0.0; +scalar meanCoNum = 0.0; + +if (mesh.nInternalFaces()) +{ + surfaceScalarField phiMask(localMin<scalar>(mesh).interpolate(cellMask)); + + scalarField sumPhi + ( + fvc::surfaceSum(mag(phiMask*phi))().internalField() + ); + + CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue(); + + meanCoNum = + 0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue(); +} + +Info<< "Courant Number mean: " << meanCoNum + << " max: " << CoNum << endl; + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files new file mode 100644 index 00000000000..e229fbaed0b --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/files @@ -0,0 +1,3 @@ +interDyMFoam.C + +EXE = $(FOAM_APPBIN)/overInterDyMFoam diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options new file mode 100644 index 00000000000..3b8ac67af5d --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/Make/options @@ -0,0 +1,31 @@ +EXE_INC = \ + -I. \ + -I.. \ + -I../../VoF \ + -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \ + -I$(LIB_SRC)/transportModels \ + -I$(LIB_SRC)/transportModels/incompressible/lnInclude \ + -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \ + -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \ + -I$(LIB_SRC)/transportModels/immiscibleIncompressibleTwoPhaseMixture/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(FOAM_SOLVERS)/incompressible/pimpleFoam/overPimpleDyMFoam \ + -I$(LIB_SRC)/overset/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude + +EXE_LIBS = \ + -limmiscibleIncompressibleTwoPhaseMixture \ + -lturbulenceModels \ + -lincompressibleTurbulenceModels \ + -lfiniteVolume \ + -ldynamicMesh \ + -ldynamicFvMesh \ + -ltopoChangerFvMesh \ + -loverset \ + -lfvOptions \ + -lsampling \ + -lwaveModels diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H new file mode 100644 index 00000000000..600c94829cc --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/UEqn.H @@ -0,0 +1,33 @@ + MRF.correctBoundaryVelocity(U); + + fvVectorMatrix UEqn + ( + fvm::ddt(rho, U) + fvm::div(rhoPhi, U) + + MRF.DDt(rho, U) + + turbulence->divDevRhoReff(rho, U) + == + fvOptions(rho, U) + ); + + UEqn.relax(); + + fvOptions.constrain(UEqn); + + if (pimple.momentumPredictor()) + { + solve + ( + UEqn + == + cellMask*fvc::reconstruct + ( + ( + mixture.surfaceTensionForce() + - ghf*fvc::snGrad(rho) + - fvc::snGrad(p_rgh) + ) * mesh.magSf() + ) + ); + + fvOptions.correct(U); + } diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H new file mode 100644 index 00000000000..c7870556230 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/continuityErrs.H @@ -0,0 +1,48 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016 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/>. + +Global + continuityErrs + +Description + Calculates and prints the continuity errors. + +\*---------------------------------------------------------------------------*/ + +{ + volScalarField contErr(interpolatedCells*cellMask*fvc::div(phi)); + + scalar sumLocalContErr = runTime.deltaTValue()* + mag(contErr)().weightedAverage(mesh.V()).value(); + + scalar globalContErr = runTime.deltaTValue()* + contErr.weightedAverage(mesh.V()).value(); + cumulativeContErr += globalContErr; + + Info<< "time step continuity errors : sum local = " << sumLocalContErr + << ", global = " << globalContErr + << ", cumulative = " << cumulativeContErr + << endl; +} + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H new file mode 100644 index 00000000000..81948b54da4 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/correctPhi.H @@ -0,0 +1,125 @@ +{ + if (mesh.changing()) + { + volVectorField::Boundary& bfld = U.boundaryFieldRef(); + forAll(bfld, patchi) + { + if (bfld[patchi].fixesValue()) + { + bfld[patchi].initEvaluate(); + } + } + + surfaceScalarField::Boundary& phiBfld = phi.boundaryFieldRef(); + forAll(bfld, patchi) + { + if (bfld[patchi].fixesValue()) + { + bfld[patchi].evaluate(); + + phiBfld[patchi] = + bfld[patchi] + & mesh.Sf().boundaryField()[patchi]; + } + } + } + + wordList pcorrTypes + ( + p_rgh.boundaryField().size(), + zeroGradientFvPatchScalarField::typeName + ); + + for (label i=0; i<p_rgh.boundaryField().size(); i++) + { + if (p_rgh.boundaryField()[i].fixesValue()) + { + pcorrTypes[i] = fixedValueFvPatchScalarField::typeName; + } + } + + volScalarField pcorr + ( + IOobject + ( + "pcorr", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar("pcorr", p_rgh.dimensions(), 0.0), + pcorrTypes + ); + + if (pcorr.needReference()) + { + fvc::makeRelative(phi, U); + adjustPhi(phi, U, pcorr); + fvc::makeAbsolute(phi, U); + } + + mesh.setFluxRequired(pcorr.name()); + + dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0); + + const cellCellStencilObject& overlap = Stencil::New(mesh); + const labelList& cellTypes = overlap.cellTypes(); + const labelIOList& zoneIDs = overlap.zoneID(); + + while (pimple.correctNonOrthogonal()) + { + label nZones = gMax(zoneIDs)+1; + //label refCellI2 = -1; + + labelList refCells(nZones, -1); + labelList refZones(nZones, -1); + + forAll(zoneIDs, cellI) + { + label zoneId = zoneIDs[cellI]; + if + ( + refCells[zoneId] == -1 + && cellTypes[cellI] == cellCellStencil::CALCULATED + && refZones[zoneId] == -1 + ) + { + refCells[zoneId] = cellI; + refZones[zoneId] = zoneId; + } + } + + fvScalarMatrix pcorrEqn + ( + fvm::laplacian(rAUf, pcorr) == fvc::div(phi) + ); + + //pcorrEqn.setReference(refCellI2, 0, true); + scalarList values(nZones, 0.0); + pcorrEqn.setReferences(refCells, values, true); + + const dictionary& d = mesh.solver + ( + pcorr.select + ( + pimple.finalInnerIter() + ) + ); + + //Bypass virtual layer + mesh.fvMesh::solve(pcorrEqn, d); + + if (pimple.finalNonOrthogonalIter()) + { + phi -= pcorrEqn.flux(); + } + } + + if (runTime.outputTime()) + { + volScalarField("contPhiPcorr", fvc::div(phi)).write(); + pcorr.write(); + } +} diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H new file mode 100644 index 00000000000..cb2dfd5ddd1 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createDyMControls.H @@ -0,0 +1,25 @@ +bool correctPhi +( + pimple.dict().lookupOrDefault<Switch>("correctPhi", true) +); + +bool checkMeshCourantNo +( + pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false) +); + +bool moveMeshOuterCorrectors +( + pimple.dict().lookupOrDefault<Switch>("moveMeshOuterCorrectors", false) +); + + +bool massFluxInterpolation +( + pimple.dict().lookupOrDefault("massFluxInterpolation", false) +); + +bool ddtCorr +( + pimple.dict().lookupOrDefault("ddtCorr", true) +); diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H new file mode 100644 index 00000000000..4a83ab58506 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/createFields.H @@ -0,0 +1,171 @@ +#include "createRDeltaT.H" + +Info<< "Reading field p_rgh\n" << endl; +volScalarField p_rgh +( + IOobject + ( + "p_rgh", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +Info<< "Reading field U\n" << endl; +volVectorField U +( + IOobject + ( + "U", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh +); + +#include "createPhi.H" + + + + //- Overset specific + + // Add solver-specific interpolations + { + dictionary oversetDict; + oversetDict.add("U", true); + oversetDict.add("p", true); + oversetDict.add("HbyA", true); + oversetDict.add("p_rgh", true); + oversetDict.add("alpha1", true); + oversetDict.add("minGradP", true); + + const_cast<dictionary&> + ( + mesh.schemesDict() + ).add + ( + "oversetInterpolationRequired", + oversetDict, + true + ); + } + + // Mask field for zeroing out contributions on hole cells + #include "createCellMask.H" + + // Create bool field with interpolated cells + #include "createInterpolatedCells.H" + + + +Info<< "Reading transportProperties\n" << endl; +immiscibleIncompressibleTwoPhaseMixture mixture(U, phi); + +volScalarField& alpha1(mixture.alpha1()); +volScalarField& alpha2(mixture.alpha2()); + +const dimensionedScalar& rho1 = mixture.rho1(); +const dimensionedScalar& rho2 = mixture.rho2(); + + +// Need to store rho for ddt(rho, U) +volScalarField rho +( + IOobject + ( + "rho", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT + ), + alpha1*rho1 + alpha2*rho2 +); +rho.oldTime(); + + +// Mass flux +surfaceScalarField rhoPhi +( + IOobject + ( + "rhoPhi", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + fvc::interpolate(rho)*phi +); + + +// Construct incompressible turbulence model +autoPtr<incompressible::turbulenceModel> turbulence +( + incompressible::turbulenceModel::New(U, phi, mixture) +); + + +#include "readGravitationalAcceleration.H" +#include "readhRef.H" +#include "gh.H" + + +volScalarField p +( + IOobject + ( + "p", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + p_rgh + rho*gh +); + +label pRefCell = 0; +scalar pRefValue = 0.0; +setRefCell +( + p, + p_rgh, + pimple.dict(), + pRefCell, + pRefValue +); + +if (p_rgh.needReference()) +{ + p += dimensionedScalar + ( + "p", + p.dimensions(), + pRefValue - getRefCellValue(p, pRefCell) + ); + p_rgh = p - rho*gh; +} + +mesh.setFluxRequired(p_rgh.name()); +mesh.setFluxRequired(alpha1.name()); + +// MULES compressed flux is registered in case scalarTransport FO needs it. +surfaceScalarField alphaPhiUn +( + IOobject + ( + "alphaPhiUn", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar("zero", phi.dimensions(), 0.0) +); + +#include "createMRF.H" diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C b/applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C new file mode 100644 index 00000000000..7bb7f8af6b8 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/interDyMFoam.C @@ -0,0 +1,209 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 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 + overInterDyMFoam + +Group + grpMultiphaseSolvers grpMovingMeshSolvers + +Description + Solver for 2 incompressible, isothermal immiscible fluids using a VOF + (volume of fluid) phase-fraction based interface capturing approach, + with optional mesh motion and mesh topology changes including adaptive + re-meshing. + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "dynamicFvMesh.H" +#include "CMULES.H" +#include "EulerDdtScheme.H" +#include "localEulerDdtScheme.H" +#include "CrankNicolsonDdtScheme.H" +#include "subCycle.H" +#include "immiscibleIncompressibleTwoPhaseMixture.H" +#include "turbulentTransportModel.H" +#include "pimpleControl.H" +#include "fvOptions.H" +#include "CorrectPhi.H" +#include "fvcSmooth.H" +#include "cellCellStencilObject.H" +#include "localMin.H" +#include "interpolationCellPoint.H" +#include "transform.H" +#include "fvMeshSubset.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #include "postProcess.H" + + #include "setRootCase.H" + #include "createTime.H" + #include "createDynamicFvMesh.H" + #include "initContinuityErrs.H" + #include "createControl.H" + #include "createTimeControls.H" + #include "createDyMControls.H" + #include "createFields.H" + #include "createAlphaFluxes.H" + #include "createFvOptions.H" + + volScalarField rAU + ( + IOobject + ( + "rAU", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("rAUf", dimTime/rho.dimensions(), 1.0) + ); + + #include "correctPhi.H" + #include "createUf.H" + + turbulence->validate(); + + if (!LTS) + { + #include "CourantNo.H" + #include "setInitialDeltaT.H" + } + + #include "setCellMask.H" + #include "setInterpolatedCells.H" + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + Info<< "\nStarting time loop\n" << endl; + + while (runTime.run()) + { + #include "readControls.H" + + if (LTS) + { + #include "setRDeltaT.H" + } + else + { + #include "CourantNo.H" + #include "alphaCourantNo.H" + #include "setDeltaT.H" + } + + runTime++; + + Info<< "Time = " << runTime.timeName() << nl << endl; + + // --- Pressure-velocity PIMPLE corrector loop + while (pimple.loop()) + { + if (pimple.firstIter() || moveMeshOuterCorrectors) + { + scalar timeBeforeMeshUpdate = runTime.elapsedCpuTime(); + + mesh.update(); + + if (mesh.changing()) + { + Info<< "Execution time for mesh.update() = " + << runTime.elapsedCpuTime() - timeBeforeMeshUpdate + << " s" << endl; + + // Do not apply previous time-step mesh compression flux + // if the mesh topology changed + if (mesh.topoChanging()) + { + talphaPhiCorr0.clear(); + } + + gh = (g & mesh.C()) - ghRef; + ghf = (g & mesh.Cf()) - ghRef; + + // Update cellMask field for blocking out hole cells + #include "setCellMask.H" + #include "setInterpolatedCells.H" + } + + if ((mesh.changing() && correctPhi) || mesh.topoChanging()) + { + // Calculate absolute flux from the mapped surface velocity + // Note: temporary fix until mapped Uf is assessed + Uf = fvc::interpolate(U); + + // Calculate absolute flux from the mapped surface velocity + phi = mesh.Sf() & Uf; + + #include "correctPhi.H" + + // Make the flux relative to the mesh motion + fvc::makeRelative(phi, U); + + mixture.correct(); + } + + if (mesh.changing() && checkMeshCourantNo) + { + #include "meshCourantNo.H" + } + } + + #include "alphaControls.H" + #include "alphaEqnSubCycle.H" + + mixture.correct(); + + #include "UEqn.H" + + // --- Pressure corrector loop + while (pimple.correct()) + { + #include "pEqn.H" + } + + if (pimple.turbCorr()) + { + turbulence->correct(); + } + } + + runTime.write(); + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H new file mode 100644 index 00000000000..0a5b0296b8b --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/pEqn.H @@ -0,0 +1,96 @@ +{ + rAU = 1.0/UEqn.A(); + surfaceScalarField faceMask(localMin<scalar>(mesh).interpolate(cellMask)); + + surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU)); + + volVectorField HbyA("HbyA", U); + //HbyA = rAU*UEqn.H(); + HbyA = constrainHbyA(rAU*UEqn.H(), U, p_rgh); + + if (massFluxInterpolation) + { + #include "interpolatedFaces.H" + } + + surfaceScalarField phiHbyA("phiHbyA", fvc::flux(HbyA)); + + if (ddtCorr) + { + phiHbyA += fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, Uf); + } + MRF.makeRelative(phiHbyA); + + if (p_rgh.needReference()) + { + fvc::makeRelative(phiHbyA, U); + adjustPhi(phiHbyA, U, p_rgh); + fvc::makeAbsolute(phiHbyA, U); + } + + surfaceScalarField phig + ( + ( + mixture.surfaceTensionForce() + - ghf*fvc::snGrad(rho) + )*faceMask*rAUf*mesh.magSf() + ); + + phiHbyA += phig; + + // Update the pressure BCs to ensure flux consistency + constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF); + + while (pimple.correctNonOrthogonal()) + { + fvScalarMatrix p_rghEqn + ( + fvm::laplacian(faceMask*rAUf, p_rgh) == fvc::div(phiHbyA) + ); + + p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell)); + + p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); + + if (pimple.finalNonOrthogonalIter()) + { + phi = phiHbyA - p_rghEqn.flux(); + + p_rgh.relax(); + + // Reconstruct body forces (-grad(p) and gh etc) + volVectorField minGradP + ( + "minGradP", + fvc::reconstruct((phig - p_rghEqn.flux())/rAUf) + ); + U = HbyA + rAU*cellMask*minGradP; + U.correctBoundaryConditions(); + fvOptions.correct(U); + } + } + + #include "continuityErrs.H" + + { + Uf = fvc::interpolate(U); + surfaceVectorField n(mesh.Sf()/mesh.magSf()); + Uf += n*(phi/mesh.magSf() - (n & Uf)); + } + + // Make the fluxes relative to the mesh motion + fvc::makeRelative(phi, U); + + p == p_rgh + rho*gh; + + if (p_rgh.needReference()) + { + p += dimensionedScalar + ( + "p", + p.dimensions(), + pRefValue - getRefCellValue(p, pRefCell) + ); + p_rgh = p - rho*gh; + } +} diff --git a/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H b/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H new file mode 100644 index 00000000000..0df2a74f309 --- /dev/null +++ b/applications/solvers/multiphase/interFoam/overInterDyMFoam/readControls.H @@ -0,0 +1,15 @@ +#include "readTimeControls.H" + +correctPhi = pimple.dict().lookupOrDefault<Switch>("correctPhi", true); + +checkMeshCourantNo = + pimple.dict().lookupOrDefault<Switch>("checkMeshCourantNo", false); + +moveMeshOuterCorrectors = + pimple.dict().lookupOrDefault<Switch>("moveMeshOuterCorrectors", false); + +massFluxInterpolation = + pimple.dict().lookupOrDefault("massFluxInterpolation", false); + +ddtCorr = + pimple.dict().lookupOrDefault("ddtCorr", true); \ No newline at end of file diff --git a/applications/test/parallelOverset/Make/files b/applications/test/parallelOverset/Make/files new file mode 100644 index 00000000000..1a6be797876 --- /dev/null +++ b/applications/test/parallelOverset/Make/files @@ -0,0 +1,3 @@ +laplacianDyMFoam.C + +EXE = $(FOAM_USER_APPBIN)/correctBoundaryConditions diff --git a/applications/test/parallelOverset/Make/options b/applications/test/parallelOverset/Make/options new file mode 100644 index 00000000000..0dd7b75e800 --- /dev/null +++ b/applications/test/parallelOverset/Make/options @@ -0,0 +1,12 @@ +EXE_INC = \ + -DFULLDEBUG -g -O0 \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/overset/lnInclude + +EXE_LIBS = \ + -lfiniteVolume \ + -lsampling \ + -loverset diff --git a/applications/test/parallelOverset/createFields.H b/applications/test/parallelOverset/createFields.H new file mode 100644 index 00000000000..d14935caab6 --- /dev/null +++ b/applications/test/parallelOverset/createFields.H @@ -0,0 +1,53 @@ + Info<< "Reading field T\n" << endl; + + volScalarField T + ( + IOobject + ( + "T", + runTime.timeName(), + mesh, + IOobject::MUST_READ, + IOobject::AUTO_WRITE + ), + mesh + ); + + // Add overset specific interpolations + { + dictionary oversetDict; + oversetDict.add("T", true); + + const_cast<dictionary&> + ( + mesh.schemesDict() + ).add + ( + "oversetInterpolationRequired", + oversetDict, + true + ); + } + + + Info<< "Reading transportProperties\n" << endl; + + IOdictionary transportProperties + ( + IOobject + ( + "transportProperties", + runTime.constant(), + mesh, + IOobject::MUST_READ_IF_MODIFIED, + IOobject::NO_WRITE + ) + ); + + + Info<< "Reading diffusivity DT\n" << endl; + + dimensionedScalar DT + ( + transportProperties.lookup("DT") + ); diff --git a/applications/test/parallelOverset/heatTransfer/0.org/T b/applications/test/parallelOverset/heatTransfer/0.org/T new file mode 100644 index 00000000000..a60edc4bb6b --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/0.org/T @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object T; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 273; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type zeroGradient; + } + + left1 + { + type fixedValue; + value uniform 300; + } + + right1 + { + type fixedValue; + value uniform 273; + } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement b/applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement new file mode 100644 index 00000000000..a1dda3a4175 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/0.org/pointDisplacement @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + ".*" + { + type uniformFixedValue; + uniformValue (0 0 0); + } + + "(free|hole)" + { + patchType overset; + type uniformFixedValue; + uniformValue (0 0 0); +// uniformValue table +// ( +// (0.0 (0 0 0)) +// (1.0 (0.31 0 0)) +// (2.0 (0 0 0)) +// ); + } +} + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/0.org/zoneID b/applications/test/parallelOverset/heatTransfer/0.org/zoneID new file mode 100644 index 00000000000..1a49886c283 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/0.org/zoneID @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev-OpenCFD.overlap | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + ".*" + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/Allclean b/applications/test/parallelOverset/heatTransfer/Allclean new file mode 100755 index 00000000000..323e09af05d --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/Allclean @@ -0,0 +1,13 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase +rm -f constant/polyMesh/boundary +rm -f constant/polyMesh/zoneID + +rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/test/parallelOverset/heatTransfer/Allrun.pre b/applications/test/parallelOverset/heatTransfer/Allrun.pre new file mode 100755 index 00000000000..19e4417a553 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/Allrun.pre @@ -0,0 +1,17 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication blockMesh + +# Select cellSets +runApplication topoSet + +runApplication subsetMesh box -patch hole -overwrite + +# Select cellSets +runApplication -s zoneID topoSet + +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict b/applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict new file mode 100644 index 00000000000..69054196e62 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/constant/dynamicMeshDict @@ -0,0 +1,33 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object dynamicMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +motionSolverLibs ( "libfvMotionSolvers.so" ); + +solver displacementLaplacian; + +displacementLaplacianCoeffs +{ + diffusivity uniform 1; +} + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +// layerRelax 0.3; +} + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/constant/transportProperties b/applications/test/parallelOverset/heatTransfer/constant/transportProperties new file mode 100644 index 00000000000..2c17a958286 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/constant/transportProperties @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +DT DT [ 0 2 -1 0 0 0 0 ] 1; + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/blockMeshDict b/applications/test/parallelOverset/heatTransfer/system/blockMeshDict new file mode 100644 index 00000000000..c3dd3573eb7 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/blockMeshDict @@ -0,0 +1,126 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.5 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + ( 0.00 0.0 0) + ( 1.00 0.0 0) + ( 1.00 1.0 0) + ( 0.00 1.0 0) + ( 0.00 0.0 1) + ( 1.00 0.0 1) + ( 1.00 1.0 1) + ( 0.00 1.0 1) + +//- 0 degrees + ( 0.25 0.25 0) + ( 0.75 0.25 0) + ( 0.75 0.75 0) + ( 0.25 0.75 0) + ( 0.25 0.25 1) + ( 0.75 0.25 1) + ( 0.75 0.75 1) + ( 0.25 0.75 1) + + +//- 45 degrees rotated +// ( 0.25 0.5 0) +// ( 0.5 0.25 0) +// ( 0.75 0.5 0) +// ( 0.5 0.75 0) +// ( 0.25 0.5 1) +// ( 0.5 0.25 1) +// ( 0.75 0.5 1) +// ( 0.5 0.75 1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (18 18 1) simpleGrading (1 1 1) + + hex (8 9 10 11 12 13 14 15) movingZone (30 30 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + free + { + type overset; + faces + ( + (8 12 15 11) + (10 14 13 9) + (11 15 14 10) + ( 9 13 12 8) + ); + } + + walls + { + type patch; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } + + // Populated by subsetMesh + hole + { + type patch; + faces (); + } + + frontAndBack + { + type empty; + faces + ( + (0 3 2 1) + (4 5 6 7) + ( 8 11 10 9) + (12 13 14 15) + ); + } + + left1 + { + type patch; + faces + ( + (0 4 7 3) + ); + } + right1 + { + type patch; + faces + ( + (2 6 5 1) + ); + } +); + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/controlDict b/applications/test/parallelOverset/heatTransfer/system/controlDict new file mode 100644 index 00000000000..535f677519c --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/controlDict @@ -0,0 +1,57 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Make sure all preprocessing tools know about the 'overset' bc +libs ("liboverset.so"); + +DebugSwitches +{ + overset 1; + inverseDistance 1; +} + +application correctBoundaryConditions; //overLaplacianDyMFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 1; + +deltaT 0.1; + +writeControl timeStep; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 16; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/decomposeParDict b/applications/test/parallelOverset/heatTransfer/system/decomposeParDict new file mode 100644 index 00000000000..b1fa24963fa --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/decomposeParDict @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 2; + + +//constraints +//{ +// localOverset +// { +// //- Keep donor and acceptor on same processor +// type localOverset; +// } +//} + +method hierarchical; + +hierarchicalCoeffs +{ + n (1 2 1); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile "decompositionData"; +} + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/fvSchemes b/applications/test/parallelOverset/heatTransfer/system/fvSchemes new file mode 100644 index 00000000000..43c631a1f29 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/fvSchemes @@ -0,0 +1,85 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default steadyState; +} + +gradSchemes +{ + default Gauss linear; + grad(T) Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) bounded Gauss limitedLinearV 1; + div(phi,k) bounded Gauss limitedLinear 1; + div(phi,epsilon) bounded Gauss limitedLinear 1; + div(phi,R) bounded Gauss limitedLinear 1; + div(R) Gauss linear; + div(phi,nuTilda) bounded Gauss limitedLinear 1; + div((nuEff*dev(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; + laplacian(diffusivity,cellDisplacement) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + pcorr ; + p ; +} + +oversetInterpolation +{ + // Interpolation scheme to use for overset calculation + method inverseDistance; + + // The inverseDistance method uses a 'voxel' like search structure. + // Optionally specify the extent and number of divisions n. + // Note that it will allocate an array of nx*ny*nz. If not specified: + // - searchBox : local mesh bounding box + // - searchBoxDivisions : root (2D) or cube-root(3D) of number of cells + searchBox (0 0 0)(1 1 1); + searchBoxDivisions (100 100 1); +} + + +oversetInterpolationRequired +{ + // Any additional fields that require overset interpolation +} + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/fvSolution b/applications/test/parallelOverset/heatTransfer/system/fvSolution new file mode 100644 index 00000000000..66c7f94747e --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/fvSolution @@ -0,0 +1,77 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + T + { + solver PBiCGStab; + preconditioner DILU; + + //solver GAMG; + //smoother DILUGaussSeidel; + //agglomerator algebraicPair; + //processorAgglomerator none; + + tolerance 1e-10; + relTol 0; + } + + cellDisplacement + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + +} + +SIMPLE +{ + nNonOrthogonalCorrectors 0; //2; +} + + +PIMPLE +{ + correctPhi yes; + nOuterCorrectors 2; + nCorrectors 1; + nNonOrthogonalCorrectors 0; +} + + +relaxationFactors +{ + fields + { + p 0.3; + } + equations + { + U 0.7; + k 0.7; + omega 0.7; + } +} + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/postProcessingDict b/applications/test/parallelOverset/heatTransfer/system/postProcessingDict new file mode 100644 index 00000000000..8fe6333aa05 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/postProcessingDict @@ -0,0 +1,35 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object postProcessingDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +functions +{ + processorField1 + { + // Type of functionObject + type processorField; + + // Where to load it from (if not already in solver) + libs ("libfieldFunctionObjects.so"); + + // Function object enabled flag + enabled true; + + // When to output the average fields + writeControl writeTime; + } +} + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/processorField b/applications/test/parallelOverset/heatTransfer/system/processorField new file mode 100644 index 00000000000..6b41df60e40 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/processorField @@ -0,0 +1,32 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object postProcessingDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +processorField +{ + // Type of functionObject + type processorField; + + // Where to load it from (if not already in solver) + libs ("libfieldFunctionObjects.so"); + + // Function object enabled flag + enabled true; + + // When to output the average fields + writeControl timeStep; +} + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/setFieldsDict b/applications/test/parallelOverset/heatTransfer/system/setFieldsDict new file mode 100644 index 00000000000..2ebc58f23ab --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/setFieldsDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue zoneID 123 +); + +regions +( + // Set cell values + // (does zerogradient on boundaries) + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + +); + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/heatTransfer/system/topoSetDict b/applications/test/parallelOverset/heatTransfer/system/topoSetDict new file mode 100644 index 00000000000..06a8182d404 --- /dev/null +++ b/applications/test/parallelOverset/heatTransfer/system/topoSetDict @@ -0,0 +1,80 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionToCell; + sourceInfo + { + insidePoints ((0.001 0.001 0.001)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } + + + // Select box to remove from region 1 + + { + name box; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c1; + } + } + + + { + name box; + type cellSet; + action subset; + source boxToCell; + sourceInfo + { + box (0.4 0.4 -100)(0.6 0.6 100); + } + } + + { + name box; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/laplacianDyMFoam.C b/applications/test/parallelOverset/laplacianDyMFoam.C new file mode 100644 index 00000000000..ea06cd7d3ac --- /dev/null +++ b/applications/test/parallelOverset/laplacianDyMFoam.C @@ -0,0 +1,125 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 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 + laplacianFoam + +Group + grpBasicSolvers + +Description + Laplace equation solver for a scalar quantity. + + \heading Solver details + The solver is applicable to, e.g. for thermal diffusion in a solid. The + equation is given by: + + \f[ + \ddt{T} = \div \left( D_T \grad T \right) + \f] + + Where: + \vartable + T | Scalar field which is solved for, e.g. temperature + D_T | Diffusion coefficient + \endvartable + + \heading Required fields + \plaintable + T | Scalar field which is solved for, e.g. temperature + \endplaintable + +\*---------------------------------------------------------------------------*/ + +#include "fvCFD.H" +#include "simpleControl.H" +#include "dynamicFvMesh.H" +#include "dynamicOversetFvMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + #include "setRootCase.H" + + #include "createTime.H" + #include "createNamedDynamicFvMesh.H" + + simpleControl simple(mesh); + + #include "createFields.H" + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + Info<< "\nCorrecting boundary conditions on " << T.name() << nl << endl; + + runTime++; + + Info<< "Time = " << runTime.timeName() << nl << endl; + + Info<< "Reading : ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + + mesh.update(); + + Info<< "Overset calculation : ExecutionTime = " + << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + + + if (false) + { + // Test correctBoundaryConditions + + // Change the internalField + component(T.ref(), mesh.C(), 0); + component(T.ref(), mesh.C(), 1); + // Interpolate + halo swap + T.correctBoundaryConditions(); + // Check halo swap + dynamicOversetFvMesh::checkCoupledBC(T); + } + if (true) + { + // Test solving + fvScalarMatrix TEqn(fvm::laplacian(DT, T)); + TEqn.solve(); + } + + runTime.write(); + + + + Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" + << " ClockTime = " << runTime.elapsedClockTime() << " s" + << nl << endl; + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/test/parallelOverset/write.H b/applications/test/parallelOverset/write.H new file mode 100644 index 00000000000..47aa182c0a9 --- /dev/null +++ b/applications/test/parallelOverset/write.H @@ -0,0 +1,46 @@ + if (runTime.outputTime()) + { + volVectorField gradT(fvc::grad(T)); + + volScalarField gradTx + ( + IOobject + ( + "gradTx", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + gradT.component(vector::X) + ); + + volScalarField gradTy + ( + IOobject + ( + "gradTy", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + gradT.component(vector::Y) + ); + + volScalarField gradTz + ( + IOobject + ( + "gradTz", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + gradT.component(vector::Z) + ); + + + runTime.write(); + } diff --git a/applications/test/wallDistDyM/Make/files b/applications/test/wallDistDyM/Make/files new file mode 100644 index 00000000000..c84f5e72f5b --- /dev/null +++ b/applications/test/wallDistDyM/Make/files @@ -0,0 +1,3 @@ +Test-wallDistDyM.C + +EXE = $(FOAM_USER_APPBIN)/Test-wallDistDyM diff --git a/applications/test/wallDistDyM/Make/options b/applications/test/wallDistDyM/Make/options new file mode 100644 index 00000000000..8a9d17bf25b --- /dev/null +++ b/applications/test/wallDistDyM/Make/options @@ -0,0 +1,9 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude + +EXE_LIBS = \ + -lfiniteVolume \ + -lmeshTools \ + -ldynamicFvMesh diff --git a/applications/test/wallDistDyM/Test-wallDistDyM.C b/applications/test/wallDistDyM/Test-wallDistDyM.C new file mode 100644 index 00000000000..cfa1bbb8be9 --- /dev/null +++ b/applications/test/wallDistDyM/Test-wallDistDyM.C @@ -0,0 +1,69 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2017 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/>. + +Description + Calculate and write the distance-to-wall field for a moving mesh. + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "Time.H" +#include "dynamicFvMesh.H" +#include "wallDist.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + #include "setRootCase.H" + #include "createTime.H" + #include "createDynamicFvMesh.H" + + Info<< "Mesh read in = " + << runTime.cpuTimeIncrement() + << " s\n" << endl << endl; + + // Calculate initial mesh-to-mesh mapping. Note that this should be + // done under the hood, e.g. as a MeshObject + mesh.update(); + + Info<< "Time now = " << runTime.timeName() << endl; + + // Wall-reflection vectors + const volVectorField& n = wallDist::New(mesh).n(); + n.write(); + + // Wall distance + const volScalarField& y = wallDist::New(mesh).y(); + y.write(); + + Info<< "End\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C b/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C index 2739ecedd7d..ec10dbb003f 100644 --- a/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C +++ b/applications/utilities/mesh/manipulation/mergeOrSplitBaffles/mergeOrSplitBaffles.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -177,7 +177,7 @@ void insertDuplicateMerge label patchSize(const polyMesh& mesh, const labelList& patchIDs) { const polyBoundaryMesh& patches = mesh.boundaryMesh(); - + label sz = 0; forAll(patchIDs, i) { @@ -191,7 +191,7 @@ label patchSize(const polyMesh& mesh, const labelList& patchIDs) labelList patchFaces(const polyMesh& mesh, const labelList& patchIDs) { const polyBoundaryMesh& patches = mesh.boundaryMesh(); - + labelList faceIDs(patchSize(mesh, patchIDs)); label sz = 0; forAll(patchIDs, i) diff --git a/etc/caseDicts/setConstraintTypes b/etc/caseDicts/setConstraintTypes index 4fc38fabf02..2098261a27f 100644 --- a/etc/caseDicts/setConstraintTypes +++ b/etc/caseDicts/setConstraintTypes @@ -64,5 +64,10 @@ wedge type wedge; } +overset +{ + type overset; +} + // ************************************************************************* // diff --git a/src/Allwmake b/src/Allwmake index 1e71c42e0cd..abe861514e0 100755 --- a/src/Allwmake +++ b/src/Allwmake @@ -54,6 +54,8 @@ wmake $targetType topoChangerFvMesh parallel/Allwmake $targetType $* randomProcesses/Allwmake $targetType $* +wmake $targetType overset + wmake $targetType ODE wmake $targetType fvMotionSolver diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H index 289649f2a9c..e1fd26b6c1c 100644 --- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H +++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduInterfaceField/LduInterfaceField.H @@ -97,6 +97,7 @@ public: virtual void initInterfaceMatrixUpdate ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType @@ -110,6 +111,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H index f96d583b1f2..bcc35cc0eda 100644 --- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H +++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrix.H @@ -617,6 +617,7 @@ public: // for matrix operations void initMatrixInterfaces ( + const bool add, const FieldField<Field, LUType>& interfaceCoeffs, const Field<Type>& psiif, Field<Type>& result @@ -625,6 +626,7 @@ public: //- Update interfaced interfaces for matrix operations void updateMatrixInterfaces ( + const bool add, const FieldField<Field, LUType>& interfaceCoeffs, const Field<Type>& psiif, Field<Type>& result diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C index 0aa6d260637..84c61a3c671 100644 --- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C +++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixATmul.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -82,6 +82,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Amul // Initialise the update of interfaced interfaces initMatrixInterfaces ( + true, interfacesUpper_, psi, Apsi @@ -104,6 +105,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Amul // Update interface interfaces updateMatrixInterfaces ( + true, interfacesUpper_, psi, Apsi @@ -136,6 +138,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Tmul // Initialise the update of interfaced interfaces initMatrixInterfaces ( + true, interfacesLower_, psi, Tpsi @@ -157,6 +160,7 @@ void Foam::LduMatrix<Type, DType, LUType>::Tmul // Update interface interfaces updateMatrixInterfaces ( + true, interfacesLower_, psi, Tpsi @@ -237,20 +241,11 @@ void Foam::LduMatrix<Type, DType, LUType>::residual // Note: there is a change of sign in the coupled // interface update to add the contibution to the r.h.s. - FieldField<Field, LUType> mBouCoeffs(interfacesUpper_.size()); - - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs.set(patchi, -interfacesUpper_[patchi]); - } - } - // Initialise the update of interfaced interfaces initMatrixInterfaces ( - mBouCoeffs, + false, // negate interface contributions + interfacesUpper_, psi, rA ); @@ -272,7 +267,8 @@ void Foam::LduMatrix<Type, DType, LUType>::residual // Update interface interfaces updateMatrixInterfaces ( - mBouCoeffs, + false, + interfacesUpper_, psi, rA ); diff --git a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C index 465c097bf09..123cc71a103 100644 --- a/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C +++ b/src/OpenFOAM/matrices/LduMatrix/LduMatrix/LduMatrixUpdateMatrixInterfaces.C @@ -31,6 +31,7 @@ License template<class Type, class DType, class LUType> void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces ( + const bool add, const FieldField<Field, LUType>& interfaceCoeffs, const Field<Type>& psiif, Field<Type>& result @@ -49,6 +50,7 @@ void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces interfaces_[interfacei].initInterfaceMatrixUpdate ( result, + add, psiif, interfaceCoeffs[interfacei], //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]), @@ -75,6 +77,7 @@ void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces interfaces_[interfacei].initInterfaceMatrixUpdate ( result, + add, psiif, interfaceCoeffs[interfacei], //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]), @@ -96,6 +99,7 @@ void Foam::LduMatrix<Type, DType, LUType>::initMatrixInterfaces template<class Type, class DType, class LUType> void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces ( + const bool add, const FieldField<Field, LUType>& interfaceCoeffs, const Field<Type>& psiif, Field<Type>& result @@ -121,6 +125,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces interfaces_[interfacei].updateInterfaceMatrix ( result, + add, psiif, interfaceCoeffs[interfacei], //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]), @@ -145,6 +150,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces interfaces_[interfacei].initInterfaceMatrixUpdate ( result, + add, psiif, interfaceCoeffs[interfacei], //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]), @@ -156,6 +162,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces interfaces_[interfacei].updateInterfaceMatrix ( result, + add, psiif, interfaceCoeffs[interfacei], //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]), @@ -179,6 +186,7 @@ void Foam::LduMatrix<Type, DType, LUType>::updateMatrixInterfaces interfaces_[interfacei].updateInterfaceMatrix ( result, + add, psiif, interfaceCoeffs[interfacei], //Amultiplier<Type, LUType>(interfaceCoeffs[interfacei]), diff --git a/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C b/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C index b37ceaa5bab..29cad04bb83 100644 --- a/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/LduMatrix/Smoothers/GaussSeidel/TGaussSeidelSmoother.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -91,30 +91,22 @@ void Foam::TGaussSeidelSmoother<Type, DType, LUType>::smooth // Note: there is a change of sign in the coupled // interface update to add the contibution to the r.h.s. - FieldField<Field, LUType> mBouCoeffs(matrix_.interfacesUpper().size()); - - forAll(mBouCoeffs, patchi) - { - if (matrix_.interfaces().set(patchi)) - { - mBouCoeffs.set(patchi, -matrix_.interfacesUpper()[patchi]); - } - } - for (label sweep=0; sweep<nSweeps; sweep++) { bPrime = matrix_.source(); matrix_.initMatrixInterfaces ( - mBouCoeffs, + false, + matrix_.interfacesUpper(), psi, bPrime ); matrix_.updateMatrixInterfaces ( - mBouCoeffs, + false, + matrix_.interfacesUpper(), psi, bPrime ); diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C index d8185f43b91..02bbd1a3939 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -215,6 +215,14 @@ const Foam::labelUList& Foam::lduAddressing::losortStartAddr() const } +void Foam::lduAddressing::clearOut() +{ + deleteDemandDrivenData(losortPtr_); + deleteDemandDrivenData(ownerStartPtr_); + deleteDemandDrivenData(losortStartPtr_); +} + + Foam::label Foam::lduAddressing::triIndex(const label a, const label b) const { label own = min(a, b); diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H index b5d6f933b13..fa405d37382 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduAddressing.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -186,6 +186,9 @@ public: // Return patch field evaluation schedule virtual const lduSchedule& patchSchedule() const = 0; + //- Clear additional addressing + void clearOut(); + //- Return losort addressing const labelUList& losortAddr() const; diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H index 1fdd8f4219c..3ce8c096d66 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceField.H @@ -131,10 +131,12 @@ public: return true; } - //- Initialise neighbour matrix update + //- Initialise neighbour matrix update. Add + // or subtract coupled contributions to matrix virtual void initInterfaceMatrixUpdate ( scalarField&, + const bool add, const scalarField&, const scalarField&, const direction, @@ -142,15 +144,28 @@ public: ) const {} - //- Update result field based on interface functionality + //- Update result field based on interface functionality. Add + // or subtract coupled contributions to matrix virtual void updateInterfaceMatrix ( scalarField&, + const bool add, const scalarField&, const scalarField&, const direction, const Pstream::commsTypes commsType ) const = 0; + + //- Helper: add (or subtract) weighted contributions to internal + // field + template<class Type> + void addToInternalField + ( + Field<Type>& result, + const bool add, + const scalarField& coeffs, + const Field<Type>& vals + ) const; }; @@ -160,6 +175,12 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#ifdef NoRepository + #include "lduInterfaceFieldTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C new file mode 100644 index 00000000000..12af2788467 --- /dev/null +++ b/src/OpenFOAM/matrices/lduMatrix/lduAddressing/lduInterfaceFields/lduInterfaceField/lduInterfaceFieldTemplates.C @@ -0,0 +1,56 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 * * * * * * * * * * * * * // + +template<class Type> +void Foam::lduInterfaceField::addToInternalField +( + Field<Type>& result, + const bool add, + const scalarField& coeffs, + const Field<Type>& vals +) const +{ + const labelUList& faceCells = this->interface().faceCells(); + + if (add) + { + forAll(faceCells, elemI) + { + result[faceCells[elemI]] += coeffs[elemI]*vals[elemI]; + } + } + else + { + forAll(faceCells, elemI) + { + result[faceCells[elemI]] -= coeffs[elemI]*vals[elemI]; + } + } +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H index 4ef5055cfb1..38301514e98 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H +++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrix.H @@ -672,6 +672,7 @@ public: // for matrix operations void initMatrixInterfaces ( + const bool add, const FieldField<Field, scalar>& interfaceCoeffs, const lduInterfaceFieldPtrsList& interfaces, const scalarField& psiif, @@ -682,6 +683,7 @@ public: //- Update interfaced interfaces for matrix operations void updateMatrixInterfaces ( + const bool add, const FieldField<Field, scalar>& interfaceCoeffs, const lduInterfaceFieldPtrsList& interfaces, const scalarField& psiif, diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C index 715fb420bac..ac340418514 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixATmul.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -56,6 +56,7 @@ void Foam::lduMatrix::Amul // Initialise the update of interfaced interfaces initMatrixInterfaces ( + true, interfaceBouCoeffs, interfaces, psi, @@ -81,6 +82,7 @@ void Foam::lduMatrix::Amul // Update interface interfaces updateMatrixInterfaces ( + true, interfaceBouCoeffs, interfaces, psi, @@ -117,6 +119,7 @@ void Foam::lduMatrix::Tmul // Initialise the update of interfaced interfaces initMatrixInterfaces ( + true, interfaceIntCoeffs, interfaces, psi, @@ -140,6 +143,7 @@ void Foam::lduMatrix::Tmul // Update interface interfaces updateMatrixInterfaces ( + true, interfaceIntCoeffs, interfaces, psi, @@ -233,20 +237,11 @@ void Foam::lduMatrix::residual // To compensate for this, it is necessary to turn the // sign of the contribution. - FieldField<Field, scalar> mBouCoeffs(interfaceBouCoeffs.size()); - - forAll(mBouCoeffs, patchi) - { - if (interfaces.set(patchi)) - { - mBouCoeffs.set(patchi, -interfaceBouCoeffs[patchi]); - } - } - // Initialise the update of interfaced interfaces initMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs, interfaces, psi, rA, @@ -271,7 +266,8 @@ void Foam::lduMatrix::residual // Update interface interfaces updateMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs, interfaces, psi, rA, diff --git a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C index af65e1bc686..28dc38f75cd 100644 --- a/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C +++ b/src/OpenFOAM/matrices/lduMatrix/lduMatrix/lduMatrixUpdateMatrixInterfaces.C @@ -29,6 +29,7 @@ License void Foam::lduMatrix::initMatrixInterfaces ( + const bool add, const FieldField<Field, scalar>& coupleCoeffs, const lduInterfaceFieldPtrsList& interfaces, const scalarField& psiif, @@ -49,6 +50,7 @@ void Foam::lduMatrix::initMatrixInterfaces interfaces[interfacei].initInterfaceMatrixUpdate ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -75,6 +77,7 @@ void Foam::lduMatrix::initMatrixInterfaces interfaces[interfacei].initInterfaceMatrixUpdate ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -95,6 +98,7 @@ void Foam::lduMatrix::initMatrixInterfaces void Foam::lduMatrix::updateMatrixInterfaces ( + const bool add, const FieldField<Field, scalar>& coupleCoeffs, const lduInterfaceFieldPtrsList& interfaces, const scalarField& psiif, @@ -111,6 +115,7 @@ void Foam::lduMatrix::updateMatrixInterfaces interfaces[interfacei].updateInterfaceMatrix ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -139,6 +144,7 @@ void Foam::lduMatrix::updateMatrixInterfaces interfaces[interfacei].updateInterfaceMatrix ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -190,6 +196,7 @@ void Foam::lduMatrix::updateMatrixInterfaces interfaces[interfacei].updateInterfaceMatrix ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -214,6 +221,7 @@ void Foam::lduMatrix::updateMatrixInterfaces interfaces[interfacei].initInterfaceMatrixUpdate ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -225,6 +233,7 @@ void Foam::lduMatrix::updateMatrixInterfaces interfaces[interfacei].updateInterfaceMatrix ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, @@ -248,6 +257,7 @@ void Foam::lduMatrix::updateMatrixInterfaces interfaces[interfacei].updateInterfaceMatrix ( result, + add, psiif, coupleCoeffs[interfacei], cmpt, diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C index b233813d31c..40c5892a69e 100644 --- a/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/GaussSeidel/GaussSeidelSmoother.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -107,28 +107,14 @@ void Foam::GaussSeidelSmoother::smooth // To compensate for this, it is necessary to turn the // sign of the contribution. - FieldField<Field, scalar>& mBouCoeffs = - const_cast<FieldField<Field, scalar>&> - ( - interfaceBouCoeffs_ - ); - - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs[patchi].negate(); - } - } - - for (label sweep=0; sweep<nSweeps; sweep++) { bPrime = source; matrix_.initMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs_, interfaces_, psi, bPrime, @@ -137,7 +123,8 @@ void Foam::GaussSeidelSmoother::smooth matrix_.updateMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs_, interfaces_, psi, bPrime, @@ -175,15 +162,6 @@ void Foam::GaussSeidelSmoother::smooth psiPtr[celli] = psii; } } - - // Restore interfaceBouCoeffs_ - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs[patchi].negate(); - } - } } diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C index bfae4ef0496..af6f772c21e 100644 --- a/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/nonBlockingGaussSeidel/nonBlockingGaussSeidelSmoother.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -134,18 +134,6 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth // To compensate for this, it is necessary to turn the // sign of the contribution. - FieldField<Field, scalar>& mBouCoeffs = - const_cast<FieldField<Field, scalar>&> - ( - interfaceBouCoeffs_ - ); - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs[patchi].negate(); - } - } for (label sweep=0; sweep<nSweeps; sweep++) { @@ -153,7 +141,8 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth matrix_.initMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs_, interfaces_, psi, bPrime, @@ -193,7 +182,8 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth matrix_.updateMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs_, interfaces_, psi, bPrime, @@ -228,15 +218,6 @@ void Foam::nonBlockingGaussSeidelSmoother::smooth psiPtr[celli] = curPsi; } } - - // Restore interfaceBouCoeffs_ - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs[patchi].negate(); - } - } } diff --git a/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C b/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C index 436b7e22f05..57b27608add 100644 --- a/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C +++ b/src/OpenFOAM/matrices/lduMatrix/smoothers/symGaussSeidel/symGaussSeidelSmoother.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-2015 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -107,28 +107,14 @@ void Foam::symGaussSeidelSmoother::smooth // To compensate for this, it is necessary to turn the // sign of the contribution. - FieldField<Field, scalar>& mBouCoeffs = - const_cast<FieldField<Field, scalar>&> - ( - interfaceBouCoeffs_ - ); - - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs[patchi].negate(); - } - } - - for (label sweep=0; sweep<nSweeps; sweep++) { bPrime = source; matrix_.initMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs_, interfaces_, psi, bPrime, @@ -137,7 +123,8 @@ void Foam::symGaussSeidelSmoother::smooth matrix_.updateMatrixInterfaces ( - mBouCoeffs, + false, + interfaceBouCoeffs_, interfaces_, psi, bPrime, @@ -204,15 +191,6 @@ void Foam::symGaussSeidelSmoother::smooth psiPtr[celli] = psii; } } - - // Restore interfaceBouCoeffs_ - forAll(mBouCoeffs, patchi) - { - if (interfaces_.set(patchi)) - { - mBouCoeffs[patchi].negate(); - } - } } diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C index 6d769f4099e..af384a3158c 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/algebraicPairGAMGAgglomeration/algebraicPairGAMGAgglomeration.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C index 3896775f435..6f0a1725591 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverInterpolate.C @@ -51,6 +51,7 @@ void Foam::GAMGSolver::interpolate m.initMatrixInterfaces ( + true, interfaceBouCoeffs, interfaces, psi, @@ -67,6 +68,7 @@ void Foam::GAMGSolver::interpolate m.updateMatrixInterfaces ( + true, interfaceBouCoeffs, interfaces, psi, diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C index c4157d57f2c..e5332f52fe6 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C index 6eebf5f6091..0d2b0c1d166 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.C @@ -109,6 +109,7 @@ Foam::cyclicGAMGInterfaceField::~cyclicGAMGInterfaceField() void Foam::cyclicGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -123,12 +124,7 @@ void Foam::cyclicGAMGInterfaceField::updateInterfaceMatrix transformCoupleField(pnf, cmpt); - const labelUList& faceCells = cyclicInterface_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H index f9068707cae..6402e5efd1e 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/cyclicGAMGInterfaceField/cyclicGAMGInterfaceField.H @@ -146,6 +146,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C index 852caef35f9..3f77067f067 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.C @@ -93,6 +93,7 @@ Foam::processorGAMGInterfaceField::~processorGAMGInterfaceField() void Foam::processorGAMGInterfaceField::initInterfaceMatrixUpdate ( scalarField&, + const bool, const scalarField& psiInternal, const scalarField&, const direction, @@ -148,6 +149,7 @@ void Foam::processorGAMGInterfaceField::initInterfaceMatrixUpdate void Foam::processorGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField&, const scalarField& coeffs, const direction cmpt, @@ -162,8 +164,6 @@ void Foam::processorGAMGInterfaceField::updateInterfaceMatrix label oldWarn = UPstream::warnComm; UPstream::warnComm = comm(); - const labelUList& faceCells = procInterface_.faceCells(); - if ( commsType == Pstream::commsTypes::nonBlocking @@ -189,10 +189,7 @@ void Foam::processorGAMGInterfaceField::updateInterfaceMatrix transformCoupleField(scalarReceiveBuf_, cmpt); // Multiply the field by coefficients and add into the result - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI]; - } + addToInternalField(result, !add, coeffs, scalarReceiveBuf_); } else { @@ -202,10 +199,7 @@ void Foam::processorGAMGInterfaceField::updateInterfaceMatrix ); transformCoupleField(pnf, cmpt); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + addToInternalField(result, !add, coeffs, pnf); } const_cast<processorGAMGInterfaceField&>(*this).updatedMatrix() = true; diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H index be57260c440..acf48e7e15d 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/interfaceFields/processorGAMGInterfaceField/processorGAMGInterfaceField.H @@ -135,6 +135,7 @@ public: virtual void initInterfaceMatrixUpdate ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -145,6 +146,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, diff --git a/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H b/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H index 7561554b64b..3c62577e4a5 100644 --- a/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H +++ b/src/OpenFOAM/meshes/lduMesh/lduPrimitiveMesh.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -78,21 +78,6 @@ class lduPrimitiveMesh //- Get size of all meshes static label totalSize(const PtrList<lduPrimitiveMesh>&); - static labelList upperTriOrder - ( - const label nCells, - const labelUList& lower, - const labelUList& upper - ); - - //- Check if in upper-triangular ordering - static void checkUpperTriangular - ( - const label size, - const labelUList& l, - const labelUList& u - ); - //- Disallow default bitwise copy construct lduPrimitiveMesh(const lduPrimitiveMesh&); @@ -261,6 +246,21 @@ public: template<class ProcPatch> static lduSchedule nonBlockingSchedule(const lduInterfacePtrsList&); + //- Calculate upper-triangular order + static labelList upperTriOrder + ( + const label nCells, + const labelUList& lower, + const labelUList& upper + ); + + //- Check if in upper-triangular ordering + static void checkUpperTriangular + ( + const label size, + const labelUList& l, + const labelUList& u + ); }; diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C b/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C index 04d7e7fbdc0..4f1edca3654 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C +++ b/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C @@ -311,7 +311,7 @@ Foam::labelList Foam::polyMeshTetDecomposition::findFaceBasePts { FatalErrorInFunction << "Coupled face base point exchange failure for face " - << fI + << fI << " at " << mesh.faceCentres()[fI] << abort(FatalError); } @@ -552,6 +552,7 @@ Foam::List<Foam::tetIndices> Foam::polyMeshTetDecomposition::faceTetIndices { WarningInFunction << "No base point for face " << fI << ", " << f + << ", vertices " << UIndirectList<point>(mesh.points(), f) << ", produces a valid tet decomposition." << endl; nWarnings++; @@ -616,6 +617,7 @@ Foam::tetIndices Foam::polyMeshTetDecomposition::triangleTetIndices { WarningInFunction << "No base point for face " << fI << ", " << f + << ", vertices " << UIndirectList<point>(mesh.points(), f) << ", produces a valid tet decomposition." << endl; nWarnings++; diff --git a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig b/src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig deleted file mode 100644 index 9b725409dce..00000000000 --- a/src/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/turbulentTemperatureRadCoupledMixed/turbulentTemperatureRadCoupledMixedFvPatchScalarField.H.orig +++ /dev/null @@ -1,219 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | -<<<<<<< HEAD - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd -======= - \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | ->>>>>>> d2a62df7c -------------------------------------------------------------------------------- -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:: - turbulentTemperatureRadCoupledMixedFvPatchScalarField - -Description - Mixed boundary condition for temperature and radiation heat transfer - to be used for in multiregion cases. Optional thin thermal layer - resistances can be specified through thicknessLayers and kappaLayers - entries. - - The thermal conductivity \c kappa can either be retrieved from various - possible sources, as detailed in the class temperatureCoupledBase. - -Usage - \table - Property | Description | Required | Default value - Tnbr | name of the field | no | T - qrNbr | name of the radiative flux in the nbr region | no | none - qr | name of the radiative flux in this region | no | none - thicknessLayers | list of thicknesses per layer [m] | no | - kappaLayers | list of thermal conductivites per layer [W/m/K] | no | - kappaMethod | inherited from temperatureCoupledBase | inherited | - kappa | inherited from temperatureCoupledBase | inherited | - thermalInertia | Add thermal inertia to wall node | no | false - \endtable - - Example of the boundary condition specification: - \verbatim - <patchName> - { - type compressible::turbulentTemperatureRadCoupledMixed; - Tnbr T; - qrNbr qr; // or none. Name of qr field on neighbour region - qr qr; // or none. Name of qr field on local region - thicknessLayers (0.1 0.2 0.3 0.4); - kappaLayers (1 2 3 4); - thermalInertia false/true; - kappaMethod lookup; - kappa kappa; - value uniform 300; - } - \endverbatim - - Needs to be on underlying mapped(Wall)FvPatch. - -See also - Foam::temperatureCoupledBase - -SourceFiles - turbulentTemperatureRadCoupledMixedFvPatchScalarField.C - -\*---------------------------------------------------------------------------*/ - -#ifndef turbulentTemperatureRadCoupledMixedFvPatchScalarField_H -#define turbulentTemperatureRadCoupledMixedFvPatchScalarField_H - -#include "mixedFvPatchFields.H" -#include "temperatureCoupledBase.H" -#include "scalarList.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ -namespace compressible -{ - -/*---------------------------------------------------------------------------*\ - Class turbulentTemperatureRadCoupledMixedFvPatchScalarField Declaration -\*---------------------------------------------------------------------------*/ - -class turbulentTemperatureRadCoupledMixedFvPatchScalarField -: - public mixedFvPatchScalarField, - public temperatureCoupledBase -{ - // Private data - - //- Name of field on the neighbour region - const word TnbrName_; - - //- Name of the radiative heat flux in the neighbout region - const word qrNbrName_; - - //- Name of the radiative heat flux in local region - const word qrName_; - - //- Thickness of layers - scalarList thicknessLayers_; - - //- Conductivity of layers - scalarList kappaLayers_; - - //- Total contact resistance - scalar contactRes_; - - //- Thermal inertia term - Switch thermalInertia_; - - -public: - - //- Runtime type information - TypeName("compressible::turbulentTemperatureRadCoupledMixed"); - - - // Constructors - - //- Construct from patch and internal field - turbulentTemperatureRadCoupledMixedFvPatchScalarField - ( - const fvPatch&, - const DimensionedField<scalar, volMesh>& - ); - - //- Construct from patch, internal field and dictionary - turbulentTemperatureRadCoupledMixedFvPatchScalarField - ( - const fvPatch&, - const DimensionedField<scalar, volMesh>&, - const dictionary& - ); - - //- Construct by mapping given - // turbulentTemperatureCoupledBaffleMixedFvPatchScalarField onto a - // new patch - turbulentTemperatureRadCoupledMixedFvPatchScalarField - ( - const - turbulentTemperatureRadCoupledMixedFvPatchScalarField&, - const fvPatch&, - const DimensionedField<scalar, volMesh>&, - const fvPatchFieldMapper& - ); - - //- Construct and return a clone - virtual tmp<fvPatchScalarField> clone() const - { - return tmp<fvPatchScalarField> - ( - new turbulentTemperatureRadCoupledMixedFvPatchScalarField - ( - *this - ) - ); - } - - //- Construct as copy setting internal field reference - turbulentTemperatureRadCoupledMixedFvPatchScalarField - ( - const turbulentTemperatureRadCoupledMixedFvPatchScalarField&, - 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 turbulentTemperatureRadCoupledMixedFvPatchScalarField - ( - *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/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H b/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H index 2458d1d400c..785aa25ccaf 100644 --- a/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H +++ b/src/dynamicMesh/motionSolvers/displacement/interpolation/displacementInterpolationMotionSolver.H @@ -25,7 +25,7 @@ Class Foam::displacementInterpolationMotionSolver Group - grpMeshMotionSolvers + grpMeshMotionSolvers Description Mesh motion solver for an fvMesh. diff --git a/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H b/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H index 07444532f4f..4975d8c875a 100644 --- a/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H +++ b/src/dynamicMesh/motionSolvers/displacement/layeredSolver/displacementLayeredMotionMotionSolver.H @@ -25,7 +25,7 @@ Class Foam::displacementLayeredMotionMotionSolver Group - grpMeshMotionSolvers + grpMeshMotionSolvers Description Mesh motion solver for an (multi-block) extruded fvMesh. Gets given the diff --git a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H index 20d87b8e866..5523ef2eac7 100644 --- a/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/basic/coupled/coupledFvPatchField.H @@ -207,6 +207,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction, @@ -217,6 +218,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C index db36178e73e..9a6dc99faac 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.C @@ -173,6 +173,7 @@ template<class Type> void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -188,12 +189,7 @@ void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix transformCoupleField(pnf, cmpt); // Multiply the field by coefficients and add into the result - const labelUList& faceCells = cyclicPatch_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } @@ -201,6 +197,7 @@ template<class Type> void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes @@ -215,12 +212,7 @@ void Foam::cyclicFvPatchField<Type>::updateInterfaceMatrix transformCoupleField(pnf); // Multiply the field by coefficients and add into the result - const labelUList& faceCells = cyclicPatch_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H index 8122c211390..cd2d5695a44 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H @@ -178,6 +178,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -188,6 +189,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes commsType diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C index 124c42fb87e..912c44173d7 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C @@ -195,6 +195,7 @@ template<class Type> void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -213,14 +214,9 @@ void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix // Transform according to the transformation tensors transformCoupleField(pnf, cmpt); - const labelUList& faceCells = cyclicACMIPatch_.faceCells(); - pnf = cyclicACMIPatch_.interpolate(pnf); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } @@ -228,6 +224,7 @@ template<class Type> void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes @@ -244,14 +241,9 @@ void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix // Transform according to the transformation tensors transformCoupleField(pnf); - const labelUList& faceCells = cyclicACMIPatch_.faceCells(); - pnf = cyclicACMIPatch_.interpolate(pnf); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H index ebb2fb8cbd2..0ae3c6b0148 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H @@ -202,6 +202,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -212,6 +213,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C index 50f0b559383..5bbce362be8 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C @@ -179,6 +179,7 @@ template<class Type> void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -204,12 +205,7 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix } // Multiply the field by coefficients and add into the result - const labelUList& faceCells = cyclicAMIPatch_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } @@ -217,6 +213,7 @@ template<class Type> void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes @@ -241,12 +238,7 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix } // Multiply the field by coefficients and add into the result - const labelUList& faceCells = cyclicAMIPatch_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H index 7ad7bddbb40..d25f2812b2c 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.H @@ -183,6 +183,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -193,6 +194,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C index 36705e2111c..577f42ee22b 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.C @@ -132,6 +132,7 @@ template<class Type> void Foam::jumpCyclicFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -146,6 +147,7 @@ template<class Type> void Foam::jumpCyclicFvPatchField<Type>::updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes @@ -183,11 +185,7 @@ void Foam::jumpCyclicFvPatchField<Type>::updateInterfaceMatrix this->transformCoupleField(pnf); // Multiply the field by coefficients and add into the result - const labelUList& faceCells = this->cyclicPatch().faceCells(); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H index 2456df9bbaa..36ebce07684 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H @@ -128,6 +128,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -138,6 +139,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType @@ -149,6 +151,7 @@ template<> void jumpCyclicFvPatchField<scalar>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C index fc620604db9..f4d7d53342c 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C @@ -40,6 +40,7 @@ template<> void Foam::jumpCyclicFvPatchField<Foam::scalar>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -78,11 +79,7 @@ void Foam::jumpCyclicFvPatchField<Foam::scalar>::updateInterfaceMatrix this->transformCoupleField(pnf, cmpt); // Multiply the field by coefficients and add into the result - const labelUList& faceCells = this->cyclicPatch().faceCells(); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C index e22390f84a2..d4facb129b0 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.C @@ -134,6 +134,7 @@ template<class Type> void Foam::jumpCyclicAMIFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -148,6 +149,7 @@ template<class Type> void Foam::jumpCyclicAMIFvPatchField<Type>::updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes @@ -189,11 +191,7 @@ void Foam::jumpCyclicAMIFvPatchField<Type>::updateInterfaceMatrix this->transformCoupleField(pnf); // Multiply the field by coefficients and add into the result - const labelUList& faceCells = this->cyclicAMIPatch().faceCells(); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H index 0815af948f1..7ea5016bf39 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchField.H @@ -131,6 +131,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -141,6 +142,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>&, + const bool add, const Field<Type>&, const scalarField&, const Pstream::commsTypes commsType @@ -153,6 +155,7 @@ template<> void jumpCyclicAMIFvPatchField<scalar>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C index c567c400623..f1d54c74886 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclicAMI/jumpCyclicAMIFvPatchFields.C @@ -42,6 +42,7 @@ template<> void Foam::jumpCyclicAMIFvPatchField<scalar>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -72,11 +73,7 @@ void Foam::jumpCyclicAMIFvPatchField<scalar>::updateInterfaceMatrix this->transformCoupleField(pnf, cmpt); // Multiply the field by coefficients and add into the result - const labelUList& faceCells = this->cyclicAMIPatch().faceCells(); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C index 39b92ea77cd..fee3226ea83 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.C @@ -318,6 +318,7 @@ template<class Type> void Foam::processorFvPatchField<Type>::initInterfaceMatrixUpdate ( scalarField&, + const bool add, const scalarField& psiInternal, const scalarField&, const direction, @@ -378,6 +379,7 @@ template<class Type> void Foam::processorFvPatchField<Type>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField&, const scalarField& coeffs, const direction cmpt, @@ -389,8 +391,6 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix return; } - const labelUList& faceCells = this->patch().faceCells(); - if ( commsType == Pstream::commsTypes::nonBlocking @@ -416,10 +416,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix transformCoupleField(scalarReceiveBuf_, cmpt); // Multiply the field by coefficients and add into the result - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI]; - } + this->addToInternalField(result, !add, coeffs, scalarReceiveBuf_); } else { @@ -432,10 +429,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix transformCoupleField(pnf, cmpt); // Multiply the field by coefficients and add into the result - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } const_cast<processorFvPatchField<Type>&>(*this).updatedMatrix() = true; @@ -446,6 +440,7 @@ template<class Type> void Foam::processorFvPatchField<Type>::initInterfaceMatrixUpdate ( Field<Type>&, + const bool add, const Field<Type>& psiInternal, const scalarField&, const Pstream::commsTypes commsType @@ -505,6 +500,7 @@ template<class Type> void Foam::processorFvPatchField<Type>::updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>&, const scalarField& coeffs, const Pstream::commsTypes commsType @@ -515,8 +511,6 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix return; } - const labelUList& faceCells = this->patch().faceCells(); - if ( commsType == Pstream::commsTypes::nonBlocking @@ -542,10 +536,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix transformCoupleField(receiveBuf_); // Multiply the field by coefficients and add into the result - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*receiveBuf_[elemI]; - } + this->addToInternalField(result, !add, coeffs, receiveBuf_); } else { @@ -558,10 +549,7 @@ void Foam::processorFvPatchField<Type>::updateInterfaceMatrix transformCoupleField(pnf); // Multiply the field by coefficients and add into the result - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } const_cast<processorFvPatchField<Type>&>(*this).updatedMatrix() = true; diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H index bfe1b75708a..11013c88245 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchField.H @@ -209,6 +209,7 @@ public: virtual void initInterfaceMatrixUpdate ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -219,6 +220,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -229,6 +231,7 @@ public: virtual void initInterfaceMatrixUpdate ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes commsType @@ -238,6 +241,7 @@ public: virtual void updateInterfaceMatrix ( Field<Type>& result, + const bool add, const Field<Type>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes commsType diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C index 53ebbb18e2e..85507d00804 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.C @@ -36,6 +36,7 @@ template<> void processorFvPatchField<scalar>::initInterfaceMatrixUpdate ( scalarField&, + const bool add, const scalarField& psiInternal, const scalarField&, const direction, @@ -96,6 +97,7 @@ template<> void processorFvPatchField<scalar>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField&, const scalarField& coeffs, const direction, @@ -107,8 +109,6 @@ void processorFvPatchField<scalar>::updateInterfaceMatrix return; } - const labelUList& faceCells = this->patch().faceCells(); - if ( commsType == Pstream::commsTypes::nonBlocking @@ -130,10 +130,7 @@ void processorFvPatchField<scalar>::updateInterfaceMatrix // Consume straight from scalarReceiveBuf_ - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*scalarReceiveBuf_[elemI]; - } + this->addToInternalField(result, !add, coeffs, scalarReceiveBuf_); } else { @@ -142,10 +139,7 @@ void processorFvPatchField<scalar>::updateInterfaceMatrix procPatch_.compressedReceive<scalar>(commsType, this->size())() ); - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } const_cast<processorFvPatchField<scalar>&>(*this).updatedMatrix() = true; diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H index a8bbb24dcb5..0328ef2797b 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/processor/processorFvPatchScalarField.H @@ -39,6 +39,7 @@ template<> void processorFvPatchField<scalar>::initInterfaceMatrixUpdate ( scalarField&, + const bool add, const scalarField&, const scalarField&, const direction, @@ -50,6 +51,7 @@ template<> void processorFvPatchField<scalar>::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField&, const scalarField& coeffs, const direction, diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C index db21f33d451..81ff46caa2e 100644 --- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C +++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -507,6 +507,32 @@ void Foam::fvMatrix<Type>::setReference } +template<class Type> +void Foam::fvMatrix<Type>::setReferences +( + const labelList& cellLabels, + const UList<Type>& values, + const bool forceReference +) +{ + bool needRef = (forceReference || psi_.needReference()); + + if (needRef) + { + forAll(cellLabels, celli) + { + label cellId = cellLabels[celli]; + if (celli >= 0) + { + source()[cellId] += diag()[cellId]*values[celli]; + diag()[cellId] += diag()[cellId]; + } + } + } +} + + + template<class Type> void Foam::fvMatrix<Type>::relax(const scalar alpha) { @@ -947,6 +973,20 @@ flux() const } +template<class Type> +const Foam::dictionary& Foam::fvMatrix<Type>::solverDict() const +{ + return psi_.mesh().solverDict + ( + psi_.select + ( + psi_.mesh().data::template lookupOrDefault<bool> + ("finalIteration", false) + ) + ); +} + + // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // template<class Type> diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H index 590c3e324e1..cb843f24fd4 100644 --- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H +++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -299,6 +299,13 @@ public: return source_; } + //- fvBoundary scalar field containing pseudo-matrix coeffs + // for internal cells + const FieldField<Field, Type>& internalCoeffs() const + { + return internalCoeffs_; + } + //- fvBoundary scalar field containing pseudo-matrix coeffs // for internal cells FieldField<Field, Type>& internalCoeffs() @@ -306,6 +313,13 @@ public: return internalCoeffs_; } + //- fvBoundary scalar field containing pseudo-matrix coeffs + // for boundary cells + const FieldField<Field, Type>& boundaryCoeffs() const + { + return boundaryCoeffs_; + } + //- fvBoundary scalar field containing pseudo-matrix coeffs // for boundary cells FieldField<Field, Type>& boundaryCoeffs() @@ -351,6 +365,14 @@ public: const bool forceReference = false ); + //- Set references level for solution + void setReferences + ( + const labelList& cells, + const UList<Type>& values, + const bool forceReference = false + ); + //- Set reference level for a component of the solution // on a given patch face void setComponentReference @@ -389,7 +411,7 @@ public: //- Solve segregated or coupled returning the solution statistics. // Use the given solver controls - SolverPerformance<Type> solve(const dictionary&); + SolverPerformance<Type> solveSegregatedOrCoupled(const dictionary&); //- Solve segregated returning the solution statistics. // Use the given solver controls @@ -399,6 +421,10 @@ public: // Use the given solver controls SolverPerformance<Type> solveCoupled(const dictionary&); + //- Solve returning the solution statistics. + // Use the given solver controls + SolverPerformance<Type> solve(const dictionary&); + //- Solve returning the solution statistics. // Solver controls read from fvSolution SolverPerformance<Type> solve(); @@ -425,6 +451,9 @@ public: tmp<GeometricField<Type, fvsPatchField, surfaceMesh>> flux() const; + //- Return the solver dictionary taking into account finalIteration + const dictionary& solverDict() const; + // Member operators diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C index 253d344a965..5eb6ead4498 100644 --- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C +++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrixSolve.C @@ -54,7 +54,7 @@ void Foam::fvMatrix<Type>::setComponentReference template<class Type> -Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve +Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregatedOrCoupled ( const dictionary& solverControls ) @@ -69,7 +69,8 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve if (debug) { Info.masterStream(this->mesh().comm()) - << "fvMatrix<Type>::solve(const dictionary& solverControls) : " + << "fvMatrix<Type>::solveSegregatedOrCoupled" + "(const dictionary& solverControls) : " "solving fvMatrix<Type>" << endl; } @@ -174,6 +175,7 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregated // conditions initMatrixInterfaces ( + true, bouCoeffsCmpt, interfaces, psiCmpt, @@ -183,6 +185,7 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregated updateMatrixInterfaces ( + true, bouCoeffsCmpt, interfaces, psiCmpt, @@ -283,55 +286,35 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveCoupled } +template<class Type> +Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve +( + const dictionary& solverControls +) +{ + return psi_.mesh().solve(*this, solverControls); +} + + template<class Type> Foam::autoPtr<typename Foam::fvMatrix<Type>::fvSolver> Foam::fvMatrix<Type>::solver() { - return solver - ( - psi_.mesh().solverDict - ( - psi_.select - ( - psi_.mesh().data::template lookupOrDefault<bool> - ("finalIteration", false) - ) - ) - ); + return solver(solverDict()); } template<class Type> Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::fvSolver::solve() { - return solve - ( - fvMat_.psi_.mesh().solverDict - ( - fvMat_.psi_.select - ( - fvMat_.psi_.mesh().data::template lookupOrDefault<bool> - ("finalIteration", false) - ) - ) - ); + return solve(fvMat_.solverDict()); } template<class Type> Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solve() { - return solve - ( - psi_.mesh().solverDict - ( - psi_.select - ( - psi_.mesh().data::template lookupOrDefault<bool> - ("finalIteration", false) - ) - ) - ); + return this->solve(solverDict()); } diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C index 6b071d91319..2c667ac6195 100644 --- a/src/finiteVolume/fvMesh/fvMesh.C +++ b/src/finiteVolume/fvMesh/fvMesh.C @@ -3,6 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -36,6 +37,7 @@ License #include "fvMeshMapper.H" #include "mapClouds.H" #include "MeshObject.H" +#include "fvMatrix.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -408,6 +410,50 @@ Foam::fvMesh::~fvMesh() // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +Foam::SolverPerformance<Foam::scalar> Foam::fvMesh::solve +( + fvMatrix<scalar>& m, + const dictionary& dict +) const +{ + // Redirect to fvMatrix solver + return m.solveSegregatedOrCoupled(dict); +} + + +Foam::SolverPerformance<Foam::vector> Foam::fvMesh::solve +( + fvMatrix<vector>& m, + const dictionary& dict +) const +{ + // Redirect to fvMatrix solver + return m.solveSegregatedOrCoupled(dict); +} + + +Foam::SolverPerformance<Foam::symmTensor> Foam::fvMesh::solve +( + fvMatrix<symmTensor>& m, + const dictionary& dict +) const +{ + // Redirect to fvMatrix solver + return m.solveSegregatedOrCoupled(dict); +} + + +Foam::SolverPerformance<Foam::tensor> Foam::fvMesh::solve +( + fvMatrix<tensor>& m, + const dictionary& dict +) const +{ + // Redirect to fvMatrix solver + return m.solveSegregatedOrCoupled(dict); +} + + void Foam::fvMesh::addFvPatches ( const List<polyPatch*> & p, diff --git a/src/finiteVolume/fvMesh/fvMesh.H b/src/finiteVolume/fvMesh/fvMesh.H index 94a6f68f21d..6132523c6ce 100644 --- a/src/finiteVolume/fvMesh/fvMesh.H +++ b/src/finiteVolume/fvMesh/fvMesh.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -62,6 +62,7 @@ SourceFiles #include "slicedVolFieldsFwd.H" #include "slicedSurfaceFieldsFwd.H" #include "className.H" +#include "SolverPerformance.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -70,6 +71,8 @@ namespace Foam class fvMeshLduAddressing; class volMesh; +template<class Type> +class fvMatrix; /*---------------------------------------------------------------------------*\ @@ -265,16 +268,93 @@ public: return polyMesh::comm(); } - //- Internal face owner + + // Overlap + + //- Interpolate interpolationCells only + virtual void interpolate(volScalarField&) const + {} + + //- Interpolate interpolationCells only + virtual void interpolate(volVectorField&) const + {} + + //- Interpolate interpolationCells only + virtual void interpolate(volSphericalTensorField&) const + {} + + //- Interpolate interpolationCells only + virtual void interpolate(volSymmTensorField&) const + {} + + //- Interpolate interpolationCells only + virtual void interpolate(volTensorField&) const + {} + + //- Interpolate interpolationCells only. No bcs. + virtual void interpolate(scalarField&) const + {} + + //- Interpolate interpolationCells only. No bcs. + virtual void interpolate(vectorField&) const + {} + + //- Interpolate interpolationCells only. No bcs. + virtual void interpolate(sphericalTensorField&) const + {} + + //- Interpolate interpolationCells only. No bcs. + virtual void interpolate(symmTensorField&) const + {} + + //- Interpolate interpolationCells only. No bcs. + virtual void interpolate(tensorField&) const + {} + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<scalar> solve + ( + fvMatrix<scalar>&, + const dictionary& + ) const; + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<vector> solve + ( + fvMatrix<vector>&, + const dictionary& + ) const; + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<symmTensor> solve + ( + fvMatrix<symmTensor>&, + const dictionary& + ) const; + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<tensor> solve + ( + fvMatrix<tensor>&, + const dictionary& + ) const; + + + //- Internal face owner. Note bypassing virtual mechanism so + // e.g. relaxation always gets done using original addressing const labelUList& owner() const { - return lduAddr().lowerAddr(); + return fvMesh::lduAddr().lowerAddr(); } //- Internal face neighbour const labelUList& neighbour() const { - return lduAddr().upperAddr(); + return fvMesh::lduAddr().upperAddr(); } //- Return cell volumes diff --git a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C index fa3d382d66d..7dd34b9343e 100644 --- a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C +++ b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/Poisson/PoissonPatchDistMethod.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2015-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -103,6 +103,15 @@ bool Foam::patchDistMethods::Poisson::correct y = sqrt(magSqr(gradyPsi) + 2*yPsi) - magGradyPsi; + // Need to stabilise the y for overset meshes since the holed cells + // keep the initial value (0.0) so the gradient of that will be + // zero as well. Turbulence models do not like zero wall distance. + y.max(SMALL); + + // For overset: enforce smooth y field (yPsi is smooth, magGradyPsi is + // not) + mesh_.interpolate(y); + // Cache yPsi if the mesh is moving otherwise delete if (!mesh_.changing()) { @@ -118,7 +127,11 @@ bool Foam::patchDistMethods::Poisson::correct ( magGradyPsi, dimensionedScalar("smallMagGradyPsi", dimLength, SMALL) + ); + + // For overset: enforce smooth field + mesh_.interpolate(n); } return true; diff --git a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C index 9e0826340a1..99820db026f 100644 --- a/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C +++ b/src/finiteVolume/fvMesh/wallDist/patchDistMethods/advectionDiffusion/advectionDiffusionPatchDistMethod.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2015-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -145,6 +145,11 @@ bool Foam::patchDistMethods::advectionDiffusion::correct } while (initialResidual > tolerance_ && ++iter < maxIter_); + // Need to stabilise the y for overset meshes since the holed cells + // keep the initial value (0.0) so the gradient of that will be + // zero as well. Turbulence models do not like zero wall distance. + y.max(SMALL); + // Only calculate n if the field is defined if (notNull(n)) { diff --git a/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C index a8c37d2c304..0ac6e22f1a7 100644 --- a/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/componentDisplacement/componentLaplacian/displacementComponentLaplacianFvMotionSolver.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -231,7 +231,9 @@ void Foam::displacementComponentLaplacianFvMotionSolver::solve() diffusivityPtr_->correct(); pointDisplacement_.boundaryFieldRef().updateCoeffs(); - Foam::solve + // We explicitly do NOT want to interpolate the motion inbetween + // different regions so bypass all the matrix manipulation. + fvScalarMatrix TEqn ( fvm::laplacian ( @@ -240,6 +242,8 @@ void Foam::displacementComponentLaplacianFvMotionSolver::solve() "laplacian(diffusivity,cellDisplacement)" ) ); + + TEqn.solveSegregatedOrCoupled(TEqn.solverDict()); } diff --git a/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C index 6facb081384..3f16a8eb87e 100644 --- a/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/componentVelocity/componentLaplacian/velocityComponentLaplacianFvMotionSolver.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -129,7 +129,9 @@ void Foam::velocityComponentLaplacianFvMotionSolver::solve() diffusivityPtr_->correct(); pointMotionU_.boundaryFieldRef().updateCoeffs(); - Foam::solve + // We explicitly do NOT want to interpolate the motion inbetween + // different regions so bypass all the matrix manipulation. + fvScalarMatrix TEqn ( fvm::laplacian ( @@ -138,6 +140,8 @@ void Foam::velocityComponentLaplacianFvMotionSolver::solve() "laplacian(diffusivity,cellMotionU)" ) ); + + TEqn.solveSegregatedOrCoupled(TEqn.solverDict()); } diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C index 2bed22c26cc..8a131674e9b 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/SBRStress/displacementSBRStressFvMotionSolver.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -186,7 +186,7 @@ void Foam::displacementSBRStressFvMotionSolver::solve() volTensorField gradCd("gradCd", fvc::grad(cellDisplacement_)); - Foam::solve + fvVectorMatrix TEqn ( fvm::laplacian ( @@ -234,6 +234,8 @@ void Foam::displacementSBRStressFvMotionSolver::solve() ) */ ); + + TEqn.solveSegregatedOrCoupled(TEqn.solverDict()); } diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C index 85c12013648..fc35fa61662 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/laplacian/displacementLaplacianFvMotionSolver.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -332,7 +332,9 @@ void Foam::displacementLaplacianFvMotionSolver::solve() diffusivity().correct(); pointDisplacement_.boundaryFieldRef().updateCoeffs(); - Foam::solve + // We explicitly do NOT want to interpolate the motion inbetween + // different regions so bypass all the matrix manipulation. + fvVectorMatrix TEqn ( fvm::laplacian ( @@ -341,6 +343,8 @@ void Foam::displacementLaplacianFvMotionSolver::solve() "laplacian(diffusivity,cellDisplacement)" ) ); + + TEqn.solveSegregatedOrCoupled(TEqn.solverDict()); } diff --git a/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C index 6294da02a18..3c39edb7b51 100644 --- a/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/displacement/surfaceAlignedSBRStress/surfaceAlignedSBRStressFvMotionSolver.C @@ -409,7 +409,8 @@ void Foam::surfaceAlignedSBRStressFvMotionSolver::solve() fvc::div(sigmaD_) ); - DEqn.solve(); + // Note: solve uncoupled + DEqn.solveSegregatedOrCoupled(DEqn.solverDict()); } } diff --git a/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C b/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C index 46e7f34e2d7..2a5bd14fcd0 100644 --- a/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C +++ b/src/fvMotionSolver/fvMotionSolvers/velocity/laplacian/velocityLaplacianFvMotionSolver.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -124,7 +124,7 @@ void Foam::velocityLaplacianFvMotionSolver::solve() diffusivityPtr_->correct(); pointMotionU_.boundaryFieldRef().updateCoeffs(); - Foam::solve + fvVectorMatrix UEqn ( fvm::laplacian ( @@ -133,6 +133,8 @@ void Foam::velocityLaplacianFvMotionSolver::solve() "laplacian(diffusivity,cellMotionU)" ) ); + + UEqn.solveSegregatedOrCoupled(UEqn.solverDict()); } diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C index 4963d926cd5..772799af49b 100644 --- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C +++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C @@ -93,6 +93,7 @@ Foam::cyclicACMIGAMGInterfaceField::~cyclicACMIGAMGInterfaceField() void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -117,12 +118,7 @@ void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix pnf = cyclicACMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf); } - const labelUList& faceCells = cyclicACMIInterface_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H index e06d76328d9..a2f4dc8aec4 100644 --- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H +++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.H @@ -120,6 +120,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C index 1cb34ad7920..7f6034a2268 100644 --- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C +++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C @@ -93,6 +93,7 @@ Foam::cyclicAMIGAMGInterfaceField::~cyclicAMIGAMGInterfaceField() void Foam::cyclicAMIGAMGInterfaceField::updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -117,12 +118,7 @@ void Foam::cyclicAMIGAMGInterfaceField::updateInterfaceMatrix pnf = cyclicAMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf); } - const labelUList& faceCells = cyclicAMIInterface_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; - } + this->addToInternalField(result, !add, coeffs, pnf); } diff --git a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H index 868e2cc47b2..7f1aa72acde 100644 --- a/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H +++ b/src/meshTools/AMIInterpolation/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.H @@ -119,6 +119,7 @@ public: virtual void updateInterfaceMatrix ( scalarField& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, diff --git a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H index 5b26ddc2a75..6701e2b7bc5 100644 --- a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H +++ b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledGAMGInterfaceField.H @@ -112,6 +112,7 @@ public: virtual void updateInterfaceMatrix ( scalarField&, + const bool add, const scalarField&, const scalarField&, const direction, diff --git a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H index 8bcdd2e1147..ca8c0b9b68f 100644 --- a/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H +++ b/src/meshTools/regionCoupled/GAMG/interfaceFields/regionCoupledGAMGInterfaceField/regionCoupledWallGAMGInterfaceField.H @@ -113,6 +113,7 @@ public: virtual void updateInterfaceMatrix ( scalarField&, + const bool add, const scalarField&, const scalarField&, const direction, diff --git a/src/overset/Make/files b/src/overset/Make/files new file mode 100644 index 00000000000..a285c4979cc --- /dev/null +++ b/src/overset/Make/files @@ -0,0 +1,31 @@ +cellCellStencil/cellCellStencil/cellCellStencil.C +cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C +cellCellStencil/cellCellStencil/cellCellStencilObject.C +cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C +cellCellStencil/inverseDistance/waveMethod.C +cellCellStencil/inverseDistance/meshToMeshData.C +cellCellStencil/trackingInverseDistance/voxelMeshSearch.C +cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C + +dynamicOversetFvMesh/dynamicOversetFvMesh.C + +fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C + +oversetPolyPatch/oversetPolyPatch.C +oversetPolyPatch/oversetLduInterface.C +oversetPolyPatch/oversetFvPatch.C +oversetPolyPatch/oversetFvPatchFields.C +oversetPolyPatch/oversetFvsPatchFields.C +oversetPolyPatch/oversetGAMGInterface.C +oversetPolyPatch/oversetGAMGInterfaceField.C +oversetPolyPatch/oversetPointPatch.C +oversetPolyPatch/oversetPointPatchFields.C + +oversetAdjustPhi/oversetAdjustPhi.C + +regionsToCell/regionsToCell.C + +lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C + + +LIB = $(FOAM_LIBBIN)/liboverset diff --git a/src/overset/Make/options b/src/overset/Make/options new file mode 100644 index 00000000000..ae7529a2277 --- /dev/null +++ b/src/overset/Make/options @@ -0,0 +1,15 @@ +EXE_INC = \ + /* -DFULLDEBUG -O0 -g */ \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/surfMesh/lnInclude \ + -I$(LIB_SRC)/sampling/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/dynamicFvMesh/lnInclude \ + -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude + +LIB_LIBS = \ + -ldynamicFvMesh \ + -lsampling \ + -ldecompositionMethods diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C new file mode 100644 index 00000000000..9ef72576fae --- /dev/null +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C @@ -0,0 +1,276 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify i + 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 "cellCellStencil.H" +#include "addToRunTimeSelectionTable.H" +#include "volFields.H" +#include "syncTools.H" +#include "globalIndex.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(cellCellStencil, 0); + defineRunTimeSelectionTable(cellCellStencil, mesh); + + template<> + const char* NamedEnum + < + cellCellStencil::cellType, + 3 + >::names[] = + { + "calculated", + "interpolated", + "hole" + }; +} + +const Foam::NamedEnum<Foam::cellCellStencil::cellType, 3> +Foam::cellCellStencil::cellTypeNames_; + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellCellStencil::cellCellStencil(const fvMesh& mesh) +: + mesh_(mesh) +{} + + +Foam::autoPtr<Foam::cellCellStencil> Foam::cellCellStencil::New +( + const fvMesh& mesh, + const dictionary& dict +) +{ + if (debug) + { + InfoInFunction << "Constructing cellCellStencil" << endl; + } + + word type(dict.lookup("method")); + + + meshConstructorTable::iterator cstrIter = + meshConstructorTablePtr_->find(type); + + if (cstrIter == meshConstructorTablePtr_->end()) + { + FatalErrorInFunction + << "Unknown cellCellStencil type " + << type << nl << nl + << "Valid cellCellStencil types are" << endl + << meshConstructorTablePtr_->sortedToc() + << abort(FatalError); + } + + return autoPtr<cellCellStencil>(cstrIter()(mesh, dict, true)); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellCellStencil::~cellCellStencil() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::labelIOList& Foam::cellCellStencil::zoneID() const +{ + if (!mesh_.foundObject<labelIOList>("zoneID")) + { + labelIOList* zoneIDPtr = new labelIOList + ( + IOobject + ( + "zoneID", + mesh_.facesInstance(), + polyMesh::meshSubDir, + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_.nCells() + ); + labelIOList& zoneID = *zoneIDPtr; + + volScalarField volZoneID + ( + IOobject + ( + "zoneID", + mesh_.time().findInstance(mesh_.dbDir(), "zoneID"), + mesh_, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ), + mesh_ + ); + forAll(volZoneID, cellI) + { + zoneID[cellI] = label(volZoneID[cellI]); + } + + zoneIDPtr->store(); + } + return mesh_.lookupObject<labelIOList>("zoneID"); +} + + +Foam::labelList Foam::cellCellStencil::count +( + const label size, + const labelUList& lst +) +{ + labelList count(size, 0); + forAll(lst, i) + { + count[lst[i]]++; + } + Pstream::listCombineGather(count, plusEqOp<label>()); + return count; +} + + +bool Foam::cellCellStencil::localStencil(const labelUList& slots) const +{ + forAll(slots, i) + { + if (slots[i] >= mesh_.nCells()) + { + return false; + } + } + return true; +} + + +void Foam::cellCellStencil::globalCellCells +( + const globalIndex& gi, + const polyMesh& mesh, + const labelList& selectedCells, + labelListList& cellCells, + pointListList& cellCellCentres +) +{ + // For selected cells determine the face neighbours (in global numbering) + + const pointField& cellCentres = mesh.cellCentres(); + const labelList& faceOwner = mesh.faceOwner(); + const labelList& faceNeighbour = mesh.faceNeighbour(); + const cellList& cells = mesh.cells(); + + + // 1. Determine global cell number on other side of coupled patches + + labelList globalCellIDs(mesh.nCells()); + forAll(globalCellIDs, celli) + { + globalCellIDs[celli] = gi.toGlobal(celli); + } + + labelList nbrGlobalCellIDs; + syncTools::swapBoundaryCellList + ( + mesh, + globalCellIDs, + nbrGlobalCellIDs + ); + pointField nbrCellCentres; + syncTools::swapBoundaryCellList + ( + mesh, + cellCentres, + nbrCellCentres + ); + + + // 2. Collect cell and all its neighbours + + cellCells.setSize(mesh.nCells()); + cellCellCentres.setSize(cellCells.size()); + + forAll(selectedCells, i) + { + label celli = selectedCells[i]; + + const cell& cFaces = cells[celli]; + labelList& stencil = cellCells[celli]; + pointList& stencilPoints = cellCellCentres[celli]; + stencil.setSize(cFaces.size()+1); + stencilPoints.setSize(stencil.size()); + label compacti = 0; + + // First entry is cell itself + stencil[compacti] = globalCellIDs[celli]; + stencilPoints[compacti++] = cellCentres[celli]; + + // Other entries are cell neighbours + forAll(cFaces, i) + { + label facei = cFaces[i]; + label bFacei = facei-mesh.nInternalFaces(); + label own = faceOwner[facei]; + label nbrCelli; + point nbrCc; + if (bFacei >= 0) + { + nbrCelli = nbrGlobalCellIDs[bFacei]; + nbrCc = nbrCellCentres[bFacei]; + } + else + { + if (own != celli) + { + nbrCelli = gi.toGlobal(own); + nbrCc = cellCentres[own]; + } + else + { + label nei = faceNeighbour[facei]; + nbrCelli = gi.toGlobal(nei); + nbrCc = cellCentres[nei]; + } + } + + SubList<label> current(stencil, compacti); + if (findIndex(current, nbrCelli) == -1) + { + stencil[compacti] = nbrCelli; + stencilPoints[compacti++] = nbrCc; + } + } + stencil.setSize(compacti); + stencilPoints.setSize(compacti); + } +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H new file mode 100644 index 00000000000..327bce87cf3 --- /dev/null +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H @@ -0,0 +1,198 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::cellCellStencil + +Description + Calculation of interpolation stencils. + + Looks up zoneID labelIOList to give the zoning. Wrapped in + MeshObject as cellCellStencilObject. Kept separate so meshes can + implement more clever methods (e.g. solid body motion does not require + full recalculation) + +SourceFiles + cellCellStencil.C + cellCellStencilObject.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellCellStencil_H +#define cellCellStencil_H + +#include "scalarList.H" +#include "mapDistribute.H" +#include "fvMesh.H" +#include "pointList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class mapDistribute; + +/*---------------------------------------------------------------------------*\ + Class cellCellStencil Declaration +\*---------------------------------------------------------------------------*/ + +class cellCellStencil +{ +public: + + enum patchCellType + { + OTHER = 0, // not on special patch + PATCH = 1, // next to (non-coupled) boundary + OVERSET = 2 // next to 'overset' boundary + }; + + enum cellType + { + CALCULATED = 0, // normal operation + INTERPOLATED = 1, // interpolated + HOLE = 2 // hole + }; + + +protected: + + // Protected data + + //- Mode type names + static const NamedEnum<cellType, 3> cellTypeNames_; + + //- Reference to the mesh + const fvMesh& mesh_; + + + // Protected Member Functions + + //- Count ocurrences (in parallel) + static labelList count(const label size, const labelUList& lst); + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellCellStencil(const cellCellStencil&); + + //- Disallow default bitwise assignment + void operator=(const cellCellStencil&); + + +public: + + //- Runtime type information + TypeName("cellCellStencil"); + + + // Declare run-time constructor selection tables + + declareRunTimeSelectionTable + ( + autoPtr, + cellCellStencil, + mesh, + ( + const fvMesh& mesh, + const dictionary& dict, + const bool update + ), + (mesh, dict, update) + ); + + + // Constructors + + //- Construct from fvMesh + cellCellStencil(const fvMesh&); + + //- New function which constructs and returns pointer to a + // cellCellStencil + static autoPtr<cellCellStencil> New + ( + const fvMesh&, + const dictionary& dict + ); + + + //- Destructor + virtual ~cellCellStencil(); + + + // Member Functions + + //- Update stencils. Return false if nothing changed. + virtual bool update() = 0; + + //- Return the cell type list + virtual const labelUList& cellTypes() const = 0; + + //- Indices of interpolated cells + virtual const labelUList& interpolationCells() const = 0; + + //- Return a communication schedule + virtual const mapDistribute& cellInterpolationMap() const = 0; + + //- Per interpolated cell the neighbour cells (in terms of slots as + // constructed by above cellInterpolationMap) to interpolate + virtual const labelListList& cellStencil() const = 0; + + //- Weights for cellStencil + virtual const List<scalarList>& cellInterpolationWeights() const = 0; + + //- Per interpolated cell the interpolation factor. (0 = use + // calculated, 1 = use interpolated) + virtual const scalarList& cellInterpolationWeight() const = 0; + + //- Helper: is stencil fully local + bool localStencil(const labelUList&) const; + + //- Helper: get reference to registered zoneID. Loads volScalarField + // if not registered. + const labelIOList& zoneID() const; + + //- Helper: create cell-cell addressing in global numbering + static void globalCellCells + ( + const globalIndex& gi, + const polyMesh& mesh, + const labelList& selectedCells, + labelListList& cellCells, + pointListList& cellCellCentres + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C new file mode 100644 index 00000000000..026c4903c55 --- /dev/null +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.C @@ -0,0 +1,37 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "cellCellStencilObject.H" + + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(cellCellStencilObject, 0); +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H new file mode 100644 index 00000000000..2a0e3ca15df --- /dev/null +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilObject.H @@ -0,0 +1,168 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::cellCellStencilObject + +Description + +SourceFiles + +\*---------------------------------------------------------------------------*/ + +#ifndef cellCellStencilObject_H +#define cellCellStencilObject_H + +#include "cellCellStencil.H" +#include "MeshObject.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class cellCellStencilObject; +typedef MeshObject +< + fvMesh, + Foam::MoveableMeshObject, + cellCellStencilObject +> Stencil; + +/*---------------------------------------------------------------------------*\ + Class cellCellStencilObject Declaration +\*---------------------------------------------------------------------------*/ + +class cellCellStencilObject +: + public MeshObject + < + fvMesh, + MoveableMeshObject, + cellCellStencilObject + >, + public cellCellStencil +{ + // Private data + + autoPtr<cellCellStencil> stencilPtr_; + + +public: + + TypeName("cellCellStencilObject"); + + // Constructors + + //- Construct with mesh + explicit cellCellStencilObject(const fvMesh& mesh) + : + MeshObject + < + fvMesh, + Foam::MoveableMeshObject, + cellCellStencilObject + >(mesh), + cellCellStencil(mesh), + stencilPtr_ + ( + cellCellStencil::New + ( + mesh, + mesh.schemesDict().subDict + ( + "oversetInterpolation" + ) + ) + ) + {} + + + //- Destructor + virtual ~cellCellStencilObject() + {} + + + // Member Functions + + //- Callback for geometry motion + virtual bool movePoints() + { + return stencilPtr_().update(); + } + + //- Update stencils. Return false if nothing changed. + virtual bool update() + { + return stencilPtr_().update(); + } + + //- Return the cell type list + virtual const labelUList& cellTypes() const + { + return stencilPtr_().cellTypes(); + } + + //- Indices of interpolated cells + virtual const labelUList& interpolationCells() const + { + return stencilPtr_().interpolationCells(); + } + + //- Return a communication schedule + virtual const mapDistribute& cellInterpolationMap() const + { + return stencilPtr_().cellInterpolationMap(); + } + + //- Per interpolated cell the neighbour cells (in terms of slots as + // constructed by above cellInterpolationMap) to interpolate + virtual const labelListList& cellStencil() const + { + return stencilPtr_().cellStencil(); + } + + //- Weights for cellStencil + virtual const List<scalarList>& cellInterpolationWeights() const + { + return stencilPtr_().cellInterpolationWeights(); + } + + //- Per interpolated cell the interpolation factor. (0 = use + // calculated, 1 = use interpolated) + virtual const scalarList& cellInterpolationWeight() const + { + return stencilPtr_().cellInterpolationWeight(); + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C new file mode 100644 index 00000000000..9e7001454d1 --- /dev/null +++ b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C @@ -0,0 +1,1107 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify i + 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 "cellVolumeWeightCellCellStencil.H" +#include "addToRunTimeSelectionTable.H" +#include "OBJstream.H" +#include "Time.H" +#include "meshToMesh.H" +#include "cellVolumeWeightMethod.H" +#include "fvMeshSubset.H" +#include "regionSplit.H" +#include "globalIndex.H" +#include "oversetFvPatch.H" +#include "zeroGradientFvPatchFields.H" +#include "syncTools.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace cellCellStencils +{ + defineTypeNameAndDebug(cellVolumeWeight, 0); + addToRunTimeSelectionTable(cellCellStencil, cellVolumeWeight, mesh); +} +} + +Foam::scalar +Foam::cellCellStencils::cellVolumeWeight::defaultOverlapTolerance_ = 1e-3; + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::cellCellStencils::cellVolumeWeight::walkFront +( + const scalar layerRelax, + labelList& allCellTypes, + scalarField& allWeight +) const +{ + // Current front + PackedBoolList isFront(mesh_.nFaces()); + PackedBoolList doneCell(mesh_.nCells()); + + const fvBoundaryMesh& fvm = mesh_.boundary(); + + + // 'overset' patches + + forAll(fvm, patchI) + { + if (isA<oversetFvPatch>(fvm[patchI])) + { + Pout<< "Storing faces on patch " << fvm[patchI].name() << endl; + + forAll(fvm[patchI], i) + { + isFront[fvm[patchI].start()+i] = true; + } + } + } + + + // Outside of 'hole' region + { + const labelList& own = mesh_.faceOwner(); + const labelList& nei = mesh_.faceNeighbour(); + + for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++) + { + label ownType = allCellTypes[own[faceI]]; + label neiType = allCellTypes[nei[faceI]]; + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + //Pout<< "Front at face:" << faceI + // << " at:" << mesh_.faceCentres()[faceI] << endl; + isFront[faceI] = true; + } + } + + labelList nbrCellTypes; + syncTools::swapBoundaryCellList(mesh_, allCellTypes, nbrCellTypes); + + for + ( + label faceI = mesh_.nInternalFaces(); + faceI < mesh_.nFaces(); + faceI++ + ) + { + label ownType = allCellTypes[own[faceI]]; + label neiType = nbrCellTypes[faceI-mesh_.nInternalFaces()]; + + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + //Pout<< "Front at coupled face:" << faceI + // << " at:" << mesh_.faceCentres()[faceI] << endl; + isFront[faceI] = true; + } + } + } + + + + // Current interpolation fraction + scalar fraction = 1.0; + + while (fraction > SMALL && returnReduce(isFront.count(), sumOp<label>())) + { + // Interpolate cells on front + + Info<< "Front : fraction:" << fraction + << " size:" << returnReduce(isFront.count(), sumOp<label>()) + << endl; + + PackedBoolList newIsFront(mesh_.nFaces()); + forAll(isFront, faceI) + { + if (isFront[faceI]) + { + label own = mesh_.faceOwner()[faceI]; + if (allCellTypes[own] != HOLE) + { + if (allWeight[own] < fraction) + { + allWeight[own] = fraction; + + if (debug) + { + Pout<< " setting cell " + << mesh_.cellCentres()[own] + << " to " << fraction << endl; + } + allCellTypes[own] = INTERPOLATED; + newIsFront.set(mesh_.cells()[own]); + } + } + if (mesh_.isInternalFace(faceI)) + { + label nei = mesh_.faceNeighbour()[faceI]; + if (allCellTypes[nei] != HOLE) + { + if (allWeight[nei] < fraction) + { + allWeight[nei] = fraction; + + if (debug) + { + Pout<< " setting cell " + << mesh_.cellCentres()[nei] + << " to " << fraction << endl; + } + + allCellTypes[nei] = INTERPOLATED; + newIsFront.set(mesh_.cells()[nei]); + } + } + } + } + } + + syncTools::syncFaceList(mesh_, newIsFront, orEqOp<unsigned int>()); + + isFront.transfer(newIsFront); + + fraction -= layerRelax; + } +} + + +void Foam::cellCellStencils::cellVolumeWeight::findHoles +( + const globalIndex& globalCells, + const fvMesh& mesh, + const labelList& zoneID, + const labelListList& stencil, + labelList& cellTypes +) const +{ + const fvBoundaryMesh& pbm = mesh.boundary(); + const labelList& own = mesh.faceOwner(); + const labelList& nei = mesh.faceNeighbour(); + + + // The input cellTypes will be + // - HOLE : cell part covered by other-mesh patch + // - INTERPOLATED : cell fully covered by other-mesh patch + // or next to 'overset' patch + // - CALCULATED : otherwise + // + // so we start a walk from our patches and any cell we cannot reach + // (because we walk is stopped by other-mesh patch) is a hole. + + + boolList isBlockedFace(mesh.nFaces(), false); + for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) + { + label ownType = cellTypes[own[faceI]]; + label neiType = cellTypes[nei[faceI]]; + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + isBlockedFace[faceI] = true; + } + } + + labelList nbrCellTypes; + syncTools::swapBoundaryCellList(mesh, cellTypes, nbrCellTypes); + + for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++) + { + label ownType = cellTypes[own[faceI]]; + label neiType = nbrCellTypes[faceI-mesh.nInternalFaces()]; + + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + isBlockedFace[faceI] = true; + } + } + + regionSplit cellRegion(mesh, isBlockedFace); + + Info<< typeName << " : detected " << cellRegion.nRegions() + << " mesh regions after overset" << nl << endl; + + + + // Now we'll have a mesh split according to where there are cells + // covered by the other-side patches. See what we can reach from our + // real patches + + // 0 : region not yet determined + // 1 : borders blockage so is not ok (but can be overriden by real + // patch) + // 2 : has real patch in it so is reachable + labelList regionType(cellRegion.nRegions(), 0); + + + // See if any regions borders blockage. Note: isBlockedFace is already + // parallel synchronised. + { + for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) + { + if (isBlockedFace[faceI]) + { + label ownRegion = cellRegion[own[faceI]]; + + if (cellTypes[own[faceI]] != HOLE) + { + if (regionType[ownRegion] == 0) + { + Pout<< "Mark region:" << ownRegion + << " on zone:" << zoneID[own[faceI]] + << " as next to blockage at:" + << mesh.faceCentres()[faceI] << endl; + + regionType[ownRegion] = 1; + } + } + + label neiRegion = cellRegion[nei[faceI]]; + + if (cellTypes[nei[faceI]] != HOLE) + { + if (regionType[neiRegion] == 0) + { + Pout<< "Mark region:" << neiRegion + << " on zone:" << zoneID[nei[faceI]] + << " as next to blockage at:" + << mesh.faceCentres()[faceI] << endl; + regionType[neiRegion] = 1; + } + } + } + } + for + ( + label faceI = mesh.nInternalFaces(); + faceI < mesh.nFaces(); + faceI++ + ) + { + if (isBlockedFace[faceI]) + { + label ownRegion = cellRegion[own[faceI]]; + + if (regionType[ownRegion] == 0) + { + Pout<< "Mark region:" << ownRegion + << " on zone:" << zoneID[own[faceI]] + << " as next to blockage at:" + << mesh.faceCentres()[faceI] << endl; + regionType[ownRegion] = 1; + } + } + } + } + + + // Override with real patches + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + + if (isA<oversetFvPatch>(fvp)) + {} + else if (!fvPatch::constraintType(fvp.type())) + { + Pout<< "Proper patch " << fvp.name() << " of type " << fvp.type() + << endl; + + const labelList& fc = fvp.faceCells(); + forAll(fc, i) + { + label regionI = cellRegion[fc[i]]; + + if (cellTypes[fc[i]] != HOLE && regionType[regionI] != 2) + { + Pout<< "reachable region : " << regionI + << " at cell " << mesh.cellCentres()[fc[i]] + << " on zone " << zoneID[fc[i]] + << endl; + regionType[regionI] = 2; + } + } + } + } + + // Now we've handled + // - cells next to blocked cells + // - coupled boundaries + // Only thing to handle is the interpolation between regions + + + labelListList compactStencil(stencil); + List<Map<label>> compactMap; + mapDistribute map(globalCells, compactStencil, compactMap); + + while (true) + { + // Synchronise region status on processors + // (could instead swap status through processor patches) + Pstream::listCombineGather(regionType, maxEqOp<label>()); + Pstream::listCombineScatter(regionType); + + // Communicate region status through interpolative cells + labelList cellRegionType(UIndirectList<label>(regionType, cellRegion)); + map.distribute(cellRegionType); + + + label nChanged = 0; + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + + if (isA<oversetFvPatch>(fvp)) + { + const labelUList& fc = fvp.faceCells(); + forAll(fc, i) + { + label cellI = fc[i]; + label regionI = cellRegion[cellI]; + + if (regionType[regionI] != 2) + { + const labelList& slots = compactStencil[cellI]; + forAll(slots, i) + { + label otherType = cellRegionType[slots[i]]; + + if (otherType == 2) + { + Pout<< "Reachable through interpolation : " + << regionI << " at cell " + << mesh.cellCentres()[cellI] + << endl; + regionType[regionI] = 2; + nChanged++; + break; + } + } + } + } + } + } + + + reduce(nChanged, sumOp<label>()); + if (nChanged == 0) + { + break; + } + } + + + // See which regions have not been visited (regionType == 1) + forAll(cellRegion, cellI) + { + label type = regionType[cellRegion[cellI]]; + if (type == 1 && cellTypes[cellI] != HOLE) + { + cellTypes[cellI] = HOLE; + } + } +} + + +void Foam::cellCellStencils::cellVolumeWeight::markPatchCells +( + const fvMesh& mesh, + const labelList& cellMap, + labelList& patchCellTypes +) const +{ + const fvBoundaryMesh& pbm = mesh.boundary(); + + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + const labelList& fc = fvp.faceCells(); + + if (isA<oversetFvPatch>(fvp)) + { + Pout<< "Marking cells on overset patch " << fvp.name() << endl; + forAll(fc, i) + { + label cellI = fc[i]; + patchCellTypes[cellMap[cellI]] = OVERSET; + } + } + else if (!fvPatch::constraintType(fvp.type())) + { + Pout<< "Marking cells on proper patch " << fvp.name() + << " with type " << fvp.type() << endl; + forAll(fc, i) + { + label cellI = fc[i]; + if (patchCellTypes[cellMap[cellI]] != OVERSET) + { + patchCellTypes[cellMap[cellI]] = PATCH; + } + } + } + } +} + + +void Foam::cellCellStencils::cellVolumeWeight::interpolatePatchTypes +( + const labelListList& addressing, + const labelList& patchTypes, + labelList& result +) const +{ + forAll(result, cellI) + { + const labelList& slots = addressing[cellI]; + forAll(slots, i) + { + label type = patchTypes[slots[i]]; + + if (type == OVERSET) + { + // 'overset' overrides anything + result[cellI] = OVERSET; + break; + } + else if (type == PATCH) + { + // 'patch' overrides -1 and 'other' + result[cellI] = PATCH; + } + else if (result[cellI] == -1) + { + // 'other' overrides -1 only + result[cellI] = OTHER; + } + } + } +} + + +void Foam::cellCellStencils::cellVolumeWeight::interpolatePatchTypes +( + const autoPtr<mapDistribute>& mapPtr, + const labelListList& addressing, + const labelList& patchTypes, + labelList& result +) const +{ + if (result.size() != addressing.size()) + { + FatalErrorInFunction << "result:" << result.size() + << " addressing:" << addressing.size() << exit(FatalError); + } + + + // Initialise to not-mapped + result = -1; + + if (mapPtr.valid()) + { + // Pull remote data into order of addressing + labelList work(patchTypes); + mapPtr().distribute(work); + + interpolatePatchTypes(addressing, work, result); + } + else + { + interpolatePatchTypes(addressing, patchTypes, result); + } +} + + +void Foam::cellCellStencils::cellVolumeWeight::combineCellTypes +( + const label subZoneID, + const fvMesh& subMesh, + const labelList& subCellMap, + + const label donorZoneID, + const labelListList& addressing, + const List<scalarList>& weights, + const labelList& otherCells, + const labelList& interpolatedOtherPatchTypes, + + labelListList& allStencil, + scalarListList& allWeights, + labelList& allCellTypes, + labelList& allDonorID +) const +{ + forAll(subCellMap, subCellI) + { + label cellI = subCellMap[subCellI]; + + bool validDonors = true; + switch (interpolatedOtherPatchTypes[subCellI]) + { + case -1: + { + validDonors = false; + } + break; + + case OTHER: + { + // No patch interaction so keep valid + } + break; + + case PATCH: + { + if (allCellTypes[cellI] != HOLE) + { + scalar overlapVol = sum(weights[subCellI]); + scalar v = mesh_.V()[cellI]; + if (overlapVol < (1.0-overlapTolerance_)*v) + { + //Pout<< "** Patch overlap:" << cellI + // << " at:" << mesh_.cellCentres()[cellI] << endl; + allCellTypes[cellI] = HOLE; + validDonors = false; + } + } + } + break; + + case OVERSET: + { + validDonors = false; + } + break; + } + + + if (validDonors) + { + // There are a few possible choices how to choose between multiple + // donor candidates: + // 1 highest overlap volume. However this is generally already + // 99.9% so you're just measuring truncation error. + // 2 smallest donors cells or most donor cells. This is quite + // often done but can cause switching of donor zone from one + // time step to the other if the donor meshes are non-uniform + // and the acceptor cells just happens to be sweeping through + // some small donor cells. + // 3 nearest zoneID. So zone 0 preferentially interpolates from + // zone 1, zone 1 preferentially from zone 2 etc. + + //- Option 1: + //scalar currentVol = sum(allWeights[cellI]); + //if (overlapVol[subCellI] > currentVol) + + //- Option 3: + label currentDiff = mag(subZoneID-allDonorID[cellI]); + label thisDiff = mag(subZoneID-donorZoneID); + + if + ( + allDonorID[cellI] == -1 + || (thisDiff < currentDiff) + || (thisDiff == currentDiff && donorZoneID > allDonorID[cellI]) + ) + { + allWeights[cellI] = weights[subCellI]; + allStencil[cellI] = + UIndirectList<label> + ( + otherCells, + addressing[subCellI] + ); + allDonorID[cellI] = donorZoneID; + } + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellCellStencils::cellVolumeWeight::cellVolumeWeight +( + const fvMesh& mesh, + const dictionary& dict, + const bool doUpdate +) +: + cellCellStencil(mesh), + dict_(dict), + overlapTolerance_(defaultOverlapTolerance_), + cellTypes_(labelList(mesh.nCells(), CALCULATED)), + interpolationCells_(0), + cellInterpolationMap_(), + cellStencil_(0), + cellInterpolationWeights_(0), + cellInterpolationWeight_ + ( + IOobject + ( + "cellInterpolationWeight", + mesh_.facesInstance(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ) +{ + if (doUpdate) + { + update(); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellCellStencils::cellVolumeWeight::~cellVolumeWeight() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::cellCellStencils::cellVolumeWeight::update() +{ + scalar layerRelax(dict_.lookupOrDefault("layerRelax", 1.0)); + const labelIOList& zoneID = this->zoneID(); + + label nZones = gMax(zoneID)+1; + labelList nCellsPerZone(nZones, 0); + forAll(zoneID, cellI) + { + nCellsPerZone[zoneID[cellI]]++; + } + Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>()); + Pstream::listCombineScatter(nCellsPerZone); + + + Info<< typeName << " : detected " << nZones + << " mesh regions" << nl << endl; + + + PtrList<fvMeshSubset> meshParts(nZones); + + Info<< incrIndent; + forAll(nCellsPerZone, zoneI) + { + Info<< indent<< "zone:" << zoneI << " nCells:" << nCellsPerZone[zoneI] + << endl; + meshParts.set(zoneI, new fvMeshSubset(mesh_)); + meshParts[zoneI].setLargeCellSubset(zoneID, zoneI); + } + Info<< decrIndent; + + + + // Current best guess for cells. Includes best stencil. Weights should + // add up to volume. + labelList allCellTypes(mesh_.nCells(), CALCULATED); + labelList allPatchTypes(mesh_.nCells(), OTHER); + labelListList allStencil(mesh_.nCells()); + scalarListList allWeights(mesh_.nCells()); + // zoneID of donor + labelList allDonorID(mesh_.nCells(), -1); + + + // Marking patch cells + forAll(meshParts, partI) + { + const fvMesh& partMesh = meshParts[partI].subMesh(); + const labelList& partCellMap = meshParts[partI].cellMap(); + + // Mark cells with + // - overset boundary + // - other, proper boundary + // - other cells + Info<< "Marking patch-cells on zone " << partI << endl; + markPatchCells(partMesh, partCellMap, allPatchTypes); + } + + + labelList nCells(count(3, allPatchTypes)); + Info<< nl + << "After patch analysis : nCells : " + << returnReduce(allPatchTypes.size(), sumOp<label>()) << nl + << incrIndent + << indent << "other : " << nCells[OTHER] << nl + << indent << "patch : " << nCells[PATCH] << nl + << indent << "overset: " << nCells[OVERSET] << nl + << decrIndent << endl; + + globalIndex globalCells(mesh_.nCells()); + + + for (label srcI = 0; srcI < meshParts.size()-1; srcI++) + { + const fvMesh& srcMesh = meshParts[srcI].subMesh(); + const labelList& srcCellMap = meshParts[srcI].cellMap(); + + for (label tgtI = srcI+1; tgtI < meshParts.size(); tgtI++) + { + const fvMesh& tgtMesh = meshParts[tgtI].subMesh(); + const labelList& tgtCellMap = meshParts[tgtI].cellMap(); + + meshToMesh mapper + ( + srcMesh, + tgtMesh, + meshToMesh::imCellVolumeWeight, + HashTable<word>(0), // patchMap, + wordList(0), // cuttingPatches + false // do not normalise + ); + + + { + // Get tgt patch types on src mesh + labelList interpolatedTgtPatchTypes(srcMesh.nCells(), -1); + interpolatePatchTypes + ( + mapper.tgtMap(), // How to get remote data local + mapper.srcToTgtCellAddr(), + labelList(UIndirectList<label>(allPatchTypes, tgtCellMap)), + interpolatedTgtPatchTypes + ); + + // Get target cell labels in global cell indexing (on overall + // mesh) + labelList tgtGlobalCells(tgtMesh.nCells()); + { + forAll(tgtCellMap, tgtCellI) + { + label cellI = tgtCellMap[tgtCellI]; + tgtGlobalCells[tgtCellI] = globalCells.toGlobal(cellI); + } + if (mapper.tgtMap().valid()) + { + mapper.tgtMap()().distribute(tgtGlobalCells); + } + } + combineCellTypes + ( + srcI, + srcMesh, + srcCellMap, + + tgtI, + mapper.srcToTgtCellAddr(), + mapper.srcToTgtCellWght(), + tgtGlobalCells, + interpolatedTgtPatchTypes, + + // Overall mesh data + allStencil, + allWeights, + allCellTypes, + allDonorID + ); + } + + { + // Get src patch types on tgt mesh + labelList interpolatedSrcPatchTypes(tgtMesh.nCells(), -1); + interpolatePatchTypes + ( + mapper.srcMap(), // How to get remote data local + mapper.tgtToSrcCellAddr(), + labelList(UIndirectList<label>(allPatchTypes, srcCellMap)), + interpolatedSrcPatchTypes + ); + + labelList srcGlobalCells(srcMesh.nCells()); + { + forAll(srcCellMap, srcCellI) + { + label cellI = srcCellMap[srcCellI]; + srcGlobalCells[srcCellI] = globalCells.toGlobal(cellI); + } + if (mapper.srcMap().valid()) + { + mapper.srcMap()().distribute(srcGlobalCells); + } + } + + combineCellTypes + ( + tgtI, + tgtMesh, + tgtCellMap, + + srcI, + mapper.tgtToSrcCellAddr(), + mapper.tgtToSrcCellWght(), + srcGlobalCells, + interpolatedSrcPatchTypes, + + // Overall mesh data + allStencil, + allWeights, + allCellTypes, + allDonorID + ); + } + } + } + + + // Use the patch types and weights to decide what to do + forAll(allPatchTypes, cellI) + { + if (allCellTypes[cellI] != HOLE) + { + switch (allPatchTypes[cellI]) + { + case OVERSET: + { + // Interpolate. Check if enough overlap + scalar v = mesh_.V()[cellI]; + scalar overlapVol = sum(allWeights[cellI]); + if (overlapVol > (1.0-overlapTolerance_)*v) + { + allCellTypes[cellI] = INTERPOLATED; + } + else + { + //Pout<< "Holeing interpolated cell:" << cellI + // << " at:" << mesh_.cellCentres()[cellI] << endl; + allCellTypes[cellI] = HOLE; + allWeights[cellI].clear(); + allStencil[cellI].clear(); + } + break; + } + } + } + } + + + // Knock out cell with insufficient interpolation weights + forAll(allCellTypes, cellI) + { + if (allCellTypes[cellI] == INTERPOLATED) + { + scalar v = mesh_.V()[cellI]; + scalar overlapVol = sum(allWeights[cellI]); + if (overlapVol < (1.0-overlapTolerance_)*v) + { + //Pout<< "Holeing cell:" << cellI + // << " at:" << mesh_.cellCentres()[cellI] << endl; + allCellTypes[cellI] = HOLE; + allWeights[cellI].clear(); + allStencil[cellI].clear(); + } + } + } + + + // Mark unreachable bits + findHoles(globalCells, mesh_, zoneID, allStencil, allCellTypes); + + + // Add buffer interpolation layer around holes + scalarField allWeight(mesh_.nCells(), 0.0); + walkFront(layerRelax, allCellTypes, allWeight); + + + // Normalise weights, Clear storage + forAll(allCellTypes, cellI) + { + if (allCellTypes[cellI] == INTERPOLATED) + { + if (allWeight[cellI] < SMALL || allStencil[cellI].size() == 0) + { + //Pout<< "Clearing cell:" << cellI + // << " at:" << mesh_.cellCentres()[cellI] << endl; + allWeights[cellI].clear(); + allStencil[cellI].clear(); + allWeight[cellI] = 0.0; + } + else + { + scalar s = sum(allWeights[cellI]); + forAll(allWeights[cellI], i) + { + allWeights[cellI][i] /= s; + } + } + } + else + { + allWeights[cellI].clear(); + allStencil[cellI].clear(); + } + } + + + // Write to volField for debugging + if (debug) + { + volScalarField patchTypes + ( + IOobject + ( + "patchTypes", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ); + + forAll(patchTypes.internalField(), cellI) + { + patchTypes[cellI] = allPatchTypes[cellI]; + } + patchTypes.correctBoundaryConditions(); + patchTypes.write(); + } + if (debug) + { + volScalarField volTypes + ( + IOobject + ( + "cellTypes", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ); + + forAll(volTypes.internalField(), cellI) + { + volTypes[cellI] = allCellTypes[cellI]; + } + volTypes.correctBoundaryConditions(); + volTypes.write(); + } + + + + cellTypes_.transfer(allCellTypes); + cellStencil_.transfer(allStencil); + cellInterpolationWeights_.transfer(allWeights); + cellInterpolationWeight_.transfer(allWeight); + cellInterpolationWeight_.correctBoundaryConditions(); + + DynamicList<label> interpolationCells; + forAll(cellStencil_, cellI) + { + if (cellStencil_[cellI].size()) + { + interpolationCells.append(cellI); + } + } + interpolationCells_.transfer(interpolationCells); + + + List<Map<label> > compactMap; + mapDistribute map(globalCells, cellStencil_, compactMap); + cellInterpolationMap_.transfer(map); + + // Dump interpolation stencil + if (debug) + { + // Dump weight + cellInterpolationWeight_.instance() = mesh_.time().timeName(); + cellInterpolationWeight_.write(); + + + mkDir(mesh_.time().timePath()); + OBJstream str(mesh_.time().timePath()/"stencil2.obj"); + Info<< typeName << " : dumping to " << str.name() << endl; + pointField cc(mesh_.cellCentres()); + cellInterpolationMap_.distribute(cc); + + forAll(interpolationCells_, compactI) + { + label cellI = interpolationCells_[compactI]; + const labelList& slots = cellStencil_[cellI]; + + Pout<< "cellI:" << cellI << " at:" + << mesh_.cellCentres()[cellI] + << " calculated from slots:" << slots + << " cc:" << UIndirectList<point>(cc, slots)() + << " weights:" << cellInterpolationWeights_[cellI] + << endl; + + forAll(slots, i) + { + const point& donorCc = cc[slots[i]]; + const point& accCc = mesh_.cellCentres()[cellI]; + + str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc)); + } + } + } + + + { + labelList nCells(count(3, cellTypes_)); + Info<< "Overset analysis : nCells : " + << returnReduce(cellTypes_.size(), sumOp<label>()) << nl + << incrIndent + << indent << "calculated : " << nCells[CALCULATED] << nl + << indent << "interpolated : " << nCells[INTERPOLATED] << nl + << indent << "hole : " << nCells[HOLE] << nl + << decrIndent << endl; + } + + // Tbd: detect if anything changed. Most likely it did! + return true; +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H new file mode 100644 index 00000000000..4331b1421f5 --- /dev/null +++ b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.H @@ -0,0 +1,242 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::cellCellStencils::cellVolumeWeight + +Description + Volume-weighted interpolation stencil + +SourceFiles + cellVolumeWeightCellCellStencil.C + cellVolumeWeightCellCellStencilTemplates.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellCellStencils_cellVolumeWeight_H +#define cellCellStencils_cellVolumeWeight_H + +#include "cellCellStencil.H" +#include "volFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace cellCellStencils +{ + +/*---------------------------------------------------------------------------*\ + Class cellVolumeWeight Declaration +\*---------------------------------------------------------------------------*/ + +class cellVolumeWeight +: + public cellCellStencil +{ +protected: + + // Static data members + + //- Default overlap tolerance. Fraction of volume + static scalar defaultOverlapTolerance_; + + + // Protected data + + //- Dictionary of motion control parameters + const dictionary dict_; + + //- Tolerance for volume overlap. Fraction of volume + scalar overlapTolerance_; + + //- Per cell the cell type + labelList cellTypes_; + + //- Indices of interpolated cells + labelList interpolationCells_; + + //- Fetch interpolated cells + mapDistribute cellInterpolationMap_; + + //- Interpolation stencil + labelListList cellStencil_; + + //- Interpolation weights + List<scalarList> cellInterpolationWeights_; + + //- Amount of interpolation + volScalarField cellInterpolationWeight_; + + + // Protected Member Functions + + void walkFront + ( + const scalar layerRelax, + labelList& allCellTypes, + scalarField& allWeight + ) const; + + //- Find cells next to cells of type PATCH + void findHoles + ( + const globalIndex& globalCells, + const fvMesh& mesh, + const labelList& zoneID, + const labelListList& stencil, + labelList& cellTypes + ) const; + + //- according to additionalDocumentation/MEJ_oversetMesh.txt + void markPatchCells + ( + const fvMesh& mesh, + const labelList& cellMap, + labelList& patchCellTypes + ) const; + + void combineCellTypes + ( + const label subZoneID, + const fvMesh& subMesh, + const labelList& subCellMap, + + const label donorZoneID, + const labelListList& toOtherCells, + const List<scalarList>& weights, + const labelList& otherCells, + const labelList& interpolatedOtherPatchTypes, + + labelListList& allStencil, + scalarListList& allWeights, + labelList& allCellTypes, + labelList& allDonorID + ) const; + + //- interpolate (= combine) patch types + void interpolatePatchTypes + ( + const labelListList& addressing, + const labelList& patchTypes, + labelList& result + ) const; + + //- interpolate (= combine) patch types + void interpolatePatchTypes + ( + const autoPtr<mapDistribute>& mapPtr, + const labelListList& addressing, + const labelList& patchTypes, + labelList& result + ) const; + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + cellVolumeWeight(const cellVolumeWeight&); + + //- Disallow default bitwise assignment + void operator=(const cellVolumeWeight&); + + +public: + + //- Runtime type information + TypeName("cellVolumeWeight"); + + + // Constructors + + //- Construct from fvMesh + cellVolumeWeight(const fvMesh&, const dictionary&, const bool doUpdate); + + + //- Destructor + virtual ~cellVolumeWeight(); + + + // Member Functions + + //- Access to volume overlap tolerance + scalar overlapTolerance() const + { + return overlapTolerance_; + } + + //- Update stencils. Return false if nothing changed. + virtual bool update(); + + //- Return the cell type list + virtual const labelUList& cellTypes() const + { + return cellTypes_; + } + + //- Indices of interpolated cells + virtual const labelUList& interpolationCells() const + { + return interpolationCells_; + } + + //- Return a communication schedule + virtual const mapDistribute& cellInterpolationMap() const + { + return cellInterpolationMap_; + } + + //- Per interpolated cell the neighbour cells (in terms of slots as + // constructed by above cellInterpolationMap) to interpolate + virtual const labelListList& cellStencil() const + { + return cellStencil_; + } + + //- Weights for cellStencil + virtual const List<scalarList>& cellInterpolationWeights() const + { + return cellInterpolationWeights_; + } + + //- Per interpolated cell the interpolation factor. (0 = use + // calculated, 1 = use interpolated) + virtual const scalarList& cellInterpolationWeight() const + { + return cellInterpolationWeight_; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace cellCellStencils +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C new file mode 100644 index 00000000000..4a5cdbe8a2c --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C @@ -0,0 +1,2059 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify i + 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 "inverseDistanceCellCellStencil.H" +#include "addToRunTimeSelectionTable.H" +#include "OBJstream.H" +#include "Time.H" +#include "fvMeshSubset.H" + +#include "globalIndex.H" +#include "oversetFvPatch.H" +#include "zeroGradientFvPatchFields.H" +#include "syncTools.H" +#include "treeBoundBoxList.H" +#include "waveMethod.H" + +#include "regionSplit.H" +//#include "minData.H" +//#include "FaceCellWave.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace cellCellStencils +{ + defineTypeNameAndDebug(inverseDistance, 0); + addToRunTimeSelectionTable(cellCellStencil, inverseDistance, mesh); +} +} + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::label Foam::cellCellStencils::inverseDistance::index +( + const labelVector& nDivs, + const labelVector& ijk +) +{ + return (ijk[0]*nDivs[1] + ijk[1])*nDivs[2] + ijk[2]; +} + + +Foam::labelVector Foam::cellCellStencils::inverseDistance::index3 +( + const labelVector& nDivs, + const label boxI +) +{ + label ij = boxI/nDivs[2]; + label k = boxI-ij*nDivs[2]; + label i = ij/nDivs[1]; + label j = ij-i*nDivs[1]; + + return labelVector(i, j, k); +} + + +Foam::labelVector Foam::cellCellStencils::inverseDistance::index3 +( + const boundBox& bb, + const labelVector& nDivs, + const point& pt +) +{ + const vector d(bb.span()); + const point relPt(pt-bb.min()); + + return labelVector + ( + floor(relPt[0]/d[0]*nDivs[0]), + floor(relPt[1]/d[1]*nDivs[1]), + floor(relPt[2]/d[2]*nDivs[2]) + ); +} + + +Foam::point Foam::cellCellStencils::inverseDistance::position +( + const boundBox& bb, + const labelVector& nDivs, + const label boxI +) +{ + // Return midpoint of box indicated by boxI + labelVector ids(index3(nDivs, boxI)); + + const vector d(bb.span()); + const vector sz(d[0]/nDivs[0], d[1]/nDivs[1], d[2]/nDivs[2]); + + return bb.min()+0.5*sz+vector(sz[0]*ids[0], sz[1]*ids[1], sz[2]*ids[2]); +} + + +void Foam::cellCellStencils::inverseDistance::fill +( + PackedList<2>& elems, + const boundBox& bb, + const labelVector& nDivs, + const boundBox& subBb, + const unsigned int val +) +{ + labelVector minIds(index3(bb, nDivs, subBb.min())); + labelVector maxIds(index3(bb, nDivs, subBb.max())); + + for (direction cmpt = 0; cmpt < 3; cmpt++) + { + if (maxIds[cmpt] < 0 || minIds[cmpt] > nDivs[cmpt]) + { + return; + } + } + + labelVector maxIndex(labelVector(nDivs[0]-1, nDivs[1]-1, nDivs[2]-1)); + minIds = max(labelVector::zero, minIds); + maxIds = min(maxIndex, maxIds); + + for (label i = minIds[0]; i <= maxIds[0]; i++) + { + for (label j = minIds[1]; j <= maxIds[1]; j++) + { + for (label k = minIds[2]; k <= maxIds[2]; k++) + { + label i1 = index(nDivs, labelVector(i, j, k)); + elems[i1] = val; + } + } + } +} + + +void Foam::cellCellStencils::inverseDistance::markBoundaries +( + const fvMesh& mesh, + + const boundBox& bb, + const labelVector& nDivs, + PackedList<2>& patchTypes, + + const labelList& cellMap, + labelList& patchCellTypes +) +{ + // Mark all voxels that overlap the bounding box of any patch + + const fvBoundaryMesh& pbm = mesh.boundary(); + + patchTypes = patchCellType::OTHER; + + // Mark wall boundaries + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + const labelList& fc = fvp.faceCells(); + + if (!fvPatch::constraintType(fvp.type())) + { + //Info<< "Marking cells on proper patch " << fvp.name() + // << " with type " << fvp.type() << endl; + const polyPatch& pp = fvp.patch(); + forAll(pp, i) + { + // Mark in overall patch types + patchCellTypes[cellMap[fc[i]]] = patchCellType::PATCH; + + // Mark in voxel mesh + boundBox faceBb(pp.points(), pp[i], false); + if (bb.overlaps(faceBb)) + { + fill(patchTypes, bb, nDivs, faceBb, patchCellType::PATCH); + } + } + } + } + + // Override with overset boundaries + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + const labelList& fc = fvp.faceCells(); + + if (isA<oversetFvPatch>(fvp)) + { + //Info<< "Marking cells on overset patch " << fvp.name() << endl; + const polyPatch& pp = fvp.patch(); + forAll(pp, i) + { + // Mark in overall patch types + patchCellTypes[cellMap[fc[i]]] = patchCellType::OVERSET; + + // Mark in voxel mesh + boundBox faceBb(pp.points(), pp[i], false); + if (bb.overlaps(faceBb)) + { + fill(patchTypes, bb, nDivs, faceBb, patchCellType::OVERSET); + } + } + } + } +} + + +Foam::treeBoundBox Foam::cellCellStencils::inverseDistance::cellBb +( + const primitiveMesh& mesh, + const label celli +) +{ + const cellList& cells = mesh.cells(); + const faceList& faces = mesh.faces(); + const pointField& points = mesh.points(); + + treeBoundBox bb + ( + vector(GREAT, GREAT, GREAT), + vector(-GREAT, -GREAT, -GREAT) + ); + + const cell& cFaces = cells[celli]; + + forAll(cFaces, cFacei) + { + const face& f = faces[cFaces[cFacei]]; + + forAll(f, fp) + { + const point& p = points[f[fp]]; + + bb.min() = min(bb.min(), p); + bb.max() = max(bb.max(), p); + } + } + return bb; +} + + +bool Foam::cellCellStencils::inverseDistance::overlaps +( + const boundBox& bb, + const labelVector& nDivs, + const PackedList<2>& vals, + const treeBoundBox& subBb, + const unsigned int val +) +{ + // Checks if subBb overlaps any voxel set to val + + labelVector minIds(index3(bb, nDivs, subBb.min())); + labelVector maxIds(index3(bb, nDivs, subBb.max())); + + for (direction cmpt = 0; cmpt < 3; cmpt++) + { + if (maxIds[cmpt] < 0 || minIds[cmpt] > nDivs[cmpt]) + { + return false; + } + } + + labelVector maxIndex(labelVector(nDivs[0]-1, nDivs[1]-1, nDivs[2]-1)); + minIds = max(labelVector::zero, minIds); + maxIds = min(maxIndex, maxIds); + + for (label i = minIds[0]; i <= maxIds[0]; i++) + { + for (label j = minIds[1]; j <= maxIds[1]; j++) + { + for (label k = minIds[2]; k <= maxIds[2]; k++) + { + label i1 = index(nDivs, labelVector(i, j, k)); + if (vals[i1] == patchCellType::PATCH) + { + return true; + } + } + } + } + return false; +} + + +void Foam::cellCellStencils::inverseDistance::markPatchesAsHoles +( + PstreamBuffers& pBufs, + + const PtrList<fvMeshSubset>& meshParts, + + const List<treeBoundBoxList>& patchBb, + const List<labelVector>& patchDivisions, + const PtrList<PackedList<2>>& patchParts, + + const label srcI, + const label tgtI, + labelList& allCellTypes +) const +{ + const treeBoundBoxList& srcPatchBbs = patchBb[srcI]; + const treeBoundBoxList& tgtPatchBbs = patchBb[tgtI]; + const labelList& tgtCellMap = meshParts[tgtI].cellMap(); + + // 1. do processor-local src-tgt patch overlap + { + const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()]; + const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()]; + + if (srcPatchBb.overlaps(tgtPatchBb)) + { + const PackedList<2>& srcPatchTypes = patchParts[srcI]; + const labelVector& zoneDivs = patchDivisions[srcI]; + + forAll(tgtCellMap, tgtCelli) + { + label celli = tgtCellMap[tgtCelli]; + if + ( + overlaps + ( + srcPatchBb, + zoneDivs, + srcPatchTypes, + cellBb(mesh_, celli), + patchCellType::PATCH + ) + ) + { + allCellTypes[celli] = HOLE; + } + } + } + } + + + // 2. Send over srcMesh bits that overlap tgt and do calculation + pBufs.clear(); + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + if (procI != Pstream::myProcNo()) + { + const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()]; + const treeBoundBox& tgtPatchBb = tgtPatchBbs[procI]; + + if (srcPatchBb.overlaps(tgtPatchBb)) + { + // Send over complete patch voxel map. Tbd: could + // subset + UOPstream os(procI, pBufs); + os << srcPatchBb << patchDivisions[srcI] << patchParts[srcI]; + } + } + } + pBufs.finishedSends(); + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + if (procI != Pstream::myProcNo()) + { + //const treeBoundBox& srcBb = srcBbs[procI]; + const treeBoundBox& srcPatchBb = srcPatchBbs[procI]; + const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()]; + + if (srcPatchBb.overlaps(tgtPatchBb)) + { + UIPstream is(procI, pBufs); + { + treeBoundBox receivedBb(is); + if (srcPatchBb != receivedBb) + { + FatalErrorInFunction + << "proc:" << procI + << " srcPatchBb:" << srcPatchBb + << " receivedBb:" << receivedBb + << exit(FatalError); + } + } + const labelVector zoneDivs(is); + const PackedList<2> srcPatchTypes(is); + + forAll(tgtCellMap, tgtCelli) + { + label celli = tgtCellMap[tgtCelli]; + if + ( + overlaps + ( + srcPatchBb, + zoneDivs, + srcPatchTypes, + cellBb(mesh_, celli), + patchCellType::PATCH + ) + ) + { + allCellTypes[celli] = HOLE; + } + } + } + } + } +} + + +void Foam::cellCellStencils::inverseDistance::markDonors +( + const globalIndex& globalCells, + PstreamBuffers& pBufs, + const PtrList<fvMeshSubset>& meshParts, + const List<treeBoundBoxList>& meshBb, + + const label srcI, + const label tgtI, + labelListList& allStencil, + labelList& allDonor +) const +{ + const treeBoundBoxList& srcBbs = meshBb[srcI]; + const treeBoundBoxList& tgtBbs = meshBb[tgtI]; + + const fvMesh& srcMesh = meshParts[srcI].subMesh(); + const labelList& srcCellMap = meshParts[srcI].cellMap(); + const fvMesh& tgtMesh = meshParts[tgtI].subMesh(); + const pointField& tgtCc = tgtMesh.cellCentres(); + const labelList& tgtCellMap = meshParts[tgtI].cellMap(); + + // 1. do processor-local src/tgt overlap + { + labelList tgtToSrcAddr; + waveMethod::calculate(tgtMesh, srcMesh, tgtToSrcAddr); + forAll(tgtCellMap, tgtCelli) + { + label srcCelli = tgtToSrcAddr[tgtCelli]; + if (srcCelli != -1) + { + label celli = tgtCellMap[tgtCelli]; + label globalDonor = + globalCells.toGlobal(srcCellMap[srcCelli]); + allStencil[celli].setSize(1); + allStencil[celli][0] = globalDonor; + allDonor[celli] = srcI; + } + } + } + + + // 2. Send over tgtMesh bits that overlap src and do calculation on + // srcMesh. + + + // (remote) processors where the tgt overlaps my src + DynamicList<label> tgtOverlapProcs(Pstream::nProcs()); + // (remote) processors where the src overlaps my tgt + DynamicList<label> srcOverlapProcs(Pstream::nProcs()); + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + if (procI != Pstream::myProcNo()) + { + if (tgtBbs[procI].overlaps(srcBbs[Pstream::myProcNo()])) + { + tgtOverlapProcs.append(procI); + } + if (srcBbs[procI].overlaps(tgtBbs[Pstream::myProcNo()])) + { + srcOverlapProcs.append(procI); + } + } + } + + + + // Indices of tgtcells to send over to each processor + List<DynamicList<label> > tgtSendCells(Pstream::nProcs()); + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + tgtSendCells[procI].reserve(tgtMesh.nCells()/srcOverlapProcs.size()); + } + + + forAll(tgtCellMap, tgtCelli) + { + label celli = tgtCellMap[tgtCelli]; + if (allStencil[celli].empty()) + { + const treeBoundBox subBb(cellBb(mesh_, celli)); + + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + if (subBb.overlaps(srcBbs[procI])) + { + tgtSendCells[procI].append(tgtCelli); + } + } + } + } + + // Send target cell centres to overlapping processors + pBufs.clear(); + + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + const labelList& cellIDs = tgtSendCells[procI]; + + UOPstream os(procI, pBufs); + os << UIndirectList<point>(tgtCc, cellIDs); + } + pBufs.finishedSends(); + + // Receive bits of target processors; find; send back + (void)srcMesh.tetBasePtIs(); + forAll(tgtOverlapProcs, i) + { + label procI = tgtOverlapProcs[i]; + + UIPstream is(procI, pBufs); + pointList samples(is); + + labelList donors(samples.size(), -1); + forAll(samples, sampleI) + { + const point& sample = samples[sampleI]; + label srcCelli = srcMesh.findCell(sample, polyMesh::CELL_TETS); + if (srcCelli != -1) + { + donors[sampleI] = globalCells.toGlobal(srcCellMap[srcCelli]); + } + } + + // Use same pStreamBuffers to send back. + UOPstream os(procI, pBufs); + os << donors; + } + pBufs.finishedSends(); + + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + const labelList& cellIDs = tgtSendCells[procI]; + + UIPstream is(procI, pBufs); + labelList donors(is); + + if (donors.size() != cellIDs.size()) + { + FatalErrorInFunction<< "problem : cellIDs:" << cellIDs.size() + << " donors:" << donors.size() << abort(FatalError); + } + + forAll(donors, donorI) + { + label globalDonor = donors[donorI]; + + if (globalDonor != -1) + { + label celli = tgtCellMap[cellIDs[donorI]]; + + // TBD: check for multiple donors. Maybe better one? + if (allStencil[celli].empty()) + { + allStencil[celli].setSize(1); + allStencil[celli][0] = globalDonor; + allDonor[celli] = srcI; + } + } + } + } +} + + +//void Foam::cellCellStencils::inverseDistance::uncompactedRegionSplit +//( +// const fvMesh& mesh, +// const globalIndex& globalFaces, +// const label nZones, +// const labelList& zoneID, +// const labelList& cellTypes, +// const boolList& isBlockedFace, +// labelList& cellRegion +//) const +//{ +// // Pass 1: locally seed 2 cells per zone (one unblocked, one blocked). +// // This avoids excessive numbers of front +// +// // Field on cells and faces. +// List<minData> cellData(mesh.nCells()); +// List<minData> faceData(mesh.nFaces()); +// +// // Take over blockedFaces by seeding a negative number +// // (so is always less than the decomposition) +// +// forAll(isBlockedFace, facei) +// { +// if (isBlockedFace[facei]) +// { +// faceData[facei] = minData(-2); +// } +// } +// +// +// labelList seedFace(nZones, -1); +// +// const labelList& owner = mesh.faceOwner(); +// const labelList& neighbour = mesh.faceNeighbour(); +// +// forAll(owner, facei) +// { +// label own = owner[facei]; +// if (seedFace[zoneID[own]] == -1) +// { +// if (cellTypes[own] != HOLE) +// { +// const cell& cFaces = mesh.cells()[own]; +// forAll(cFaces, i) +// { +// if (!isBlockedFace[cFaces[i]]) +// { +// seedFace[zoneID[own]] = cFaces[i]; +// } +// } +// } +// } +// } +// forAll(neighbour, facei) +// { +// label nei = neighbour[facei]; +// if (seedFace[zoneID[nei]] == -1) +// { +// if (cellTypes[nei] != HOLE) +// { +// const cell& cFaces = mesh.cells()[nei]; +// forAll(cFaces, i) +// { +// if (!isBlockedFace[cFaces[i]]) +// { +// seedFace[zoneID[nei]] = cFaces[i]; +// } +// } +// } +// } +// } +// +// DynamicList<label> seedFaces(nZones); +// DynamicList<minData> seedData(seedFaces.size()); +// forAll(seedFace, zonei) +// { +// if (seedFace[zonei] != -1) +// { +// seedFaces.append(seedFace[zonei]); +// seedData.append(minData(globalFaces.toGlobal(seedFace[zonei]))); +// } +// } +// +// // Propagate information inwards +// FaceCellWave<minData> deltaCalc +// ( +// mesh, +// List<labelPair>(), +// false, // disable walking through cyclicAMI for backwards +// // compatibility +// seedFaces, +// seedData, +// faceData, +// cellData, +// mesh.globalData().nTotalCells()+1 +// ); +// +// // Extract +// cellRegion.setSize(mesh.nCells()); +// forAll(cellRegion, celli) +// { +// if (cellData[celli].valid(deltaCalc.data())) +// { +// cellRegion[celli] = cellData[celli].data(); +// } +// else +// { +// // Unvisited cell -> only possible if surrounded by blocked faces. +// // If so make up region from any of the faces +// const cell& cFaces = mesh.cells()[celli]; +// label facei = cFaces[0]; +// cellRegion[celli] = globalFaces.toGlobal(facei); +// } +// } +//} +//Foam::autoPtr<Foam::globalIndex> +//Foam::cellCellStencils::inverseDistance::compactedRegionSplit +//( +// const fvMesh& mesh, +// const globalIndex& globalRegions, +// labelList& cellRegion +//) const +//{ +// // Now our cellRegion will have +// // - non-local regions (i.e. originating from other processors) +// // - non-compact locally originating regions +// // so we'll need to compact +// +// // 4a: count per originating processor the number of regions +// labelList nOriginating(Pstream::nProcs(), 0); +// { +// labelHashSet haveRegion(mesh.nCells()/8); +// +// forAll(cellRegion, celli) +// { +// label region = cellRegion[celli]; +// +// // Count originating processor. Use isLocal as efficiency since +// // most cells are locally originating. +// if (globalRegions.isLocal(region)) +// { +// if (haveRegion.insert(region)) +// { +// nOriginating[Pstream::myProcNo()]++; +// } +// } +// else +// { +// label proci = globalRegions.whichProcID(region); +// if (haveRegion.insert(region)) +// { +// nOriginating[proci]++; +// } +// } +// } +// } +// +// if (debug) +// { +// Pout<< "Counted " << nOriginating[Pstream::myProcNo()] +// << " local regions." << endl; +// } +// +// +// // Global numbering for compacted local regions +// autoPtr<globalIndex> globalCompactPtr +// ( +// new globalIndex(nOriginating[Pstream::myProcNo()]) +// ); +// const globalIndex& globalCompact = globalCompactPtr(); +// +// +// // 4b: renumber +// // Renumber into compact indices. Note that since we've already made +// // all regions global we now need a Map to store the compacting +// // information +// // instead of a labelList - otherwise we could have used a straight +// // labelList. +// +// // Local compaction map +// Map<label> globalToCompact(2*nOriginating[Pstream::myProcNo()]); +// // Remote regions we want the compact number for +// List<labelHashSet> nonLocal(Pstream::nProcs()); +// forAll(nonLocal, proci) +// { +// if (proci != Pstream::myProcNo()) +// { +// nonLocal[proci].resize(2*nOriginating[proci]); +// } +// } +// +// forAll(cellRegion, celli) +// { +// label region = cellRegion[celli]; +// if (globalRegions.isLocal(region)) +// { +// // Insert new compact region (if not yet present) +// globalToCompact.insert +// ( +// region, +// globalCompact.toGlobal(globalToCompact.size()) +// ); +// } +// else +// { +// nonLocal[globalRegions.whichProcID(region)].insert(region); +// } +// } +// +// +// // Now we have all the local regions compacted. Now we need to get the +// // non-local ones from the processors to whom they are local. +// // Convert the nonLocal (labelHashSets) to labelLists. +// +// labelListList sendNonLocal(Pstream::nProcs()); +// forAll(sendNonLocal, proci) +// { +// sendNonLocal[proci] = nonLocal[proci].toc(); +// } +// +// if (debug) +// { +// forAll(sendNonLocal, proci) +// { +// Pout<< " from processor " << proci +// << " want " << sendNonLocal[proci].size() +// << " region numbers." << endl; +// } +// Pout<< endl; +// } +// +// +// // Get the wanted region labels into recvNonLocal +// labelListList recvNonLocal; +// Pstream::exchange<labelList, label>(sendNonLocal, recvNonLocal); +// +// // Now we have the wanted compact region labels that proci wants in +// // recvNonLocal[proci]. Construct corresponding list of compact +// // region labels to send back. +// +// labelListList sendWantedLocal(Pstream::nProcs()); +// forAll(recvNonLocal, proci) +// { +// const labelList& nonLocal = recvNonLocal[proci]; +// sendWantedLocal[proci].setSize(nonLocal.size()); +// +// forAll(nonLocal, i) +// { +// sendWantedLocal[proci][i] = globalToCompact[nonLocal[i]]; +// } +// } +// +// +// // Send back (into recvNonLocal) +// recvNonLocal.clear(); +// Pstream::exchange<labelList, label>(sendWantedLocal, recvNonLocal); +// sendWantedLocal.clear(); +// +// // Now recvNonLocal contains for every element in setNonLocal the +// // corresponding compact number. Insert these into the local compaction +// // map. +// +// forAll(recvNonLocal, proci) +// { +// const labelList& wantedRegions = sendNonLocal[proci]; +// const labelList& compactRegions = recvNonLocal[proci]; +// +// forAll(wantedRegions, i) +// { +// globalToCompact.insert(wantedRegions[i], compactRegions[i]); +// } +// } +// +// // Finally renumber the regions +// forAll(cellRegion, celli) +// { +// cellRegion[celli] = globalToCompact[cellRegion[celli]]; +// } +// +// return globalCompactPtr; +//} + + +void Foam::cellCellStencils::inverseDistance::findHoles +( + const globalIndex& globalCells, + const fvMesh& mesh, + const labelList& zoneID, + const labelListList& stencil, + labelList& cellTypes +) const +{ + const fvBoundaryMesh& pbm = mesh.boundary(); + const labelList& own = mesh.faceOwner(); + const labelList& nei = mesh.faceNeighbour(); + + + // The input cellTypes will be + // - HOLE : cell part covered by other-mesh patch + // - INTERPOLATED : cell fully covered by other-mesh patch + // or next to 'overset' patch + // - CALCULATED : otherwise + // + // so we start a walk from our patches and any cell we cannot reach + // (because we walk is stopped by other-mesh patch) is a hole. + + + DebugInfo<< FUNCTION_NAME << " : Starting hole flood filling" << endl; + + DebugInfo<< FUNCTION_NAME << " : Starting hole cells : " + << findIndices(cellTypes, HOLE).size() << endl; + + boolList isBlockedFace(mesh.nFaces(), false); + label nBlocked = 0; + + for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) + { + label ownType = cellTypes[own[faceI]]; + label neiType = cellTypes[nei[faceI]]; + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + isBlockedFace[faceI] = true; + nBlocked++; + } + } + DebugInfo<< FUNCTION_NAME << " : Marked internal hole boundaries : " + << nBlocked << endl; + + + labelList nbrCellTypes; + syncTools::swapBoundaryCellList(mesh, cellTypes, nbrCellTypes); + + for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++) + { + label ownType = cellTypes[own[faceI]]; + label neiType = nbrCellTypes[faceI-mesh.nInternalFaces()]; + + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + isBlockedFace[faceI] = true; + nBlocked++; + } + } + + DebugInfo<< FUNCTION_NAME << " : Marked all hole boundaries : " + << nBlocked << endl; + + // Determine regions + regionSplit cellRegion(mesh, isBlockedFace); + const label nRegions = cellRegion.nRegions(); + + //labelList cellRegion; + //label nRegions = -1; + //{ + // const globalIndex globalFaces(mesh.nFaces()); + // uncompactedRegionSplit + // ( + // mesh, + // globalFaces, + // gMax(zoneID)+1, + // zoneID, + // cellTypes, + // isBlockedFace, + // cellRegion + // ); + // autoPtr<globalIndex> globalRegions + // ( + // compactedRegionSplit + // ( + // mesh, + // globalFaces, + // cellRegion + // ) + // ); + // nRegions = globalRegions().size(); + //} + DebugInfo<< FUNCTION_NAME << " : Determined regions : " + << nRegions << endl; + + //Info<< typeName << " : detected " << nRegions + // << " mesh regions after overset" << nl << endl; + + + + // Now we'll have a mesh split according to where there are cells + // covered by the other-side patches. See what we can reach from our + // real patches + + // 0 : region not yet determined + // 1 : borders blockage so is not ok (but can be overriden by real + // patch) + // 2 : has real patch in it so is reachable + labelList regionType(nRegions, 0); + + + // See if any regions borders blockage. Note: isBlockedFace is already + // parallel synchronised. + { + for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) + { + if (isBlockedFace[faceI]) + { + label ownRegion = cellRegion[own[faceI]]; + + if (cellTypes[own[faceI]] != HOLE) + { + if (regionType[ownRegion] == 0) + { + regionType[ownRegion] = 1; + } + } + + label neiRegion = cellRegion[nei[faceI]]; + + if (cellTypes[nei[faceI]] != HOLE) + { + if (regionType[neiRegion] == 0) + { + regionType[neiRegion] = 1; + } + } + } + } + for + ( + label faceI = mesh.nInternalFaces(); + faceI < mesh.nFaces(); + faceI++ + ) + { + if (isBlockedFace[faceI]) + { + label ownRegion = cellRegion[own[faceI]]; + + if (regionType[ownRegion] == 0) + { + regionType[ownRegion] = 1; + } + } + } + } + + + // Override with real patches + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + + if (isA<oversetFvPatch>(fvp)) + {} + else if (!fvPatch::constraintType(fvp.type())) + { + const labelList& fc = fvp.faceCells(); + forAll(fc, i) + { + label regionI = cellRegion[fc[i]]; + + if (cellTypes[fc[i]] != HOLE && regionType[regionI] != 2) + { + regionType[regionI] = 2; + } + } + } + } + + DebugInfo<< FUNCTION_NAME << " : Done local analysis" << endl; + + // Now we've handled + // - cells next to blocked cells + // - coupled boundaries + // Only thing to handle is the interpolation between regions + + + labelListList compactStencil(stencil); + List<Map<label>> compactMap; + mapDistribute map(globalCells, compactStencil, compactMap); + + DebugInfo<< FUNCTION_NAME << " : Converted stencil into compact form" + << endl; + + + while (true) + { + // Synchronise region status on processors + // (could instead swap status through processor patches) + Pstream::listCombineGather(regionType, maxEqOp<label>()); + Pstream::listCombineScatter(regionType); + + DebugInfo<< FUNCTION_NAME << " : Gathered region type" << endl; + + // Communicate region status through interpolative cells + labelList cellRegionType(UIndirectList<label>(regionType, cellRegion)); + map.distribute(cellRegionType); + + DebugInfo<< FUNCTION_NAME << " : Interpolated region type" << endl; + + + + label nChanged = 0; + forAll(pbm, patchI) + { + const fvPatch& fvp = pbm[patchI]; + + if (isA<oversetFvPatch>(fvp)) + { + const labelUList& fc = fvp.faceCells(); + forAll(fc, i) + { + label cellI = fc[i]; + label regionI = cellRegion[cellI]; + + if (regionType[regionI] != 2) + { + const labelList& slots = compactStencil[cellI]; + forAll(slots, i) + { + label otherType = cellRegionType[slots[i]]; + + if (otherType == 2) + { + //Pout<< "Reachable through interpolation : " + // << regionI << " at cell " + // << mesh.cellCentres()[cellI] << endl; + regionType[regionI] = 2; + nChanged++; + break; + } + } + } + } + } + } + + reduce(nChanged, sumOp<label>()); + DebugInfo<< FUNCTION_NAME << " : Determined regions changed : " + << nChanged << endl; + + if (nChanged == 0) + { + break; + } + } + + + // See which regions have not been visited (regionType == 1) + forAll(cellRegion, cellI) + { + label type = regionType[cellRegion[cellI]]; + if (type == 1 && cellTypes[cellI] != HOLE) + { + cellTypes[cellI] = HOLE; + } + } + DebugInfo<< FUNCTION_NAME << " : Finished hole flood filling" << endl; +} + + +void Foam::cellCellStencils::inverseDistance::seedCell +( + const label cellI, + const scalar wantedFraction, + PackedBoolList& isFront, + scalarField& fraction +) const +{ + const cell& cFaces = mesh_.cells()[cellI]; + forAll(cFaces, i) + { + label nbrFacei = cFaces[i]; + if (fraction[nbrFacei] < wantedFraction) + { + fraction[nbrFacei] = wantedFraction; + isFront.set(nbrFacei); + } + } +} + + +void Foam::cellCellStencils::inverseDistance::walkFront +( + const scalar layerRelax, + const labelListList& allStencil, + labelList& allCellTypes, + scalarField& allWeight +) const +{ + // Current front + PackedBoolList isFront(mesh_.nFaces()); + + const fvBoundaryMesh& fvm = mesh_.boundary(); + + + // 'overset' patches + + forAll(fvm, patchI) + { + if (isA<oversetFvPatch>(fvm[patchI])) + { + forAll(fvm[patchI], i) + { + isFront[fvm[patchI].start()+i] = true; + } + } + } + + + // Outside of 'hole' region + { + const labelList& own = mesh_.faceOwner(); + const labelList& nei = mesh_.faceNeighbour(); + + for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++) + { + label ownType = allCellTypes[own[faceI]]; + label neiType = allCellTypes[nei[faceI]]; + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + //Pout<< "Front at face:" << faceI + // << " at:" << mesh_.faceCentres()[faceI] << endl; + isFront[faceI] = true; + } + } + + labelList nbrCellTypes; + syncTools::swapBoundaryCellList(mesh_, allCellTypes, nbrCellTypes); + + for + ( + label faceI = mesh_.nInternalFaces(); + faceI < mesh_.nFaces(); + faceI++ + ) + { + label ownType = allCellTypes[own[faceI]]; + label neiType = nbrCellTypes[faceI-mesh_.nInternalFaces()]; + + if + ( + (ownType == HOLE && neiType != HOLE) + || (ownType != HOLE && neiType == HOLE) + ) + { + //Pout<< "Front at coupled face:" << faceI + // << " at:" << mesh_.faceCentres()[faceI] << endl; + isFront[faceI] = true; + } + } + } + + + // Current interpolation fraction + scalarField fraction(mesh_.nFaces(), 0.0); + + forAll(isFront, faceI) + { + if (isFront[faceI]) + { + fraction[faceI] = 1.0; + } + } + + + while (returnReduce(isFront.count(), sumOp<label>())) + { + // Interpolate cells on front + PackedBoolList newIsFront(mesh_.nFaces()); + scalarField newFraction(fraction); + forAll(isFront, faceI) + { + if (isFront[faceI]) + { + label own = mesh_.faceOwner()[faceI]; + if (allCellTypes[own] != HOLE) + { + if (allWeight[own] < fraction[faceI]) + { + // Cell wants to become interpolated (if sufficient + // stencil, otherwise becomes hole) + if (allStencil[own].size()) + { + allWeight[own] = fraction[faceI]; + allCellTypes[own] = INTERPOLATED; + // Add faces of cell (with lower weight) as new + // front + seedCell + ( + own, + fraction[faceI]-layerRelax, + newIsFront, + newFraction + ); + } + else + { + allWeight[own] = 0.0; + allCellTypes[own] = HOLE; + // Add faces of cell as new front + seedCell + ( + own, + 1.0, + newIsFront, + newFraction + ); + } + } + } + if (mesh_.isInternalFace(faceI)) + { + label nei = mesh_.faceNeighbour()[faceI]; + if (allCellTypes[nei] != HOLE) + { + if (allWeight[nei] < fraction[faceI]) + { + if (allStencil[nei].size()) + { + allWeight[nei] = fraction[faceI]; + allCellTypes[nei] = INTERPOLATED; + seedCell + ( + nei, + fraction[faceI]-layerRelax, + newIsFront, + newFraction + ); + } + else + { + allWeight[nei] = 0.0; + allCellTypes[nei] = HOLE; + seedCell + ( + nei, + 1.0, + newIsFront, + newFraction + ); + } + } + } + } + } + } + + syncTools::syncFaceList(mesh_, newIsFront, orEqOp<unsigned int>()); + syncTools::syncFaceList(mesh_, newFraction, maxEqOp<scalar>()); + + isFront.transfer(newIsFront); + fraction.transfer(newFraction); + } +} + + +void Foam::cellCellStencils::inverseDistance::calcStencilWeights +( + const point& sample, + const pointList& donorCcs, + scalarList& weights +) +{ + // Inverse-distance weighting + + weights.setSize(donorCcs.size()); + scalar sum = 0.0; + forAll(donorCcs, i) + { + scalar d = mag(sample-donorCcs[i]); + + if (d > ROOTVSMALL) + { + weights[i] = 1.0/d; + sum += weights[i]; + } + else + { + // Short circuit + weights = 0.0; + weights[i] = 1.0; + return; + } + } + forAll(weights, i) + { + weights[i] /= sum; + } +} + + +void Foam::cellCellStencils::inverseDistance::createStencil +( + const globalIndex& globalCells +) +{ + // Send cell centre back to donor + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // The complication is that multiple acceptors need the same donor + // (but with different weights obviously) + // So we do multi-pass: + // - send over cc of acceptor for which we want stencil. + // Consistenly choose the acceptor with smallest magSqr in case of + // multiple acceptors for the containing cell/donor. + // - find the cell-cells and weights for the donor + // - send back together with the acceptor cc + // - use the acceptor cc to see if it was 'me' that sent it. If so + // mark me as complete so it doesn't get involved in the next loop. + // - loop until all resolved. + + // Special value for unused points + const vector greatPoint(GREAT, GREAT, GREAT); + + // Has acceptor been handled already? + PackedBoolList doneAcceptor(interpolationCells_.size()); + + while (true) + { + pointField samples(cellInterpolationMap_.constructSize(), greatPoint); + + // Fill remote slots (override old content). We'll find out later + // on which one has won and mark this one in doneAcceptor. + label nSamples = 0; + forAll(interpolationCells_, i) + { + if (!doneAcceptor[i]) + { + label cellI = interpolationCells_[i]; + const point& cc = mesh_.cellCentres()[cellI]; + const labelList& slots = cellStencil_[cellI]; + + if (slots.size() != 1) + { + FatalErrorInFunction<< "Problem:" << slots + << abort(FatalError); + } + + forAll(slots, slotI) + { + label elemI = slots[slotI]; + //Pout<< " acceptor:" << cellI + // << " at:" << mesh_.cellCentres()[cellI] + // << " global:" << globalCells.toGlobal(cellI) + // << " foudn in donor:" << elemI << endl; + minMagSqrEqOp<point>()(samples[elemI], cc); + } + nSamples++; + } + } + + + if (returnReduce(nSamples, sumOp<label>()) == 0) + { + break; + } + + // Send back to donor. Make sure valid point takes priority + mapDistributeBase::distribute<point, minMagSqrEqOp<point>, flipOp> + ( + Pstream::commsTypes::nonBlocking, + List<labelPair>(), + mesh_.nCells(), + cellInterpolationMap_.constructMap(), + false, + cellInterpolationMap_.subMap(), + false, + samples, + minMagSqrEqOp<point>(), + flipOp(), // negateOp + greatPoint // nullValue + ); + + // All the donor cells will now have a valid cell centre. Construct a + // stencil for these. + + DynamicList<label> donorCells(mesh_.nCells()); + forAll(samples, cellI) + { + if (samples[cellI] != greatPoint) + { + donorCells.append(cellI); + } + } + + + // Get neighbours (global cell and centre) of donorCells. + labelListList donorCellCells(mesh_.nCells()); + pointListList donorCellCentres(mesh_.nCells()); + globalCellCells + ( + globalCells, + mesh_, + donorCells, + donorCellCells, + donorCellCentres + ); + + // Determine the weights. + scalarListList donorWeights(mesh_.nCells()); + forAll(donorCells, i) + { + label cellI = donorCells[i]; + const pointList& donorCentres = donorCellCentres[cellI]; + calcStencilWeights + ( + samples[cellI], + donorCentres, + donorWeights[cellI] + ); + } + + // Transfer the information back to the acceptor: + // - donorCellCells : stencil (with first element the original donor) + // - donorWeights : weights for donorCellCells + cellInterpolationMap_.distribute(donorCellCells); + cellInterpolationMap_.distribute(donorWeights); + cellInterpolationMap_.distribute(samples); + + // Check which acceptor has won and transfer + forAll(interpolationCells_, i) + { + if (!doneAcceptor[i]) + { + label cellI = interpolationCells_[i]; + const labelList& slots = cellStencil_[cellI]; + + if (slots.size() != 1) + { + FatalErrorInFunction << "Problem:" << slots + << abort(FatalError); + } + + label slotI = slots[0]; + + // Important: check if the stencil is actually for this cell + if (samples[slotI] == mesh_.cellCentres()[cellI]) + { + cellStencil_[cellI].transfer(donorCellCells[slotI]); + cellInterpolationWeights_[cellI].transfer + ( + donorWeights[slotI] + ); + // Mark cell as being done so it does not get sent over + // again. + doneAcceptor[i] = true; + } + } + } + } + + // Re-do the mapDistribute + List<Map<label> > compactMap; + mapDistribute map(globalCells, cellStencil_, compactMap); + cellInterpolationMap_.transfer(map); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellCellStencils::inverseDistance::inverseDistance +( + const fvMesh& mesh, + const dictionary& dict, + const bool doUpdate +) +: + cellCellStencil(mesh), + dict_(dict), + cellTypes_(labelList(mesh.nCells(), CALCULATED)), + interpolationCells_(0), + cellInterpolationMap_(), + cellStencil_(0), + cellInterpolationWeights_(0), + cellInterpolationWeight_ + ( + IOobject + ( + "cellInterpolationWeight", + mesh_.facesInstance(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ) +{ + if (doUpdate) + { + update(); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellCellStencils::inverseDistance::~inverseDistance() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::cellCellStencils::inverseDistance::update() +{ + scalar layerRelax(dict_.lookupOrDefault("layerRelax", 1.0)); + + const labelIOList& zoneID = this->zoneID(); + + label nZones = gMax(zoneID)+1; + labelList nCellsPerZone(nZones, 0); + forAll(zoneID, cellI) + { + nCellsPerZone[zoneID[cellI]]++; + } + Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>()); + Pstream::listCombineScatter(nCellsPerZone); + + + const boundBox& allBb(mesh_.bounds()); + + + PtrList<fvMeshSubset> meshParts(nZones); + List<treeBoundBoxList> meshBb(nZones); + + // Determine zone meshes and bounding boxes + { + // Per processor, per zone the bounding box + List<treeBoundBoxList> procBb(Pstream::nProcs()); + procBb[Pstream::myProcNo()].setSize(nZones); + + forAll(nCellsPerZone, zoneI) + { + meshParts.set(zoneI, new fvMeshSubset(mesh_)); + meshParts[zoneI].setLargeCellSubset(zoneID, zoneI); + const fvMesh& subMesh = meshParts[zoneI].subMesh(); + + // Trigger early evaluation of mesh dimension (in case there are + // zero cells in mesh) + (void)subMesh.nGeometricD(); + + if (subMesh.nPoints()) + { + procBb[Pstream::myProcNo()][zoneI] = + treeBoundBox(subMesh.points()); + procBb[Pstream::myProcNo()][zoneI].inflate(1e-6); + } + else + { + // No part of zone on this processor. Make up bb. + procBb[Pstream::myProcNo()][zoneI] = treeBoundBox + ( + allBb.min() - 2*allBb.span(), + allBb.min() - allBb.span() + ); + procBb[Pstream::myProcNo()][zoneI].inflate(1e-6); + } + } + + Pstream::gatherList(procBb); + Pstream::scatterList(procBb); + + // Move local bounding boxes to per-mesh indexing + forAll(meshBb, zoneI) + { + treeBoundBoxList& bbs = meshBb[zoneI]; + bbs.setSize(Pstream::nProcs()); + forAll(procBb, procI) + { + bbs[procI] = procBb[procI][zoneI]; + } + } + } + + + // Determine patch bounding boxes. These are either global and provided + // by the user or processor-local as a copy of the mesh bounding box. + + List<treeBoundBoxList> patchBb(nZones); + List<labelVector> patchDivisions(nZones); + PtrList<PackedList<2>> patchParts(nZones); + labelList allPatchTypes(mesh_.nCells(), OTHER); + + { + treeBoundBox globalPatchBb; + if (dict_.readIfPresent("searchBox", globalPatchBb)) + { + // All processors, all zones have the same bounding box + patchBb = treeBoundBoxList(Pstream::nProcs(), globalPatchBb); + } + else + { + // Use the meshBb (differing per zone, per processor) + patchBb = meshBb; + } + } + + { + labelVector globalDivs; + if (dict_.readIfPresent("searchBoxDivisions", globalDivs)) + { + patchDivisions = globalDivs; + } + else + { + const labelVector& dim = mesh_.geometricD(); + label nDivs = -1; + if (mesh_.nGeometricD() == 1) + { + nDivs = mesh_.nCells(); + } + else if (mesh_.nGeometricD() == 2) + { + nDivs = label(Foam::sqrt(scalar(mesh_.nCells()))); + } + else + { + nDivs = label(Foam::cbrt(scalar(mesh_.nCells()))); + } + + labelVector v(nDivs, nDivs, nDivs); + forAll(dim, i) + { + if (dim[i] == -1) + { + v[i] = 1; + } + } + patchDivisions = v; + } + } + + forAll(patchParts, zoneI) + { + patchParts.set + ( + zoneI, + new PackedList<2> + ( + patchDivisions[zoneI][0] + *patchDivisions[zoneI][1] + *patchDivisions[zoneI][2] + ) + ); + markBoundaries + ( + meshParts[zoneI].subMesh(), + + patchBb[zoneI][Pstream::myProcNo()], + patchDivisions[zoneI], + patchParts[zoneI], + + meshParts[zoneI].cellMap(), + allPatchTypes + ); + } + + + // Print a bit + { + Info<< typeName << " : detected " << nZones + << " mesh regions" << endl; + Info<< incrIndent; + forAll(nCellsPerZone, zoneI) + { + Info<< indent<< "zone:" << zoneI + << " nCells:" << nCellsPerZone[zoneI] + << " voxels:" << patchDivisions[zoneI] + << " bb:" << patchBb[zoneI][Pstream::myProcNo()] + << endl; + } + Info<< decrIndent; + } + + + // Current best guess for cells. Includes best stencil. Weights should + // add up to volume. + labelList allCellTypes(mesh_.nCells(), CALCULATED); + labelListList allStencil(mesh_.nCells()); + // zoneID of donor + labelList allDonorID(mesh_.nCells(), -1); + + const globalIndex globalCells(mesh_.nCells()); + + PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking); + + for (label srcI = 0; srcI < meshParts.size()-1; srcI++) + { + for (label tgtI = srcI+1; tgtI < meshParts.size(); tgtI++) + { + markPatchesAsHoles + ( + pBufs, + + meshParts, + + patchBb, + patchDivisions, + patchParts, + + srcI, + tgtI, + allCellTypes + ); + markPatchesAsHoles + ( + pBufs, + + meshParts, + + patchBb, + patchDivisions, + patchParts, + + tgtI, + srcI, + allCellTypes + ); + + markDonors + ( + globalCells, + pBufs, + meshParts, + meshBb, + + tgtI, + srcI, + allStencil, + allDonorID + ); + markDonors + ( + globalCells, + pBufs, + meshParts, + meshBb, + + srcI, + tgtI, + allStencil, + allDonorID + ); + } + } + + + // Use the patch types and weights to decide what to do + forAll(allPatchTypes, cellI) + { + if (allCellTypes[cellI] != HOLE) + { + switch (allPatchTypes[cellI]) + { + case OVERSET: + { + // Require interpolation. See if possible. + + if (allStencil[cellI].size()) + { + allCellTypes[cellI] = INTERPOLATED; + } + else + { + allCellTypes[cellI] = HOLE; + } + } + } + } + } + + + // Mark unreachable bits + findHoles(globalCells, mesh_, zoneID, allStencil, allCellTypes); + + + // Add buffer interpolation layer(s) around holes + scalarField allWeight(mesh_.nCells(), 0.0); + walkFront(layerRelax, allStencil, allCellTypes, allWeight); + + + // Convert cell-cell addressing to stencil in compact notation + + cellTypes_.transfer(allCellTypes); + cellStencil_.setSize(mesh_.nCells()); + cellInterpolationWeights_.setSize(mesh_.nCells()); + DynamicList<label> interpolationCells; + forAll(cellTypes_, cellI) + { + if (cellTypes_[cellI] == INTERPOLATED) + { + cellStencil_[cellI].transfer(allStencil[cellI]); + cellInterpolationWeights_[cellI].setSize(1); + cellInterpolationWeights_[cellI][0] = 1.0; + interpolationCells.append(cellI); + } + else + { + cellStencil_[cellI].clear(); + cellInterpolationWeights_[cellI].clear(); + } + } + interpolationCells_.transfer(interpolationCells); + + List<Map<label> > compactMap; + mapDistribute map(globalCells, cellStencil_, compactMap); + cellInterpolationMap_.transfer(map); + + cellInterpolationWeight_.transfer(allWeight); + cellInterpolationWeight_.correctBoundaryConditions(); + + + if (debug&2) + { + // Dump stencil + mkDir(mesh_.time().timePath()); + OBJstream str(mesh_.time().timePath()/"injectionStencil.obj"); + Pout<< typeName << " : dumping injectionStencil to " + << str.name() << endl; + pointField cc(mesh_.cellCentres()); + cellInterpolationMap_.distribute(cc); + + forAll(cellStencil_, celli) + { + const labelList& slots = cellStencil_[celli]; + if (slots.size()) + { + const point& accCc = mesh_.cellCentres()[celli]; + forAll(slots, i) + { + const point& donorCc = cc[slots[i]]; + str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc)); + } + } + } + } + + + // Extend stencil to get inverse distance weighted neighbours + createStencil(globalCells); + + + if (debug&2) + { + // Dump weight + cellInterpolationWeight_.instance() = mesh_.time().timeName(); + cellInterpolationWeight_.write(); + + // Dump cell types + volScalarField volTypes + ( + IOobject + ( + "cellTypes", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ); + + forAll(volTypes.internalField(), cellI) + { + volTypes[cellI] = cellTypes_[cellI]; + } + volTypes.correctBoundaryConditions(); + volTypes.write(); + + // Dump stencil + mkDir(mesh_.time().timePath()); + OBJstream str(mesh_.time().timePath()/"stencil.obj"); + Pout<< typeName << " : dumping to " << str.name() << endl; + pointField cc(mesh_.cellCentres()); + cellInterpolationMap_.distribute(cc); + + forAll(cellStencil_, celli) + { + const labelList& slots = cellStencil_[celli]; + if (slots.size()) + { + const point& accCc = mesh_.cellCentres()[celli]; + forAll(slots, i) + { + const point& donorCc = cc[slots[i]]; + str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc)); + } + } + } + } + + // Print some stats + { + labelList nCells(count(3, cellTypes_)); + + label nLocal = 0; + label nMixed = 0; + label nRemote = 0; + forAll(interpolationCells_, i) + { + label celli = interpolationCells_[i]; + const labelList& slots = cellStencil_[celli]; + + bool hasLocal = false; + bool hasRemote = false; + + forAll(slots, sloti) + { + if (slots[sloti] >= mesh_.nCells()) + { + hasRemote = true; + } + else + { + hasLocal = true; + } + } + + if (hasRemote) + { + if (!hasLocal) + { + nRemote++; + } + else + { + nMixed++; + } + } + else if (hasLocal) + { + nLocal++; + } + } + reduce(nLocal, sumOp<label>()); + reduce(nMixed, sumOp<label>()); + reduce(nRemote, sumOp<label>()); + + Info<< "Overset analysis : nCells : " + << returnReduce(cellTypes_.size(), sumOp<label>()) << nl + << incrIndent + << indent << "calculated : " << nCells[CALCULATED] << nl + << indent << "interpolated : " << nCells[INTERPOLATED] + << " (interpolated from local:" << nLocal + << " mixed local/remote:" << nMixed + << " remote:" << nRemote << ")" << nl + << indent << "hole : " << nCells[HOLE] << nl + << decrIndent << endl; + } + + // Tbd: detect if anything changed. Most likely it did! + return true; +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H new file mode 100644 index 00000000000..ffc9a291ef4 --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.H @@ -0,0 +1,334 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::cellCellStencils::inverseDistance + +Description + Inverse-distance-weighted interpolation stencil. + + hole finding: + - mark boundary faces on helper (voxel) mesh + - mark any cell overlaying these voxels + - use flood filling to find any unreachable cell + Alternative is to use an octree of the boundary faces and determine + directly for all cells whether we are outside. Might be slow though. + +SourceFiles + inverseDistanceCellCellStencil.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellCellStencils_inverseDistance_H +#define cellCellStencils_inverseDistance_H + +#include "cellCellStencil.H" +#include "volFields.H" +#include "labelVector.H" +#include "treeBoundBoxList.H" +#include "pointList.H" +#include "globalIndex.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class fvMeshSubset; + +namespace cellCellStencils +{ + +/*---------------------------------------------------------------------------*\ + Class inverseDistance Declaration +\*---------------------------------------------------------------------------*/ + +class inverseDistance +: + public cellCellStencil +{ +protected: + + // Protected data + + //- Dictionary of motion control parameters + const dictionary dict_; + + //- Per cell the cell type + labelList cellTypes_; + + //- Indices of interpolated cells + labelList interpolationCells_; + + //- Fetch interpolated cells + mapDistribute cellInterpolationMap_; + + //- Interpolation stencil + labelListList cellStencil_; + + //- Interpolation weights + scalarListList cellInterpolationWeights_; + + //- Amount of interpolation + volScalarField cellInterpolationWeight_; + + + // Protected Member Functions + + // Voxel representation + + //- Convert ijk indices into single index + static label index(const labelVector& nDivs, const labelVector&); + + //- Convert single index into ijk + static labelVector index3(const labelVector& nDivs, const label); + + //- Convert coordinate into ijk + static labelVector index3 + ( + const boundBox& bb, + const labelVector& nDivs, + const point& pt + ); + + //- Convert index back into coordinate + static point position + ( + const boundBox& bb, + const labelVector& nDivs, + const label boxI + ); + + //- Fill all elements overlapping subBb with value val + static void fill + ( + PackedList<2>& elems, + const boundBox& bb, + const labelVector& nDivs, + const boundBox& subBb, + const unsigned int val + ); + + //- Is any voxel inside subBb set to val + static bool overlaps + ( + const boundBox& bb, + const labelVector& nDivs, + const PackedList<2>& voxels, + const treeBoundBox& subBb, + const unsigned int val + ); + + //- Mark voxels of patchTypes with type of patch face + static void markBoundaries + ( + const fvMesh& mesh, + const boundBox& bb, + const labelVector& nDivs, + PackedList<2>& patchTypes, + const labelList& cellMap, + labelList& patchCellTypes + ); + + //- Calculate bounding box of cell + static treeBoundBox cellBb + ( + const primitiveMesh& mesh, + const label celli + ); + + //- Mark all cells overlapping (a voxel covered by) a src patch + // with type HOLE + void markPatchesAsHoles + ( + PstreamBuffers& pBufs, + + // Mesh bb and data + const PtrList<fvMeshSubset>& meshParts, + + // Helper mesh for patches + const List<treeBoundBoxList>& patchBb, + const List<labelVector>& patchDivisions, + const PtrList<PackedList<2>>& patchParts, + + const label srcI, + const label tgtI, + labelList& allCellTypes + ) const; + + //- Determine donors for all tgt cells + void markDonors + ( + const globalIndex& globalCells, + PstreamBuffers& pBufs, + const PtrList<fvMeshSubset>& meshParts, + const List<treeBoundBoxList>& meshBb, + + const label srcI, + const label tgtI, + labelListList& allStencil, + labelList& allDonor + ) const; + + //- Replacement of regionSplit + void uncompactedRegionSplit + ( + const fvMesh& mesh, + const globalIndex& globalFaces, + const label nZones, + const labelList& zoneID, + const labelList& cellTypes, + const boolList& isBlockedFace, + labelList& cellRegion + ) const; + autoPtr<globalIndex> compactedRegionSplit + ( + const fvMesh& mesh, + const globalIndex& globalFaces, + labelList& cellRegion + ) const; + + //- Do flood filling to detect unreachable (from patches) sections + // of mesh + void findHoles + ( + const globalIndex& globalCells, + const fvMesh& mesh, + const labelList& zoneID, + const labelListList& stencil, + labelList& cellTypes + ) const; + + //- Seed faces of cell with wantedFraction (if higher than current) + void seedCell + ( + const label cellI, + const scalar wantedFraction, + PackedBoolList& isFront, + scalarField& fraction + ) const; + + //- Surround holes with layer(s) of interpolated cells + void walkFront + ( + const scalar layerRelax, + const labelListList& allStencil, + labelList& allCellTypes, + scalarField& allWeight + ) const; + + + //- Calculate inverse distance weights + static void calcStencilWeights + ( + const point& sample, + const pointList& donorCcs, + scalarList& weights + ); + + //- Create stencil starting from the donor containing the acceptor + virtual void createStencil(const globalIndex&); + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + inverseDistance(const inverseDistance&); + + //- Disallow default bitwise assignment + void operator=(const inverseDistance&); + + +public: + + //- Runtime type information + TypeName("inverseDistance"); + + + // Constructors + + //- Construct from fvMesh + inverseDistance(const fvMesh&, const dictionary&, const bool); + + + //- Destructor + virtual ~inverseDistance(); + + + // Member Functions + + //- Update stencils. Return false if nothing changed. + virtual bool update(); + + //- Return the cell type list + virtual const labelUList& cellTypes() const + { + return cellTypes_; + } + + //- Indices of interpolated cells + virtual const labelUList& interpolationCells() const + { + return interpolationCells_; + } + + //- Return a communication schedule + virtual const mapDistribute& cellInterpolationMap() const + { + return cellInterpolationMap_; + } + + //- Per interpolated cell the neighbour cells (in terms of slots as + // constructed by above cellInterpolationMap) to interpolate + virtual const labelListList& cellStencil() const + { + return cellStencil_; + } + + //- Weights for cellStencil + virtual const scalarListList& cellInterpolationWeights() const + { + return cellInterpolationWeights_; + } + + //- Per interpolated cell the interpolation factor. (0 = use + // calculated, 1 = use interpolated) + virtual const scalarList& cellInterpolationWeight() const + { + return cellInterpolationWeight_; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace cellCellStencils +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshData.C b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.C new file mode 100644 index 00000000000..1d755ae78a5 --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.C @@ -0,0 +1,50 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "meshToMeshData.H" + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<< +( + Foam::Ostream& os, + const Foam::meshToMeshData& wDist +) +{ + return os << wDist.tgtCelli_; +} + + +Foam::Istream& Foam::operator>> +( + Foam::Istream& is, + Foam::meshToMeshData& wDist +) +{ + return is >> wDist.tgtCelli_; +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H new file mode 100644 index 00000000000..0b252bbee05 --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshData.H @@ -0,0 +1,248 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::meshToMeshData + +Description + Transfers refinement levels such that slow transition between levels is + maintained. Used in FaceCellWave. + +SourceFiles + meshToMeshDataI.H + meshToMeshData.C + +\*---------------------------------------------------------------------------*/ + +#ifndef meshToMeshData_H +#define meshToMeshData_H + +#include "point.H" +#include "tensor.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class polyPatch; +class polyMesh; + + +// Forward declaration of friend functions and operators + +class meshToMeshData; + +Istream& operator>>(Istream&, meshToMeshData&); +Ostream& operator<<(Ostream&, const meshToMeshData&); + + +/*---------------------------------------------------------------------------*\ + Class meshToMeshData Declaration +\*---------------------------------------------------------------------------*/ + +class meshToMeshData +{ +public: + + //- Class used to pass non-cell data to the update function + class trackData + { + public: + + const polyMesh& tgtMesh_; + + + // Constructors + + trackData(const polyMesh& tgtMesh) + : + tgtMesh_(tgtMesh) + {} + + }; + + + // Private data + + // Corresponding cell in tgtMesh + label tgtCelli_; + + +public: + + // Constructors + + //- Construct null + inline meshToMeshData(); + + //- Construct from count + inline meshToMeshData + ( + const label tgtCelli + ); + + + // Member Functions + + // Access + + inline label tgtCell() const + { + return tgtCelli_; + } + + inline label& tgtCell() + { + return tgtCelli_; + } + + + // Needed by FaceCellWave + + //- Check whether origin has been changed at all or + // still contains original (invalid) value. + template<class TrackingData> + inline bool valid(TrackingData&) const; + + //- Check for identical geometrical data. Used for cyclics checking. + template<class TrackingData> + inline bool sameGeometry + ( + const polyMesh&, + const meshToMeshData&, + const scalar, + TrackingData& + ) const; + + //- Convert any absolute coordinates into relative to (patch)face + // centre + template<class TrackingData> + inline void leaveDomain + ( + const polyMesh&, + const polyPatch&, + const label patchFacei, + const point& faceCentre, + TrackingData& + ); + + //- Reverse of leaveDomain + template<class TrackingData> + inline void enterDomain + ( + const polyMesh&, + const polyPatch&, + const label patchFacei, + const point& faceCentre, + TrackingData& + ); + + //- Apply rotation matrix to any coordinates + template<class TrackingData> + inline void transform + ( + const polyMesh&, + const tensor&, + TrackingData& + ); + + //- Influence of neighbouring face. + template<class TrackingData> + inline bool updateCell + ( + const polyMesh&, + const label thisCelli, + const label neighbourFacei, + const meshToMeshData& neighbourInfo, + const scalar tol, + TrackingData& + ); + + //- Influence of neighbouring cell. + template<class TrackingData> + inline bool updateFace + ( + const polyMesh&, + const label thisFacei, + const label neighbourCelli, + const meshToMeshData& neighbourInfo, + const scalar tol, + TrackingData& + ); + + //- Influence of different value on same face. + template<class TrackingData> + inline bool updateFace + ( + const polyMesh&, + const label thisFacei, + const meshToMeshData& neighbourInfo, + const scalar tol, + TrackingData& + ); + + //- Same (like operator==) + template<class TrackingData> + inline bool equal + ( + const meshToMeshData&, + TrackingData& + ) const; + + // Member Operators + + // Needed for List IO + inline bool operator==(const meshToMeshData&) const; + + inline bool operator!=(const meshToMeshData&) const; + + + // IOstream Operators + + friend Ostream& operator<<(Ostream&, const meshToMeshData&); + friend Istream& operator>>(Istream&, meshToMeshData&); +}; + + +//- Data associated with meshToMeshData type are contiguous +template<> +inline bool contiguous<meshToMeshData>() +{ + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "meshToMeshDataI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H b/src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H new file mode 100644 index 00000000000..5bc0923fdf6 --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/meshToMeshDataI.H @@ -0,0 +1,242 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "polyMesh.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Null constructor +inline Foam::meshToMeshData::meshToMeshData() +: + tgtCelli_(-2) +{} + + +// Construct from components +inline Foam::meshToMeshData::meshToMeshData(const label tgtCelli) +: + tgtCelli_(tgtCelli) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class TrackingData> +inline bool Foam::meshToMeshData::valid(TrackingData& td) const +{ + return tgtCelli_ != -2; +} + + +// No geometric data so never any problem on cyclics +template<class TrackingData> +inline bool Foam::meshToMeshData::sameGeometry +( + const polyMesh&, + const meshToMeshData&, + const scalar, + TrackingData& td +) const +{ + return true; +} + + +template<class TrackingData> +inline void Foam::meshToMeshData::leaveDomain +( + const polyMesh&, + const polyPatch& patch, + const label patchFacei, + const point& faceCentre, + TrackingData& td +) +{} + + +template<class TrackingData> +inline void Foam::meshToMeshData::transform +( + const polyMesh&, + const tensor& rotTensor, + TrackingData& td +) +{} + + +// Update absolute geometric quantities. +template<class TrackingData> +inline void Foam::meshToMeshData::enterDomain +( + const polyMesh&, + const polyPatch& patch, + const label patchFacei, + const point& faceCentre, + TrackingData& td +) +{} + + +// Update cell with neighbouring face information +template<class TrackingData> +inline bool Foam::meshToMeshData::updateCell +( + const polyMesh& mesh, + const label thisCelli, + const label neighbourFacei, + const meshToMeshData& neighbourInfo, + const scalar tol, + TrackingData& td +) +{ + if (!valid(td)) + { + const point& cc = mesh.cellCentres()[thisCelli]; + + // See if we are in the neighbour + label tgti = neighbourInfo.tgtCelli_; + + // Try match of neighbour + if (td.tgtMesh_.pointInCell(cc, tgti, polyMesh::CELL_TETS)) + { + tgtCelli_ = tgti; + return true; + } + + // Try match of neighbour's neighbours + const labelList& tgtNbrs = td.tgtMesh_.cellCells(tgti); + forAll(tgtNbrs, i) + { + label tgti = tgtNbrs[i]; + + // Try match of neighbour + if (td.tgtMesh_.pointInCell(cc, tgti, polyMesh::CELL_TETS)) + { + tgtCelli_ = tgti; + return true; + } + } + + // Leave unmatched cell for visit from different face + } + return false; +} + + +// Update face with neighbouring cell information +template<class TrackingData> +inline bool Foam::meshToMeshData::updateFace +( + const polyMesh& mesh, + const label thisFacei, + const label neighbourCelli, + const meshToMeshData& neighbourInfo, + const scalar tol, + TrackingData& td +) +{ + if (!valid(td)) + { + tgtCelli_ = neighbourInfo.tgtCelli_; + return true; + } + else + { + return false; + } +} + + +// Update face with coupled face information +template<class TrackingData> +inline bool Foam::meshToMeshData::updateFace +( + const polyMesh& mesh, + const label thisFacei, + const meshToMeshData& neighbourInfo, + const scalar tol, + TrackingData& td +) +{ + if (!valid(td)) + { + tgtCelli_ = neighbourInfo.tgtCelli_; + return true; + } + else + { + return false; + } +} + + +template<class TrackingData> +inline bool Foam::meshToMeshData::equal +( + const meshToMeshData& rhs, + TrackingData& td +) const +{ + if (!valid(td)) + { + if (!rhs.valid(td)) + { + return true; + } + else + { + return false; + } + } + else + { + return operator==(rhs); + } +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +inline bool Foam::meshToMeshData::operator== +( + const Foam::meshToMeshData& rhs +) + const +{ + return tgtCelli_ == rhs.tgtCelli_; +} + + +inline bool Foam::meshToMeshData::operator!= +( + const Foam::meshToMeshData& rhs +) + const +{ + return !(*this == rhs); +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/waveMethod.C b/src/overset/cellCellStencil/inverseDistance/waveMethod.C new file mode 100644 index 00000000000..e8ca6715c92 --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/waveMethod.C @@ -0,0 +1,215 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "waveMethod.H" +#include "meshToMeshData.H" +#include "FaceCellWave.H" +#include "addToRunTimeSelectionTable.H" +#include "treeDataCell.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(waveMethod, 0); + addToRunTimeSelectionTable(meshToMeshMethod, waveMethod, components); +} + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::waveMethod::calculate +( + const polyMesh& src, + const polyMesh& tgt, + labelList& srcToTgtAddr +) +{ + // If parallel running a local domain might have zero cells thus never + // constructing the face-diagonal decomposition which uses parallel + // transfers. + (void)tgt.tetBasePtIs(); + + // The actual matching is only w.r.t local cells so cannot be run in + // parallel. + const bool oldParRun = Pstream::parRun(); + Pstream::parRun() = false; + + label nSeeds = 0; + + if (tgt.nCells() == 0) + { + srcToTgtAddr.setSize(src.nCells()); + srcToTgtAddr = -1; + } + else + { + const treeBoundBox& tgtBb = tgt.cellTree().bb(); + + DynamicList<label> changedFaces(src.nFaces()/100 + 100); + DynamicList<meshToMeshData> changedFacesInfo(changedFaces.size()); + + List<meshToMeshData> cellData(src.nCells()); + List<meshToMeshData> faceData(src.nFaces()); + + meshToMeshData::trackData td(tgt); + + label startCelli = 0; + + while (true) + { + changedFaces.clear(); + changedFacesInfo.clear(); + + // Search for starting seed + for (; startCelli < src.nCells(); startCelli++) + { + if (!cellData[startCelli].valid(td)) + { + nSeeds++; + const point& cc = src.cellCentres()[startCelli]; + + if (!tgtBb.contains(cc)) + { + // Point outside local bb of tgt mesh. No need to + // search. Register as no correspondence + cellData[startCelli] = meshToMeshData(-1); + } + else + { + label tgtCelli = tgt.findCell(cc, polyMesh::CELL_TETS); + if (tgtCelli != -1) + { + // Insert any face of cell + label facei = src.cells()[startCelli][0]; + changedFaces.append(facei); + changedFacesInfo.append(meshToMeshData(tgtCelli)); + break; + } + else + { + // Register as no correspondence + cellData[startCelli] = meshToMeshData(-1); + } + } + } + } + + if (returnReduce(changedFaces.empty(), andOp<bool>())) + { + break; + } + + FaceCellWave<meshToMeshData, meshToMeshData::trackData> calc + ( + src, + changedFaces, + changedFacesInfo, + faceData, + cellData, + src.globalData().nTotalCells(), // max iterations + td + ); + } + + // Copy into srcToTgt + srcToTgtAddr.setSize(src.nCells()); + + forAll(cellData, celli) + { + srcToTgtAddr[celli] = cellData[celli].tgtCelli_; + } + } + + Pstream::parRun() = oldParRun; + + if (debug) + { + Pout<< "nSeeds:" << returnReduce(nSeeds, sumOp<label>()) + << " out of nCells:" << returnReduce(src.nCells(), sumOp<label>()) + << endl; + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::waveMethod::waveMethod +( + const polyMesh& src, + const polyMesh& tgt +) +: + meshToMeshMethod(src, tgt) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::waveMethod::~waveMethod() +{} + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::waveMethod::calculate +( + labelListList& srcToTgtAddr, + scalarListList& srcToTgtWght, + pointListList& srcToTgtVec, + labelListList& tgtToSrcAddr, + scalarListList& tgtToSrcWght, + pointListList& tgtToSrcVec +) +{ + { + labelList srcToTgt(src_.nCells()); + calculate(src_, tgt_, srcToTgt); + srcToTgtAddr.setSize(srcToTgt.size()); + srcToTgtWght.setSize(srcToTgt.size()); + forAll(srcToTgtAddr, celli) + { + srcToTgtAddr[celli].setSize(1); + srcToTgtAddr[celli][0] = srcToTgt[celli]; + srcToTgtWght[celli].setSize(1); + srcToTgtWght[celli][0] = src_.cellVolumes()[celli]; + } + } + + { + labelList tgtToSrc(tgt_.nCells()); + calculate(tgt_, src_, tgtToSrc); + tgtToSrcAddr.setSize(tgtToSrc.size()); + tgtToSrcWght.setSize(tgtToSrc.size()); + forAll(tgtToSrcAddr, celli) + { + tgtToSrcAddr[celli].setSize(1); + tgtToSrcAddr[celli][0] = tgtToSrc[celli]; + tgtToSrcWght[celli].setSize(1); + tgtToSrcWght[celli][0] = tgt_.cellVolumes()[celli]; + } + } +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/inverseDistance/waveMethod.H b/src/overset/cellCellStencil/inverseDistance/waveMethod.H new file mode 100644 index 00000000000..9ab9635bcfe --- /dev/null +++ b/src/overset/cellCellStencil/inverseDistance/waveMethod.H @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::waveMethod + +Description + Direct (one-to-one cell correspondence) mesh-to-mesh interpolation class + +SourceFiles + waveMethod.C + +\*---------------------------------------------------------------------------*/ + +#ifndef waveMethod_H +#define waveMethod_H + +#include "meshToMeshMethod.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class waveMethod Declaration +\*---------------------------------------------------------------------------*/ + +class waveMethod +: + public meshToMeshMethod +{ + // Private member functions + + //- Disallow default bitwise copy construct + waveMethod(const waveMethod&); + + //- Disallow default bitwise assignment + void operator=(const waveMethod&); + + +public: + + //- Run-time type information + TypeName("wave"); + + //- Construct from source and target meshes + waveMethod(const polyMesh& src, const polyMesh& tgt); + + //- Destructor + virtual ~waveMethod(); + + + // Member Functions + + // Evaluate + + //- Calculate addressing + static void calculate + ( + const polyMesh& src, + const polyMesh& tgt, + labelList& srcToTgtAddr + ); + + //- Calculate addressing and weights and optionally offset vectors + virtual void calculate + ( + labelListList& srcToTgtAddr, + scalarListList& srcToTgtWght, + pointListList& srcToTgtVec, + labelListList& tgtToSrcAddr, + scalarListList& tgtToSrcWght, + pointListList& tgtToSrcVec + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C new file mode 100644 index 00000000000..ed4e2e251ee --- /dev/null +++ b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C @@ -0,0 +1,930 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify i + 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 "trackingInverseDistanceCellCellStencil.H" +#include "addToRunTimeSelectionTable.H" +#include "OBJstream.H" +#include "Time.H" +#include "fvMeshSubset.H" +#include "globalIndex.H" +#include "oversetFvPatch.H" +#include "zeroGradientFvPatchFields.H" +#include "syncTools.H" +#include "treeBoundBoxList.H" +#include "voxelMeshSearch.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace cellCellStencils +{ + defineTypeNameAndDebug(trackingInverseDistance, 0); + addToRunTimeSelectionTable(cellCellStencil, trackingInverseDistance, mesh); +} +} + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::cellCellStencils::trackingInverseDistance::markBoundaries +( + const fvMesh& mesh, + + const boundBox& bb, + const labelVector& nDivs, + PackedList<2>& patchTypes, + + const labelList& cellMap, + labelList& patchCellTypes +) +{ + // Mark all voxels that overlap the bounding box of any patch + + const fvBoundaryMesh& pbm = mesh.boundary(); + + patchTypes = patchCellType::OTHER; + + // Mark wall boundaries + forAll(pbm, patchi) + { + const fvPatch& fvp = pbm[patchi]; + const labelList& fc = fvp.faceCells(); + + if (!fvPatch::constraintType(fvp.type())) + { + //Info<< "Marking cells on proper patch " << fvp.name() + // << " with type " << fvp.type() << endl; + const polyPatch& pp = fvp.patch(); + forAll(pp, i) + { + // Mark in overall patch types + patchCellTypes[cellMap[fc[i]]] = patchCellType::PATCH; + + // Mark in voxel mesh + boundBox faceBb(pp.points(), pp[i], false); + if (bb.overlaps(faceBb)) + { + voxelMeshSearch::fill + ( + patchTypes, + bb, + nDivs, + faceBb, + patchCellType::PATCH + ); + } + } + } + } + + // Override with overset boundaries + forAll(pbm, patchi) + { + const fvPatch& fvp = pbm[patchi]; + const labelList& fc = fvp.faceCells(); + + if (isA<oversetFvPatch>(fvp)) + { + //Info<< "Marking cells on overset patch " << fvp.name() << endl; + const polyPatch& pp = fvp.patch(); + forAll(pp, i) + { + // Mark in overall patch types + patchCellTypes[cellMap[fc[i]]] = patchCellType::OVERSET; + + // Mark in voxel mesh + boundBox faceBb(pp.points(), pp[i], false); + if (bb.overlaps(faceBb)) + { + voxelMeshSearch::fill + ( + patchTypes, + bb, + nDivs, + faceBb, + patchCellType::OVERSET + ); + } + } + } + } +} + + +void Foam::cellCellStencils::trackingInverseDistance::markPatchesAsHoles +( + PstreamBuffers& pBufs, + const List<treeBoundBoxList>& patchBb, + const List<labelVector>& patchDivisions, + const PtrList<PackedList<2>>& patchParts, + + const label srcI, + const label tgtI, + labelList& allCellTypes +) const +{ + const pointField& allPoints = mesh_.points(); + const labelListList& allCellPoints = mesh_.cellPoints(); + + const treeBoundBoxList& srcPatchBbs = patchBb[srcI]; + const treeBoundBoxList& tgtPatchBbs = patchBb[tgtI]; + const labelList& tgtCellMap = meshParts_[tgtI].cellMap(); + + // 1. do processor-local src-tgt patch overlap + { + const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()]; + const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()]; + + if (srcPatchBb.overlaps(tgtPatchBb)) + { + const PackedList<2>& srcPatchTypes = patchParts[srcI]; + const labelVector& srcDivs = patchDivisions[srcI]; + + forAll(tgtCellMap, tgtCelli) + { + label celli = tgtCellMap[tgtCelli]; + + if + ( + voxelMeshSearch::overlaps + ( + srcPatchBb, + srcDivs, + boundBox(allPoints, allCellPoints[celli], false), + srcPatchTypes, + static_cast<unsigned int>(patchCellType::PATCH) + ) + ) + { + allCellTypes[celli] = HOLE; + } + } + } + } + + + // 2. Send over srcMesh bits that overlap tgt and do calculation + pBufs.clear(); + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + if (procI != Pstream::myProcNo()) + { + const treeBoundBox& srcPatchBb = srcPatchBbs[Pstream::myProcNo()]; + const treeBoundBox& tgtPatchBb = tgtPatchBbs[procI]; + + if (srcPatchBb.overlaps(tgtPatchBb)) + { + // Send over complete patch voxel map. Tbd: could + // subset + UOPstream os(procI, pBufs); + os << srcPatchBb << patchDivisions[srcI] << patchParts[srcI]; + } + } + } + pBufs.finishedSends(); + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + if (procI != Pstream::myProcNo()) + { + const treeBoundBox& srcPatchBb = srcPatchBbs[procI]; + const treeBoundBox& tgtPatchBb = tgtPatchBbs[Pstream::myProcNo()]; + + if (srcPatchBb.overlaps(tgtPatchBb)) + { + UIPstream is(procI, pBufs); + { + treeBoundBox receivedBb(is); + if (srcPatchBb != receivedBb) + { + FatalErrorInFunction + << "proc:" << procI + << " srcPatchBb:" << srcPatchBb + << " receivedBb:" << receivedBb + << exit(FatalError); + } + } + const labelVector srcDivs(is); + const PackedList<2> srcPatchTypes(is); + + forAll(tgtCellMap, tgtCelli) + { + label celli = tgtCellMap[tgtCelli]; + if + ( + voxelMeshSearch::overlaps + ( + srcPatchBb, + srcDivs, + boundBox(allPoints, allCellPoints[celli], false), + srcPatchTypes, + static_cast<unsigned int>(patchCellType::PATCH) + ) + ) + { + allCellTypes[celli] = HOLE; + } + } + } + } + } +} + + +void Foam::cellCellStencils::trackingInverseDistance::markDonors +( + PstreamBuffers& pBufs, + const List<treeBoundBoxList>& meshBb, + const PtrList<voxelMeshSearch>& meshSearches, + + const label srcI, + const label tgtI, + labelListList& allStencil, + labelList& allDonor +) const +{ + const treeBoundBoxList& srcBbs = meshBb[srcI]; + const treeBoundBoxList& tgtBbs = meshBb[tgtI]; + + const fvMesh& srcMesh = meshParts_[srcI].subMesh(); + const labelList& srcCellMap = meshParts_[srcI].cellMap(); + const voxelMeshSearch& meshSearch = meshSearches[srcI]; + const fvMesh& tgtMesh = meshParts_[tgtI].subMesh(); + const pointField& tgtCc = tgtMesh.cellCentres(); + const labelList& tgtCellMap = meshParts_[tgtI].cellMap(); + + // 1. do processor-local src/tgt overlap + { + forAll(tgtCellMap, tgtCelli) + { + label srcCelli = meshSearch.findCell(tgtCc[tgtCelli]); + if (srcCelli != -1) + { + label globalDonor = globalCells_.toGlobal(srcCellMap[srcCelli]); + label celli = tgtCellMap[tgtCelli]; + allStencil[celli].setSize(1); + allStencil[celli][0] = globalDonor; + allDonor[celli] = srcI; + } + } + } + + + // 2. Send over tgtMesh bits that overlap src and do calculation on + // srcMesh. + + + // (remote) processors where the tgt overlaps my src + DynamicList<label> tgtOverlapProcs(Pstream::nProcs()); + // (remote) processors where the src overlaps my tgt + DynamicList<label> srcOverlapProcs(Pstream::nProcs()); + for (label procI = 0; procI < Pstream::nProcs(); procI++) + { + if (procI != Pstream::myProcNo()) + { + if (tgtBbs[procI].overlaps(srcBbs[Pstream::myProcNo()])) + { + tgtOverlapProcs.append(procI); + } + if (srcBbs[procI].overlaps(tgtBbs[Pstream::myProcNo()])) + { + srcOverlapProcs.append(procI); + } + } + } + + + + // Indices of tgtcells to send over to each processor + List<DynamicList<label> > tgtSendCells(Pstream::nProcs()); + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + tgtSendCells[procI].reserve(tgtMesh.nCells()/srcOverlapProcs.size()); + } + + + forAll(tgtCellMap, tgtCelli) + { + label celli = tgtCellMap[tgtCelli]; + if (allStencil[celli].empty()) + { + const treeBoundBox subBb(cellBb(mesh_, celli)); + + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + if (subBb.overlaps(srcBbs[procI])) + { + tgtSendCells[procI].append(tgtCelli); + } + } + } + } + + // Send target cell centres to overlapping processors + pBufs.clear(); + + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + const labelList& cellIDs = tgtSendCells[procI]; + + UOPstream os(procI, pBufs); + os << UIndirectList<point>(tgtCc, cellIDs); + } + pBufs.finishedSends(); + + // Receive bits of target processors; find; send back + (void)srcMesh.tetBasePtIs(); + forAll(tgtOverlapProcs, i) + { + label procI = tgtOverlapProcs[i]; + + UIPstream is(procI, pBufs); + pointList samples(is); + + labelList donors(samples.size(), -1); + forAll(samples, sampleI) + { + label srcCelli = meshSearch.findCell(samples[sampleI]); + if (srcCelli != -1) + { + donors[sampleI] = globalCells_.toGlobal(srcCellMap[srcCelli]); + } + } + + // Use same pStreamBuffers to send back. + UOPstream os(procI, pBufs); + os << donors; + } + pBufs.finishedSends(); + + forAll(srcOverlapProcs, i) + { + label procI = srcOverlapProcs[i]; + const labelList& cellIDs = tgtSendCells[procI]; + + UIPstream is(procI, pBufs); + labelList donors(is); + + if (donors.size() != cellIDs.size()) + { + FatalErrorInFunction<< "problem : cellIDs:" << cellIDs.size() + << " donors:" << donors.size() << abort(FatalError); + } + + forAll(donors, donorI) + { + label globalDonor = donors[donorI]; + + if (globalDonor != -1) + { + label celli = tgtCellMap[cellIDs[donorI]]; + + // TBD: check for multiple donors. Maybe better one? + if (allStencil[celli].empty()) + { + allStencil[celli].setSize(1); + allStencil[celli][0] = globalDonor; + allDonor[celli] = srcI; + } + } + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cellCellStencils::trackingInverseDistance::trackingInverseDistance +( + const fvMesh& mesh, + const dictionary& dict, + const bool doUpdate +) +: + inverseDistance(mesh, dict, false), + globalCells_(mesh_.nCells()) +{ + if (doUpdate) + { + // Initialise donor cell + globalDonor_.setSize(mesh_.nCells()); + globalDonor_ = -1; + + // Initialise mesh partitions + const labelIOList& zoneID = this->zoneID(); + label nZones = gMax(zoneID)+1; + + labelList nCellsPerZone(nZones, 0); + forAll(zoneID, celli) + { + nCellsPerZone[zoneID[celli]]++; + } + Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>()); + Pstream::listCombineScatter(nCellsPerZone); + + meshParts_.setSize(nZones); + forAll(meshParts_, zonei) + { + meshParts_.set(zonei, new fvMeshSubset(mesh_)); + meshParts_[zonei].setLargeCellSubset(zoneID, zonei); + // Trigger early evaluation of mesh dimension (in case there are + // locally zero cells in mesh) + (void)meshParts_[zonei].subMesh().nGeometricD(); + } + + + // Print a bit + { + Info<< typeName << " : detected " << nZones + << " mesh regions" << endl; + Info<< incrIndent; + forAll(nCellsPerZone, zonei) + { + Info<< indent<< "zone:" << zonei + << " nCells:" << nCellsPerZone[zonei] + << endl; + } + Info<< decrIndent; + } + + + // Do geometry update + update(); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cellCellStencils::trackingInverseDistance::~trackingInverseDistance() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::cellCellStencils::trackingInverseDistance::update() +{ + DebugInfo<< FUNCTION_NAME << " : Start of analysis" << endl; + + scalar layerRelax(dict_.lookupOrDefault("layerRelax", 1.0)); + const labelIOList& zoneID = this->zoneID(); + label nZones = meshParts_.size(); + + // Update stored mesh partitions for geometry changes + forAll(meshParts_, zonei) + { + pointField subPoints(mesh_.points(), meshParts_[zonei].pointMap()); + + fvMesh& subMesh = meshParts_[zonei].subMesh(); + subMesh.movePoints(subPoints); + } + + DebugInfo<< FUNCTION_NAME << " : Moved zone sub-meshes" << endl; + + + // Calculate fast search structure for each zone + PtrList<voxelMeshSearch> meshSearches(nZones); + + List<labelVector> searchBoxDivisions; + if (dict_.readIfPresent("searchBoxDivisions", searchBoxDivisions)) + { + forAll(meshParts_, zonei) + { + meshSearches.set + ( + zonei, + new voxelMeshSearch + ( + meshParts_[zonei].subMesh(), + searchBoxDivisions[zonei], + true + ) + ); + } + } + else + { + forAll(meshParts_, zonei) + { + meshSearches.set + ( + zonei, + new voxelMeshSearch(meshParts_[zonei].subMesh(), true) + ); + } + } + DebugInfo<< FUNCTION_NAME << " : Constructed cell voxel meshes" << endl; + + + const boundBox& allBb(mesh_.bounds()); + + List<treeBoundBoxList> meshBb(nZones); + + // Determine zone meshes and bounding boxes + { + // Per processor, per zone the bounding box + List<treeBoundBoxList> procBb(Pstream::nProcs()); + procBb[Pstream::myProcNo()].setSize(nZones); + + forAll(meshParts_, zonei) + { + const fvMesh& subMesh = meshParts_[zonei].subMesh(); + + if (subMesh.nPoints()) + { + procBb[Pstream::myProcNo()][zonei] = + treeBoundBox(subMesh.points()); + procBb[Pstream::myProcNo()][zonei].inflate(1e-6); + } + else + { + // No part of zone on this processor. Make up bb. + procBb[Pstream::myProcNo()][zonei] = treeBoundBox + ( + allBb.min() - 2*allBb.span(), + allBb.min() - allBb.span() + ); + procBb[Pstream::myProcNo()][zonei].inflate(1e-6); + } + } + + Pstream::gatherList(procBb); + Pstream::scatterList(procBb); + + // Move local bounding boxes to per-mesh indexing + forAll(meshBb, zonei) + { + treeBoundBoxList& bbs = meshBb[zonei]; + bbs.setSize(Pstream::nProcs()); + forAll(procBb, proci) + { + bbs[proci] = procBb[proci][zonei]; + } + } + } + + DebugInfo<< FUNCTION_NAME << " : Calculated bounding boxes" << endl; + + + // Determine patch bounding boxes. These are either global and provided + // by the user or processor-local as a copy of the mesh bounding box. + + List<treeBoundBoxList> patchBb(nZones); + List<labelVector> patchDivisions(searchBoxDivisions); + PtrList<PackedList<2>> patchParts(nZones); + labelList allPatchTypes(mesh_.nCells(), OTHER); + + { + treeBoundBox globalPatchBb; + if (dict_.readIfPresent("searchBox", globalPatchBb)) + { + // All processors, all zones have the same bounding box + patchBb = treeBoundBoxList(Pstream::nProcs(), globalPatchBb); + } + else + { + // Use the meshBb (differing per zone, per processor) + patchBb = meshBb; + } + } + if (patchDivisions.empty()) + { + patchDivisions.setSize(nZones); + forAll(patchDivisions, zonei) + { + patchDivisions[zonei] = meshSearches[zonei].nDivs(); + } + } + + forAll(patchParts, zonei) + { + const labelVector& g = patchDivisions[zonei]; + patchParts.set(zonei, new PackedList<2>(cmptProduct(g))); + + markBoundaries + ( + meshParts_[zonei].subMesh(), + + patchBb[zonei][Pstream::myProcNo()], + patchDivisions[zonei], + patchParts[zonei], + + meshParts_[zonei].cellMap(), + allPatchTypes + ); + } + DebugInfo<< FUNCTION_NAME << " : Calculated boundary voxel meshes" << endl; + + + // Current best guess for cells + labelList allCellTypes(mesh_.nCells(), CALCULATED); + labelListList allStencil(mesh_.nCells()); + // zoneID of donor + labelList allDonorID(mesh_.nCells(), -1); + + const globalIndex globalCells(mesh_.nCells()); + + PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking); + + DebugInfo<< FUNCTION_NAME << " : Allocated donor-cell structures" << endl; + + for (label srci = 0; srci < meshParts_.size()-1; srci++) + { + for (label tgti = srci+1; tgti < meshParts_.size(); tgti++) + { + markPatchesAsHoles + ( + pBufs, + + patchBb, + patchDivisions, + patchParts, + + srci, + tgti, + allCellTypes + ); + markPatchesAsHoles + ( + pBufs, + + patchBb, + patchDivisions, + patchParts, + + tgti, + srci, + allCellTypes + ); + + markDonors + ( + pBufs, + meshBb, + meshSearches, + + tgti, + srci, + allStencil, + allDonorID + ); + markDonors + ( + pBufs, + meshBb, + meshSearches, + + srci, + tgti, + allStencil, + allDonorID + ); + } + } + + DebugInfo<< FUNCTION_NAME << " : Determined holes and donor-acceptors" + << endl; + + + // Use the patch types and weights to decide what to do + forAll(allPatchTypes, celli) + { + if (allCellTypes[celli] != HOLE) + { + switch (allPatchTypes[celli]) + { + case OVERSET: + { + // Require interpolation. See if possible. + + if (allStencil[celli].size()) + { + allCellTypes[celli] = INTERPOLATED; + } + else + { + allCellTypes[celli] = HOLE; + } + } + } + } + } + DebugInfo<< FUNCTION_NAME << " : Removed bad donors" << endl; + + // Mark unreachable bits + findHoles(globalCells_, mesh_, zoneID, allStencil, allCellTypes); + DebugInfo<< FUNCTION_NAME << " : Flood-filled holes" << endl; + + // Add buffer interpolation layer(s) around holes + scalarField allWeight(mesh_.nCells(), 0.0); + walkFront(layerRelax, allStencil, allCellTypes, allWeight); + DebugInfo<< FUNCTION_NAME << " : Implemented layer relaxation" << endl; + + + // Convert cell-cell addressing to stencil in compact notation + + cellTypes_.transfer(allCellTypes); + cellStencil_.setSize(mesh_.nCells()); + cellInterpolationWeights_.setSize(mesh_.nCells()); + DynamicList<label> interpolationCells; + forAll(cellTypes_, celli) + { + if (cellTypes_[celli] == INTERPOLATED) + { + cellStencil_[celli].transfer(allStencil[celli]); + cellInterpolationWeights_[celli].setSize(1); + cellInterpolationWeights_[celli][0] = 1.0; + interpolationCells.append(celli); + } + else + { + cellStencil_[celli].clear(); + cellInterpolationWeights_[celli].clear(); + } + } + interpolationCells_.transfer(interpolationCells); + + List<Map<label> > compactMap; + mapDistribute map(globalCells, cellStencil_, compactMap); + cellInterpolationMap_.transfer(map); + + cellInterpolationWeight_.transfer(allWeight); + cellInterpolationWeight_.correctBoundaryConditions(); + + + if (debug & 2) + { + // Dump stencil + mkDir(mesh_.time().timePath()); + OBJstream str(mesh_.time().timePath()/"injectionStencil.obj"); + Pout<< typeName << " : dumping injectionStencil to " + << str.name() << endl; + pointField cc(mesh_.cellCentres()); + cellInterpolationMap_.distribute(cc); + + forAll(cellStencil_, celli) + { + const labelList& slots = cellStencil_[celli]; + if (slots.size()) + { + const point& accCc = mesh_.cellCentres()[celli]; + forAll(slots, i) + { + const point& donorCc = cc[slots[i]]; + str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc)); + } + } + } + } + + DebugInfo<< FUNCTION_NAME << " : Transferred donor to stencil" << endl; + + + // Extend stencil to get inverse distance weighted neighbours + createStencil(globalCells); + DebugInfo<< FUNCTION_NAME << " : Extended stencil" << endl; + + + if (debug & 2) + { + // Dump weight + cellInterpolationWeight_.instance() = mesh_.time().timeName(); + cellInterpolationWeight_.write(); + + // Dump cell types + volScalarField volTypes + ( + IOobject + ( + "cellTypes", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh_, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ); + + forAll(volTypes.internalField(), celli) + { + volTypes[celli] = cellTypes_[celli]; + } + volTypes.correctBoundaryConditions(); + volTypes.write(); + + // Dump stencil + mkDir(mesh_.time().timePath()); + OBJstream str(mesh_.time().timePath()/"stencil.obj"); + Pout<< typeName << " : dumping to " << str.name() << endl; + pointField cc(mesh_.cellCentres()); + cellInterpolationMap_.distribute(cc); + + forAll(cellStencil_, celli) + { + const labelList& slots = cellStencil_[celli]; + if (slots.size()) + { + const point& accCc = mesh_.cellCentres()[celli]; + forAll(slots, i) + { + const point& donorCc = cc[slots[i]]; + str.write(linePointRef(accCc, 0.1*accCc+0.9*donorCc)); + } + } + } + } + + + // Print some stats + { + labelList nCells(count(3, cellTypes_)); + + label nLocal = 0; + label nMixed = 0; + label nRemote = 0; + forAll(interpolationCells_, i) + { + label celli = interpolationCells_[i]; + const labelList& slots = cellStencil_[celli]; + + bool hasLocal = false; + bool hasRemote = false; + + forAll(slots, sloti) + { + if (slots[sloti] >= mesh_.nCells()) + { + hasRemote = true; + } + else + { + hasLocal = true; + } + } + + if (hasRemote) + { + if (!hasLocal) + { + nRemote++; + } + else + { + nMixed++; + } + } + else if (hasLocal) + { + nLocal++; + } + } + reduce(nLocal, sumOp<label>()); + reduce(nMixed, sumOp<label>()); + reduce(nRemote, sumOp<label>()); + + Info<< "Overset analysis : nCells : " + << returnReduce(cellTypes_.size(), sumOp<label>()) << nl + << incrIndent + << indent << "calculated : " << nCells[CALCULATED] << nl + << indent << "interpolated : " << nCells[INTERPOLATED] + << " (interpolated from local:" << nLocal + << " mixed local/remote:" << nMixed + << " remote:" << nRemote << ")" << nl + << indent << "hole : " << nCells[HOLE] << nl + << decrIndent << endl; + } + DebugInfo<< FUNCTION_NAME << " : Finished analysis" << endl; + + // Tbd: detect if anything changed. Most likely it did! + return true; +} + + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H new file mode 100644 index 00000000000..f0cafa3521c --- /dev/null +++ b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.H @@ -0,0 +1,162 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::cellCellStencils::trackingInverseDistance + +Description + Inverse-distance-weighted interpolation stencil. + +SourceFiles + trackingInverseDistanceCellCellStencil.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cellCellStencils_trackingInverseDistance_H +#define cellCellStencils_trackingInverseDistance_H + +#include "inverseDistanceCellCellStencil.H" +#include "globalIndex.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class voxelMeshSearch; + +namespace cellCellStencils +{ + +/*---------------------------------------------------------------------------*\ + Class trackingInverseDistance Declaration +\*---------------------------------------------------------------------------*/ + +class trackingInverseDistance +: + public inverseDistance +{ +protected: + + // Protected data + + //- Global indexing for cells + globalIndex globalCells_; + + //- Current (global) donor cell + labelList globalDonor_; + + //- Subset according to zone + PtrList<fvMeshSubset> meshParts_; + + + + // Protected Member Functions + + //- Mark voxels of patchTypes with type of patch face + static void markBoundaries + ( + const fvMesh& mesh, + + const boundBox& bb, + const labelVector& nDivs, + PackedList<2>& patchTypes, + + const labelList& cellMap, + labelList& patchCellTypes + ); + + //- Mark all cells overlapping (a voxel covered by) a src patch + // with type HOLE + void markPatchesAsHoles + ( + PstreamBuffers& pBufs, + + // Voxel mesh for patches + const List<treeBoundBoxList>& patchBb, + const List<labelVector>& patchDivisions, + const PtrList<PackedList<2>>& patchParts, + + const label srcI, + const label tgtI, + labelList& allCellTypes + ) const; + + void markDonors + ( + PstreamBuffers& pBufs, + const List<treeBoundBoxList>& meshBb, + const PtrList<voxelMeshSearch>& meshSearches, + + const label srcI, + const label tgtI, + labelListList& allStencil, + labelList& allDonor + ) const; + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + trackingInverseDistance(const trackingInverseDistance&); + + //- Disallow default bitwise assignment + void operator=(const trackingInverseDistance&); + + +public: + + //- Runtime type information + TypeName("trackingInverseDistance"); + + + // Constructors + + //- Construct from fvMesh + trackingInverseDistance(const fvMesh&, const dictionary&, const bool); + + + //- Destructor + virtual ~trackingInverseDistance(); + + + // Member Functions + + //- Update stencils. Return false if nothing changed. + virtual bool update(); + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace cellCellStencils +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C new file mode 100644 index 00000000000..720b25d7610 --- /dev/null +++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C @@ -0,0 +1,432 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "voxelMeshSearch.H" +#include "polyMesh.H" +#include "processorPolyPatch.H" + + +/* * * * * * * * * * * * * * * Static Member Data * * * * * * * * * * * * * */ + +namespace Foam +{ + defineTypeNameAndDebug(voxelMeshSearch, 0); +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::labelVector Foam::voxelMeshSearch::index3 +( + const boundBox& bb, + const labelVector& g, + const point& pt +) +{ + const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z()))); + + labelVector v + ( + floor((pt.x()-bb.min().x())/s.x()), + floor((pt.y()-bb.min().y())/s.y()), + floor((pt.z()-bb.min().z())/s.z()) + ); + + return v; +} + + +Foam::label Foam::voxelMeshSearch::index +( + const boundBox& bb, + const labelVector& g, + const point& pt, + const bool clip +) +{ + const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z()))); + + labelVector v + ( + floor((pt.x()-bb.min().x())/s.x()), + floor((pt.y()-bb.min().y())/s.y()), + floor((pt.z()-bb.min().z())/s.z()) + ); + + if (clip) + { + v[0] = max(0, min(g[0]-1, v[0])); + v[1] = max(0, min(g[1]-1, v[1])); + v[2] = max(0, min(g[2]-1, v[2])); + } + else if + ( + v[0] < 0 + || v[1] < 0 + || v[2] < 0 + || v[0] >= g[0] + || v[1] >= g[1] + || v[2] >= g[2] + ) + { + return -1; + } + + return v[0] + g[0]*v[1] + g[1]*g.y()*v[2]; +} + + +Foam::point Foam::voxelMeshSearch::centre +( + const boundBox& bb, + const labelVector& g, + const labelVector& voxel +) +{ + const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z()))); + + return bb.min()+0.5*s+point(voxel[0]*s[0], voxel[1]*s[1], voxel[2]*s[2]); +} + + +void Foam::voxelMeshSearch::writeGrid +( + OBJstream& os, + const boundBox& bb, + const labelVector& g +) +{ + const vector s(cmptDivide(bb.span(), vector(g.x(), g.y(), g.z()))); + + for (label i = 1; i < g[0]; i++) + { + for (label j = 0; j < g[1]; j++) + { + for (label k = 0; k < g[2]; k++) + { + point p1(bb.min()+point((i-1)*s[0], j*s[1], k*s[2])); + point p2(bb.min()+point(i*s[0], j*s[1], k*s[2])); + os.write(linePointRef(p1, p2)); + } + } + } + for (label i = 0; i < g[0]; i++) + { + for (label j = 1; j < g[1]; j++) + { + for (label k = 0; k < g[2]; k++) + { + point p1(bb.min()+point(i*s[0], (j-1)*s[1], k*s[2])); + point p2(bb.min()+point(i*s[0], j*s[1], k*s[2])); + os.write(linePointRef(p1, p2)); + } + } + } + for (label i = 0; i < g[0]; i++) + { + for (label j = 0; j < g[1]; j++) + { + for (label k = 1; k < g[2]; k++) + { + point p1(bb.min()+point(i*s[0], j*s[1], (k-1)*s[2])); + point p2(bb.min()+point(i*s[0], j*s[1], k*s[2])); + os.write(linePointRef(p1, p2)); + } + } + } +} + + +Foam::label Foam::voxelMeshSearch::searchProcPatch +( + const label faceID, + const point& searchPoint +) const +{ + const pointField& cellCentres = mesh_.cellCentres(); + const polyBoundaryMesh& bMeshes = mesh_.boundaryMesh(); + + label patchi = bMeshes.patchID()[faceID-mesh_.nInternalFaces()]; + const polyPatch& bMeshPatch = bMeshes[patchi]; + + if (!isA<processorPolyPatch>(bMeshPatch)) + { + return -1; + } + else + { + // Find nearest cell. Linear search since cheaper than constructing + // tree? + const labelUList& faceCells = bMeshPatch.faceCells(); + scalar minProximity = GREAT; + + label nearestCellI = -1; + forAll(faceCells, i) + { + const point& cc = cellCentres[faceCells[i]]; + scalar proximity = magSqr(cc-searchPoint); + if (proximity < minProximity) + { + minProximity = proximity; + nearestCellI = faceCells[i]; + } + } + return nearestCellI; + } +} + + +Foam::label Foam::voxelMeshSearch::findIntersectedFace +( + const label cellI, + const point& p +) const +{ + // Return -1 or the label of the face intersected when tracking from + // p to centre of cellI + + const faceList& faces = mesh_.faces(); + const pointField& faceCentres = mesh_.faceCentres(); + const pointField& points = mesh_.points(); + + const point& cc = mesh_.cellCentres()[cellI]; + const labelList& cFaces = mesh_.cells()[cellI]; + + const vector q(cc-p); + + forAll(cFaces, cFacei) + { + label facei = cFaces[cFacei]; + + pointHit hitInfo = faces[facei].intersection + ( + p, + q, + faceCentres[facei], + points, + intersection::HALF_RAY + ); + + if (hitInfo.hit() && (hitInfo.distance() < 1)) + { + return facei; + } + } + return -1; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::voxelMeshSearch::voxelMeshSearch +( + const polyMesh& mesh, + const bool doUpdate +) +: + mesh_(mesh) +{ + // Determine number of voxels from number of cells in mesh + const labelVector& dim = mesh_.geometricD(); + + // Guarantee at least one voxel + label nCells = max(1, mesh_.nCells()); + + label nDivs = -1; + if (mesh_.nGeometricD() == 1) + { + nDivs = nCells; + } + else if (mesh_.nGeometricD() == 2) + { + nDivs = label(Foam::sqrt(scalar(nCells))); + } + else + { + nDivs = label(Foam::cbrt(scalar(nCells))); + } + + nDivs_ = labelVector(nDivs, nDivs, nDivs); + forAll(dim, i) + { + if (dim[i] == -1) + { + nDivs_[i] = 1; + } + } + + if (debug) + { + Pout<< "voxelMeshSearch : mesh:" << mesh_.name() + << " nDivs:" << nDivs_ << endl; + } + + if (doUpdate) + { + update(); + } +} + + +Foam::voxelMeshSearch::voxelMeshSearch +( + const polyMesh& mesh, + const labelVector& nDivs, + const bool doUpdate +) +: + mesh_(mesh), + nDivs_(nDivs) +{ + if (doUpdate) + { + update(); + } +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::voxelMeshSearch::update() +{ + // Redo the local bounding box + localBb_ = boundBox(mesh_.points(), false); + + const point eps(1e-10, 1e-10, 1e-10); + + localBb_.min() = localBb_.min()-eps; + localBb_.max() = localBb_.max()+eps; + + // Initialise seed cell array + + seedCell_.setSize(cmptProduct(nDivs_)); + seedCell_ = -1; + + + // Find seed cells + const pointField& points = mesh_.points(); + const labelListList& cellPoints = mesh_.cellPoints(); + + forAll(cellPoints, celli) + { + const labelList& cPoints = cellPoints[celli]; + + // Get cell bounding box + boundBox bb(points, cPoints, false); + + fill(seedCell_, localBb_, nDivs_, bb, celli); + } + + + //// Small optimisation: make sure the cell centre at least always + //// returns the cell itself + //const pointField& cellCentres = mesh_.cellCentres(); + //forAll(cellCentres, celli) + //{ + // label voxeli = index(cellCentres[celli]); + // seedCell_[voxeli] = celli; + //} + + return true; +} + + +Foam::label Foam::voxelMeshSearch::findCell(const point& p) const +{ + // First check if the point is contained in the bounding box, else exit + if (!localBb_.contains(p)) + { + return -1; + } + + // Locate the voxel index for this point. Do not clip. + label voxeli = index(localBb_, nDivs_, p, false); + + // The point may still be inside the bb but outside the actual domain. + if (voxeli < 0) + { + return -1; + } + else + { + // Inverse map to compute the seed cell. + label celli = seedCell_[voxeli]; + + if (celli < 0) + { + return -1; + } + else + { + // Simplified, non-parallel tracking from cell centre of + // celli to wanted location p. Note that the cell thus + // found does not have to be the absolute 'correct' one as + // long as at least one of the processors finds a cell. + + label nextCellOld = -1; + + while (true) + { + // I am in celli now. How many faces do I have ? + label facei = findIntersectedFace(celli, p); + + if (facei == -1) + { + return celli; + } + + + label nextCell; + if (mesh_.isInternalFace(facei)) + { + label own = mesh_.faceOwner()[facei]; + label nei = mesh_.faceNeighbour()[facei]; + nextCell = (own == celli ? nei : own); + } + else + { + nextCell = searchProcPatch(facei, p); + + if (nextCell == nextCellOld) + { + return -1; // point is really out + } + + if (nextCell == -1 || nextCell == celli) + { + return nextCell; + } + nextCellOld = nextCell; + } + + celli = nextCell; + } + return -1; + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H new file mode 100644 index 00000000000..3f8bd044348 --- /dev/null +++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H @@ -0,0 +1,203 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::voxelMeshSearch + +Description + Fast, non-parallel searching in mesh without use of octree. + +SourceFiles + voxelMeshSearch.C + +\*---------------------------------------------------------------------------*/ + +#ifndef voxelMeshSearch_H +#define voxelMeshSearch_H + +#include "boundBox.H" +#include "labelVector.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of friend functions and operators +class polyMesh; +class OBJstream; + +/*---------------------------------------------------------------------------*\ + Class voxelMeshSearch Declaration +\*---------------------------------------------------------------------------*/ + +class voxelMeshSearch +{ + // Private data + + const polyMesh& mesh_; + + //- Local mesh bounding box + boundBox localBb_; + + //- Number of points in all directions (for local mesh only) + labelVector nDivs_; + + //- Voxel to seed cell + labelList seedCell_; + + + // Private Member Functions + + //- Find nearest cell (on same processor patch as seed face) + label searchProcPatch(const label seedFacei, const point&) const; + + //- Find the face on the cell that gets intersected + label findIntersectedFace(const label celli, const point&) const; + + +public: + + // Declare name of the class and its debug switch + ClassName("voxelMeshSearch"); + + + // Constructors + + //- Construct from mesh; voxels estimated from local number of cells + voxelMeshSearch(const polyMesh&, const bool doUpdate = true); + + //- Construct from mesh and voxel discretisation + voxelMeshSearch + ( + const polyMesh&, + const labelVector&, + const bool doUpdate = true + ); + + + // Member functions + + //- Number of voxels for local mesh + const labelVector& nDivs() const + { + return nDivs_; + } + + //- Update lookup tables for geometry changes + bool update(); + + //- Find a cell + label findCell(const point&) const; + + //- Find cells. Returns number of cells found + //label findCells(const UList<point>&, labelList&) const; + + + //Voxel helper functions + + //- Coordinate to voxel indices + static labelVector index3 + ( + const boundBox& bb, + const labelVector& nDivs, + const point& p + ); + + //- Coordinate to combined voxel index. If clip makes sure + // components are all inside. If not clip returns -1 if outside bb. + static label index + ( + const boundBox& bb, + const labelVector& nDivs, + const point& p, + const bool clip + ); + + //- Voxel index to voxel centre + static point centre + ( + const boundBox& bb, + const labelVector& nDivs, + const labelVector& voxel + ); + + //- Fill voxels indicated by bounding box + template<class Container, class Type> + static void fill + ( + Container& elems, + const boundBox& bb, + const labelVector& nDivs, + const boundBox& subBb, + const Type val + ); + + //- Check if any voxel inside bounding box is set to val or + // not set to val (isNot = true) + template<class Container, class Type> + static bool overlaps + ( + const boundBox& bb, + const labelVector& nDivs, + const boundBox& subBb, + const Container& elems, + const Type val, + const bool isNot = false + ); + + //- Debug: write points for every set element + template<class Container, class Type> + static void write + ( + OBJstream&, + const boundBox& bb, + const labelVector& nDivs, + const Container& elems, + const Type val, + const bool isNot = false + ); + + //- Debug: write all edges + static void writeGrid + ( + OBJstream&, + const boundBox&, + const labelVector& + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "voxelMeshSearchTemplates.C" +#endif + +#endif + +// ************************************************************************* // diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C new file mode 100644 index 00000000000..e748d23281d --- /dev/null +++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearchTemplates.C @@ -0,0 +1,156 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "voxelMeshSearch.H" +#include "OBJstream.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class Container, class Type> +void Foam::voxelMeshSearch::fill +( + Container& elems, + const boundBox& bb, + const labelVector& nDivs, + const boundBox& subBb, + const Type val +) +{ + labelVector minIds(index3(bb, nDivs, subBb.min())); + labelVector maxIds(index3(bb, nDivs, subBb.max())); + + for (direction cmpt = 0; cmpt < 3; cmpt++) + { + if (maxIds[cmpt] < 0 || minIds[cmpt] >= nDivs[cmpt]) + { + return; + } + // Clip + maxIds[cmpt] = min(maxIds[cmpt], nDivs[cmpt]-1); + minIds[cmpt] = max(minIds[cmpt], 0); + } + + for (label i = minIds[0]; i <= maxIds[0]; i++) + { + for (label j = minIds[1]; j <= maxIds[1]; j++) + { + for (label k = minIds[2]; k <= maxIds[2]; k++) + { + elems[i+j*nDivs.x()+k*nDivs.x()*nDivs.y()] = val; + } + } + } +} + + +template<class Container, class Type> +bool Foam::voxelMeshSearch::overlaps +( + const boundBox& bb, + const labelVector& nDivs, + const boundBox& subBb, + const Container& elems, + const Type val, + const bool isNot +) +{ + // Checks if subBb overlaps any voxel set to val + + labelVector minIds(index3(bb, nDivs, subBb.min())); + labelVector maxIds(index3(bb, nDivs, subBb.max())); + + for (direction cmpt = 0; cmpt < 3; cmpt++) + { + if (maxIds[cmpt] < 0 || minIds[cmpt] >= nDivs[cmpt]) + { + return false; + } + // Clip + maxIds[cmpt] = min(maxIds[cmpt], nDivs[cmpt]-1); + minIds[cmpt] = max(minIds[cmpt], 0); + } + + if (elems.size() != cmptProduct(nDivs)) + { + FatalErrorInFunction + << "sizes:" << elems.size() << " and " << nDivs + << exit(FatalError); + } + + + for (label i = minIds[0]; i <= maxIds[0]; i++) + { + for (label j = minIds[1]; j <= maxIds[1]; j++) + { + for (label k = minIds[2]; k <= maxIds[2]; k++) + { + const Type elemVal = elems[i+j*nDivs.x()+k*nDivs.x()*nDivs.y()]; + if (isNot != (elemVal == val)) + { + return true; + } + } + } + } + return false; +} + + +template<class Container, class Type> +void Foam::voxelMeshSearch::write +( + OBJstream& os, + const boundBox& bb, + const labelVector& nDivs, + const Container& elems, + const Type val, + const bool isNot +) +{ + if (elems.size() != cmptProduct(nDivs)) + { + FatalErrorInFunction + << "sizes:" << elems.size() << " and " << nDivs + << exit(FatalError); + } + + for (label i = 0; i < nDivs[0]; i++) + { + for (label j = 0; j < nDivs[1]; j++) + { + for (label k = 0; k < nDivs[2]; k++) + { + const Type elemVal = elems[i+j*nDivs.x()+k*nDivs.x()*nDivs.y()]; + if (isNot != (elemVal == val)) + { + os.write(centre(bb, nDivs, labelVector(i, j, k))); + } + } + } + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C new file mode 100644 index 00000000000..7e5e3584a8c --- /dev/null +++ b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.C @@ -0,0 +1,354 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify i + 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 "dynamicOversetFvMesh.H" +#include "addToRunTimeSelectionTable.H" +#include "cellCellStencilObject.H" +#include "zeroGradientFvPatchFields.H" +#include "lduPrimitiveProcessorInterface.H" +#include "globalIndex.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(dynamicOversetFvMesh, 0); + addToRunTimeSelectionTable(dynamicFvMesh, dynamicOversetFvMesh, IOobject); +} + + +// * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * * // + +bool Foam::dynamicOversetFvMesh::updateAddressing() const +{ + const cellCellStencilObject& overlap = Stencil::New(*this); + + // The (processor-local part of the) stencil determines the local + // faces to add to the matrix. tbd: parallel + const labelListList& stencil = overlap.cellStencil(); + + // Get the base addressing + const lduAddressing& baseAddr = dynamicMotionSolverFvMesh::lduAddr(); + + // Add to the base addressing + labelList lowerAddr; + labelList upperAddr; + label nExtraFaces; + + const globalIndex globalNumbering(baseAddr.size()); + labelListList localFaceCells; + labelListList remoteFaceCells; + + labelList globalCellIDs(overlap.cellInterpolationMap().constructSize()); + forAll(baseAddr, cellI) + { + globalCellIDs[cellI] = globalNumbering.toGlobal(cellI); + } + overlap.cellInterpolationMap().distribute(globalCellIDs); + + + reverseFaceMap_ = fvMeshPrimitiveLduAddressing::addAddressing + ( + baseAddr, + stencil, + nExtraFaces, + lowerAddr, + upperAddr, + stencilFaces_, + globalNumbering, + globalCellIDs, + localFaceCells, + remoteFaceCells + ); + + if (debug) + { + Pout<< "dynamicOversetFvMesh::update() : extended addresssing from" + << " nFaces:" << baseAddr.lowerAddr().size() + << " to nFaces:" << lowerAddr.size() + << " nExtraFaces:" << nExtraFaces << endl; + } + + // Send across wanted cells + labelListList sendCells; + Pstream::exchange<labelList, label>(remoteFaceCells, sendCells); + + // Extract relevant remote processors + labelList nbrProcs(localFaceCells.size()); + { + label nbrI = 0; + forAll(localFaceCells, procI) + { + if (localFaceCells[procI].size()) + { + //Pout<< " from proc:" << procI + // << " want its local cells " << remoteFaceCells[procI] + // << " to add to my local cells:" << localFaceCells[procI] + // << endl; + nbrProcs[nbrI++] = procI; + } + } + nbrProcs.setSize(nbrI); + } + + // Construct interfaces + remoteStencilInterfaces_.setSize(nbrProcs.size()); + forAll(nbrProcs, i) + { + label procI = nbrProcs[i]; + remoteStencilInterfaces_.set + ( + i, + new lduPrimitiveProcessorInterface + ( + localFaceCells[procI], + Pstream::myProcNo(), + procI, + tensorField(0), + Pstream::msgType() + ) + ); + } + + + // Get addressing and interfaces of all interfaces + + + List<const labelUList*> patchAddr; + { + const fvBoundaryMesh& fvp = boundary(); + + patchAddr.setSize(fvp.size() + remoteStencilInterfaces_.size()); + + allInterfaces_ = dynamicMotionSolverFvMesh::interfaces(); + allInterfaces_.setSize(patchAddr.size()); + + forAll(fvp, patchI) + { + patchAddr[patchI] = &fvp[patchI].faceCells(); + } + forAll(remoteStencilInterfaces_, i) + { + label patchI = fvp.size()+i; + const lduPrimitiveProcessorInterface& pp = + remoteStencilInterfaces_[i]; + + //Pout<< "at patch:" << patchI + // << " have procPatch:" << pp.type() + // << " from:" << pp.myProcNo() + // << " to:" << pp.neighbProcNo() + // << " with fc:" << pp.faceCells().size() << endl; + + patchAddr[patchI] = &pp.faceCells(); + allInterfaces_.set(patchI, &pp); + } + } + const lduSchedule ps + ( + lduPrimitiveMesh::nonBlockingSchedule<processorLduInterface> + ( + allInterfaces_ + ) + ); + + lduPtr_.reset + ( + new fvMeshPrimitiveLduAddressing + ( + nCells(), + lowerAddr.xfer(), + upperAddr.xfer(), + patchAddr, + ps + ) + ); + + + // Check + if (debug) + { + const lduAddressing& addr = lduPtr_(); //this->lduAddr(); + + Pout<< "Adapted addressing:" + << " lower:" << addr.lowerAddr().size() + << " upper:" << addr.upperAddr().size() << endl; + + lduInterfacePtrsList iFaces = this->interfaces(); + // Using lduAddressing::patch + forAll(patchAddr, patchI) + { + Pout<< " " << patchI << "\tpatchAddr:" + << addr.patchAddr(patchI).size() + << endl; + } + + // Using interfaces + Pout<< "iFaces:" << iFaces.size() << endl; + forAll(iFaces, patchI) + { + if (iFaces.set(patchI)) + { + Pout<< " " << patchI << "\tiFace:" << iFaces[patchI].type() + << endl; + } + } + + Pout<< "end of printing." << endl; + } + + return true; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::dynamicOversetFvMesh::dynamicOversetFvMesh(const IOobject& io) +: + dynamicMotionSolverFvMesh(io), + active_(false) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::dynamicOversetFvMesh::~dynamicOversetFvMesh() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::lduAddressing& Foam::dynamicOversetFvMesh::lduAddr() const +{ + if (!active_) + { + return dynamicMotionSolverFvMesh::lduAddr(); + } + if (lduPtr_.empty()) + { + // Build extended addressing + updateAddressing(); + } + return lduPtr_(); +} + + +const Foam::fvMeshPrimitiveLduAddressing& +Foam::dynamicOversetFvMesh::primitiveLduAddr() const +{ + if (lduPtr_.empty()) + { + FatalErrorInFunction + << "Extended addressing not allocated" << abort(FatalError); + } + + return lduPtr_(); +} + + +bool Foam::dynamicOversetFvMesh::update() +{ + if (dynamicMotionSolverFvMesh::update()) + { + // Calculate the local extra faces for the interpolation. Note: could + // let demand-driven lduAddr() trigger it but just to make sure. + updateAddressing(); + + return true; + } + + return false; +} + + +bool Foam::dynamicOversetFvMesh::writeObject +( + IOstream::streamFormat fmt, + IOstream::versionNumber ver, + IOstream::compressionType cmp +) const +{ + bool ok = dynamicMotionSolverFvMesh::writeObject(fmt, ver, cmp); + + // For postprocessing : write cellTypes and zoneID + { + const cellCellStencilObject& overlap = Stencil::New(*this); + + const labelUList& cellTypes = overlap.cellTypes(); + + volScalarField volTypes + ( + IOobject + ( + "cellTypes", + this->time().timeName(), + *this, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + *this, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ); + + forAll(volTypes.internalField(), cellI) + { + volTypes[cellI] = cellTypes[cellI]; + } + volTypes.correctBoundaryConditions(); + volTypes.writeObject(fmt, ver, cmp); + } + { + volScalarField volZoneID + ( + IOobject + ( + "zoneID", + this->time().timeName(), + *this, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + *this, + dimensionedScalar("zero", dimless, 0.0), + zeroGradientFvPatchScalarField::typeName + ); + + const cellCellStencilObject& overlap = Stencil::New(*this); + const labelIOList& zoneID = overlap.zoneID(); + + forAll(zoneID, cellI) + { + volZoneID[cellI] = zoneID[cellI]; + } + volZoneID.correctBoundaryConditions(); + volZoneID.writeObject(fmt, ver, cmp); + } + return ok; +} + + +// ************************************************************************* // diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H new file mode 100644 index 00000000000..2be46218a3e --- /dev/null +++ b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMesh.H @@ -0,0 +1,314 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::dynamicOversetFvMesh + +Description + dynamicFvMesh with support for overset meshes. + +SourceFiles + dynamicOversetFvMesh.C + +\*---------------------------------------------------------------------------*/ + +#ifndef dynamicOversetFvMesh_H +#define dynamicOversetFvMesh_H + +#include "dynamicMotionSolverFvMesh.H" +#include "labelIOList.H" +#include "fvMeshPrimitiveLduAddressing.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class mapDistribute; +class lduPrimitiveProcessorInterface; + +/*---------------------------------------------------------------------------*\ + Class dynamicOversetFvMesh Declaration +\*---------------------------------------------------------------------------*/ + +class dynamicOversetFvMesh +: + public dynamicMotionSolverFvMesh +{ +protected: + + // Protected data + + //- Select base addressing (false) or locally stored extended + // lduAddressing (true) + mutable bool active_; + + //- Extended addressing (extended with local interpolation stencils) + mutable autoPtr<fvMeshPrimitiveLduAddressing> lduPtr_; + + //- Added (processor)lduInterfaces for remote bits of stencil. + //PtrList<const lduInterface> remoteStencilInterfaces_; + mutable PtrList<const lduPrimitiveProcessorInterface> + remoteStencilInterfaces_; + + //- Interfaces for above mesh. Contains both original and + // above added processorLduInterfaces + mutable lduInterfacePtrsList allInterfaces_; + + //- Corresponding faces (in above lduPtr) to the stencil + mutable labelListList stencilFaces_; + + //- From old to new face labels + mutable labelList reverseFaceMap_; + + + // Protected Member Functions + + //- Calculate the extended lduAddressing + virtual bool updateAddressing() const; + + //- Debug: print matrix + template<class Type> + void write(Ostream&, const fvMatrix<Type>&, const lduAddressing&) const; + + //- Explicit interpolation of acceptor cells from donor cells + template<class T> + void interpolate(Field<T>& psi) const; + + //- Explicit interpolation of acceptor cells from donor cells with + // boundary condition handling + template<class GeoField> + void interpolate(GeoField& psi) const; + + //- Add interpolation to matrix (coefficients) + template<class Type> + void addInterpolation(fvMatrix<Type>&) const; + + //- Solve given dictionary with settings + template<class Type> + SolverPerformance<Type> solve(fvMatrix<Type>&, const dictionary&) const; + + //- Debug: correct coupled bc + template<class GeoField> + static void correctCoupledBoundaryConditions(GeoField& fld); + + //- Use extended addressing + void active(const bool f) const + { + active_ = f; + + if (active_) + { + DebugInfo<< "Switching to extended addressing with nFaces:" + << primitiveLduAddr().lowerAddr().size() + << endl; + } + else + { + DebugInfo<< "Switching to base addressing with nFaces:" + << fvMesh::lduAddr().lowerAddr().size() + << endl; + } + } + + +private: + + // Private Member Functions + + //- Disallow default bitwise copy construct + dynamicOversetFvMesh(const dynamicOversetFvMesh&); + + //- Disallow default bitwise assignment + void operator=(const dynamicOversetFvMesh&); + + +public: + + //- Runtime type information + TypeName("dynamicOversetFvMesh"); + + + // Constructors + + //- Construct from IOobject + dynamicOversetFvMesh(const IOobject& io); + + + //- Destructor + virtual ~dynamicOversetFvMesh(); + + + // Member Functions + + + // Extended addressing + + //- Use extended addressing + bool active() const + { + return active_; + } + + //- Return extended ldu addressing + const fvMeshPrimitiveLduAddressing& primitiveLduAddr() const; + + //- Return ldu addressing. If active: is (extended) + // primitiveLduAddr + virtual const lduAddressing& lduAddr() const; + + + // Overset + + // Explicit interpolation + + virtual void interpolate(scalarField& psi) const + { + interpolate<scalar>(psi); + } + + virtual void interpolate(vectorField& psi) const + { + interpolate<vector>(psi); + } + + virtual void interpolate(sphericalTensorField& psi) const + { + interpolate<sphericalTensor>(psi); + } + + virtual void interpolate(symmTensorField& psi) const + { + interpolate<symmTensor>(psi); + } + + virtual void interpolate(tensorField& psi) const + { + interpolate<tensor>(psi); + } + + virtual void interpolate(volScalarField& psi) const + { + interpolate<volScalarField>(psi); + } + + virtual void interpolate(volVectorField& psi) const + { + interpolate<volVectorField>(psi); + } + + virtual void interpolate(volSphericalTensorField& psi) const + { + interpolate<volSphericalTensorField>(psi); + } + + virtual void interpolate(volSymmTensorField& psi) const + { + interpolate<volSymmTensorField>(psi); + } + + virtual void interpolate(volTensorField& psi) const + { + interpolate<volTensorField>(psi); + } + + + // Implicit interpolation (matrix manipulation) + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<scalar> solve + ( + fvMatrix<scalar>& m, + const dictionary& dict + ) const + { + return solve<scalar>(m, dict); + } + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<vector> solve + ( + fvMatrix<vector>& m, + const dictionary& dict + ) const + { + return solve<vector>(m, dict); + } + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<symmTensor> solve + ( + fvMatrix<symmTensor>& m, + const dictionary& dict + ) const + { + return solve<symmTensor>(m, dict); + } + + //- Solve returning the solution statistics given convergence + // tolerance. Use the given solver controls + virtual SolverPerformance<tensor> solve + ( + fvMatrix<tensor>& m, + const dictionary& dict + ) const + { + return solve<tensor>(m, dict); + } + + + //- Update the mesh for both mesh motion and topology change + virtual bool update(); + + //- Write using given format, version and compression + virtual bool writeObject + ( + IOstream::streamFormat, + IOstream::versionNumber, + IOstream::compressionType + ) const; + + //- Debug: check halo swap is ok + template<class GeoField> + static void checkCoupledBC(const GeoField& fld); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "dynamicOversetFvMeshTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C new file mode 100644 index 00000000000..dce8e9cd7a8 --- /dev/null +++ b/src/overset/dynamicOversetFvMesh/dynamicOversetFvMeshTemplates.C @@ -0,0 +1,506 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "fvMatrix.H" +#include "cellCellStencilObject.H" + +// * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * * // + +template<class T> +void Foam::dynamicOversetFvMesh::interpolate(Field<T>& psi) const +{ + const cellCellStencil& overlap = Stencil::New(*this); + const labelListList& stencil = overlap.cellStencil(); + + if (stencil.size() != nCells()) + { + return; + } + + const mapDistribute& map = overlap.cellInterpolationMap(); + const List<scalarList>& wghts = overlap.cellInterpolationWeights(); + const labelList& cellIDs = overlap.interpolationCells(); + const scalarList& factor = overlap.cellInterpolationWeight(); + + Field<T> work(psi); + map.mapDistributeBase::distribute(work, UPstream::msgType()+1); + + forAll(cellIDs, i) + { + label celli = cellIDs[i]; + + const scalarList& w = wghts[celli]; + const labelList& nbrs = stencil[celli]; + const scalar f = factor[celli]; + + T s(pTraits<T>::zero); + forAll(nbrs, nbrI) + { + s += w[nbrI]*work[nbrs[nbrI]]; + } + //Pout<< "Interpolated value:" << s << endl; + //T oldPsi = psi[celli]; + psi[celli] = (1.0-f)*psi[celli] + f*s; + //Pout<< "psi was:" << oldPsi << " now:" << psi[celli] << endl; + } +} + + +template<class GeoField> +void Foam::dynamicOversetFvMesh::interpolate(GeoField& psi) const +{ + interpolate(psi.primitiveFieldRef()); + psi.correctBoundaryConditions(); +} + + +//template<class T> +//void Foam::dynamicOversetFvMesh::setReference(fvMatrix<T>& m) const +//{ +// const mapDistribute& map = cellInterpolationMap(); +// const List<scalarList>& wghts = cellInterpolationWeights(); +// const labelListList& stencil = cellStencil(); +// const labelList& cellIDs = interpolationCells(); +// const scalarList& factor = cellInterpolationWeight(); +// +// Field<T> work(m.psi()); +// map.mapDistributeBase::distribute(work, UPstream::msgType()+1); +// +// forAll(cellIDs, i) +// { +// label celli = cellIDs[i]; +// +// const scalarList& w = wghts[celli]; +// const labelList& nbrs = stencil[celli]; +// const scalar f = factor[celli]; +// +// //Pout<< "Interpolating " << celli << " from values:" << endl; +// T s(pTraits<T>::zero); +// forAll(nbrs, nbrI) +// { +// //Pout<< " " << work[nbrs[nbrI]] +// // << " from slot " << nbrs[nbrI] << endl; +// s += w[nbrI]*work[nbrs[nbrI]]; +// } +// //Pout<< "Interpolated value:" << s << endl; +// const T oldPsi = m.psi()[celli]; +// m.setReference(celli, (1.0-f)*oldPsi + f*s, true); +// Pout<< "psi was:" << oldPsi << " now forcing to:" +// << (1.0-f)*oldPsi + f*s << endl; +// } +//} + + +template<class Type> +void Foam::dynamicOversetFvMesh::addInterpolation(fvMatrix<Type>& m) const +{ + const cellCellStencilObject& overlap = Stencil::New(*this); + const List<scalarList>& wghts = overlap.cellInterpolationWeights(); + const labelListList& stencil = overlap.cellStencil(); + const labelList& cellIDs = overlap.interpolationCells(); + const scalarList& factor = overlap.cellInterpolationWeight(); + const labelUList& types = overlap.cellTypes(); + + + // Force asymmetric matrix (if it wasn't already) + scalarField& lower = m.lower(); + scalarField& upper = m.upper(); + Field<Type>& source = m.source(); + scalarField& diag = m.diag(); + + + // Get the addressing. Note that the addressing is now extended with + // any interpolation faces. + const lduAddressing& addr = lduAddr(); + const labelUList& upperAddr = addr.upperAddr(); + const labelUList& lowerAddr = addr.lowerAddr(); + const labelUList& ownerStartAddr = addr.ownerStartAddr(); + const labelUList& losortAddr = addr.losortAddr(); + + + if (!isA<fvMeshPrimitiveLduAddressing>(addr)) + { + FatalErrorInFunction + << "Problem : addressing is not fvMeshPrimitiveLduAddressing" + << exit(FatalError); + } + + + + // 1. Adapt lduMatrix for additional faces and new ordering + upper.setSize(upperAddr.size(), 0.0); + inplaceReorder(reverseFaceMap_, upper); + lower.setSize(lowerAddr.size(), 0.0); + inplaceReorder(reverseFaceMap_, lower); + + + // 2. Adapt fvMatrix level: faceFluxCorrectionPtr + // Question: do we need to do this? + // This seems to be set/used only by the gaussLaplacianScheme and + // fvMatrix:correction, both of which are outside the linear solver. + + + + // Clear out existing connections on cells to be interpolated + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Note: could avoid doing the zeroing of the new faces since these + // are set to zero anyway. + + forAll(upperAddr, facei) + { + if (types[upperAddr[facei]] == cellCellStencil::INTERPOLATED) + { + // Disconnect upper from lower + label celli = upperAddr[facei]; + lower[facei] *= 1.0-factor[celli]; + } + if (types[lowerAddr[facei]] == cellCellStencil::INTERPOLATED) + { + // Disconnect lower from upper + label celli = lowerAddr[facei]; + upper[facei] *= 1.0-factor[celli]; + } + } + + forAll(m.internalCoeffs(), patchI) + { + const labelUList& fc = addr.patchAddr(patchI); + Field<Type>& intCoeffs = m.internalCoeffs()[patchI]; + Field<Type>& bouCoeffs = m.boundaryCoeffs()[patchI]; + forAll(fc, i) + { + label celli = fc[i]; + { + if (types[celli] == cellCellStencil::INTERPOLATED) + { + scalar f = factor[celli]; + intCoeffs[i] *= 1.0-f; + bouCoeffs[i] *= 1.0-f; + } + else if (types[celli] == cellCellStencil::HOLE) + { + intCoeffs[i] = pTraits<Type>::zero; + bouCoeffs[i] = pTraits<Type>::zero; + } + } + } + } + + + + // Modify matrix + // ~~~~~~~~~~~~~ + + + + // Do hole cells. Note: maybe put into interpolationCells() loop above? + forAll(types, celli) + { + if (types[celli] == cellCellStencil::HOLE) + { + //Pout<< "Found hole cell:" << celli + // << " at:" << C()[celli] + // << " ; setting value" << endl; + + label startLabel = ownerStartAddr[celli]; + label endLabel = ownerStartAddr[celli + 1]; + + for (label facei = startLabel; facei < endLabel; facei++) + { + upper[facei] = 0.0; + } + + startLabel = addr.losortStartAddr()[celli]; + endLabel = addr.losortStartAddr()[celli + 1]; + + for (label i = startLabel; i < endLabel; i++) + { + label facei = losortAddr[i]; + lower[facei] = 0.0; + } + + const scalar normalisation = V()[celli]; + diag[celli] = normalisation; + source[celli] = normalisation*m.psi()[celli]; + } + } + + + forAll(cellIDs, i) + { + label celli = cellIDs[i]; + + const scalar f = factor[celli]; + const scalarList& w = wghts[celli]; + const labelList& nbrs = stencil[celli]; + const labelList& nbrFaces = stencilFaces_[celli]; + + const scalar normalisation = V()[celli]; + + if (types[celli] == cellCellStencil::HOLE) + { + FatalErrorInFunction << "Found HOLE cell " << celli + << " at:" << C()[celli] + << " . Should this be in interpolationCells()????" + << abort(FatalError); + } + else + { + // Create interpolation stencil. Leave any non-local contributions + // to be done by oversetFvPatchField updateMatrixInterface + + diag[celli] *= (1.0-f); + diag[celli] += normalisation*f; + + source[celli] *= (1.0-f); + source[celli] += normalisation*f*pTraits<Type>::zero; // dummy + + //Pout<< "Interpolating " << celli << " with factor:" << f + // << " new diag:" << diag[celli] + // << " new source:" << source[celli] + // << " volume:" << V()[celli] << endl; + + forAll(nbrs, nbri) + { + label facei = nbrFaces[nbri]; + + if (facei != -1) + { + label nbrCelli = nbrs[nbri]; + + // Add the coefficients + + scalar& u = upper[facei]; + scalar& l = lower[facei]; + if (celli < nbrCelli) + { + u += -normalisation*f*w[nbri]; + } + else + { + l += -normalisation*f*w[nbri]; + } + } + //else + //{ + // Pout<< "addItnerpolation of " << celli + // << " at:" << this->cellCentres()[celli] + // << " zone:" << this->zoneID()[celli] + // << " diag:" << diag[celli] + // << " source:" << source[celli] + // <<" : skipping remote cell:" << nbrs[nbri] + // << " with weight:" << w[nbri] + // << endl; + //} + } + } + } +} + + +template<class Type> +Foam::SolverPerformance<Type> Foam::dynamicOversetFvMesh::solve +( + fvMatrix<Type>& m, + const dictionary& dict +) const +{ + // Switch to extended addressing (requires mesh::update() having been + // called) + active(true); + + // Adapt matrix + scalarField oldUpper(m.upper()); + scalarField oldLower(m.lower()); + FieldField<Field, Type> oldInt(m.internalCoeffs()); + FieldField<Field, Type> oldBou(m.boundaryCoeffs()); + + addInterpolation(m); + + // Print a bit + //write(Pout, m, lduAddr()); + + // Use lower level solver + SolverPerformance<Type> s(dynamicMotionSolverFvMesh::solve(m, dict)); + + // Reset matrix (shuffle faces into original order) + //resetMatrix(m); + m.upper().transfer(oldUpper); + m.lower().transfer(oldLower); + m.internalCoeffs().transfer(oldInt); + m.boundaryCoeffs().transfer(oldBou); + + // Switch to original addressing + active(false); + + return s; +} + + +template<class Type> +void Foam::dynamicOversetFvMesh::write +( + Ostream& os, + const fvMatrix<Type>& m, + const lduAddressing& addr +) const +{ + os << "** Matrix **" << endl; + const labelUList& upperAddr = addr.upperAddr(); + const labelUList& lowerAddr = addr.lowerAddr(); + const labelUList& ownerStartAddr = addr.ownerStartAddr(); + const labelUList& losortAddr = addr.losortAddr(); + + const scalarField& lower = m.lower(); + const scalarField& upper = m.upper(); + const Field<Type>& source = m.source(); + const scalarField& diag = m.diag(); + + forAll(source, celli) + { + os << "cell:" << celli << " diag:" << diag[celli] + << " source:" << source[celli] << endl; + + label startLabel = ownerStartAddr[celli]; + label endLabel = ownerStartAddr[celli + 1]; + + for (label facei = startLabel; facei < endLabel; facei++) + { + os << " face:" << facei + << " nbr:" << upperAddr[facei] << " coeff:" << upper[facei] + << endl; + } + + startLabel = addr.losortStartAddr()[celli]; + endLabel = addr.losortStartAddr()[celli + 1]; + + for (label i = startLabel; i < endLabel; i++) + { + label facei = losortAddr[i]; + os << " face:" << facei + << " nbr:" << lowerAddr[facei] << " coeff:" << lower[facei] + << endl; + } + } + forAll(m.internalCoeffs(), patchi) + { + if (m.internalCoeffs().set(patchi)) + { + const labelUList& fc = addr.patchAddr(patchi); + + os << "patch:" << patchi << " size:" << fc.size() << endl; + forAll(fc, i) + { + os << " cell:" << fc[i] + << " int:" << m.internalCoeffs()[patchi][i] + << " boun:" << m.boundaryCoeffs()[patchi][i] + << endl; + } + } + } + + + lduInterfaceFieldPtrsList interfaces = + m.psi().boundaryField().scalarInterfaces(); + forAll(interfaces, inti) + { + if (interfaces.set(inti)) + { + os << "interface:" << inti + << " if type:" << interfaces[inti].interface().type() + << " fld type:" << interfaces[inti].type() << endl; + } + } + + os << "** End of Matrix **" << endl; +} + + +template<class GeoField> +void Foam::dynamicOversetFvMesh::correctCoupledBoundaryConditions(GeoField& fld) +{ + typename GeoField::Boundary& bfld = fld.boundaryFieldRef(); + + label nReq = Pstream::nRequests(); + + forAll(bfld, patchi) + { + if (bfld[patchi].coupled()) + { + Pout<< "initEval of " << bfld[patchi].patch().name() << endl; + bfld[patchi].initEvaluate(Pstream::defaultCommsType); + } + } + + // Block for any outstanding requests + if (Pstream::parRun()) + { + Pstream::waitRequests(nReq); + } + + forAll(bfld, patchi) + { + if (bfld[patchi].coupled()) + { + Pout<< "eval of " << bfld[patchi].patch().name() << endl; + bfld[patchi].evaluate(Pstream::defaultCommsType); + } + } +} + + +template<class GeoField> +void Foam::dynamicOversetFvMesh::checkCoupledBC(const GeoField& fld) +{ + Pout<< "** starting checking of " << fld.name() << endl; + + GeoField fldCorr(fld.name()+"_correct", fld); + correctCoupledBoundaryConditions(fldCorr); + + const typename GeoField::Boundary& bfld = fld.boundaryField(); + const typename GeoField::Boundary& bfldCorr = fldCorr.boundaryField(); + + forAll(bfld, patchi) + { + const typename GeoField::Patch& pfld = bfld[patchi]; + const typename GeoField::Patch& pfldCorr = bfldCorr[patchi]; + + Pout<< "Patch:" << pfld.patch().name() << endl; + + forAll(pfld, i) + { + if (pfld[i] != pfldCorr[i]) + { + Pout<< " " << i << " orig:" << pfld[i] + << " corrected:" << pfldCorr[i] << endl; + } + } + } + Pout<< "** end of " << fld.name() << endl; +} + + +// ************************************************************************* // diff --git a/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C new file mode 100644 index 00000000000..d779b59de64 --- /dev/null +++ b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.C @@ -0,0 +1,267 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "fvMeshPrimitiveLduAddressing.H" +#include "lduPrimitiveMesh.H" +#include "processorLduInterface.H" +#include "globalIndex.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + + +Foam::fvMeshPrimitiveLduAddressing::fvMeshPrimitiveLduAddressing +( + const fvMesh& mesh +) +: + lduAddressing(mesh.nCells()), + lowerAddr_ + ( + labelList::subList + ( + mesh.faceOwner(), + mesh.nInternalFaces() + ) + ), + upperAddr_(mesh.faceNeighbour()), + patchAddr_(mesh.boundary().size()), + patchSchedule_(mesh.globalData().patchSchedule()) +{ + forAll(mesh.boundary(), patchI) + { + patchAddr_[patchI] = &mesh.boundary()[patchI].faceCells(); + } +} + + +Foam::fvMeshPrimitiveLduAddressing::fvMeshPrimitiveLduAddressing +( + const label nCells, + const Xfer<labelList>& lowerAddr, + const Xfer<labelList>& upperAddr, + const List<const labelUList*>& patchAddr, + const lduSchedule& ps +) +: + lduAddressing(nCells), + lowerAddr_(lowerAddr), + upperAddr_(upperAddr), + patchAddr_(patchAddr), + patchSchedule_(ps) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::label Foam::fvMeshPrimitiveLduAddressing::triIndex +( + const lduAddressing& addr, + const label a, + const label b +) +{ + label own = min(a, b); + + label nbr = max(a, b); + + label startLabel = addr.ownerStartAddr()[own]; + + label endLabel = addr.ownerStartAddr()[own + 1]; + + const labelUList& neighbour = addr.upperAddr(); + + for (label i = startLabel; i < endLabel; i++) + { + if (neighbour[i] == nbr) + { + return i; + } + } + return -1; +} + + +Foam::labelList Foam::fvMeshPrimitiveLduAddressing::addAddressing +( + const lduAddressing& addr, + const labelListList& nbrCells, + label& nExtraFaces, + labelList& newLowerAddr, + labelList& newUpperAddr, + labelListList& nbrCellFaces, + const globalIndex& globalNumbering, + const labelList& globalCellIDs, + labelListList& localFaceCells, + labelListList& remoteFaceCells +) +{ + label nCells = addr.size(); + label nFaces = addr.upperAddr().size(); + labelList nProcFaces(Pstream::nProcs(), 0); + + // Count additional faces + nExtraFaces = 0; + forAll(nbrCells, cellI) + { + const labelList& nbrs = nbrCells[cellI]; + forAll(nbrs, nbrI) + { + if (nbrs[nbrI] < nCells) + { + // Local cell + if (triIndex(addr, cellI, nbrs[nbrI]) == -1) + { + nExtraFaces++; + } + } + else + { + label globalNbr = globalCellIDs[nbrs[nbrI]]; + label procI = globalNumbering.whichProcID(globalNbr); + nProcFaces[procI]++; + } + } + } + + // Create space for extra addressing + newLowerAddr.setSize(nFaces + nExtraFaces); + newUpperAddr.setSize(nFaces + nExtraFaces); + + // Copy existing addressing + SubList<label>(newLowerAddr, nFaces) = addr.lowerAddr(); + SubList<label>(newUpperAddr, nFaces) = addr.upperAddr(); + + + // Per processor its local cells we want + localFaceCells.setSize(Pstream::nProcs()); + remoteFaceCells.setSize(Pstream::nProcs()); + forAll(nProcFaces, procI) + { + localFaceCells[procI].setSize(nProcFaces[procI]); + remoteFaceCells[procI].setSize(nProcFaces[procI]); + } + nProcFaces = 0; + + nbrCellFaces.setSize(nbrCells.size()); + forAll(nbrCells, cellI) + { + const labelList& nbrs = nbrCells[cellI]; + labelList& faces = nbrCellFaces[cellI]; + faces.setSize(nbrs.size()); + + forAll(nbrs, nbrI) + { + label nbrCellI = nbrs[nbrI]; + + if (nbrCellI < nCells) + { + // Find neighbour cell in owner list + label faceI = triIndex(addr, cellI, nbrCellI); + if (faceI == -1) + { + faceI = nFaces++; + newLowerAddr[faceI] = min(cellI, nbrCellI); + newUpperAddr[faceI] = max(cellI, nbrCellI); + } + faces[nbrI] = faceI; + } + else + { + // Remote cell + faces[nbrI] = -1; + + label globalNbr = globalCellIDs[nbrs[nbrI]]; + label procI = globalNumbering.whichProcID(globalNbr); + label remoteCellI = globalNumbering.toLocal(procI, globalNbr); + + label procFaceI = nProcFaces[procI]++; + localFaceCells[procI][procFaceI] = cellI; + remoteFaceCells[procI][procFaceI] = remoteCellI; + } + } + } + + // Reorder upper-triangular + labelList oldToNew + ( + lduPrimitiveMesh::upperTriOrder + ( + addr.size(), + newLowerAddr, + newUpperAddr + ) + ); + + // Shuffle face-to-cell addressing + inplaceReorder(oldToNew, newLowerAddr); + inplaceReorder(oldToNew, newUpperAddr); + // Update cell-to-face addressing + forAll(nbrCellFaces, cellI) + { + inplaceRenumber(oldToNew, nbrCellFaces[cellI]); + } + + //if (debug) + //{ + // for + // ( + // label i = addr.upperAddr().size(); + // i < oldToNew.size(); + // i++ + // ) + // { + // label faceI = oldToNew[i]; + // Pout<< "new face:" << faceI << endl + // << " owner:" << newLowerAddr[faceI] + // << " neighbour:" << newUpperAddr[faceI] + // << endl; + // } + // + // forAll(nbrCellFaces, cellI) + // { + // const labelList& nbrs = nbrCells[cellI]; + // const labelList& nbrFaces = nbrCellFaces[cellI]; + // if (nbrs.size()) + // { + // Pout<< "cell:" << cellI << " has additional neighbours:" + // << endl; + // forAll(nbrs, i) + // { + // label faceI = nbrFaces[i]; + // Pout<< " nbr:" << nbrs[i] + // << " through face:" << faceI + // << " with own:" << newLowerAddr[faceI] + // << " with nei:" << newUpperAddr[faceI] + // << endl; + // } + // } + // } + //} + + return oldToNew; +} + + +// ************************************************************************* // diff --git a/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H new file mode 100644 index 00000000000..097a4308125 --- /dev/null +++ b/src/overset/fvMeshPrimitiveLduAddressing/fvMeshPrimitiveLduAddressing.H @@ -0,0 +1,172 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::fvMeshPrimitiveLduAddressing + +Description + Variant of fvMeshLduAddressing that contains addressing instead of + slices. + + Alternatively use lduPrimitiveMesh but that assumes there are only + lduInterfaces and not also generic patches. + +SourceFiles + fvMeshPrimitiveLduAddressing.C + +\*---------------------------------------------------------------------------*/ + +#ifndef fvMeshPrimitiveLduAddressing_H +#define fvMeshPrimitiveLduAddressing_H + +#include "lduPrimitiveMesh.H" +#include "lduAddressing.H" +#include "fvMesh.H" +#include "globalMeshData.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class fvMeshPrimitiveLduAddressing Declaration +\*---------------------------------------------------------------------------*/ + +class fvMeshPrimitiveLduAddressing +: + public lduAddressing +{ + // Private data + + //- Lower (face to owner addressing) + labelList lowerAddr_; + + //- Upper (face to neighbour addressing) + labelList upperAddr_; + + //- Patch addressing as a list of sublists + List<const labelUList*> patchAddr_; + + //- Patch field evaluation schedule + const lduSchedule& patchSchedule_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + fvMeshPrimitiveLduAddressing(const fvMeshPrimitiveLduAddressing&); + + //- Disallow default bitwise assignment + void operator=(const fvMeshPrimitiveLduAddressing&); + + +public: + + // Constructors + + //- Construct from mesh + fvMeshPrimitiveLduAddressing(const fvMesh& mesh); + + //- Construct from components + fvMeshPrimitiveLduAddressing + ( + const label nCells, + const Xfer<labelList>& lowerAddr, + const Xfer<labelList>& upperAddr, + const List<const labelUList*>& interfaces, + const lduSchedule& ps + ); + + + //- Destructor + virtual ~fvMeshPrimitiveLduAddressing() + {} + + + // Member Functions + + //- Return lower addressing (i.e. lower label = upper triangle) + virtual const labelUList& lowerAddr() const + { + return lowerAddr_; + } + + //- Return upper addressing (i.e. upper label) + virtual const labelUList& upperAddr() const + { + return upperAddr_; + } + + //- Return patch addressing + virtual const labelUList& patchAddr(const label i) const + { + return *patchAddr_[i]; + } + + // Return patch field evaluation schedule + virtual const lduSchedule& patchSchedule() const + { + return patchSchedule_; + } + + //- Given additional addressing (in the form of additional neighbour + // cells, i.e. like cellCells) + // - add any additional faces + // - sort in upper-triangular order + // - construct cell-faces equivalent of given nbrCells + // (so e.g. nbrCellFaces[cellI][0] is the face corresponding to + // the cell nbrCells[cellI][0]) + // (note: face in nbrCellFaces is -1 if the nbrCell is not local) + // - construct additional processor interface addressing: + // per processor the local and the remote cell. + // - return old-to-new face mapping + static labelList addAddressing + ( + const lduAddressing& addr, + const labelListList& nbrCells, + label& nExtraFaces, + labelList& lower, + labelList& upper, + labelListList& nbrCellFaces, + const globalIndex&, + const labelList& globalCellIDs, + labelListList& localFaceCells, + labelListList& remoteFaceCells + ); + + //- Return off-diagonal index given owner and neighbour label. Return + // -1 if not found + static label triIndex(const lduAddressing&, const label, const label); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/include/createCellMask.H b/src/overset/include/createCellMask.H new file mode 100644 index 00000000000..61de1068858 --- /dev/null +++ b/src/overset/include/createCellMask.H @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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/>. + +Global + blockedCellMask + +Description + Creates mask for blocked out cells + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Info<< "Creating cellMask field to block out hole cells\n" << endl; + +volScalarField cellMask +( + IOobject + ( + "cellMask", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::AUTO_WRITE + ), + mesh, + dimensionedScalar("cellMask", dimless, 1.0), + zeroGradientFvPatchScalarField::typeName +); + +#include "setCellMask.H" + +// ************************************************************************* // diff --git a/src/overset/include/createInterpolatedCells.H b/src/overset/include/createInterpolatedCells.H new file mode 100644 index 00000000000..87b8ebbb4a0 --- /dev/null +++ b/src/overset/include/createInterpolatedCells.H @@ -0,0 +1,53 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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/>. + +Global + interpolatedCells + +Description + Creates mask for interpolated cells + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +Info<< "Creating interpolatedCells field \n" << endl; + +volScalarField interpolatedCells +( + IOobject + ( + "interpolatedCells", + runTime.timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar("interpolatedCells", dimless, 1.0), + zeroGradientFvPatchScalarField::typeName +); + +#include "setInterpolatedCells.H" + +// ************************************************************************* // diff --git a/src/overset/include/setCellMask.H b/src/overset/include/setCellMask.H new file mode 100644 index 00000000000..92e187ee596 --- /dev/null +++ b/src/overset/include/setCellMask.H @@ -0,0 +1,51 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 + +Description + Sets blocked cells mask field + +SourceFiles + +\*---------------------------------------------------------------------------*/ + +{ + const cellCellStencilObject& overlap = Stencil::New(mesh); + const labelList& cellTypes = overlap.cellTypes(); + + //label nHoles = 0; + + cellMask.primitiveFieldRef() = 1.0; + forAll(cellMask, cellI) + { + if (cellTypes[cellI] == cellCellStencil::HOLE) + { + cellMask[cellI] = 0.0; + //nHoles++; + } + } + cellMask.correctBoundaryConditions(); +} + +// ************************************************************************* // diff --git a/src/overset/include/setInterpolatedCells.H b/src/overset/include/setInterpolatedCells.H new file mode 100644 index 00000000000..6b3cac9e854 --- /dev/null +++ b/src/overset/include/setInterpolatedCells.H @@ -0,0 +1,48 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 + +Description + Sets blocked cells mask field + +SourceFiles + +\*---------------------------------------------------------------------------*/ + +{ + const cellCellStencilObject& overlap = Stencil::New(mesh); + const labelList& cellTypes = overlap.cellTypes(); + + interpolatedCells.primitiveFieldRef() = 1.0; + forAll(cellMask, cellI) + { + if (cellTypes[cellI] == cellCellStencil::INTERPOLATED) + { + interpolatedCells[cellI] = 0.0; + } + } + interpolatedCells.correctBoundaryConditions(); +} + +// ************************************************************************* // diff --git a/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C new file mode 100644 index 00000000000..c12dc99f90f --- /dev/null +++ b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.C @@ -0,0 +1,97 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "lduPrimitiveProcessorInterface.H" +#include "transformField.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(lduPrimitiveProcessorInterface, 0); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::lduPrimitiveProcessorInterface::lduPrimitiveProcessorInterface +( + const labelUList& faceCells, + const label myProcNo, + const label neighbProcNo, + const tensorField& forwardT, + const int tag, + const label comm +) +: + faceCells_(faceCells), + myProcNo_(myProcNo), + neighbProcNo_(neighbProcNo), + forwardT_(forwardT), + tag_(tag), + comm_(comm) +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::tmp<Foam::labelField> +Foam::lduPrimitiveProcessorInterface::interfaceInternalField +( + const labelUList& internalData +) const +{ + tmp<labelField> tfld(new labelField(faceCells_.size())); + labelField& fld = tfld.ref(); + forAll(faceCells_, i) + { + fld[i] = internalData[faceCells_[i]]; + } + return tfld; +} + + +void Foam::lduPrimitiveProcessorInterface::initInternalFieldTransfer +( + const Pstream::commsTypes commsType, + const labelUList& iF +) const +{ + processorLduInterface::send(commsType, interfaceInternalField(iF)()); +} + + +Foam::tmp<Foam::labelField> +Foam::lduPrimitiveProcessorInterface::internalFieldTransfer +( + const Pstream::commsTypes commsType, + const labelUList& +) const +{ + return processorLduInterface::receive<label>(commsType, faceCells_.size()); +} + + +// ************************************************************************* // diff --git a/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H new file mode 100644 index 00000000000..2f1777008f9 --- /dev/null +++ b/src/overset/lduPrimitiveProcessorInterface/lduPrimitiveProcessorInterface.H @@ -0,0 +1,193 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +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::lduPrimitiveProcessorInterface + +Description + Concrete implementation of processor interface. Used to temporarily store + settings. + +SourceFiles + lduPrimitiveProcessorInterface.C + +\*---------------------------------------------------------------------------*/ + +#ifndef lduPrimitiveProcessorInterface_H +#define lduPrimitiveProcessorInterface_H + +#include "GAMGInterface.H" +#include "processorLduInterface.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class lduPrimitiveProcessorInterface Declaration +\*---------------------------------------------------------------------------*/ + +class lduPrimitiveProcessorInterface +: + public lduInterface, + public processorLduInterface +{ + // Private data + + const labelList faceCells_; + + //- My processor rank in communicator + label myProcNo_; + + //- Neighbouring processor rank in communicator + label neighbProcNo_; + + //- Transformation tensor + tensorField forwardT_; + + //- Message tag used for sending + int tag_; + + //- Communicator to use for parallel communication + const label comm_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + lduPrimitiveProcessorInterface(const lduPrimitiveProcessorInterface&); + + //- Disallow default bitwise assignment + void operator=(const lduPrimitiveProcessorInterface&); + + +public: + + //- Runtime type information + TypeName("primitiveProcessor"); + + + // Constructors + + //- Construct from components + lduPrimitiveProcessorInterface + ( + const labelUList& faceCells, + const label myProcNo, + const label neighbProcNo, + const tensorField& forwardT, + const int tag, + const label comm = UPstream::worldComm + ); + + + //- Destructor + virtual ~lduPrimitiveProcessorInterface() + {} + + + // Member Functions + + // Access + + //- Return faceCell addressing + virtual const labelUList& faceCells() const + { + return faceCells_; + } + + + // Interface transfer functions + + //- Return the values of the given internal data adjacent to + // the interface as a field + virtual tmp<labelField> interfaceInternalField + ( + const labelUList& internalData + ) const; + + //- Initialise neighbour field transfer + virtual void initInternalFieldTransfer + ( + const Pstream::commsTypes commsType, + const labelUList& iF + ) const; + + //- Transfer and return internal field adjacent to the interface + virtual tmp<labelField> internalFieldTransfer + ( + const Pstream::commsTypes commsType, + const labelUList& iF + ) const; + + + //- Processor interface functions + + //- Return communicator used for sending + virtual label comm() const + { + return comm_; + } + + //- Return processor number (rank in communicator) + virtual int myProcNo() const + { + return myProcNo_; + } + + //- Return neigbour processor number (rank in communicator) + virtual int neighbProcNo() const + { + return neighbProcNo_; + } + + //- Return face transformation tensor + virtual const tensorField& forwardT() const + { + return forwardT_; + } + + //- Return message tag used for sending + virtual int tag() const + { + return tag_; + } + + +// // I/O +// +// //- Write to stream +// virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetAdjustPhi/oversetAdjustPhi.C b/src/overset/oversetAdjustPhi/oversetAdjustPhi.C new file mode 100644 index 00000000000..b6eb644b550 --- /dev/null +++ b/src/overset/oversetAdjustPhi/oversetAdjustPhi.C @@ -0,0 +1,291 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetAdjustPhi.H" +#include "volFields.H" +#include "surfaceFields.H" +#include "cellCellStencilObject.H" +#include "syncTools.H" +#include "fv.H" + +// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // + +bool Foam::oversetAdjustPhi +( + surfaceScalarField& phi, + const volVectorField& U +) +{ + const fvMesh& mesh = U.mesh(); + + const cellCellStencilObject& overlap = Stencil::New(mesh); + const labelList& cellTypes = overlap.cellTypes(); + const labelList& zoneID = overlap.zoneID(); + label nZones = gMax(zoneID)+1; + + + + // Pass1: accumulate all fluxes, calculate correction factor + + scalarField massIn(nZones, 0.0); + scalarField adjustableMassOut(nZones, 0.0); + + surfaceScalarField::Boundary& bphi = + phi.boundaryFieldRef(); + + + // Check all faces on the outside of interpolated cells + const labelUList& own = mesh.owner(); + const labelUList& nei = mesh.neighbour(); + { + forAll(own, facei) + { + label zonei = zoneID[own[facei]]; // note:own and nei in same zone + + label ownType = cellTypes[own[facei]]; + label neiType = cellTypes[nei[facei]]; + + bool ownCalc = + (ownType == cellCellStencil::CALCULATED) + && (neiType == cellCellStencil::INTERPOLATED); + + bool neiCalc = + (ownType == cellCellStencil::INTERPOLATED) + && (neiType == cellCellStencil::CALCULATED); + + + if (ownCalc || neiCalc) + { + // Calculate flux w.r.t. calculated cell + scalar flux = phi[facei]; + if (neiCalc) + { + flux = -flux; + } + + if (flux < 0.0) + { + massIn[zonei] -= flux; + } + else + { + adjustableMassOut[zonei] += flux; + } + } + } + } + + + // Check all coupled faces on the outside of interpolated cells + labelList neiCellTypes; + syncTools::swapBoundaryCellList(mesh, cellTypes, neiCellTypes); + { + forAll(bphi, patchi) + { + const fvPatchVectorField& Up = U.boundaryField()[patchi]; + const fvsPatchScalarField& phip = bphi[patchi]; + const labelUList& fc = Up.patch().faceCells(); + + label start = Up.patch().start(); + + forAll(fc, i) + { + label facei = start+i; + label celli = fc[i]; + label ownType = cellTypes[celli]; + label neiType = neiCellTypes[facei-mesh.nInternalFaces()]; + + bool ownCalc = + (ownType == cellCellStencil::CALCULATED) + && (neiType == cellCellStencil::INTERPOLATED); + + bool neiCalc = + (ownType == cellCellStencil::INTERPOLATED) + && (neiType == cellCellStencil::CALCULATED); + + + if (ownCalc || neiCalc) + { + // Calculate flux w.r.t. calculated cell + scalar flux = phip[i]; + if (neiCalc) + { + flux = -flux; + } + + if (flux < 0.0) + { + massIn[zoneID[celli]] -= flux; + } + else + { + adjustableMassOut[zoneID[celli]] += flux; + } + } + } + } + } + + // Calculate the total flux in the domain, used for normalisation + scalar totalFlux = VSMALL + sum(mag(phi)).value(); + + forAll(massIn, zonei) + { + reduce(massIn[zonei], sumOp<scalar>()); + reduce(adjustableMassOut[zonei], sumOp<scalar>()); + } + + + scalarField massCorr(nZones, 1.0); + + forAll(massIn, zonei) + { + scalar magAdjustableMassOut = mag(adjustableMassOut[zonei]); + + if + ( + magAdjustableMassOut > VSMALL + && magAdjustableMassOut/totalFlux > SMALL + ) + { + massCorr[zonei] = massIn[zonei]/adjustableMassOut[zonei]; + } + else if (mag(massIn[zonei])/totalFlux > 1e-8) + { + WarningInFunction + << "Continuity error cannot be removed by adjusting the" + " flow at fringe faces.\n Please check the cell types" + << " from the overset analysis." + << nl + << "Zone : " << zonei << nl + << "Total flux : " << totalFlux << nl + << "Specified mass inflow : " << massIn[zonei] << nl + << "Adjustable mass outflow : " << adjustableMassOut[zonei] + << nl << endl; + } + + + if (fv::debug) + { + Info<< "Zone : " << zonei << nl + << "Total flux : " << totalFlux << nl + << "Specified mass inflow : " << massIn[zonei] << nl + << "Adjustable mass outflow : " << adjustableMassOut[zonei] + << nl + << "Correction factor : " << massCorr[zonei] << nl + << endl; + } + } + + + + // Pass2: adjust fluxes + + forAll(own, facei) + { + label zonei = zoneID[own[facei]]; // note:own and nei in same zone + + label ownType = cellTypes[own[facei]]; + label neiType = cellTypes[nei[facei]]; + + bool ownCalc = + (ownType == cellCellStencil::CALCULATED) + && (neiType == cellCellStencil::INTERPOLATED); + + bool neiCalc = + (ownType == cellCellStencil::INTERPOLATED) + && (neiType == cellCellStencil::CALCULATED); + + if (ownCalc || neiCalc) + { + // Calculate flux w.r.t. calculated cell + scalar flux = phi[facei]; + if (neiCalc) + { + flux = -flux; + } + + if (flux < 0.0) + { + phi[facei] /= Foam::sqrt(massCorr[zonei]); + } + else + { + phi[facei] *= Foam::sqrt(massCorr[zonei]); + } + } + } + + forAll(bphi, patchi) + { + const fvPatchVectorField& Up = U.boundaryField()[patchi]; + fvsPatchScalarField& phip = bphi[patchi]; + const labelUList& fc = Up.patch().faceCells(); + + label start = Up.patch().start(); + + forAll(fc, i) + { + label facei = start+i; + label celli = fc[i]; + label zonei = zoneID[celli]; // note:own and nei in same zone + label ownType = cellTypes[celli]; + label neiType = neiCellTypes[facei-mesh.nInternalFaces()]; + + bool ownCalc = + (ownType == cellCellStencil::CALCULATED) + && (neiType == cellCellStencil::INTERPOLATED); + + bool neiCalc = + (ownType == cellCellStencil::INTERPOLATED) + && (neiType == cellCellStencil::CALCULATED); + + if (ownCalc || neiCalc) + { + // Calculate flux w.r.t. calculated cell + scalar flux = phip[i]; + if (neiCalc) + { + flux = -flux; + } + + if (flux < 0.0) + { + phip[i] /= Foam::sqrt(massCorr[zonei]); + } + else + { + phip[i] *= Foam::sqrt(massCorr[zonei]); + } + } + } + } + + return sum(mag(massIn))/totalFlux < SMALL + && sum(mag(adjustableMassOut))/totalFlux < SMALL; +} + + +// ************************************************************************* // diff --git a/src/overset/oversetAdjustPhi/oversetAdjustPhi.H b/src/overset/oversetAdjustPhi/oversetAdjustPhi.H new file mode 100644 index 00000000000..1adfea339a6 --- /dev/null +++ b/src/overset/oversetAdjustPhi/oversetAdjustPhi.H @@ -0,0 +1,61 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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/>. + +InNamespace + Foam + +Description + Adjust the balance of fluxes on the faces between interpolated + and calculated to obey continuity. + +SourceFiles + oversetAdjustPhi.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetAdjustPhi_H +#define oversetAdjustPhi_H + +#include "volFieldsFwd.H" +#include "surfaceFieldsFwd.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +//- Adjust the balance of fluxes to obey continuity. +// Return true if no flux was adjusted. +bool oversetAdjustPhi +( + surfaceScalarField& phi, + const volVectorField& U +); + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvPatch.C b/src/overset/oversetPolyPatch/oversetFvPatch.C new file mode 100644 index 00000000000..1be8d160cb3 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvPatch.C @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetFvPatch.H" +#include "addToRunTimeSelectionTable.H" +#include "fvMesh.H" +#include "transform.H" +#include "cellCellStencilObject.H" +#include "volFields.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(oversetFvPatch, 0); + addToRunTimeSelectionTable(fvPatch, oversetFvPatch, polyPatch); +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::labelField> Foam::oversetFvPatch::interfaceInternalField +( + const labelUList& internalData +) const +{ + return patchInternalField(internalData); +} + + +Foam::tmp<Foam::labelField> Foam::oversetFvPatch::internalFieldTransfer +( + const Pstream::commsTypes commsType, + const labelUList& restrictMap +) const +{ + // Store the restrictMap. This routine gets used for + // - GAMGAgglomeration : this is the use we want to intercept. + // - GAMGProcAgglomeration : to find out the cell number on the other side + // - MGridGenGAMGAgglomeration: same + if (master()) + { + restrictMap_ = restrictMap; + } + + return patchInternalField(restrictMap); +} + + +const Foam::labelListList& Foam::oversetFvPatch::stencil() const +{ + const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh()); + + return overlap.cellStencil(); +} + + +const Foam::mapDistribute& Foam::oversetFvPatch::cellInterpolationMap() const +{ + const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh()); + return overlap.cellInterpolationMap(); +} + + +const Foam::List<Foam::scalarList>& +Foam::oversetFvPatch::cellInterpolationWeights() const +{ + const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh()); + return overlap.cellInterpolationWeights(); +} + + +const Foam::scalarField& Foam::oversetFvPatch::normalisation() const +{ + return boundaryMesh().mesh().V().field(); +} + + +const Foam::labelList& Foam::oversetFvPatch::interpolationCells() const +{ + const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh()); + return overlap.interpolationCells(); +} + + +const Foam::scalarList& Foam::oversetFvPatch::cellInterpolationWeight() const +{ + const cellCellStencilObject& overlap = Stencil::New(boundaryMesh().mesh()); + return overlap.cellInterpolationWeight(); +} + + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvPatch.H b/src/overset/oversetPolyPatch/oversetFvPatch.H new file mode 100644 index 00000000000..eaf4e4289a4 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvPatch.H @@ -0,0 +1,169 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::oversetFvPatch + +Description + Patch for indicating interpolated boundaries (in overset meshes). + +SourceFiles + oversetFvPatch.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetFvPatch_H +#define oversetFvPatch_H + +#include "fvPatch.H" +#include "oversetPolyPatch.H" +#include "fvBoundaryMesh.H" +#include "lduInterface.H" +#include "oversetLduInterface.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class oversetFvPatch Declaration +\*---------------------------------------------------------------------------*/ + +class oversetFvPatch +: + public lduInterface, + public oversetLduInterface, + public fvPatch +{ + // Private data + + const oversetPolyPatch& oversetPolyPatch_; + + //- Temporary copy of the fine level restrict map. Cleared upon + // calculating stencils below + mutable labelList restrictMap_; + + +public: + + //- Runtime type information + TypeName(oversetPolyPatch::typeName_()); + + + // Constructors + + //- Construct from polyPatch + oversetFvPatch(const polyPatch& patch, const fvBoundaryMesh& bm) + : + fvPatch(patch, bm), + oversetPolyPatch_(refCast<const oversetPolyPatch>(patch)) + {} + + + // Member functions + + // Access + + //- Return local reference cast into the overset patch + const oversetPolyPatch& oversetPatch() const + { + return oversetPolyPatch_; + } + + + // Access + + //- Return faceCell addressing + virtual const labelUList& faceCells() const + { + return oversetPolyPatch_.faceCells(); + } + + + // Interface transfer functions + + //- Return the values of the given internal data adjacent to + // the interface as a field + virtual tmp<labelField> interfaceInternalField + ( + const labelUList& internalData + ) const; + + //- Return neighbour field + virtual tmp<labelField> internalFieldTransfer + ( + const Pstream::commsTypes commsType, + const labelUList& internalData + ) const; + + + //- Overset interface functions + + //- Name of interface (for debugging) + virtual const word& name() const + { + return oversetPolyPatch_.name(); + } + + //- Am I the master interface + virtual bool master() const + { + return oversetPolyPatch_.master(); + } + + //- GAMG restriction (fine-to-coarse) + virtual const labelList& restrictMap() const + { + return restrictMap_; + } + + //- Donor stencil + virtual const labelListList& stencil() const; + + //- Map for obtaining data in stencil order + virtual const mapDistribute& cellInterpolationMap() const; + + //- Weights in stencil order + virtual const List<scalarList>& cellInterpolationWeights() const; + + //- Normalisation of matrix; for explicit contributions + virtual const scalarField& normalisation() const; + + //- Acceptor cells + virtual const labelList& interpolationCells() const; + + //- Underrelaxation for acceptor cells + virtual const scalarList& cellInterpolationWeight() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvPatchField.C b/src/overset/oversetPolyPatch/oversetFvPatchField.C new file mode 100644 index 00000000000..0d38b83514c --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvPatchField.C @@ -0,0 +1,354 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +template<class Type> +Foam::oversetFvPatchField<Type>::oversetFvPatchField +( + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF +) +: + LduInterfaceField<Type>(refCast<const oversetFvPatch>(p)), + zeroGradientFvPatchField<Type>(p, iF), + oversetPatch_(refCast<const oversetFvPatch>(p)) +{} + + +template<class Type> +Foam::oversetFvPatchField<Type>::oversetFvPatchField +( + const oversetFvPatchField<Type>& ptf, + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + LduInterfaceField<Type>(refCast<const oversetFvPatch>(p)), + zeroGradientFvPatchField<Type>(ptf, p, iF, mapper), + oversetPatch_(refCast<const oversetFvPatch>(p)) +{ + if (!isA<oversetFvPatch>(this->patch())) + { + FatalErrorInFunction + << " patch type '" << p.type() + << "' not constraint type '" << typeName << "'" + << "\n for patch " << p.name() + << " of field " << this->internalField().name() + << " in file " << this->internalField().objectPath() + << exit(FatalIOError); + } +} + + +template<class Type> +Foam::oversetFvPatchField<Type>::oversetFvPatchField +( + const fvPatch& p, + const DimensionedField<Type, volMesh>& iF, + const dictionary& dict +) +: + LduInterfaceField<Type>(refCast<const oversetFvPatch>(p)), + zeroGradientFvPatchField<Type>(p, iF, dict), + oversetPatch_(refCast<const oversetFvPatch>(p)) +{ + if (!isA<oversetFvPatch>(p)) + { + FatalIOErrorIn + ( + "oversetFvPatchField<Type>::oversetFvPatchField" + "(" + "const fvPatch&, " + "const DimensionedField<Type, volMesh>&, " + "const dictionary&" + ")", + dict + ) << " patch type '" << p.type() + << "' not constraint type '" << typeName << "'" + << "\n for patch " << p.name() + << " of field " << this->internalField().name() + << " in file " << this->internalField().objectPath() + << exit(FatalIOError); + } + + if (!dict.found("value") && this->coupled()) + { + this->evaluate(Pstream::commsTypes::blocking); + } +} + + +template<class Type> +Foam::oversetFvPatchField<Type>::oversetFvPatchField +( + const oversetFvPatchField<Type>& ptf +) +: + LduInterfaceField<Type>(ptf.oversetPatch_), + zeroGradientFvPatchField<Type>(ptf), + oversetPatch_(ptf.oversetPatch_) +{} + + +template<class Type> +Foam::oversetFvPatchField<Type>::oversetFvPatchField +( + const oversetFvPatchField<Type>& ptf, + const DimensionedField<Type, volMesh>& iF +) +: + LduInterfaceField<Type>(ptf.oversetPatch_), + zeroGradientFvPatchField<Type>(ptf, iF), + oversetPatch_(ptf.oversetPatch_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + + +template<class Type> +void Foam::oversetFvPatchField<Type>::initEvaluate +( + const Pstream::commsTypes commsType +) +{ + if (oversetPatch_.master()) + { + // Trigger interpolation + const fvMesh& mesh = this->internalField().mesh(); + const dictionary& fvSchemes = mesh.schemesDict(); + const word& fldName = this->internalField().name(); + + if (&mesh.lduAddr() != &mesh.fvMesh::lduAddr()) + { + // Running extended addressing. Interpolate always. + if (debug) + { + Info<< "Interpolating solved-for field " << fldName << endl; + } + + // Interpolate without bc update (since would trigger infinite + // recursion back to oversetFvPatchField<Type>::evaluate) + // The only problem is bcs that use the new cell values + // (e.g. zeroGradient, processor). These need to appear -after- + // the 'overset' bc. + mesh.interpolate + ( + const_cast<Field<Type>&> + ( + this->primitiveField() + ) + ); + } + else if + ( + !fvSchemes.found("oversetInterpolation") + || !fvSchemes.found("oversetInterpolationRequired") + ) + { + IOWarningInFunction(fvSchemes) + << "Missing required dictionary entries" + << " 'oversetInterpolation' and 'oversetInterpolationRequired'" + << ". Skipping overset interpolation for field " + << fldName << endl; + } + else + { + const dictionary& intDict = fvSchemes.subDict + ( + "oversetInterpolationRequired" + ); + if (intDict.found(fldName)) + { + if (debug) + { + Info<< "Interpolating field " << fldName << endl; + } + + // Interpolate without bc update (since would trigger infinite + // recursion back to oversetFvPatchField<Type>::evaluate) + // The only problem is bcs that use the new cell values + // (e.g. zeroGradient, processor). These need to appear -after- + // the 'overset' bc. + mesh.interpolate + ( + const_cast<Field<Type>&> + ( + this->primitiveField() + ) + ); + } + else if (debug) + { + Info<< "Skipping overset interpolation for field " + << fldName << endl; + } + } + } +} + + +template<class Type> +void Foam::oversetFvPatchField<Type>::evaluate(const Pstream::commsTypes) +{ + if (!this->updated()) + { + this->updateCoeffs(); + } + + zeroGradientFvPatchField<Type>::evaluate(); +} + + +template<class Type> +void Foam::oversetFvPatchField<Type>::initInterfaceMatrixUpdate +( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType +) const +{} + + +template<class Type> +void Foam::oversetFvPatchField<Type>::updateInterfaceMatrix +( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes +) const +{ + // Add remote values + if (oversetPatch_.master()) + { + const fvMesh& mesh = this->patch().boundaryMesh().mesh(); + + // Try to find out if the solve routine comes from the mesh + // TBD. This should be cleaner. + if (&mesh.lduAddr() == &mesh.fvMesh::lduAddr()) + { + //Pout<< "** not running extended addressing..." << endl; + return; + } + + const labelListList& stencil = oversetPatch_.stencil(); + + if (stencil.size() != psiInternal.size()) + { + FatalErrorInFunction << "psiInternal:" << psiInternal.size() + << " stencil:" << stencil.size() << exit(FatalError); + } + + const mapDistribute& map = oversetPatch_.cellInterpolationMap(); + const List<scalarList>& wghts = + oversetPatch_.cellInterpolationWeights(); + const labelList& cellIDs = oversetPatch_.interpolationCells(); + const scalarList& factor = oversetPatch_.cellInterpolationWeight(); + const scalarField& normalisation = oversetPatch_.normalisation(); + + + // Since we're inside initEvaluate/evaluate there might be processor + // comms underway. Change the tag we use. + scalarField work(psiInternal); + map.mapDistributeBase::distribute(work, UPstream::msgType()+1); + + forAll(cellIDs, i) + { + label celli = cellIDs[i]; + + const scalarList& w = wghts[celli]; + const labelList& nbrs = stencil[celli]; + scalar f = factor[celli]; + const scalar norm = normalisation[celli]; + + // Add the non-local matrix contribution to psi. Note that the + // matrix coefficients are -weights + + if (add) + { + f = -1.0*f; + } + + forAll(nbrs, nbrI) + { + label slotI = nbrs[nbrI]; + if (slotI >= psiInternal.size()) + { + result[celli] += f*norm*w[nbrI]*work[slotI]; + } + } + } + } +} + + +template<class Type> +void Foam::oversetFvPatchField<Type>::initInterfaceMatrixUpdate +( + Field<Type>&, + const bool add, + const Field<Type>&, + const scalarField&, + const Pstream::commsTypes commsType +) const +{ + NotImplemented; +} + + +template<class Type> +void Foam::oversetFvPatchField<Type>::updateInterfaceMatrix +( + Field<Type>& result, + const bool add, + const Field<Type>& psiInternal, + const scalarField&, + const Pstream::commsTypes +) const +{ + NotImplemented; +} + + +template<class Type> +void Foam::oversetFvPatchField<Type>::write(Ostream& os) const +{ + zeroGradientFvPatchField<Type>::write(os); + // Make sure to write the value for ease of postprocessing. + this->writeEntry("value", os); +} + + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvPatchField.H b/src/overset/oversetPolyPatch/oversetFvPatchField.H new file mode 100644 index 00000000000..3a337996ee6 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvPatchField.H @@ -0,0 +1,217 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::oversetFvPatchField + +Group + grpCoupledBoundaryConditions + +Description + +SeeAlso + +SourceFiles + oversetFvPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetFvPatchField_H +#define oversetFvPatchField_H + +#include "oversetFvPatch.H" +#include "zeroGradientFvPatchField.H" +#include "LduInterfaceField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class oversetFvPatchField Declaration +\*---------------------------------------------------------------------------*/ + +template<class Type> +class oversetFvPatchField +: + public LduInterfaceField<Type>, + public zeroGradientFvPatchField<Type> +{ + // Private data + + //- Local reference cast into the overset patch + const oversetFvPatch& oversetPatch_; + + //- Master patch ID + mutable label masterPatchID_; + + +public: + + //- Runtime type information + TypeName(oversetFvPatch::typeName_()); + + + // Constructors + + //- Construct from patch and internal field + oversetFvPatchField + ( + const fvPatch&, + const DimensionedField<Type, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + oversetFvPatchField + ( + const fvPatch&, + const DimensionedField<Type, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given oversetFvPatchField onto a new patch + oversetFvPatchField + ( + const oversetFvPatchField<Type>&, + const fvPatch&, + const DimensionedField<Type, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + oversetFvPatchField(const oversetFvPatchField<Type>&); + + //- Construct and return a clone + virtual tmp<fvPatchField<Type> > clone() const + { + return tmp<fvPatchField<Type> > + ( + new oversetFvPatchField<Type>(*this) + ); + } + + //- Construct as copy setting internal field reference + oversetFvPatchField + ( + const oversetFvPatchField<Type>&, + 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 oversetFvPatchField<Type>(*this, iF) + ); + } + + + // Member functions + + // Access + + //- Return local reference cast into the cyclic AMI patch + const oversetFvPatch& oversetPatch() const + { + return oversetPatch_; + } + + + // Evaluation functions + + //- Initialise the evaluation of the patch field + virtual void initEvaluate(const Pstream::commsTypes commsType); + + //- Evaluate the patch field + virtual void evaluate(const Pstream::commsTypes commsType); + + //- Initialise neighbour matrix update + virtual void initInterfaceMatrixUpdate + ( + scalarField&, + const bool add, + const scalarField&, + const scalarField&, + const direction, + const Pstream::commsTypes commsType + ) const; + + //- Update result field based on interface functionality + virtual void updateInterfaceMatrix + ( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType + ) const; + + //- Initialise neighbour matrix update + virtual void initInterfaceMatrixUpdate + ( + Field<Type>&, + const bool add, + const Field<Type>&, + const scalarField&, + const Pstream::commsTypes commsType + ) const; + + //- Update result field based on interface functionality + virtual void updateInterfaceMatrix + ( + Field<Type>&, + const bool add, + const Field<Type>&, + const scalarField&, + const Pstream::commsTypes commsType + ) const; + + + // I-O + + //- Write + virtual void write(Ostream& os) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "oversetFvPatchField.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvPatchFields.C b/src/overset/oversetPolyPatch/oversetFvPatchFields.C new file mode 100644 index 00000000000..27f04e81b98 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvPatchFields.C @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetFvPatchFields.H" +#include "addToRunTimeSelectionTable.H" +#include "volFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +makePatchFields(overset); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvPatchFields.H b/src/overset/oversetPolyPatch/oversetFvPatchFields.H new file mode 100644 index 00000000000..7c1dde9fbb4 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvPatchFields.H @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 oversetFvPatchFields_H +#define oversetFvPatchFields_H + +#include "oversetFvPatchField.H" +#include "fieldTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makePatchTypeFieldTypedefs(overset); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetFvsPatchFields.C b/src/overset/oversetPolyPatch/oversetFvsPatchFields.C new file mode 100644 index 00000000000..4c58c315193 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetFvsPatchFields.C @@ -0,0 +1,79 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetFvPatchField.H" +#include "calculatedFvsPatchFields.H" +#include "fvsPatchFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +addNamedToRunTimeSelectionTable +( + fvsPatchScalarField, + calculatedFvsPatchScalarField, + patch, + overset +); +addNamedToRunTimeSelectionTable +( + fvsPatchVectorField, + calculatedFvsPatchVectorField, + patch, + overset +); +addNamedToRunTimeSelectionTable +( + fvsPatchSphericalTensorField, + calculatedFvsPatchSphericalTensorField, + patch, + overset +); +addNamedToRunTimeSelectionTable +( + fvsPatchSymmTensorField, + calculatedFvsPatchSymmTensorField, + patch, + overset +); +addNamedToRunTimeSelectionTable +( + fvsPatchTensorField, + calculatedFvsPatchTensorField, + patch, + overset +); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterface.C b/src/overset/oversetPolyPatch/oversetGAMGInterface.C new file mode 100644 index 00000000000..e4155338355 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetGAMGInterface.C @@ -0,0 +1,264 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetGAMGInterface.H" +#include "addToRunTimeSelectionTable.H" +#include "Map.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(oversetGAMGInterface, 0); + addToRunTimeSelectionTable + ( + GAMGInterface, + oversetGAMGInterface, + lduInterface + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::oversetGAMGInterface::oversetGAMGInterface +( + const label index, + const lduInterfacePtrsList& coarseInterfaces, + const lduInterface& fineInterface, + const labelField& localRestrictAddressing, + const labelField& neighbourRestrictAddressing, + const label fineLevelIndex, + const label coarseComm +) +: + GAMGInterface(index, coarseInterfaces), + fineOversetInterface_ + ( + refCast<const oversetLduInterface>(fineInterface) + ) +{ + //Pout<< "Constructing oversetGAMGInterface index:" << index + // << " from:" << fineOversetInterface_.name() + // << " size:" << localRestrictAddressing.size() + // << endl; + + // From coarse face to coarse cell + DynamicList<label> dynFaceCells(localRestrictAddressing.size()); + // From fine face to coarse face + DynamicList<label> dynFaceRestrictAddressing(dynFaceCells.size()); + + + // From coarse cell to coarse face + Map<label> cellToCoarseFace(dynFaceCells.size()); + + // Construct face agglomeration from cell agglomeration + forAll(localRestrictAddressing, ffi) + { + // Get coarse cell + label coarseCelli = localRestrictAddressing[ffi]; + + // Do we have coarse face for it? + Map<label>::iterator iter = cellToCoarseFace.find(coarseCelli); + if (iter == cellToCoarseFace.end()) + { + label coarseFacei = dynFaceCells.size(); + cellToCoarseFace.insert(coarseCelli, coarseFacei); + dynFaceCells.append(coarseCelli); + dynFaceRestrictAddressing.append(coarseFacei); + } + else + { + dynFaceRestrictAddressing.append(iter()); + } + } + + faceCells_.transfer(dynFaceCells); + faceRestrictAddressing_.transfer(dynFaceRestrictAddressing); + + //Pout<< "** Constructed interface:" << name() + // << " of size:" << size() << endl; + + + // Determine this level's stencil from the fine stencil + if (master()) + { + const mapDistribute& fineMap = + fineOversetInterface_.cellInterpolationMap(); + const List<scalarList>& fineWghts = + fineOversetInterface_.cellInterpolationWeights(); + const labelListList& fineStencil = fineOversetInterface_.stencil(); + const labelList& fineCellIDs = + fineOversetInterface_.interpolationCells(); + const scalarList& fineFactor = + fineOversetInterface_.cellInterpolationWeight(); + const scalarField& fineNorm = fineOversetInterface_.normalisation(); + const labelList& restrictMap = fineOversetInterface_.restrictMap(); + + + if (localRestrictAddressing.size() && restrictMap.empty()) + { + FatalErrorInFunction + << "The restrict addressing has not been saved on interface " + << this->name() + << ". This gets stored when running internalFieldTransfer" + << exit(FatalError); + } + + + // 'Interpolate' the restrict map so locally we know what the remote + // cells are going to be. + + label nCoarseCells = max(restrictMap)+1; + globalIndex globalNumbering(nCoarseCells); + + labelList globalCoarseIDs(restrictMap.size()); + forAll(restrictMap, fineCelli) + { + globalCoarseIDs[fineCelli] = + globalNumbering.toGlobal(restrictMap[fineCelli]); + } + fineMap.distribute(globalCoarseIDs); + + //Pout<< this->name() + // << " index:" << index + // << " size:" << this->size() + // << " restrictMap:" << restrictMap.size() + // << " fineNumInterpolate:" << fineCellIDs.size() + // << " nCoarseCells:" << nCoarseCells + // << endl; + + + + // Accumulate the coarse level stencil + + // Number of fine cells contributing to the coarse cell + labelList nFineCells(nCoarseCells, 0); + + stencil_.setSize(nCoarseCells); + cellInterpolationWeights_.setSize(nCoarseCells); + cellInterpolationWeight_.setSize(nCoarseCells, 0.0); + normalisation_.setSize(nCoarseCells, 0.0); + + forAll(fineCellIDs, i) + { + label fineCelli = fineCellIDs[i]; + label coarseCelli = restrictMap[fineCelli]; + + const scalarList& w = fineWghts[fineCelli]; + const labelList& nbrs = fineStencil[fineCelli]; + + // Accumulate stencil + + labelList& coarseStencil = stencil_[coarseCelli]; + scalarList& coarseWghts = cellInterpolationWeights_[coarseCelli]; + + label sz = coarseStencil.size(); + coarseStencil.setSize(sz+nbrs.size()); + coarseWghts.setSize(coarseStencil.size()); + + forAll(nbrs, i) + { + coarseStencil[sz] = globalCoarseIDs[nbrs[i]]; + coarseWghts[sz] = w[i]; + sz++; + } + + // Accumulate weight + cellInterpolationWeight_[coarseCelli] += fineFactor[fineCelli]; + normalisation_[coarseCelli] += fineNorm[fineCelli]; + nFineCells[coarseCelli]++; + } + + // Normalise weight (0 .. 1). Take average? Volume average? Min? Max? + forAll(nFineCells, coarseCelli) + { + label nAvg = nFineCells[coarseCelli]; + if (nAvg > 0) + { + cellInterpolationWeight_[coarseCelli] /= nAvg; + } + } + + + // Work the stencil back from global cells into a mapDistribute + // + slots + List<Map<label>> compactMap; + mapPtr_.reset(new mapDistribute(globalNumbering, stencil_, compactMap)); + + + // Determine the interpolationCells + label nInterpolate = 0; + forAll(stencil_, coarseCelli) + { + if (stencil_[coarseCelli].size()) + { + nInterpolate++; + } + } + + //Pout<< this->name() << " nInterpolate:" << nInterpolate << endl; + + interpolationCells_.setSize(nInterpolate); + nInterpolate = 0; + forAll(stencil_, coarseCelli) + { + if (stencil_[coarseCelli].size()) + { + interpolationCells_[nInterpolate++] = coarseCelli; + } + } + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::oversetGAMGInterface::~oversetGAMGInterface() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::tmp<Foam::labelField> Foam::oversetGAMGInterface::internalFieldTransfer +( + const Pstream::commsTypes, + const labelUList& restrictMap +) const +{ + // Store the restrictMap. This routine gets used for + // - GAMGAgglomeration : this is the use we want to intercept. + // - GAMGProcAgglomeration : to find out the cell number on the other side + // - MGridGenGAMGAgglomeration: same + if (master()) + { + restrictMap_ = restrictMap; + } + + return tmp<labelField>(new labelField(restrictMap, faceCells())); +} + + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterface.H b/src/overset/oversetPolyPatch/oversetGAMGInterface.H new file mode 100644 index 00000000000..3f9105b612e --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetGAMGInterface.H @@ -0,0 +1,202 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::oversetGAMGInterface + +Description + GAMG agglomerated overset interface. + +SourceFiles + oversetGAMGInterface.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetGAMGInterface_H +#define oversetGAMGInterface_H + +#include "GAMGInterface.H" +#include "oversetLduInterface.H" +#include "mapDistribute.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class oversetGAMGInterface Declaration +\*---------------------------------------------------------------------------*/ + +class oversetGAMGInterface +: + public GAMGInterface, + virtual public oversetLduInterface +{ + // Private data + + //- Reference for the oversetLduInterface from which this is + // agglomerated + const oversetLduInterface& fineOversetInterface_; + + //- Temporary copy of the fine level restrict map. Cleared upon + // calculating stencils below + mutable labelList restrictMap_; + + labelListList stencil_; + + autoPtr<mapDistribute> mapPtr_; + + List<scalarList> cellInterpolationWeights_; + + scalarField normalisation_; + + labelList interpolationCells_; + + scalarList cellInterpolationWeight_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + oversetGAMGInterface(const oversetGAMGInterface&); + + //- Disallow default bitwise assignment + void operator=(const oversetGAMGInterface&); + + +public: + + //- Runtime type information + TypeName("overset"); + + + // Constructors + + //- Construct from fine level interface, + // local and neighbour restrict addressing + oversetGAMGInterface + ( + const label index, + const lduInterfacePtrsList& coarseInterfaces, + const lduInterface& fineInterface, + const labelField& localRestrictAddressing, + const labelField& neighbourRestrictAddressing, + const label fineLevelIndex, + const label coarseComm + ); + + + //- Destructor + virtual ~oversetGAMGInterface(); + + + // Member Functions + + // Interface transfer functions + + //- Transfer and return internal field adjacent to the interface + virtual tmp<labelField> internalFieldTransfer + ( + const Pstream::commsTypes commsType, + const labelUList& iF + ) const; + + + //- Overset interface functions + + //- Name of lduInterface + virtual const word& name() const + { + return fineOversetInterface_.name(); + } + + //- Am I the master interface + virtual bool master() const + { + return fineOversetInterface_.master(); + } + + //- GAMG restriction (fine-to-coarse) + virtual const labelList& restrictMap() const + { + return restrictMap_; + } + + //- Donor stencil + virtual const labelListList& stencil() const + { + return stencil_; + } + + //- Map for obtaining data in stencil order + virtual const mapDistribute& cellInterpolationMap() const + { + return mapPtr_(); + } + + //- Weights in stencil order + virtual const List<scalarList>& cellInterpolationWeights() const + { + return cellInterpolationWeights_; + } + + //- Normalisation ot matrix; for explicit contributions + virtual const scalarField& normalisation() const + { + return normalisation_; + } + + //- Acceptor cells + virtual const labelList& interpolationCells() const + { + return interpolationCells_; + } + + //- Underrelaxation for acceptor cells + virtual const scalarList& cellInterpolationWeight() const + { + return cellInterpolationWeight_; + } + + + // I/O + + //- Write to stream + virtual void write(Ostream&) const + { + //TBD. + NotImplemented; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C new file mode 100644 index 00000000000..b3c33752098 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.C @@ -0,0 +1,152 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetGAMGInterfaceField.H" +#include "addToRunTimeSelectionTable.H" +#include "lduMatrix.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(oversetGAMGInterfaceField, 0); + addToRunTimeSelectionTable + ( + GAMGInterfaceField, + oversetGAMGInterfaceField, + lduInterfaceField + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::oversetGAMGInterfaceField::oversetGAMGInterfaceField +( + const GAMGInterface& GAMGCp, + const lduInterfaceField& fineInterface +) +: + GAMGInterfaceField(GAMGCp, fineInterface), + oversetInterface_(refCast<const oversetGAMGInterface>(GAMGCp)) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::oversetGAMGInterfaceField::~oversetGAMGInterfaceField() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::oversetGAMGInterfaceField::updateInterfaceMatrix +( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType +) const +{ + //Pout<< "oversetGAMGInterfaceField::updateInterfaceMatrix: at:" + // << oversetInterface_.name() + // << " nCells:" << result.size() << endl; + // + // Add remote values + if (oversetInterface_.master()) + { + const labelListList& stencil = oversetInterface_.stencil(); + + if (stencil.size() != psiInternal.size()) + { + FatalErrorInFunction << "psiInternal:" << psiInternal.size() + << " stencil:" << stencil.size() << exit(FatalError); + } + + const mapDistribute& map = oversetInterface_.cellInterpolationMap(); + const List<scalarList>& wghts = + oversetInterface_.cellInterpolationWeights(); + const labelList& cellIDs = oversetInterface_.interpolationCells(); + const scalarList& factor = oversetInterface_.cellInterpolationWeight(); + const scalarField& normalisation = oversetInterface_.normalisation(); + + scalarField work(psiInternal); + map.mapDistributeBase::distribute(work, UPstream::msgType()+1); + + forAll(cellIDs, i) + { + label celli = cellIDs[i]; + + const scalarList& w = wghts[celli]; + const labelList& nbrs = stencil[celli]; + const scalar f = factor[celli]; + + bool hasRemote = false; + forAll(nbrs, nbrI) + { + label slotI = nbrs[nbrI]; + if (slotI >= psiInternal.size()) + { + hasRemote = true; + break; + } + } + + if (hasRemote) + { + //Pout<< "oversetGAMGInterfaceField : Interpolating " << celli + // << " from remote values (if any):" << endl; + scalar s(0.0); + forAll(nbrs, nbrI) + { + label slotI = nbrs[nbrI]; + if (slotI >= psiInternal.size()) + { + //Pout<< " remote value " << work[slotI] + // << " from slot " << slotI << " with w:" << w[nbrI] + // << endl; + s += w[nbrI]*work[slotI]; + } + } + //Pout<< "oversetGAMGInterfaceField : Interpolated value:" + // << s << endl; + //scalar oldPsi = result[celli]; + if (add) + { + s = -1.0*s; + } + + result[celli] += normalisation[celli]*f*s; + //Pout<< "oversetGAMGInterfaceField : result was:" << oldPsi + // << " now:" << result[celli] << endl; + } + } + } +} + + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H new file mode 100644 index 00000000000..3cd44fa3dba --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetGAMGInterfaceField.H @@ -0,0 +1,124 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::oversetGAMGInterfaceField + +Description + GAMG agglomerated processor interface field. + +SourceFiles + processorGAMGInterfaceField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetGAMGInterfaceField_H +#define oversetGAMGInterfaceField_H + +#include "GAMGInterfaceField.H" +#include "oversetGAMGInterface.H" +#include "processorLduInterfaceField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class oversetGAMGInterfaceField Declaration +\*---------------------------------------------------------------------------*/ + +class oversetGAMGInterfaceField +: + public GAMGInterfaceField +{ + // Private data + + //- Local reference cast into the interface + const oversetGAMGInterface& oversetInterface_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + oversetGAMGInterfaceField(const oversetGAMGInterfaceField&); + + //- Disallow default bitwise assignment + void operator=(const oversetGAMGInterfaceField&); + + +public: + + //- Runtime type information + TypeName("overset"); + + + // Constructors + + //- Construct from GAMG interface and fine level interface field + oversetGAMGInterfaceField + ( + const GAMGInterface& GAMGCp, + const lduInterfaceField& fineInterface + ); + + + //- Destructor + virtual ~oversetGAMGInterfaceField(); + + + // Member Functions + + // Access + + //- Return size + label size() const + { + return oversetInterface_.size(); + } + + + // Interface matrix update + + //- Update result field based on interface functionality + virtual void updateInterfaceMatrix + ( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetLduInterface.C b/src/overset/oversetPolyPatch/oversetLduInterface.C new file mode 100644 index 00000000000..ec04070196a --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetLduInterface.C @@ -0,0 +1,42 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetLduInterface.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +defineTypeNameAndDebug(oversetLduInterface, 0); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::oversetLduInterface::~oversetLduInterface() +{} + + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetLduInterface.H b/src/overset/oversetPolyPatch/oversetLduInterface.H new file mode 100644 index 00000000000..537def21642 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetLduInterface.H @@ -0,0 +1,111 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::oversetLduInterface + +Description + An abstract base class for overset coupled interfaces + +SourceFiles + oversetLduInterface.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetLduInterface_H +#define oversetLduInterface_H + +#include "mapDistribute.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class oversetLduInterface Declaration +\*---------------------------------------------------------------------------*/ + +class oversetLduInterface +{ + +public: + + //- Runtime type information + TypeName("oversetLduInterface"); + + + // Constructors + + //- Construct null + oversetLduInterface() + {} + + + //- Destructor + virtual ~oversetLduInterface(); + + + // Member Functions + + // Access + + //- Name of interface (for debugging) + virtual const word& name() const = 0; + + //- Am I the master interface + virtual bool master() const = 0; + + //- GAMG restriction (fine-to-coarse) + virtual const labelList& restrictMap() const = 0; + + //- Donor stencil + virtual const labelListList& stencil() const = 0; + + //- Map for obtaining data in stencil order + virtual const mapDistribute& cellInterpolationMap() const = 0; + + //- Weights in stencil order + virtual const List<scalarList>& + cellInterpolationWeights() const = 0; + + //- Normalisation of matrix; for explicit contributions + virtual const scalarField& normalisation() const = 0; + + //- Acceptor cells + virtual const labelList& interpolationCells() const = 0; + + //- Underrelaxation for acceptor cells + virtual const scalarList& cellInterpolationWeight() const = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetPointPatch.C b/src/overset/oversetPolyPatch/oversetPointPatch.C new file mode 100644 index 00000000000..15f4a37e0c7 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetPointPatch.C @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "facePointPatch.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +addNamedToRunTimeSelectionTable +( + facePointPatch, + facePointPatch, + polyPatch, + overset +); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetPointPatchFields.C b/src/overset/oversetPolyPatch/oversetPointPatchFields.C new file mode 100644 index 00000000000..c8c0168df34 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetPointPatchFields.C @@ -0,0 +1,78 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "slipPointPatchFields.H" +#include "pointPatchFields.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +addNamedToRunTimeSelectionTable +( + pointPatchScalarField, + slipPointPatchScalarField, + pointPatch, + overset +); +addNamedToRunTimeSelectionTable +( + pointPatchVectorField, + slipPointPatchVectorField, + pointPatch, + overset +); +addNamedToRunTimeSelectionTable +( + pointPatchSphericalTensorField, + slipPointPatchSphericalTensorField, + pointPatch, + overset +); +addNamedToRunTimeSelectionTable +( + pointPatchSymmTensorField, + slipPointPatchSymmTensorField, + pointPatch, + overset +); +addNamedToRunTimeSelectionTable +( + pointPatchTensorField, + slipPointPatchTensorField, + pointPatch, + overset +); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetPolyPatch.C b/src/overset/oversetPolyPatch/oversetPolyPatch.C new file mode 100644 index 00000000000..ddce16ae7c6 --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetPolyPatch.C @@ -0,0 +1,159 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "oversetPolyPatch.H" +#include "addToRunTimeSelectionTable.H" +#include "polyBoundaryMesh.H" +#include "processorPolyPatch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(oversetPolyPatch, 0); + + addToRunTimeSelectionTable(polyPatch, oversetPolyPatch, word); + addToRunTimeSelectionTable(polyPatch, oversetPolyPatch, dictionary); +} + +// * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * * * * // + +Foam::oversetPolyPatch::oversetPolyPatch +( + const word& name, + const label size, + const label start, + const label index, + const polyBoundaryMesh& bm, + const word& patchType +) +: + polyPatch(name, size, start, index, bm, patchType), + masterPatchID_(-1) +{ + // 'overset' is not constraint type so add to group explicitly + if (findIndex(inGroups(), typeName) == -1) + { + inGroups().append(typeName); + } +} + + +Foam::oversetPolyPatch::oversetPolyPatch +( + const word& name, + const dictionary& dict, + const label index, + const polyBoundaryMesh& bm, + const word& patchType +) +: + polyPatch(name, dict, index, bm, patchType), + masterPatchID_(-1) +{ + // 'overset' is not constraint type so add to group explicitly + if (findIndex(inGroups(), typeName) == -1) + { + inGroups().append(typeName); + } +} + + +Foam::oversetPolyPatch::oversetPolyPatch +( + const oversetPolyPatch& pp, + const polyBoundaryMesh& bm +) +: + polyPatch(pp, bm), + masterPatchID_(-1) +{} + + +Foam::oversetPolyPatch::oversetPolyPatch +( + const oversetPolyPatch& pp, + const polyBoundaryMesh& bm, + const label index, + const label newSize, + const label newStart +) +: + polyPatch(pp, bm, index, newSize, newStart), + masterPatchID_(-1) +{} + + +Foam::oversetPolyPatch::oversetPolyPatch +( + const oversetPolyPatch& pp, + const polyBoundaryMesh& bm, + const label index, + const labelUList& mapAddressing, + const label newStart +) +: + polyPatch(pp, bm, index, mapAddressing, newStart), + masterPatchID_(-1) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::oversetPolyPatch::~oversetPolyPatch() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::oversetPolyPatch::master() const +{ + if (masterPatchID_ == -1) + { + // Find lowest numbered overset patch + const polyBoundaryMesh& pbm = boundaryMesh(); + + forAll(pbm, patchi) + { + if (isA<oversetPolyPatch>(pbm[patchi])) + { + masterPatchID_ = patchi; + break; + } + } + + if (masterPatchID_ != -1 && masterPatchID_ > 0) + { + WarningInFunction<< "The master overset patch is not the" + << " first patch. Generally the first patch should be an" + << " overset patch to guarantee consistent operation." << endl; + } + } + + return index() == masterPatchID_; +} + + +// ************************************************************************* // diff --git a/src/overset/oversetPolyPatch/oversetPolyPatch.H b/src/overset/oversetPolyPatch/oversetPolyPatch.H new file mode 100644 index 00000000000..52eba954f2d --- /dev/null +++ b/src/overset/oversetPolyPatch/oversetPolyPatch.H @@ -0,0 +1,185 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::oversetPolyPatch + +Description + Patch for indicating interpolated boundaries (in overset meshes). + +SourceFiles + oversetPolyPatch.C + +\*---------------------------------------------------------------------------*/ + +#ifndef oversetPolyPatch_H +#define oversetPolyPatch_H + +#include "polyPatch.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class polyMesh; + +/*---------------------------------------------------------------------------*\ + Class oversetPolyPatch Declaration +\*---------------------------------------------------------------------------*/ + +class oversetPolyPatch +: + public polyPatch +{ + // Private data + + //- Master patch ID + mutable label masterPatchID_; + + +public: + + //- Runtime type information + TypeName("overset"); + + + // Constructors + + //- Construct from components + oversetPolyPatch + ( + const word& name, + const label size, + const label start, + const label index, + const polyBoundaryMesh& bm, + const word& patchType + ); + + //- Construct from dictionary + oversetPolyPatch + ( + const word& name, + const dictionary& dict, + const label index, + const polyBoundaryMesh& bm, + const word& patchType + ); + + + //- Construct as copy, resetting the boundary mesh + oversetPolyPatch + ( + const oversetPolyPatch& pp, + const polyBoundaryMesh& bm + ); + + //- Construct given the original patch and resetting the + // face list and boundary mesh information + oversetPolyPatch + ( + const oversetPolyPatch& pp, + const polyBoundaryMesh& bm, + const label index, + const label newSize, + const label newStart + ); + + //- Construct given the original patch and a map + oversetPolyPatch + ( + const oversetPolyPatch& pp, + const polyBoundaryMesh& bm, + const label index, + const labelUList& mapAddressing, + const label newStart + ); + + //- Construct and return a clone, resetting the boundary mesh + virtual autoPtr<polyPatch> clone(const polyBoundaryMesh& bm) const + { + return autoPtr<polyPatch>(new oversetPolyPatch(*this, bm)); + } + + //- Construct and return a clone, resetting the face list + // and boundary mesh + virtual autoPtr<polyPatch> clone + ( + const polyBoundaryMesh& bm, + const label index, + const label newSize, + const label newStart + ) const + { + return autoPtr<polyPatch> + ( + new oversetPolyPatch(*this, bm, index, newSize, newStart) + ); + } + + //- Construct and return a clone, resetting the face list + // and boundary mesh + virtual autoPtr<polyPatch> clone + ( + const polyBoundaryMesh& bm, + const label index, + const labelUList& mapAddressing, + const label newStart + ) const + { + return autoPtr<polyPatch> + ( + new oversetPolyPatch + ( + *this, + bm, + index, + mapAddressing, + newStart + ) + ); + } + + + //- Destructor + virtual ~oversetPolyPatch(); + + + // Member functions + + //- Am I master patch? The master is responsible for doing all + // interpolation. + bool master() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/regionsToCell/findRefCells.C b/src/overset/regionsToCell/findRefCells.C new file mode 100644 index 00000000000..289bb1959b5 --- /dev/null +++ b/src/overset/regionsToCell/findRefCells.C @@ -0,0 +1,274 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016 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 "findRefCell.H" +#include "regionSplit.H" + +// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // + +void Foam::setRefCells +( + const volScalarField& field, + const volScalarField& fieldRef, + const dictionary& dict, + boolList& regionNeedReference, + labelList& regionRefCells, + scalarField& regionRefValues, + const bool forceReference +) +{ + const regionSplit& regions = regionSplit::New(field.mesh()); + + regionNeedReference.setSize(regions.nRegions(), true); + regionRefCells.setSize(regions.nRegions(), -1); + regionRefValues.setSize(regions.nRegions(), 0); + + if (!forceReference) + { + const volScalarField::GeometricBoundaryField& bfld = + fieldRef.boundaryField(); + + forAll(bfld, patchI) + { + if (bfld[patchI].fixesValue()) + { + // Unmark all regions + + const labelUList& fc = bfld[patchI].patch().patch().faceCells(); + + forAll(fc, faceI) + { + regionNeedReference[regions[fc[faceI]]] = false; + } + } + } + + Pstream::listCombineGather(regionNeedReference, orEqOp<bool>()); + Pstream::listCombineScatter(regionNeedReference); + } + + + label nRefs = 0; + forAll(regionNeedReference, regionI) + { + if (regionNeedReference[regionI]) + { + nRefs++; + } + } + + if (nRefs == 0) + { + return; + } + + // Get the reference cells for all the regions + + word refCellName = field.name() + "RefCells"; + word refPointName = field.name() + "RefPoints"; + word refValueName = field.name() + "RefValues"; + + + // (per region!) does region have reference cell? + labelList hasRef(regionNeedReference.size(), 0); + + + const labelList refValues(dict.lookup(refValueName)); + + + if (dict.found(refCellName)) + { + // Have specified reference cells (on master!) + + if (Pstream::master()) + { + labelList refCells(dict.lookup(refCellName)); + + if (refCells.size() != regionNeedReference.size()) + { + FatalIOErrorIn + ( + "setRefCell\n" + "(\n" + " const volScalarField&,\n" + " const volScalarField&,\n" + " const dictionary&,\n" + " labelList&,\n" + " scalarField&,\n" + " const bool\n" + ")\n", + dict + ) << "Number of refCells " << refCells.size() + << " does not correspond to number of regions " + << regionNeedReference.size() + << exit(FatalIOError); + } + + forAll(refCells, i) + { + label regionI = regions[refCells[i]]; + + if (regionNeedReference[regionI]) + { + regionRefCells[regionI] = refCells[i]; + regionRefValues[regionI] = refValues[i]; + } + } + + + forAll(regionNeedReference, regionI) + { + if + ( + regionNeedReference[regionI] + && regionRefCells[regionI] == -1 + ) + { + FatalIOErrorIn + ( + "setRefCell\n" + "(\n" + " const volScalarField&,\n" + " const volScalarField&,\n" + " const dictionary&,\n" + " labelList&,\n" + " scalarField&,\n" + " const bool\n" + ")\n", + dict + ) << "Have no reference cell for region " << regionI + << nl + << "Overall per-region reference cells " + << regionRefCells + << exit(FatalIOError); + } + } + } + } + else if (dict.found(refPointName)) + { + pointField refPoints(dict.lookup(refPointName)); + + if (refPoints.size() != regionNeedReference.size()) + { + FatalIOErrorIn + ( + "setRefCell\n" + "(\n" + " const volScalarField&,\n" + " const volScalarField&,\n" + " const dictionary&,\n" + " labelList&,\n" + " scalarField&,\n" + " const bool\n" + ")\n", + dict + ) << "Number of refPoints " << refPoints.size() + << " does not correspond to number of regions " + << regionNeedReference.size() + << exit(FatalIOError); + } + + labelList hasRef(refPoints.size(), 0); + + forAll(refPoints, i) + { + // Note: find reference cell using facePlanes to avoid constructing + // face decomposition structure. Most likely the reference + // cell is an undistorted one so this should not be a + // problem. + + label celli = field.mesh().findCell + ( + refPoints[i], + polyMesh::FACEPLANES + ); + + if (celli >= 0) + { + Pout<< "Found point " << refPoints[i] + << " in reference cell " << celli + << " at " << field.mesh().cellCentres()[celli] + << " for region " << regions[celli] + << endl; + + regionRefCells[regions[celli]] = celli; + hasRef[regions[celli]] = 1; + } + } + + Pstream::listCombineGather(hasRef, plusEqOp<label>()); + Pstream::listCombineScatter(hasRef); + + forAll(hasRef, regionI) + { + if (hasRef[regionI] != 1) + { + FatalIOErrorIn + ( + "setRefCell\n" + "(\n" + " const volScalarField&,\n" + " const volScalarField&,\n" + " const dictionary&,\n" + " labelList&,\n" + " scalarField&,\n" + " const bool\n" + ")\n", + dict + ) << "Unable to set reference cell for field " << field.name() + << nl + << " Reference points " << refPointName + << " " << refPoints + << nl << " For region " << regionI + << " found on " << hasRef[regionI] + << " domains (should be one)" + << nl << exit(FatalIOError); + } + } + } + else + { + FatalIOErrorIn + ( + "setRefCell\n" + "(\n" + " const volScalarField&,\n" + " const volScalarField&,\n" + " const dictionary&,\n" + " labelList&,\n" + " scalarField&,\n" + " const bool\n" + ")\n", + dict + ) << "Unable to set reference cell for field " << field.name() + << nl + << " Please supply either " << refCellName + << " or " << refPointName << nl << exit(FatalIOError); + } +} + + +// ************************************************************************* // diff --git a/src/overset/regionsToCell/findRefCells.H b/src/overset/regionsToCell/findRefCells.H new file mode 100644 index 00000000000..4812750c608 --- /dev/null +++ b/src/overset/regionsToCell/findRefCells.H @@ -0,0 +1,74 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\/ M anipulation | Copyright (C) 2016 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/>. + +InNamespace + Foam + +Description + Find the reference cells per region. Regions given as cellSet names. + +SourceFiles + findRefCell.C + +SeeAlso + Foam::regionSplit + +\*---------------------------------------------------------------------------*/ + +#ifndef findRefCell_H +#define findRefCell_H + +#include "label.H" +#include "volFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +//- Set reference cells for multi-region domains. Returns per region: +// - whether a reference is needed +// - if so a reference cell (or -1) +// - and a reference value +void setRefCells +( + const volScalarField& field, + const volScalarField& fieldRef, + const dictionary& dict, + + const label refCelli, + const scalar refValue, + + boolList& needReference, + labelList& refCells, + scalarField& refValues, + const bool forceReference = false +); + +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/overset/regionsToCell/regionsToCell.C b/src/overset/regionsToCell/regionsToCell.C new file mode 100644 index 00000000000..2cb3419a4f4 --- /dev/null +++ b/src/overset/regionsToCell/regionsToCell.C @@ -0,0 +1,484 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 "regionsToCell.H" +#include "regionSplit.H" +#include "emptyPolyPatch.H" +#include "cellSet.H" +#include "syncTools.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(regionsToCell, 0); + +addToRunTimeSelectionTable(topoSetSource, regionsToCell, word); + +addToRunTimeSelectionTable(topoSetSource, regionsToCell, istream); + +} + + +Foam::topoSetSource::addToUsageTable Foam::regionsToCell::usage_ +( + regionsToCell::typeName, + "\n Usage: regionsToCell subCellSet (pt0 .. ptn) nErode\n\n" + " Select all cells in the connected region containing" + " points (pt0..ptn).\n" +); + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::regionsToCell::markRegionFaces +( + const boolList& selectedCell, + boolList& regionFace +) const +{ + // Internal faces + const labelList& faceOwner = mesh_.faceOwner(); + const labelList& faceNeighbour = mesh_.faceNeighbour(); + forAll(faceNeighbour, faceI) + { + if + ( + selectedCell[faceOwner[faceI]] + != selectedCell[faceNeighbour[faceI]] + ) + { + regionFace[faceI] = true; + } + } + + // Swap neighbour selectedCell state + boolList nbrSelected; + syncTools::swapBoundaryCellList(mesh_, selectedCell, nbrSelected); + + // Boundary faces + const polyBoundaryMesh& pbm = mesh_.boundaryMesh(); + forAll(pbm, patchI) + { + const polyPatch& pp = pbm[patchI]; + const labelUList& faceCells = pp.faceCells(); + forAll(faceCells, i) + { + label faceI = pp.start()+i; + label bFaceI = faceI-mesh_.nInternalFaces(); + if + ( + selectedCell[faceCells[i]] + != selectedCell[nbrSelected[bFaceI]] + ) + { + regionFace[faceI] = true; + } + } + } +} + + +Foam::boolList Foam::regionsToCell::findRegions +( + const bool verbose, + const boolList& selectedCell, + const regionSplit& cellRegion +) const +{ + boolList keepRegion(cellRegion.nRegions(), false); + + forAll(insidePoints_, i) + { + // Find the region containing the insidePoint + + const point& insidePt = insidePoints_[i]; + + //label cellI = mesh_.findCell(insidePt); + label cellI = -1; + forAll(selectedCell, index) + { + if + ( + selectedCell[index] + && mesh_.pointInCell(insidePt, index, polyMesh::CELL_TETS) + ) + { + cellI = index; + break; + } + } + + label keepRegionI = -1; + label keepProcI = -1; + if (cellI != -1) + { + keepRegionI = cellRegion[cellI]; + keepProcI = Pstream::myProcNo(); + } + reduce(keepRegionI, maxOp<label>()); + keepRegion[keepRegionI] = true; + + reduce(keepProcI, maxOp<label>()); + + if (keepProcI == -1) + { + FatalErrorInFunction + << "Did not find " << insidePt + << " in mesh." << " Mesh bounds are " << mesh_.bounds() + << exit(FatalError); + } + + if (verbose) + { + Info<< " Found location " << insidePt + << " in cell " << cellI << " on processor " << keepProcI + << " in global region " << keepRegionI + << " out of " << cellRegion.nRegions() << " regions." << endl; + } + } + + return keepRegion; +} + + +void Foam::regionsToCell::unselectOutsideRegions +( + boolList& selectedCell +) const +{ + // Determine faces on the edge of selectedCell + boolList blockedFace(mesh_.nFaces(), false); + markRegionFaces(selectedCell, blockedFace); + + // Determine regions + regionSplit cellRegion(mesh_, blockedFace); + + // Determine regions containing insidePoints_ + boolList keepRegion(findRegions(true, selectedCell, cellRegion)); + + // Go back to bool per cell + forAll(cellRegion, cellI) + { + if (!keepRegion[cellRegion[cellI]]) + { + selectedCell[cellI] = false; + } + } +} + + +void Foam::regionsToCell::shrinkRegions +( + boolList& selectedCell +) const +{ + // Select points on unselected cells and boundary + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + boolList boundaryPoint(mesh_.nPoints(), false); + + const polyBoundaryMesh& pbm = mesh_.boundaryMesh(); + + forAll(pbm, patchI) + { + const polyPatch& pp = pbm[patchI]; + + if (!pp.coupled() && !isA<emptyPolyPatch>(pp)) + { + forAll(pp, i) + { + const face& f = pp[i]; + forAll(f, fp) + { + boundaryPoint[f[fp]] = true; + } + } + } + } + + forAll(selectedCell, cellI) + { + if (!selectedCell[cellI]) + { + const labelList& cPoints = mesh_.cellPoints(cellI); + forAll(cPoints, i) + { + boundaryPoint[cPoints[i]] = true; + } + } + } + + syncTools::syncPointList(mesh_, boundaryPoint, orEqOp<bool>(), false); + + + // Select all cells using these points + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + label nChanged = 0; + forAll(boundaryPoint, pointI) + { + if (boundaryPoint[pointI]) + { + const labelList& pCells = mesh_.pointCells(pointI); + forAll(pCells, i) + { + label cellI = pCells[i]; + if (selectedCell[cellI]) + { + selectedCell[cellI] = false; + nChanged++; + } + } + } + } + Info<< " Eroded " << returnReduce(nChanged, sumOp<label>()) + << " cells." << endl; +} + + +void Foam::regionsToCell::erode +( + boolList& selectedCell +) const +{ + //Info<< "Entering shrinkRegions:" << count(selectedCell) << endl; + //generateField("selectedCell_before", selectedCell)().write(); + + // Now erode and see which regions get disconnected + boolList shrunkSelectedCell(selectedCell); + + for (label iter = 0; iter < nErode_; iter++) + { + shrinkRegions(shrunkSelectedCell); + } + + //Info<< "After shrinking:" << count(shrunkSelectedCell) << endl; + //generateField("shrunkSelectedCell", shrunkSelectedCell)().write(); + + + + // Determine faces on the edge of shrunkSelectedCell + boolList blockedFace(mesh_.nFaces(), false); + markRegionFaces(shrunkSelectedCell, blockedFace); + + // Find disconnected regions + regionSplit cellRegion(mesh_, blockedFace); + + // Determine regions containing insidePoints + boolList keepRegion(findRegions(true, shrunkSelectedCell, cellRegion)); + + + // Extract cells in regions that are not to be kept. + boolList removeCell(mesh_.nCells(), false); + forAll(cellRegion, cellI) + { + if (shrunkSelectedCell[cellI] && !keepRegion[cellRegion[cellI]]) + { + removeCell[cellI] = true; + } + } + + //Info<< "removeCell before:" << count(removeCell) << endl; + //generateField("removeCell_before", removeCell)().write(); + + + + // Grow removeCell + for (label iter = 0; iter < nErode_; iter++) + { + // Grow selected cell in regions that are not for keeping + boolList boundaryPoint(mesh_.nPoints(), false); + forAll(removeCell, cellI) + { + if (removeCell[cellI]) + { + const labelList& cPoints = mesh_.cellPoints(cellI); + forAll(cPoints, i) + { + boundaryPoint[cPoints[i]] = true; + } + } + } + syncTools::syncPointList(mesh_, boundaryPoint, orEqOp<bool>(), false); + + // Select all cells using these points + + label nChanged = 0; + forAll(boundaryPoint, pointI) + { + if (boundaryPoint[pointI]) + { + const labelList& pCells = mesh_.pointCells(pointI); + forAll(pCells, i) + { + label cellI = pCells[i]; + if (!removeCell[cellI]) + { + removeCell[cellI] = true; + nChanged++; + } + } + } + } + } + + //Info<< "removeCell after:" << count(removeCell) << endl; + //generateField("removeCell_after", removeCell)().write(); + + + // Unmark removeCell + forAll(removeCell, cellI) + { + if (removeCell[cellI]) + { + selectedCell[cellI] = false; + } + } +} + + +void Foam::regionsToCell::combine(topoSet& set, const bool add) const +{ + // Note: wip. Select cells first + boolList selectedCell(mesh_.nCells(), true); + + if (setName_.size() && setName_ != "none") + { + Info<< " Loading subset " << setName_ << " to delimit search region." + << endl; + cellSet subSet(mesh_, setName_); + + selectedCell = false; + forAllConstIter(cellSet, subSet, iter) + { + selectedCell[iter.key()] = true; + } + } + + + unselectOutsideRegions(selectedCell); + + if (nErode_ > 0) + { + erode(selectedCell); + } + + + forAll(selectedCell, cellI) + { + if (selectedCell[cellI]) + { + addOrDelete(set, cellI, add); + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +// Construct from components +Foam::regionsToCell::regionsToCell +( + const polyMesh& mesh, + const word& setName, + const pointField& insidePoints, + const label nErode +) +: + topoSetSource(mesh), + setName_(setName), + insidePoints_(insidePoints), + nErode_(nErode) +{} + + +// Construct from dictionary +Foam::regionsToCell::regionsToCell +( + const polyMesh& mesh, + const dictionary& dict +) +: + topoSetSource(mesh), + setName_(dict.lookupOrDefault<word>("set", "none")), + insidePoints_ + ( + dict.found("insidePoints") + ? dict.lookup("insidePoints") + : dict.lookup("insidePoint") + ), + nErode_(dict.lookupOrDefault("nErode", 0)) +{} + + +// Construct from Istream +Foam::regionsToCell::regionsToCell +( + const polyMesh& mesh, + Istream& is +) +: + topoSetSource(mesh), + setName_(checkIs(is)), + insidePoints_(checkIs(is)), + nErode_(readLabel(checkIs(is))) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::regionsToCell::~regionsToCell() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::regionsToCell::applyToSet +( + const topoSetSource::setAction action, + topoSet& set +) const +{ + if ((action == topoSetSource::NEW) || (action == topoSetSource::ADD)) + { + Info<< " Adding all cells of connected region containing points " + << insidePoints_ << " ..." << endl; + + combine(set, true); + } + else if (action == topoSetSource::DELETE) + { + Info<< " Removing all cells of connected region containing points " + << insidePoints_ << " ..." << endl; + + combine(set, false); + } +} + + +// ************************************************************************* // diff --git a/src/overset/regionsToCell/regionsToCell.H b/src/overset/regionsToCell/regionsToCell.H new file mode 100644 index 00000000000..1f7c5445746 --- /dev/null +++ b/src/overset/regionsToCell/regionsToCell.H @@ -0,0 +1,173 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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::regionsToCell + +Description + TopoSetSource. Select cells belonging to topological connected region + (that contains given points) + + In dictionary input: + + // optional name of cellSet delimiting search + set c0; + + //- Number of cell layers to erode mesh to detect holes in the mesh + // Set to 0 if not used. + nErode 3; + + // points inside region to select + insidePoints ((1 2 3)); + + +SourceFiles + regionsToCell.C + +\*---------------------------------------------------------------------------*/ + +#ifndef regionsToCell_H +#define regionsToCell_H + +#include "topoSetSource.H" +#include "boolList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class regionSplit; + +/*---------------------------------------------------------------------------*\ + Class regionsToCell Declaration +\*---------------------------------------------------------------------------*/ + +class regionsToCell +: + public topoSetSource +{ + + // Private data + + //- Add usage string + static addToUsageTable usage_; + + //- Name of cellSet to keep to + const word setName_; + + //- Coordinate(s) that is inside connected region + const pointField insidePoints_; + + //- Number of layers to erode + const label nErode_; + + + // Private Member Functions + + //- Mark faces inbetween selected and unselected elements + void markRegionFaces + ( + const boolList& selectedCell, + boolList& regionFace + ) const; + + //- Determine for every disconnected region in the mesh whether + // it contains a locationInMesh + boolList findRegions + ( + const bool verbose, + const boolList& selectedCell, + const regionSplit& + ) const; + + //- Unselect regions not containing a locationInMesh + void unselectOutsideRegions(boolList& selectedCell) const; + + //- Unselect one layer of cells from selectedCell + void shrinkRegions(boolList& selectedCell) const; + + //- Erode a given number of layers from selectedCell. Remove any + // region that gets disconnected that way. + void erode(boolList& selectedCell) const; + + void combine(topoSet& set, const bool add) const; + + +public: + + //- Runtime type information + TypeName("regionsToCell"); + + // Constructors + + //- Construct from components + regionsToCell + ( + const polyMesh& mesh, + const word& setName, + const pointField& insidePoints, + const label nErode + ); + + //- Construct from dictionary + regionsToCell + ( + const polyMesh& mesh, + const dictionary& dict + ); + + //- Construct from Istream + regionsToCell + ( + const polyMesh& mesh, + Istream& + ); + + + //- Destructor + virtual ~regionsToCell(); + + + // Member Functions + + virtual sourceType setType() const + { + return CELLSETSOURCE; + } + + virtual void applyToSet(const topoSetSource::setAction action, topoSet&) + const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C index 72afb55582a..1fcabf5243a 100644 --- a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C +++ b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.C @@ -406,6 +406,7 @@ patchInternalTemperatureField() const void Foam::energyRegionCoupledFvPatchScalarField::updateInterfaceMatrix ( Field<scalar>& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -435,18 +436,14 @@ void Foam::energyRegionCoupledFvPatchScalarField::updateInterfaceMatrix } // Multiply the field by coefficients and add into the result - const labelUList& faceCells = regionCoupledPatch_.faceCells(); - - forAll(faceCells, elemI) - { - result[faceCells[elemI]] -= coeffs[elemI]*myHE[elemI]; - } + this->addToInternalField(result, !add, coeffs, myHE); } void Foam::energyRegionCoupledFvPatchScalarField::updateInterfaceMatrix ( Field<scalar>& result, + const bool add, const Field<scalar>& psiInternal, const scalarField& coeffs, const Pstream::commsTypes diff --git a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H index df8a2c8fd83..877d40583de 100644 --- a/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H +++ b/src/regionCoupled/derivedFvPatchFields/energyRegionCoupled/energyRegionCoupledFvPatchScalarField.H @@ -221,6 +221,7 @@ public: virtual void updateInterfaceMatrix ( Field<scalar>& result, + const bool add, const scalarField& psiInternal, const scalarField& coeffs, const direction cmpt, @@ -231,6 +232,7 @@ public: virtual void updateInterfaceMatrix ( Field<scalar>&, + const bool, const Field<scalar>&, const scalarField&, const Pstream::commsTypes commsType diff --git a/src/sampling/meshToMesh/meshToMesh.C b/src/sampling/meshToMesh/meshToMesh.C index 57b290851c8..3ac9607fff0 100644 --- a/src/sampling/meshToMesh/meshToMesh.C +++ b/src/sampling/meshToMesh/meshToMesh.C @@ -420,7 +420,7 @@ void Foam::meshToMesh::calcAddressing } -void Foam::meshToMesh::calculate(const word& methodName) +void Foam::meshToMesh::calculate(const word& methodName, const bool normalise) { Info<< "Creating mesh-to-mesh addressing for " << srcRegion_.name() << " and " << tgtRegion_.name() << " regions using " @@ -566,19 +566,22 @@ void Foam::meshToMesh::calculate(const word& methodName) ); // weights normalisation - normaliseWeights - ( - "source", - srcToTgtCellAddr_, - srcToTgtCellWght_ - ); + if (normalise) + { + normaliseWeights + ( + "source", + srcToTgtCellAddr_, + srcToTgtCellWght_ + ); - normaliseWeights - ( - "target", - tgtToSrcCellAddr_, - tgtToSrcCellWght_ - ); + normaliseWeights + ( + "target", + tgtToSrcCellAddr_, + tgtToSrcCellWght_ + ); + } // cache maps and reset addresses List<Map<label>> cMap; @@ -598,19 +601,22 @@ void Foam::meshToMesh::calculate(const word& methodName) { calcAddressing(methodName, srcRegion_, tgtRegion_); - normaliseWeights - ( - "source", - srcToTgtCellAddr_, - srcToTgtCellWght_ - ); + if (normalise) + { + normaliseWeights + ( + "source", + srcToTgtCellAddr_, + srcToTgtCellWght_ + ); - normaliseWeights - ( - "target", - tgtToSrcCellAddr_, - tgtToSrcCellWght_ - ); + normaliseWeights + ( + "target", + tgtToSrcCellAddr_, + tgtToSrcCellWght_ + ); + } } Info<< " Overlap volume: " << V_ << endl; @@ -743,7 +749,7 @@ void Foam::meshToMesh::constructNoCuttingPatches } // calculate volume addressing and weights - calculate(methodName); + calculate(methodName, true); // calculate patch addressing and weights calculatePatchAMIs(AMIMethodName); @@ -755,7 +761,8 @@ void Foam::meshToMesh::constructFromCuttingPatches const word& methodName, const word& AMIMethodName, const HashTable<word>& patchMap, - const wordList& cuttingPatches + const wordList& cuttingPatches, + const bool normalise ) { const polyBoundaryMesh& srcBm = srcRegion_.boundaryMesh(); @@ -806,7 +813,7 @@ void Foam::meshToMesh::constructFromCuttingPatches tgtPatchID_.transfer(tgtIDs); // calculate volume addressing and weights - calculate(methodName); + calculate(methodName, normalise); // calculate patch addressing and weights calculatePatchAMIs(AMIMethodName); @@ -888,7 +895,8 @@ Foam::meshToMesh::meshToMesh const polyMesh& tgt, const interpolationMethod& method, const HashTable<word>& patchMap, - const wordList& cuttingPatches + const wordList& cuttingPatches, + const bool normalise ) : srcRegion_(src), @@ -914,7 +922,8 @@ Foam::meshToMesh::meshToMesh interpolationMethodAMI(method) ), patchMap, - cuttingPatches + cuttingPatches, + normalise ); } @@ -926,7 +935,8 @@ Foam::meshToMesh::meshToMesh const word& methodName, // internal mapping const word& AMIMethodName, // boundary mapping const HashTable<word>& patchMap, - const wordList& cuttingPatches + const wordList& cuttingPatches, + const bool normalise ) : srcRegion_(src), @@ -949,7 +959,8 @@ Foam::meshToMesh::meshToMesh methodName, AMIMethodName, patchMap, - cuttingPatches + cuttingPatches, + normalise ); } diff --git a/src/sampling/meshToMesh/meshToMesh.H b/src/sampling/meshToMesh/meshToMesh.H index 26227235db0..62b5781979a 100644 --- a/src/sampling/meshToMesh/meshToMesh.H +++ b/src/sampling/meshToMesh/meshToMesh.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -205,7 +205,7 @@ private: ); //- Calculate - main driver function - void calculate(const word& methodName); + void calculate(const word& methodName, const bool normalise); //- Calculate patch overlap void calculatePatchAMIs(const word& amiMethodName); @@ -224,7 +224,8 @@ private: const word& methodName, const word& AMIMethodName, const HashTable<word>& patchMap, - const wordList& cuttingPatches + const wordList& cuttingPatches, + const bool normalise ); // Parallel operations @@ -320,7 +321,8 @@ public: const polyMesh& tgt, const interpolationMethod& method, const HashTable<word>& patchMap, - const wordList& cuttingPatches + const wordList& cuttingPatches, + const bool normalise = true ); @@ -332,7 +334,8 @@ public: const word& methodName, // internal mapping const word& AMIMethodName, // boundary mapping const HashTable<word>& patchMap, - const wordList& cuttingPatches + const wordList& cuttingPatches, + const bool normalise = true ); @@ -383,6 +386,15 @@ public: patchAMIs() const; + // Explicit access. Can probably be done with combine operator. + + //- Source map pointer - valid if no singleMeshProc + inline const autoPtr<mapDistribute>& srcMap() const; + + //- Target map pointer - valid if no singleMeshProc + inline const autoPtr<mapDistribute>& tgtMap() const; + + // Evaluation // Source-to-target field mapping diff --git a/src/sampling/meshToMesh/meshToMeshI.H b/src/sampling/meshToMesh/meshToMeshI.H index a00d37a62e8..bd62cdb004e 100644 --- a/src/sampling/meshToMesh/meshToMeshI.H +++ b/src/sampling/meshToMesh/meshToMeshI.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-2014 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -81,6 +81,20 @@ inline Foam::scalar Foam::meshToMesh::V() const } +inline const Foam::autoPtr<Foam::mapDistribute>& +Foam::meshToMesh::srcMap() const +{ + return srcMapPtr_; +} + + +inline const Foam::autoPtr<Foam::mapDistribute>& +Foam::meshToMesh::tgtMap() const +{ + return tgtMapPtr_; +} + + inline const Foam::PtrList<Foam::AMIPatchToPatchInterpolation>& Foam::meshToMesh::patchAMIs() const { diff --git a/src/waveModels/waveModel/waveModel.C b/src/waveModels/waveModel/waveModel.C index 484aac3f6dc..ed7e3e1ba32 100644 --- a/src/waveModels/waveModel/waveModel.C +++ b/src/waveModels/waveModel/waveModel.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | Copyright (C) 2015 IH-Cantabria ------------------------------------------------------------------------------- License diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T new file mode 100644 index 00000000000..a60edc4bb6b --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/T @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object T; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 1 0 0 0]; + +internalField uniform 273; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type zeroGradient; + } + + left1 + { + type fixedValue; + value uniform 300; + } + + right1 + { + type fixedValue; + value uniform 273; + } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement new file mode 100644 index 00000000000..dcf1467e615 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/pointDisplacement @@ -0,0 +1,43 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + ".*" + { + type uniformFixedValue; + uniformValue (0 0 0); + } + + "(free|hole)" + { + patchType overset; + type uniformFixedValue; + uniformValue table + ( + (0.0 (0 0 0)) + (1.0 (0.31 0 0)) + (2.0 (0 0 0)) + ); + } +} + + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID new file mode 100644 index 00000000000..1a49886c283 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/0.org/zoneID @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev-OpenCFD.overlap | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + ".*" + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean new file mode 100755 index 00000000000..323e09af05d --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allclean @@ -0,0 +1,13 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase +rm -f constant/polyMesh/boundary +rm -f constant/polyMesh/zoneID + +rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun new file mode 100755 index 00000000000..a7602c7dea1 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun @@ -0,0 +1,13 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +./Allrun.pre + +# Run it for a bit + +# Serial +#runApplication `getApplication` + +# Parallel +runApplication decomposePar -cellDist +runParallel `getApplication` diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre new file mode 100755 index 00000000000..19e4417a553 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/Allrun.pre @@ -0,0 +1,17 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication blockMesh + +# Select cellSets +runApplication topoSet + +runApplication subsetMesh box -patch hole -overwrite + +# Select cellSets +runApplication -s zoneID topoSet + +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt new file mode 100644 index 00000000000..2b8ef391a71 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/README.txt @@ -0,0 +1,4 @@ +Transient, moving mesh +---------------------- + +Simple testcase for testing mesh motion diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict new file mode 100644 index 00000000000..69054196e62 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/dynamicMeshDict @@ -0,0 +1,33 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object dynamicMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +motionSolverLibs ( "libfvMotionSolvers.so" ); + +solver displacementLaplacian; + +displacementLaplacianCoeffs +{ + diffusivity uniform 1; +} + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +// layerRelax 0.3; +} + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties new file mode 100644 index 00000000000..2c17a958286 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/constant/transportProperties @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +DT DT [ 0 2 -1 0 0 0 0 ] 1; + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} + + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict new file mode 100644 index 00000000000..a5fafc3ec13 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/blockMeshDict @@ -0,0 +1,126 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 1.5 | +| \\ / A nd | Web: http://www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + ( 0.00 0.0 0) + ( 1.00 0.0 0) + ( 1.00 1.0 0) + ( 0.00 1.0 0) + ( 0.00 0.0 1) + ( 1.00 0.0 1) + ( 1.00 1.0 1) + ( 0.00 1.0 1) + +//- 0 degrees + ( 0.25 0.25 0) + ( 0.75 0.25 0) + ( 0.75 0.75 0) + ( 0.25 0.75 0) + ( 0.25 0.25 1) + ( 0.75 0.25 1) + ( 0.75 0.75 1) + ( 0.25 0.75 1) + + +//- 45 degrees rotated +// ( 0.25 0.5 0) +// ( 0.5 0.25 0) +// ( 0.75 0.5 0) +// ( 0.5 0.75 0) +// ( 0.25 0.5 1) +// ( 0.5 0.25 1) +// ( 0.75 0.5 1) +// ( 0.5 0.75 1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (18 18 1) simpleGrading (1 1 1) + + hex (8 9 10 11 12 13 14 15) movingZone (20 20 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + free + { + type overset; + faces + ( + (8 12 15 11) + (10 14 13 9) + (11 15 14 10) + ( 9 13 12 8) + ); + } + + walls + { + type patch; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } + + // Populated by subsetMesh + hole + { + type patch; + faces (); + } + + frontAndBack + { + type empty; + faces + ( + (0 3 2 1) + (4 5 6 7) + ( 8 11 10 9) + (12 13 14 15) + ); + } + + left1 + { + type patch; + faces + ( + (0 4 7 3) + ); + } + right1 + { + type patch; + faces + ( + (2 6 5 1) + ); + } +); + + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict new file mode 100644 index 00000000000..52e7cf888d4 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/controlDict @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Make sure all preprocessing tools know about the 'overset' bc +libs ("liboverset.so"); + +application overLaplacianDyMFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 1; + +deltaT 0.1; + +writeControl timeStep; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 10; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict new file mode 100644 index 00000000000..138625c7da8 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/decomposeParDict @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 2; + +method hierarchical; + +hierarchicalCoeffs +{ + n (2 1 1); + delta 0.001; + order xyz; +} + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes new file mode 100644 index 00000000000..54af0223a5b --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSchemes @@ -0,0 +1,85 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; //steadyState; +} + +gradSchemes +{ + default Gauss linear; + grad(T) Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) bounded Gauss limitedLinearV 1; + div(phi,k) bounded Gauss limitedLinear 1; + div(phi,epsilon) bounded Gauss limitedLinear 1; + div(phi,R) bounded Gauss limitedLinear 1; + div(R) Gauss linear; + div(phi,nuTilda) bounded Gauss limitedLinear 1; + div((nuEff*dev(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; + laplacian(diffusivity,cellDisplacement) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + pcorr ; + p ; +} + +oversetInterpolation +{ + // Interpolation scheme to use for overset calculation + method inverseDistance; + + // The inverseDistance method uses a 'voxel' like search structure. + // Optionally specify the extent and number of divisions n. + // Note that it will allocate an array of nx*ny*nz. If not specified: + // - searchBox : local mesh bounding box + // - searchBoxDivisions : root (2D) or cube-root(3D) of number of cells + //searchBox (0 0 0)(1 1 1); + //searchBoxDivisions (100 100 1); +} + + +oversetInterpolationRequired +{ + // Any additional fields that require overset interpolation +} + + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution new file mode 100644 index 00000000000..66c7f94747e --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/fvSolution @@ -0,0 +1,77 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + T + { + solver PBiCGStab; + preconditioner DILU; + + //solver GAMG; + //smoother DILUGaussSeidel; + //agglomerator algebraicPair; + //processorAgglomerator none; + + tolerance 1e-10; + relTol 0; + } + + cellDisplacement + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + +} + +SIMPLE +{ + nNonOrthogonalCorrectors 0; //2; +} + + +PIMPLE +{ + correctPhi yes; + nOuterCorrectors 2; + nCorrectors 1; + nNonOrthogonalCorrectors 0; +} + + +relaxationFactors +{ + fields + { + p 0.3; + } + equations + { + U 0.7; + k 0.7; + omega 0.7; + } +} + + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict new file mode 100644 index 00000000000..2ebc58f23ab --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/setFieldsDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue zoneID 123 +); + +regions +( + // Set cell values + // (does zerogradient on boundaries) + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + +); + +// ************************************************************************* // diff --git a/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict new file mode 100644 index 00000000000..06a8182d404 --- /dev/null +++ b/tutorials/basic/overLaplacianDyMFoam/heatTransfer/system/topoSetDict @@ -0,0 +1,80 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionToCell; + sourceInfo + { + insidePoints ((0.001 0.001 0.001)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } + + + // Select box to remove from region 1 + + { + name box; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c1; + } + } + + + { + name box; + type cellSet; + action subset; + source boxToCell; + sourceInfo + { + box (0.4 0.4 -100)(0.6 0.6 100); + } + } + + { + name box; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean new file mode 100755 index 00000000000..862ed262d87 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allclean @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Extrude mesh around cylinder +(cd cylinderAndBackground && ./Allclean) + +# Add background mesh +(cd cylinderMesh && foamCleanTutorials) + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun new file mode 100755 index 00000000000..7604f9ad35a --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun @@ -0,0 +1,8 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Extrude mesh around cylinder +(cd cylinderMesh && ./Allrun.pre) + +# Add background mesh +(cd cylinderAndBackground && ./Allrun) diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre new file mode 100755 index 00000000000..788e9474864 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/Allrun.pre @@ -0,0 +1,8 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Extrude mesh around cylinder +(cd cylinderMesh && ./Allrun.pre) + +# Add background mesh +(cd cylinderAndBackground && ./Allrun.pre) diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt b/tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt new file mode 100644 index 00000000000..172ae4285f8 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/README.txt @@ -0,0 +1,8 @@ +Transient, steady mesh +----------------------- + +cylinderMesh/ + For generating (2D) mesh cylinder mesh + +cylinderAndBackground/ + BlockMesh for background and running diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U new file mode 100644 index 00000000000..58e5de004b0 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/U @@ -0,0 +1,58 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform $flowVelocity; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + walls + { + type movingWallVelocity; + value uniform (0 0 0); + } + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue uniform (0 0 0); + value $internalField; + } + + topAndBottom + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon new file mode 100644 index 00000000000..e84ad141fd4 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/epsilon @@ -0,0 +1,59 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object epsilon; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [ 0 2 -3 0 0 0 0 ]; + +internalField uniform $turbulentEpsilon; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + wall + { + type epsilonWallFunction; + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + inlet + { + type turbulentMixingLengthDissipationRateInlet; + mixingLength 0.01; // 1cm - half channel height + value $internalField; + } + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet new file mode 100644 index 00000000000..f765e838505 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/fixedInlet @@ -0,0 +1,15 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +inlet +{ + type fixedValue; + value $internalField; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions new file mode 100644 index 00000000000..aaa6bd1c6ff --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/include/initialConditions @@ -0,0 +1,15 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +flowVelocity (10 0 0); +pressure 0; +turbulentKE 1.5; +turbulentEpsilon 0.88; +#inputMode merge + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k new file mode 100644 index 00000000000..abe94093414 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/k @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [ 0 2 -2 0 0 0 0 ]; + +internalField uniform $turbulentKE; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + #include "include/fixedInlet" + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + wall + { + type kqRWallFunction; + value $internalField; + } + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut new file mode 100644 index 00000000000..cc655b9cc59 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/nut @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: 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 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + wall + { + type nutkWallFunction; + value uniform 0; + } + + ".*" + { + type calculated; + value uniform 0; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p new file mode 100644 index 00000000000..e7f065b3bd8 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/p @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform $pressure; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + wall + { + type zeroGradient; + } + + inlet + { + type zeroGradient; + } + + outlet + { + type fixedValue; //calculated; + value $internalField; + } + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement new file mode 100644 index 00000000000..0bcc4e3481f --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/pointDisplacement @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + overset + { + patchType overset; + type zeroGradient; + } + + walls + { + type uniformFixedValue; + uniformValue (0 0 0); + } + + ".*" + { + type uniformFixedValue; + uniformValue (0 0 0); + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID new file mode 100644 index 00000000000..b1cdf0478ed --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/0.org/zoneID @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean new file mode 100755 index 00000000000..5d96ca404a3 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allclean @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase +rm -f constant/polyMesh/boundary +rm -f constant/polyMesh/zoneID +rm -f constant/cellInterpolationWeight + +rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun new file mode 100755 index 00000000000..b3d5b3a8dea --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun @@ -0,0 +1,7 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +./Allrun.pre + +# Run it for a bit +runApplication `getApplication` diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre new file mode 100755 index 00000000000..5e8d5fb08da --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/Allrun.pre @@ -0,0 +1,20 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Create background mesh +runApplication blockMesh + +# Add the cylinder mesh +runApplication mergeMeshes . ../cylinderMesh -overwrite + +## Make it a bit smaller to keep it laminar +#runApplication transformPoints -scale '(0.001 0.001 0.001)' + +# Select cellSets for the different zones +runApplication topoSet + +# Copy standard fields +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict new file mode 100644 index 00000000000..799c4a059b7 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/dynamicMeshDict @@ -0,0 +1,33 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object dynamicMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +motionSolverLibs ( "libfvMotionSolvers.so" ); + +solver displacementLaplacian; + +displacementLaplacianCoeffs +{ + diffusivity uniform 1; +} + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +// layerRelax 0.3; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties new file mode 100644 index 00000000000..4efbc8b9325 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/transportProperties @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +DT DT [ 0 2 -1 0 0 0 0 ] 1; //4e-05; + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties new file mode 100644 index 00000000000..8fe9b5ed38d --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/constant/turbulenceProperties @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RAS; + +RAS +{ + RASModel kEpsilon; + + turbulence on; + + printCoeffs on; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict new file mode 100644 index 00000000000..b2e40c26c83 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/blockMeshDict @@ -0,0 +1,83 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (-5 -0.05 -4.0) + ( 9 -0.05 -4.0) + ( 9 0.05 -4.0) + (-5 0.05 -4.0) + (-5 -0.05 4.0) + ( 9 -0.05 4.0) + ( 9 0.05 4.0) + (-5 0.05 4.0) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (120 1 60) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + topAndBottom + { + type patch; + faces + ( + (4 5 6 7) + (0 3 2 1) + ); + } + + inlet + { + type patch; + faces + ( + (0 4 7 3) + ); + } + + outlet + { + type patch; + faces + ( + (2 6 5 1) + ); + } + + frontAndBack + { + type empty; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } +); + + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict new file mode 100644 index 00000000000..cc974a94e69 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/controlDict @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + + +libs ("liboverset.so"); + +application overPimpleDyMFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 2.0; + +deltaT 0.005; + +writeControl timeStep; + +writeInterval 10; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict new file mode 100644 index 00000000000..29610a20d88 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/decomposeParDict @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 4; + + +method hierarchical; + +hierarchicalCoeffs +{ + n (2 2 1); + delta 0.001; + order xyz; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes new file mode 100644 index 00000000000..a8031a5b63a --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSchemes @@ -0,0 +1,72 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss limitedLinear 1;; + div(phi,epsilon) Gauss limitedLinear 1;; + div(phi,R) Gauss limitedLinear 1;; + div(R) Gauss limitedLinear 1;; + div(phi,omega) Gauss limitedLinear 1; + div(phid,p) Gauss limitedLinear 1; + div(phi,K) Gauss limitedLinear 1; + div(phi,e) Gauss limitedLinear 1; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; + div((nuEff*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected ; +} + +oversetInterpolation +{ + method inverseDistance; +} + +fluxRequired +{ + default no; + pcorr ; + p ; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution new file mode 100644 index 00000000000..889491adf98 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/fvSolution @@ -0,0 +1,100 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + cellDisplacement + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + p + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + } + + + pFinal + { + $p; + relTol 0; + } + + pcorr + { + $pFinal; + solver PCG; + preconditioner DIC; + } + + pcorrFinal + { + $pcorr; + relTol 0; + } + + "(U|k|epsilon|omega)" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-6; + relTol 0; + } + + "(U|k|epsilon|omega)Final" + { + $U; + tolerance 1e-6; + relTol 0; + } +} + + +PIMPLE +{ + momentumPredictor false; + correctPhi false; //true; + oversetAdjustPhi true; + nOuterCorrectors 1; + nCorrectors 2; + nNonOrthogonalCorrectors 0; + + ddtCorr true; + +} + +relaxationFactors +{ + fields + { + } + equations + { + ".*" 1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict new file mode 100644 index 00000000000..21c7adb08ee --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/setFieldsDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue zoneID 123 +); + +regions +( + // Set cell values + // (does zerogradient on boundaries) + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict new file mode 100644 index 00000000000..9c6d9767824 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderAndBackground/system/topoSetDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionToCell; + sourceInfo + { + insidePoints ((-4.999 0 -3.999)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre new file mode 100755 index 00000000000..ad0801bbb90 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/Allrun.pre @@ -0,0 +1,8 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Generate mesh from surface (in constant/triSurface) +runApplication extrudeMesh + +# Make front and back type empty +runApplication createPatch -overwrite diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk new file mode 100644 index 00000000000..6a99fb9b6fa --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/constant/triSurface/cylinder.vtk @@ -0,0 +1,221 @@ +# vtk DataFile Version 4.0 +vtk output +ASCII +DATASET POLYDATA +POINTS 150 float +0.5 0.05 0 0.5 -0.05 0 0.498246 0.05 -0.0418389 +0.498246 -0.05 -0.0418389 0.492998 0.05 -0.0833844 0.492998 -0.05 -0.0833844 +0.484292 0.05 -0.124345 0.484292 -0.05 -0.124345 0.472188 0.05 -0.164433 +0.472188 -0.05 -0.164433 0.456773 0.05 -0.203368 0.456773 -0.05 -0.203368 +0.438153 0.05 -0.240877 0.438153 -0.05 -0.240877 0.416461 0.05 -0.276696 +0.416461 -0.05 -0.276696 0.391847 0.05 -0.310574 0.391847 -0.05 -0.310574 +0.364484 0.05 -0.342274 0.364484 -0.05 -0.342274 0.334565 0.05 -0.371572 +0.334565 -0.05 -0.371572 0.3023 0.05 -0.398265 0.3023 -0.05 -0.398265 +0.267913 0.05 -0.422164 0.267913 -0.05 -0.422164 0.231648 0.05 -0.443102 +0.231648 -0.05 -0.443102 0.193758 0.05 -0.460932 0.193758 -0.05 -0.460932 +0.154509 0.05 -0.475528 0.154509 -0.05 -0.475528 0.114175 0.05 -0.486789 +0.114175 -0.05 -0.486789 0.0730415 0.05 -0.494636 0.0730415 -0.05 -0.494636 +0.0313953 0.05 -0.499013 0.0313953 -0.05 -0.499013 -0.0104712 0.05 -0.49989 +-0.0104712 -0.05 -0.49989 -0.0522642 0.05 -0.497261 -0.0522642 -0.05 -0.497261 +-0.0936907 0.05 -0.491144 -0.0936907 -0.05 -0.491144 -0.13446 0.05 -0.481581 +-0.13446 -0.05 -0.481581 -0.174286 0.05 -0.468641 -0.174286 -0.05 -0.468641 +-0.21289 0.05 -0.452414 -0.21289 -0.05 -0.452414 -0.25 0.05 -0.433013 +-0.25 -0.05 -0.433013 -0.285357 0.05 -0.410575 -0.285357 -0.05 -0.410575 +-0.318712 0.05 -0.385257 -0.318712 -0.05 -0.385257 -0.349832 0.05 -0.357236 +-0.349832 -0.05 -0.357236 -0.378498 0.05 -0.32671 -0.378498 -0.05 -0.32671 +-0.404509 0.05 -0.293893 -0.404509 -0.05 -0.293893 -0.427682 0.05 -0.259014 +-0.427682 -0.05 -0.259014 -0.447856 0.05 -0.222318 -0.447856 -0.05 -0.222318 +-0.464888 0.05 -0.184062 -0.464888 -0.05 -0.184062 -0.47866 0.05 -0.144516 +-0.47866 -0.05 -0.144516 -0.489074 0.05 -0.103956 -0.489074 -0.05 -0.103956 +-0.496057 0.05 -0.0626666 -0.496057 -0.05 -0.0626666 -0.499561 0.05 -0.0209378 +-0.499561 -0.05 -0.0209378 -0.499561 0.05 0.0209378 -0.499561 -0.05 0.0209378 +-0.496057 0.05 0.0626666 -0.496057 -0.05 0.0626666 -0.489074 0.05 0.103956 +-0.489074 -0.05 0.103956 -0.47866 0.05 0.144516 -0.47866 -0.05 0.144516 +-0.464888 0.05 0.184062 -0.464888 -0.05 0.184062 -0.447856 0.05 0.222318 +-0.447856 -0.05 0.222318 -0.427682 0.05 0.259014 -0.427682 -0.05 0.259014 +-0.404509 0.05 0.293893 -0.404509 -0.05 0.293893 -0.378498 0.05 0.32671 +-0.378498 -0.05 0.32671 -0.349832 0.05 0.357236 -0.349832 -0.05 0.357236 +-0.318712 0.05 0.385257 -0.318712 -0.05 0.385257 -0.285357 0.05 0.410575 +-0.285357 -0.05 0.410575 -0.25 0.05 0.433013 -0.25 -0.05 0.433013 +-0.21289 0.05 0.452414 -0.21289 -0.05 0.452414 -0.174286 0.05 0.468641 +-0.174286 -0.05 0.468641 -0.13446 0.05 0.481581 -0.13446 -0.05 0.481581 +-0.0936907 0.05 0.491144 -0.0936907 -0.05 0.491144 -0.0522642 0.05 0.497261 +-0.0522642 -0.05 0.497261 -0.0104712 0.05 0.49989 -0.0104712 -0.05 0.49989 +0.0313953 0.05 0.499013 0.0313953 -0.05 0.499013 0.0730415 0.05 0.494636 +0.0730415 -0.05 0.494636 0.114175 0.05 0.486789 0.114175 -0.05 0.486789 +0.154509 0.05 0.475528 0.154509 -0.05 0.475528 0.193758 0.05 0.460932 +0.193758 -0.05 0.460932 0.231648 0.05 0.443102 0.231648 -0.05 0.443102 +0.267913 0.05 0.422164 0.267913 -0.05 0.422164 0.3023 0.05 0.398265 +0.3023 -0.05 0.398265 0.334565 0.05 0.371572 0.334565 -0.05 0.371572 +0.364484 0.05 0.342274 0.364484 -0.05 0.342274 0.391847 0.05 0.310574 +0.391847 -0.05 0.310574 0.416461 0.05 0.276696 0.416461 -0.05 0.276696 +0.438153 0.05 0.240877 0.438153 -0.05 0.240877 0.456773 0.05 0.203368 +0.456773 -0.05 0.203368 0.472188 0.05 0.164433 0.472188 -0.05 0.164433 +0.484292 0.05 0.124345 0.484292 -0.05 0.124345 0.492998 0.05 0.0833844 +0.492998 -0.05 0.0833844 0.498246 0.05 0.0418389 0.498246 -0.05 0.0418389 + +POLYGONS 75 375 +4 0 1 3 2 +4 2 3 5 4 +4 4 5 7 6 +4 6 7 9 8 +4 8 9 11 10 +4 10 11 13 12 +4 12 13 15 14 +4 14 15 17 16 +4 16 17 19 18 +4 18 19 21 20 +4 20 21 23 22 +4 22 23 25 24 +4 24 25 27 26 +4 26 27 29 28 +4 28 29 31 30 +4 30 31 33 32 +4 32 33 35 34 +4 34 35 37 36 +4 36 37 39 38 +4 38 39 41 40 +4 40 41 43 42 +4 42 43 45 44 +4 44 45 47 46 +4 46 47 49 48 +4 48 49 51 50 +4 50 51 53 52 +4 52 53 55 54 +4 54 55 57 56 +4 56 57 59 58 +4 58 59 61 60 +4 60 61 63 62 +4 62 63 65 64 +4 64 65 67 66 +4 66 67 69 68 +4 68 69 71 70 +4 70 71 73 72 +4 72 73 75 74 +4 74 75 77 76 +4 76 77 79 78 +4 78 79 81 80 +4 80 81 83 82 +4 82 83 85 84 +4 84 85 87 86 +4 86 87 89 88 +4 88 89 91 90 +4 90 91 93 92 +4 92 93 95 94 +4 94 95 97 96 +4 96 97 99 98 +4 98 99 101 100 +4 100 101 103 102 +4 102 103 105 104 +4 104 105 107 106 +4 106 107 109 108 +4 108 109 111 110 +4 110 111 113 112 +4 112 113 115 114 +4 114 115 117 116 +4 116 117 119 118 +4 118 119 121 120 +4 120 121 123 122 +4 122 123 125 124 +4 124 125 127 126 +4 126 127 129 128 +4 128 129 131 130 +4 130 131 133 132 +4 132 133 135 134 +4 134 135 137 136 +4 136 137 139 138 +4 138 139 141 140 +4 140 141 143 142 +4 142 143 145 144 +4 144 145 147 146 +4 146 147 149 148 +4 148 149 1 0 + +POINT_DATA 150 +NORMALS Normals float +1 0 -0 1 0 -0 0.996493 0 -0.0836778 +0.996493 0 -0.0836778 0.985996 0 -0.166769 0.985996 0 -0.166769 +0.968583 0 -0.24869 0.968583 0 -0.24869 0.944376 0 -0.328867 +0.944376 0 -0.328867 0.913545 0 -0.406737 0.913545 0 -0.406737 +0.876307 0 -0.481754 0.876307 0 -0.481754 0.832921 0 -0.553392 +0.832921 0 -0.553392 0.783693 0 -0.621148 0.783693 0 -0.621148 +0.728969 0 -0.684547 0.728969 0 -0.684547 0.669131 0 -0.743145 +0.669131 0 -0.743145 0.604599 0 -0.79653 0.604599 0 -0.79653 +0.535827 0 -0.844328 0.535827 0 -0.844328 0.463296 0 -0.886204 +0.463296 0 -0.886204 0.387516 0 -0.921863 0.387516 0 -0.921863 +0.309017 0 -0.951057 0.309017 0 -0.951057 0.228351 0 -0.973579 +0.228351 0 -0.973579 0.146083 0 -0.989272 0.146083 0 -0.989272 +0.0627905 0 -0.998027 0.0627905 0 -0.998027 -0.0209424 0 -0.999781 +-0.0209424 0 -0.999781 -0.104528 0 -0.994522 -0.104528 0 -0.994522 +-0.187381 0 -0.982287 -0.187381 0 -0.982287 -0.26892 0 -0.963163 +-0.26892 0 -0.963163 -0.348572 0 -0.937282 -0.348572 0 -0.937282 +-0.425779 0 -0.904827 -0.425779 0 -0.904827 -0.5 0 -0.866025 +-0.5 0 -0.866025 -0.570714 0 -0.821149 -0.570714 0 -0.821149 +-0.637424 0 -0.770513 -0.637424 0 -0.770513 -0.699663 0 -0.714473 +-0.699663 0 -0.714473 -0.756995 0 -0.653421 -0.756995 0 -0.653421 +-0.809017 0 -0.587785 -0.809017 0 -0.587785 -0.855364 0 -0.518027 +-0.855364 0 -0.518027 -0.895712 0 -0.444635 -0.895712 0 -0.444635 +-0.929776 0 -0.368125 -0.929776 0 -0.368125 -0.957319 0 -0.289032 +-0.957319 0 -0.289032 -0.978148 0 -0.207912 -0.978148 0 -0.207912 +-0.992115 0 -0.125333 -0.992115 0 -0.125333 -0.999123 0 -0.0418757 +-0.999123 0 -0.0418757 -0.999123 0 0.0418757 -0.999123 0 0.0418757 +-0.992115 0 0.125333 -0.992115 0 0.125333 -0.978148 0 0.207912 +-0.978148 0 0.207912 -0.957319 0 0.289032 -0.957319 0 0.289032 +-0.929776 0 0.368125 -0.929776 0 0.368125 -0.895712 0 0.444635 +-0.895712 0 0.444635 -0.855364 0 0.518027 -0.855364 0 0.518027 +-0.809017 0 0.587785 -0.809017 0 0.587785 -0.756995 0 0.653421 +-0.756995 0 0.653421 -0.699663 0 0.714473 -0.699663 0 0.714473 +-0.637424 0 0.770513 -0.637424 0 0.770513 -0.570714 0 0.821149 +-0.570714 0 0.821149 -0.5 0 0.866025 -0.5 0 0.866025 +-0.425779 0 0.904827 -0.425779 0 0.904827 -0.348572 0 0.937282 +-0.348572 0 0.937282 -0.26892 0 0.963163 -0.26892 0 0.963163 +-0.187381 0 0.982287 -0.187381 0 0.982287 -0.104528 0 0.994522 +-0.104528 0 0.994522 -0.0209424 0 0.999781 -0.0209424 0 0.999781 +0.0627905 0 0.998027 0.0627905 0 0.998027 0.146083 0 0.989272 +0.146083 0 0.989272 0.228351 0 0.973579 0.228351 0 0.973579 +0.309017 0 0.951057 0.309017 0 0.951057 0.387516 0 0.921863 +0.387516 0 0.921863 0.463296 0 0.886204 0.463296 0 0.886204 +0.535827 0 0.844328 0.535827 0 0.844328 0.604599 0 0.79653 +0.604599 0 0.79653 0.669131 0 0.743145 0.669131 0 0.743145 +0.728969 0 0.684547 0.728969 0 0.684547 0.783693 0 0.621148 +0.783693 0 0.621148 0.832921 0 0.553392 0.832921 0 0.553392 +0.876307 0 0.481754 0.876307 0 0.481754 0.913545 0 0.406737 +0.913545 0 0.406737 0.944376 0 0.328867 0.944376 0 0.328867 +0.968583 0 0.24869 0.968583 0 0.24869 0.985996 0 0.166769 +0.985996 0 0.166769 0.996493 0 0.0836778 0.996493 0 0.0836778 + +TEXTURE_COORDINATES TCoords 2 float +1 0 1 1 0.973333 0 0.973333 1 0.946667 +0 0.946667 1 0.92 0 0.92 1 0.893333 0 +0.893333 1 0.866667 0 0.866667 1 0.84 0 0.84 +1 0.813333 0 0.813333 1 0.786667 0 0.786667 1 +0.76 0 0.76 1 0.733333 0 0.733333 1 0.706667 +0 0.706667 1 0.68 0 0.68 1 0.653333 0 +0.653333 1 0.626667 0 0.626667 1 0.6 0 0.6 +1 0.573333 0 0.573333 1 0.546667 0 0.546667 1 +0.52 0 0.52 1 0.493333 0 0.493333 1 0.466667 +0 0.466667 1 0.44 0 0.44 1 0.413333 0 +0.413333 1 0.386667 0 0.386667 1 0.36 0 0.36 +1 0.333333 0 0.333333 1 0.306667 0 0.306667 1 +0.28 0 0.28 1 0.253333 0 0.253333 1 0.226667 +0 0.226667 1 0.2 0 0.2 1 0.173333 0 +0.173333 1 0.146667 0 0.146667 1 0.12 0 0.12 +1 0.0933333 0 0.0933333 1 0.0666667 0 0.0666667 1 +0.04 0 0.04 1 0.0133333 0 0.0133333 1 0.0133333 +0 0.0133333 1 0.04 0 0.04 1 0.0666667 0 +0.0666667 1 0.0933333 0 0.0933333 1 0.12 0 0.12 +1 0.146667 0 0.146667 1 0.173333 0 0.173333 1 +0.2 0 0.2 1 0.226667 0 0.226667 1 0.253333 +0 0.253333 1 0.28 0 0.28 1 0.306667 0 +0.306667 1 0.333333 0 0.333333 1 0.36 0 0.36 +1 0.386667 0 0.386667 1 0.413333 0 0.413333 1 +0.44 0 0.44 1 0.466667 0 0.466667 1 0.493333 +0 0.493333 1 0.52 0 0.52 1 0.546667 0 +0.546667 1 0.573333 0 0.573333 1 0.6 0 0.6 +1 0.626667 0 0.626667 1 0.653333 0 0.653333 1 +0.68 0 0.68 1 0.706667 0 0.706667 1 0.733333 +0 0.733333 1 0.76 0 0.76 1 0.786667 0 +0.786667 1 0.813333 0 0.813333 1 0.84 0 0.84 +1 0.866667 0 0.866667 1 0.893333 0 0.893333 1 +0.92 0 0.92 1 0.946667 0 0.946667 1 0.973333 +0 0.973333 1 diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict new file mode 100644 index 00000000000..933969693bd --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/controlDict @@ -0,0 +1,50 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application snappyHexMesh; + +startFrom latestTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl runTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict new file mode 100644 index 00000000000..74214eea863 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/createPatchDict @@ -0,0 +1,112 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object createPatchDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// This application/dictionary controls: +// - optional: create new patches from boundary faces (either given as +// a set of patches or as a faceSet) +// - always: order faces on coupled patches such that they are opposite. This +// is done for all coupled faces, not just for any patches created. +// - optional: synchronise points on coupled patches. +// - always: remove zero-sized (non-coupled) patches (that were not added) + +// 1. Create cyclic: +// - specify where the faces should come from +// - specify the type of cyclic. If a rotational specify the rotationAxis +// and centre to make matching easier +// - always create both halves in one invocation with correct 'neighbourPatch' +// setting. +// - optionally pointSync true to guarantee points to line up. + +// 2. Correct incorrect cyclic: +// This will usually fail upon loading: +// "face 0 area does not match neighbour 2 by 0.0100005%" +// " -- possible face ordering problem." +// - in polyMesh/boundary file: +// - loosen matchTolerance of all cyclics to get case to load +// - or change patch type from 'cyclic' to 'patch' +// and regenerate cyclic as above + +// Do a synchronisation of coupled points after creation of any patches. +// Note: this does not work with points that are on multiple coupled patches +// with transformations (i.e. cyclics). +pointSync false; + +// Patches to create. +patches +( + { + // Name of new patch + name oversetPatch; + + // Dictionary to construct new patch from + patchInfo + { + type overset; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (otherSide); + + // If constructFrom = set : name of faceSet + set f0; + } + + { + // Name of new patch + name walls; + + // Dictionary to construct new patch from + patchInfo + { + type wall; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (originalPatch); + + // If constructFrom = set : name of faceSet + set f0; + } + + { + // Name of new patch + name frontAndBack; + + // Dictionary to construct new patch from + patchInfo + { + type empty; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (sides); + + // If constructFrom = set : name of faceSet + set f0; + } + +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict new file mode 100644 index 00000000000..56563f90d3c --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/extrudeMeshDict @@ -0,0 +1,136 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrudeMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// What to extrude: +// patch : from patch of another case ('sourceCase') +// mesh : as above but with original case included +// surface : from externally read surface + +//constructFrom mesh; +//constructFrom patch; +constructFrom surface; + +// If construct from patch/mesh: +sourceCase "../cavity"; +sourcePatches (movingWall); + +// If construct from patch: patch to use for back (can be same as sourcePatch) +exposedPatchName movingWall; + +// If construct from surface: +surface "constant/triSurface/cylinder.vtk"; + +// Flip surface normals before usage. Valid only for extrude from surface or +// patch. +flipNormals false; + +//- Linear extrusion in point-normal direction +extrudeModel linearNormal; + +//- Single layer linear extrusion in point-normal direction +// with empty patches on front and back +//extrudeModel plane; + +//- Linear extrusion in specified direction +//extrudeModel linearDirection; + +//- Sector extrusion +//extrudeModel sector; + +//- Wedge extrusion of a single layer +// with wedge patches on front and back +//extrudeModel wedge; + +//- Extrudes into sphere around (0 0 0) +//extrudeModel linearRadial; + +//- Extrudes into sphere around (0 0 0) with specified radii +//extrudeModel radial; + +//- Extrudes into sphere with grading according to pressure (atmospherics) +//extrudeModel sigmaRadial; + +//- Extrudes by interpolating along path inbetween two (topologically identical) +// surfaces (e.g. one is an offsetted version of the other) +//extrudeModel offsetSurface; + +nLayers 10; + +expansionRatio 1.02; + +sectorCoeffs +{ + axisPt (0 0.1 -0.05); + axis (-1 0 0); + angle 360; // For nLayers=1 assume symmetry so angle/2 on each side +} + +linearNormalCoeffs +{ + thickness 0.7; +} + +planeCoeffs +{ +// thickness 0.1; + nLayers 4; +} + +linearDirectionCoeffs +{ + direction (0 1 0); + thickness 0.5; +} + +linearRadialCoeffs +{ + R 0.1; + // Optional inner radius + Rsurface 0.01; +} + +radialCoeffs +{ + // Radii specified through interpolation table + R table ((0 0.01)(3 0.03)(10 0.1)); +} + +sigmaRadialCoeffs +{ + RTbyg 1; + pRef 1; + pStrat 1; +} + +offsetSurfaceCoeffs +{ + // Surface that mesh has been meshed to + baseSurface "$FOAM_CASE/constant/triSurface/DTC-scaled-inflated.obj"; + + // Surface to fill in to + offsetSurface "$FOAM_CASE/constant/triSurface/DTC-scaled.obj"; +} + + +// Do front and back need to be merged? Usually only makes sense for 360 +// degree wedges. +mergeFaces false; + +// Merge small edges. Fraction of bounding box. +mergeTol 0; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes new file mode 100644 index 00000000000..471fef01438 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSchemes @@ -0,0 +1,58 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss upwind; + div(phi,epsilon) Gauss upwind; + div(phi,R) Gauss upwind; + div(R) Gauss linear; + div(phid,p) Gauss limitedLinear 1; + div(phi,K) Gauss limitedLinear 1; + div(phi,e) Gauss limitedLinear 1; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear limited corrected 0.5; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution new file mode 100644 index 00000000000..852422eb082 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/cylinder/cylinderMesh/system/fvSolution @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: v3.0+ | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-12; + relTol 0; + } + + rho + { + solver PCG; + preconditioner DIC; + tolerance 1e-08; + relTol 0; + } + + "(U|e|k|epsilon|R)" + { + $p; + tolerance 1e-08; + relTol 0; + } +} + +PISO +{ + nCorrectors 2; + nNonOrthogonalCorrectors 2; +} + + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U new file mode 100644 index 00000000000..b1fc09c1253 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/U @@ -0,0 +1,62 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: 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 +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + walls + { + //type slip; + type uniformFixedValue; + uniformValue (0 0 0); + } + + hole + { + type movingWallVelocity; + value uniform (0 0 0); + } + +// left1 +// { +// type pressureInletOutletVelocity; +// value uniform (0 0 0); +// } +// left1 +// { +// type fixedValue; +// value $internalField; +// } +// +// right1 +// { +// type zeroGradient; //calculated; +// value $internalField; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon new file mode 100644 index 00000000000..ca86c9f6e5f --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/epsilon @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object epsilon; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [ 0 2 -3 0 0 0 0 ]; + +internalField uniform 200; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type epsilonWallFunction; + value $internalField; + } + +// left1 +// { +// type turbulentMixingLengthDissipationRateInlet; +// mixingLength 0.01; // 1cm - half channel height +// value $internalField; +// } +// +// right1 +// { +// type calculated; +// value $internalField; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k new file mode 100644 index 00000000000..b74e3daf920 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/k @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [ 0 2 -2 0 0 0 0 ]; + +internalField uniform 0.2; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type kqRWallFunction; + value uniform 0; + } + +// left1 +// { +// type turbulentIntensityKineticEnergyInlet; +// intensity 0.05; // 5% turbulent intensity +// value $internalField; +// } +// +// right1 +// { +// type calculated; +// value $internalField; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda new file mode 100644 index 00000000000..11af85939e9 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nuTilda @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: 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 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut new file mode 100644 index 00000000000..f7c72d5ce2a --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/nut @@ -0,0 +1,50 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: 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 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type nutkWallFunction; + value uniform 0; + } + +// left1 +// { +// type calculated; +// value uniform 0; +// } +// +// right1 +// { +// type calculated; +// value uniform 0; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p new file mode 100644 index 00000000000..55e4c8b692e --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/p @@ -0,0 +1,64 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type zeroGradient; + } + +// left1 +// { +// type uniformTotalPressure; +// pressure table +// ( +// (0 10) +// (1 40) +// ); +// p0 40; // only used for restarts +// U U; +// phi phi; +// rho none; +// psi none; +// gamma 1; +// value uniform 40; +// } +// left1 +// { +// type zeroGradient; +// } +// +// right1 +// { +// type fixedValue; //calculated; +// value $internalField; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement new file mode 100644 index 00000000000..fe072121d35 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/pointDisplacement @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + ".*" + { + type uniformFixedValue; + uniformValue (0 0 0); + } + + overset + { + patchType overset; + type zeroGradient; + } + + hole + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID new file mode 100644 index 00000000000..acef7b1a3df --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/0.org/zoneID @@ -0,0 +1,38 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + ".*" + { + type zeroGradient; + } + + overset + { + type overset; + value uniform 0; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean new file mode 100755 index 00000000000..5d96ca404a3 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allclean @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase +rm -f constant/polyMesh/boundary +rm -f constant/polyMesh/zoneID +rm -f constant/cellInterpolationWeight + +rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun new file mode 100755 index 00000000000..9edfe26c89a --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun @@ -0,0 +1,6 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +./Allrun.pre + +runApplication overPimpleDyMFoam diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre new file mode 100755 index 00000000000..a6ddc21dbe9 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/Allrun.pre @@ -0,0 +1,19 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication blockMesh + +# Select cellSets +runApplication topoSet + +runApplication subsetMesh box -patch hole -overwrite + +# Select cellSets +rm log.topoSet + +runApplication topoSet + +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties new file mode 100644 index 00000000000..ec34b4c47c9 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/RASProperties @@ -0,0 +1,23 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object RASProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +RASModel laminar; //kEpsilon; + +turbulence off; //on; + +printCoeffs off; //on; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict new file mode 100644 index 00000000000..951bd08dae5 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/dynamicMeshDict @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object dynamicMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +// layerRelax 0.3; +} + +//motionSolverLibs ( "libfvMotionSolvers.so" ); +// +//solver displacementLaplacian; +// +//displacementLaplacianCoeffs +//{ +// diffusivity uniform 1; +//} + +solver multiSolidBodyMotionSolver; + +multiSolidBodyMotionSolverCoeffs +{ + movingZone + { + solidBodyMotionFunction rotatingMotion; + rotatingMotionCoeffs + { + origin (0.005 0.005 0.005); + axis (0 0 1); + omega 100.0; + } + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties new file mode 100644 index 00000000000..4efbc8b9325 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/transportProperties @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +DT DT [ 0 2 -1 0 0 0 0 ] 1; //4e-05; + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties new file mode 100644 index 00000000000..c1f1b1a8341 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/constant/turbulenceProperties @@ -0,0 +1,19 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType laminar; //RASModel; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict new file mode 100644 index 00000000000..7e5a21da5f5 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/blockMeshDict @@ -0,0 +1,97 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 0.01; + +vertices +( + ( 0.00 0.0 0) + ( 1.00 0.0 0) + ( 1.00 1.0 0) + ( 0.00 1.0 0) + ( 0.00 0.0 1) + ( 1.00 0.0 1) + ( 1.00 1.0 1) + ( 0.00 1.0 1) + + ( 0.15 0.35 0) + ( 0.85 0.35 0) + ( 0.85 0.65 0) + ( 0.15 0.65 0) + ( 0.15 0.35 1) + ( 0.85 0.35 1) + ( 0.85 0.65 1) + ( 0.15 0.65 1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (36 36 1) simpleGrading (1 1 1) + + hex (8 9 10 11 12 13 14 15) movingZone (28 12 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + overset2 + { + type overset; + faces + ( + ( 8 12 15 11) + (10 14 13 9) + (11 15 14 10) + ( 9 13 12 8) + ); + } + + walls + { + type wall; + faces + ( + (3 7 6 2) + (1 5 4 0) + (0 4 7 3) + (2 6 5 1) + ); + } + + // Populated by subsetMesh + hole + { + type wall; + faces (); + } + + frontAndBack + { + type empty; + faces + ( + (0 3 2 1) + (4 5 6 7) + ( 8 11 10 9) + (12 13 14 15) + ); + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict new file mode 100644 index 00000000000..d9178735a16 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/controlDict @@ -0,0 +1,55 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +libs ("liboverset.so"); + +application overPimpleDyMFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.1; + +deltaT 0.00025; + +//writeControl timeStep; +//writeInterval 10; + +writeControl adjustableRunTime; +writeInterval 0.01; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 10; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +adjustTimeStep yes; + +maxCo 1; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict new file mode 100644 index 00000000000..805c936e877 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/decomposeParDict @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 3; + +method hierarchical; + +hierarchicalCoeffs +{ + n (3 1 1); + delta 0.001; + order xyz; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes new file mode 100644 index 00000000000..067d2aa43b6 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes @@ -0,0 +1,69 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + grad(T) Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss limitedLinear 1; + div(phi,epsilon) Gauss limitedLinear 1; + div(phi,R) Gauss limitedLinear 1; + div(R) Gauss linear; + div(phi,nuTilda) Gauss limitedLinear 1; + div((nuEff*dev(T(grad(U))))) Gauss linear; + div((nuEff*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; + laplacian(diffusivity,cellDisplacement) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +oversetInterpolation +{ + method inverseDistance; +} + +fluxRequired +{ + default no; + pcorr ; + p ; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution new file mode 100644 index 00000000000..464100d29a4 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSolution @@ -0,0 +1,96 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + cellDisplacement + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + p + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + } + + pFinal + { + $p; + } + + pcorr + { + $p; + solver PCG; + preconditioner DIC; + } + + pcorrFinal + { + $pcorr; + relTol 0; + } + + "(U|k|epsilon)" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-6; + relTol 0; + } + + "(U|k|epsilon)Final" + { + $U; + tolerance 1e-6; + relTol 0; + } +} + +PIMPLE +{ + momentumPredictor no; + correctPhi no; + nOuterCorrectors 1; + nCorrectors 2; + nNonOrthogonalCorrectors 0; + + ddtCorr false; + + pRefPoint (0.0001 0.0001 0.001); + pRefValue 0.0; +} + +relaxationFactors +{ + fields + { + } + equations + { + ".*" 1; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict new file mode 100644 index 00000000000..21c7adb08ee --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/setFieldsDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue zoneID 123 +); + +regions +( + // Set cell values + // (does zerogradient on boundaries) + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict new file mode 100644 index 00000000000..4b0957e2889 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/topoSetDict @@ -0,0 +1,78 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionToCell; + sourceInfo + { + insidePoints ((0.001 0.001 0.001)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } + + // Select box to remove from region 1 + + { + name box; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c1; + } + } + + { + name box; + type cellSet; + action subset; + source boxToCell; + sourceInfo + { + box (0.0025 0.0045 -100)(0.0075 0.0055 100); + } + } + + { + name box; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U new file mode 100644 index 00000000000..b1fc09c1253 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/U @@ -0,0 +1,62 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: 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 +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + walls + { + //type slip; + type uniformFixedValue; + uniformValue (0 0 0); + } + + hole + { + type movingWallVelocity; + value uniform (0 0 0); + } + +// left1 +// { +// type pressureInletOutletVelocity; +// value uniform (0 0 0); +// } +// left1 +// { +// type fixedValue; +// value $internalField; +// } +// +// right1 +// { +// type zeroGradient; //calculated; +// value $internalField; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p new file mode 100644 index 00000000000..55e4c8b692e --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/p @@ -0,0 +1,64 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + "(walls|hole)" + { + type zeroGradient; + } + +// left1 +// { +// type uniformTotalPressure; +// pressure table +// ( +// (0 10) +// (1 40) +// ); +// p0 40; // only used for restarts +// U U; +// phi phi; +// rho none; +// psi none; +// gamma 1; +// value uniform 40; +// } +// left1 +// { +// type zeroGradient; +// } +// +// right1 +// { +// type fixedValue; //calculated; +// value $internalField; +// } + + overset + { + type overset; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement new file mode 100644 index 00000000000..b218758016c --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/pointDisplacement @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + ".*" + { + type uniformFixedValue; + uniformValue (0 0 0); + } + + hole + { + type zeroGradient; + } + + overset + { + patchType overset; + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID new file mode 100644 index 00000000000..b1cdf0478ed --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/0.org/zoneID @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + overset + { + type overset; + } + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean new file mode 100755 index 00000000000..5d96ca404a3 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allclean @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase +rm -f constant/polyMesh/boundary +rm -f constant/polyMesh/zoneID +rm -f constant/cellInterpolationWeight + +rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun new file mode 100755 index 00000000000..ea6d08a994b --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun @@ -0,0 +1,14 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +./Allrun.pre + +# Get application directory +application=`getApplication` + +# Serial +#runApplication $application + +# Parallel +runApplication decomposePar -cellDist +runParallel $application diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre new file mode 100755 index 00000000000..19f634cd43d --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/Allrun.pre @@ -0,0 +1,17 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication blockMesh + +# Select cellSets +runApplication -s 1 topoSet + +runApplication subsetMesh box -patch hole -overwrite + +# Select cellSets +runApplication -s 2 topoSet + +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt new file mode 100644 index 00000000000..eb98b26f8d7 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/README.txt @@ -0,0 +1,3 @@ +Transient, moving mesh +---------------------- +Two turning rotors diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict new file mode 100644 index 00000000000..391eb516ead --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/dynamicMeshDict @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object dynamicMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +// layerRelax 0.3; +} + +solver multiSolidBodyMotionSolver; + +multiSolidBodyMotionSolverCoeffs +{ + movingZone1 + { + solidBodyMotionFunction rotatingMotion; + rotatingMotionCoeffs + { + origin (0.005 0.005 0.005); + axis (0 0 1); + omega 100.0; + } + } + + movingZone2 + { + solidBodyMotionFunction rotatingMotion; + rotatingMotionCoeffs + { + origin (0.009 0.005 0.005); + axis (0 0 1); + omega -100.0; + } + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties new file mode 100644 index 00000000000..ab4d80f3308 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/transportProperties @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties new file mode 100644 index 00000000000..9abf14eeecd --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/constant/turbulenceProperties @@ -0,0 +1,19 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType laminar; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict new file mode 100644 index 00000000000..5456fdbf9c0 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/blockMeshDict @@ -0,0 +1,140 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 0.01; + +vertices +( + ( 0.00 0.0 0) + ( 2.00 0.0 0) + ( 2.00 1.0 0) + ( 0.00 1.0 0) + ( 0.00 0.0 1) + ( 2.00 0.0 1) + ( 2.00 1.0 1) + ( 0.00 1.0 1) + + // movingZone1 + ( 0.15 0.35 0) + ( 0.85 0.35 0) + ( 0.85 0.65 0) + ( 0.15 0.65 0) + ( 0.15 0.35 1) + ( 0.85 0.35 1) + ( 0.85 0.65 1) + ( 0.15 0.65 1) + + // movingZone2 + ( 0.75 0.15 0) + ( 1.05 0.15 0) + ( 1.05 0.85 0) + ( 0.75 0.85 0) + ( 0.75 0.15 1) + ( 1.05 0.15 1) + ( 1.05 0.85 1) + ( 0.75 0.85 1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (73 37 1) simpleGrading (1 1 1) + + hex (8 9 10 11 12 13 14 15) movingZone1 (28 12 1) simpleGrading (1 1 1) + + hex (16 17 18 19 20 21 22 23) movingZone2 (12 28 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + overset1 + { + type overset; + faces + ( + ( 8 12 15 11) + (10 14 13 9) + (11 15 14 10) + ( 9 13 12 8) + ); + } + + overset2 + { + type overset; + faces + ( + (16 20 23 19) + (18 22 21 17) + (19 23 22 18) + (17 21 20 16) + ); + } + + walls + { + type wall; + faces + ( + (3 7 6 2) + (1 5 4 0) + (0 4 7 3) + (2 6 5 1) + ); + } + + // Populated by subsetMesh + hole + { + type wall; + faces (); + } + + frontAndBack + { + type empty; + faces + ( + (0 3 2 1) + (4 5 6 7) + ); + } + + frontAndBack1 + { + type empty; + faces + ( + ( 8 11 10 9) + (12 13 14 15) + ); + } + + frontAndBack2 + { + type empty; + faces + ( + (16 19 18 17) + (20 21 22 23) + ); + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict new file mode 100644 index 00000000000..591998cc3f6 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/controlDict @@ -0,0 +1,53 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +libs ("liboverset.so"); + +application overPimpleDyMFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.06; + +deltaT 0.00025; + +writeControl adjustableRunTime; + +writeInterval 0.005; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 10; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +adjustTimeStep yes; + +maxCo 1; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict new file mode 100644 index 00000000000..2e73b80199c --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/decomposeParDict @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 3; + + +method hierarchical; + +hierarchicalCoeffs +{ + n (3 1 1); + delta 0.001; + order xyz; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes new file mode 100644 index 00000000000..4e18294c71a --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSchemes @@ -0,0 +1,68 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + grad(T) Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss limitedLinear 1; + div(phi,epsilon) Gauss limitedLinear 1; + div(phi,R) Gauss limitedLinear 1; + div(R) Gauss linear; + div(phi,nuTilda) Gauss limitedLinear 1; + div((nuEff*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; + laplacian(diffusivity,cellDisplacement) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +oversetInterpolation +{ + method inverseDistance; +} + +fluxRequired +{ + default no; + pcorr ; + p ; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution new file mode 100644 index 00000000000..464100d29a4 --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/fvSolution @@ -0,0 +1,96 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + cellDisplacement + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + p + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0; + } + + pFinal + { + $p; + } + + pcorr + { + $p; + solver PCG; + preconditioner DIC; + } + + pcorrFinal + { + $pcorr; + relTol 0; + } + + "(U|k|epsilon)" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-6; + relTol 0; + } + + "(U|k|epsilon)Final" + { + $U; + tolerance 1e-6; + relTol 0; + } +} + +PIMPLE +{ + momentumPredictor no; + correctPhi no; + nOuterCorrectors 1; + nCorrectors 2; + nNonOrthogonalCorrectors 0; + + ddtCorr false; + + pRefPoint (0.0001 0.0001 0.001); + pRefValue 0.0; +} + +relaxationFactors +{ + fields + { + } + equations + { + ".*" 1; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict new file mode 100644 index 00000000000..b3f3729fe8b --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/setFieldsDict @@ -0,0 +1,57 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue zoneID 123 +); + +regions +( + // Set cell values + // (does zerogradient on boundaries) + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + + cellToCell + { + set c2; + + fieldValues + ( + volScalarFieldValue zoneID 2 + ); + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict new file mode 100644 index 00000000000..db08fe53b5d --- /dev/null +++ b/tutorials/incompressible/overPimpleDyMFoam/twoSimpleRotors/system/topoSetDict @@ -0,0 +1,116 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus-overset | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionsToCell; + sourceInfo + { + insidePoints ((0.001 0.001 0.001)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } + + { + name c2; + type cellSet; + action new; + source regionsToCell; + sourceInfo + { + insidePoints ((0.0076 0.00151 0.001)); + set c1; + } + } + + { + name c1; + type cellSet; + action delete; + source cellToCell; + sourceInfo + { + set c2; + } + } + + // Select box to remove from region 1 and 2 + + { + name box; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c1; + } + } + + { + name box; + type cellSet; + action add; + source cellToCell; + sourceInfo + { + set c2; + } + } + + { + name box; + type cellSet; + action subset; + source boxToCell; + sourceInfo + { + boxes + ( + (0.0025 0.0045 -100)(0.0075 0.0055 100) + (0.0085 0.0025 -100)(0.0095 0.0075 100) + ); + } + } + + { + name box; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean new file mode 100755 index 00000000000..10394c3ebe5 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allclean @@ -0,0 +1,20 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cd aeroFoil_snappyHexMesh +cleanCase + +cd ../aeroFoil_overset +cleanCase +rm -rf 0 + +cd ../background_snappyHexMesh +cleanCase + + +cd ../background_overset +cleanCase +./Allclean diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun new file mode 100755 index 00000000000..728e17019da --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + + +./Allrun.pre +cd background_overset +./Allrun diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre new file mode 100755 index 00000000000..6b300fc25ac --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/Allrun.pre @@ -0,0 +1,12 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# create aeroFoil mesh using snappyHexMesh +(cd aeroFoil_snappyHexMesh && ./Allrun.pre) + +# Extrude mesh +(cd aeroFoil_overset && ./Allrun.pre) + +(cd background_snappyHexMesh && ./Allrun.pre) + +(cd background_overset && ./Allrun.pre) diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt b/tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt new file mode 100644 index 00000000000..c77aeeff8ac --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/README.txt @@ -0,0 +1,14 @@ +Steady state, steady mesh +------------------------- + +aeroFoil_snappyHexMesh/ + For generating (3D) mesh for background + +aeroFoil_overset/ + Extruding into 2D + +background_snappyHexMesh/ + For generating (3D) mesh for background + +background_overset/ + Combined mesh for running diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre new file mode 100755 index 00000000000..98a5ce71db0 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/Allrun.pre @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + + +# Make a 2D mesh by extruding a patch and solve to steady state. +runApplication extrudeMesh +runApplication createPatch -overwrite diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties new file mode 100644 index 00000000000..9531534e980 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/transportProperties @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +transportModel Newtonian; + +nu [0 2 -1 0 0 0 0] 1e-05; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties new file mode 100644 index 00000000000..7b102c0acca --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/constant/turbulenceProperties @@ -0,0 +1,28 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RAS; + +RAS +{ + RASModel kOmegaSST; + + turbulence on; + + printCoeffs on; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict new file mode 100644 index 00000000000..6e5ca5c1c57 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/controlDict @@ -0,0 +1,65 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application simpleFoam; + +startFrom latestTime; + +startTime 0; + +stopAt endTime; + +endTime 3000; + +deltaT 1; + +writeControl runTime; + +writeInterval 100; + +purgeWrite 0; + +writeFormat binary; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +functions +{ + forces + { + type forces; + functionObjectLibs ( "libforces.so" ); + outputControl timeStep; + outputInterval 10; + patches (wing); + pName p; + UName U; + rhoName rhoInf; + log true; + rhoInf 1; + CofR (0.4974612746 -0.01671895744 0.125); + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict new file mode 100644 index 00000000000..89853b13d6e --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/createPatchDict @@ -0,0 +1,86 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object createPatchDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Do a synchronisation of coupled points after creation of any patches. +// Note: this does not work with points that are on multiple coupled patches +// with transformations (i.e. cyclics). +pointSync false; + +// Patches to create. +patches +( + { + // Name of new patch + name oversetPatch; + + // Dictionary to construct new patch from + patchInfo + { + type overset; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (inlet outlet topAndBottom); + + // If constructFrom = set : name of faceSet + set f0; + } + + { + // Name of new patch + name walls; + + // Dictionary to construct new patch from + patchInfo + { + type wall; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (wing); + + // If constructFrom = set : name of faceSet + set f0; + } + { + // Name of new patch + name frontAndBack; + + // Dictionary to construct new patch from + patchInfo + { + type empty; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (symFront symBack); + + // If constructFrom = set : name of faceSet + set f0; + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict new file mode 100644 index 00000000000..2e735d74798 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/extrudeMeshDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrudeMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// What to extrude: +// patch : from patch of another case ('sourceCase') +// mesh : as above but with original case included +// surface : from externally read surface + +constructFrom patch; +sourceCase "../aeroFoil_snappyHexMesh"; +sourcePatches (symFront); + +// If construct from patch: patch to use for back (can be same as sourcePatch) +exposedPatchName symBack; + +// Flip surface normals before usage. Valid only for extrude from surface or +// patch. +flipNormals false; + +//- Linear extrusion in point-normal direction +extrudeModel linearNormal; + +nLayers 1; + +expansionRatio 1.0; + +linearNormalCoeffs +{ + thickness 0.05; +} + +// Do front and back need to be merged? Usually only makes sense for 360 +// degree wedges. +mergeFaces false; //true; + +// Merge small edges. Fraction of bounding box. +mergeTol 0; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes new file mode 100644 index 00000000000..089b2c5116d --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSchemes @@ -0,0 +1,58 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default steadyState; +} + +gradSchemes +{ + default Gauss linear; + grad(p) Gauss linear; + grad(U) Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) bounded Gauss linearUpwind grad(U); + div(phi,k) bounded Gauss upwind; + div(phi,omega) bounded Gauss upwind; + div((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/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution new file mode 100644 index 00000000000..015f39e4ade --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_overset/system/fvSolution @@ -0,0 +1,77 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver PBiCGStab; + preconditioner DILU; + relTol 0.1; + } + + U + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0.1; + nSweeps 1; + } + + k + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0.1; + nSweeps 1; + } + + omega + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0.1; + nSweeps 1; + } +} + +SIMPLE +{ + nNonOrthogonalCorrectors 0; +} + +relaxationFactors +{ + fields + { + p 0.3; + } + equations + { + "(U|k|omega)" 0.7; + "(U|k|omega)Final" 1.0; + } +} + +cache +{ + grad(U); +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre new file mode 100755 index 00000000000..fdfb7e78d16 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/Allrun.pre @@ -0,0 +1,9 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Make 3D mesh in slab of cells. +runApplication blockMesh +runApplication snappyHexMesh -overwrite diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj new file mode 100644 index 00000000000..4be2aac5f2f --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/constant/triSurface/wing_5degrees.obj @@ -0,0 +1,1054 @@ +# Wavefront OBJ file written 2010-05-13T09:12:43 +o wing_5degrees + +# points : 520 +# faces : 520 +# zones : 1 +# 0 WALL10 (nFaces: 520) + +# <points count="520"> +v 1.00488 -0.0890722 -0.5 +v 1.00488 -0.0890722 0.5 +v 0.999453 -0.0870827 0.5 +v 0.999453 -0.0870827 -0.5 +v 0.993747 -0.0849908 0.5 +v 0.993747 -0.0849908 -0.5 +v 0.98776 -0.0827959 0.5 +v 0.98776 -0.0827959 -0.5 +v 0.981475 -0.0804834 0.5 +v 0.981475 -0.0804834 -0.5 +v 0.974878 -0.0780483 0.5 +v 0.974878 -0.0780483 -0.5 +v 0.967936 -0.075535 0.5 +v 0.967936 -0.075535 -0.5 +v 0.960671 -0.0728297 0.5 +v 0.960671 -0.0728297 -0.5 +v 0.952986 -0.070149 0.5 +v 0.952986 -0.070149 -0.5 +v 0.944915 -0.067332 0.5 +v 0.944915 -0.067332 -0.5 +v 0.936442 -0.064377 0.5 +v 0.936442 -0.064377 -0.5 +v 0.927543 -0.0612777 0.5 +v 0.927543 -0.0612777 -0.5 +v 0.918171 -0.0581074 0.5 +v 0.918171 -0.0581074 -0.5 +v 0.908345 -0.0547308 0.5 +v 0.908345 -0.0547308 -0.5 +v 0.897978 -0.0513371 0.5 +v 0.897978 -0.0513371 -0.5 +v 0.887113 -0.0477115 0.5 +v 0.887113 -0.0477115 -0.5 +v 0.875671 -0.0440076 0.5 +v 0.875671 -0.0440076 -0.5 +v 0.863634 -0.0401898 0.5 +v 0.863634 -0.0401898 -0.5 +v 0.850988 -0.0362043 0.5 +v 0.850988 -0.0362043 -0.5 +v 0.837677 -0.0321259 0.5 +v 0.837677 -0.0321259 -0.5 +v 0.8237 -0.0278406 0.5 +v 0.8237 -0.0278406 -0.5 +v 0.808997 -0.0234314 0.5 +v 0.808997 -0.0234314 -0.5 +v 0.793536 -0.0188824 0.5 +v 0.793536 -0.0188824 -0.5 +v 0.777248 -0.0142896 0.5 +v 0.777248 -0.0142896 -0.5 +v 0.760144 -0.00947585 0.5 +v 0.760144 -0.00947585 -0.5 +v 0.742148 -0.0045544 0.5 +v 0.742148 -0.0045544 -0.5 +v 0.723207 0.000449948 0.5 +v 0.723207 0.000449948 -0.5 +v 0.703296 0.00561154 0.5 +v 0.703296 0.00561154 -0.5 +v 0.682345 0.010854 0.5 +v 0.682345 0.010854 -0.5 +v 0.660295 0.0161554 0.5 +v 0.660295 0.0161554 -0.5 +v 0.637103 0.0215548 0.5 +v 0.637103 0.0215548 -0.5 +v 0.606829 0.0282606 0.5 +v 0.606829 0.0282606 -0.5 +v 0.578018 0.0343978 0.5 +v 0.578018 0.0343978 -0.5 +v 0.550557 0.0397874 0.5 +v 0.550557 0.0397874 -0.5 +v 0.524436 0.0447356 0.5 +v 0.524436 0.0447356 -0.5 +v 0.499549 0.0490421 0.5 +v 0.499549 0.0490421 -0.5 +v 0.475869 0.05291 0.5 +v 0.475869 0.05291 -0.5 +v 0.45334 0.0563729 0.5 +v 0.45334 0.0563729 -0.5 +v 0.431911 0.059484 0.5 +v 0.431911 0.059484 -0.5 +v 0.411518 0.0621876 0.5 +v 0.411518 0.0621876 -0.5 +v 0.392118 0.0645445 0.5 +v 0.392118 0.0645445 -0.5 +v 0.373644 0.0664046 0.5 +v 0.373644 0.0664046 -0.5 +v 0.356081 0.0680196 0.5 +v 0.356081 0.0680196 -0.5 +v 0.339375 0.0692961 0.5 +v 0.339375 0.0692961 -0.5 +v 0.323487 0.0702815 0.5 +v 0.323487 0.0702815 -0.5 +v 0.308383 0.0710035 0.5 +v 0.308383 0.0710035 -0.5 +v 0.294024 0.0714698 0.5 +v 0.294024 0.0714698 -0.5 +v 0.28038 0.0717809 0.5 +v 0.28038 0.0717809 -0.5 +v 0.267416 0.0719191 0.5 +v 0.267416 0.0719191 -0.5 +v 0.255099 0.0718222 0.5 +v 0.255099 0.0718222 -0.5 +v 0.243399 0.0716511 0.5 +v 0.243399 0.0716511 -0.5 +v 0.232288 0.0713208 0.5 +v 0.232288 0.0713208 -0.5 +v 0.221735 0.0709249 0.5 +v 0.221735 0.0709249 -0.5 +v 0.211715 0.0704338 0.5 +v 0.211715 0.0704338 -0.5 +v 0.202202 0.0698513 0.5 +v 0.202202 0.0698513 -0.5 +v 0.19317 0.0692271 0.5 +v 0.19317 0.0692271 -0.5 +v 0.184599 0.0685108 0.5 +v 0.184599 0.0685108 -0.5 +v 0.176464 0.0677409 0.5 +v 0.176464 0.0677409 -0.5 +v 0.168741 0.0669472 0.5 +v 0.168741 0.0669472 -0.5 +v 0.161418 0.0660755 0.5 +v 0.161418 0.0660755 -0.5 +v 0.154469 0.0651852 0.5 +v 0.154469 0.0651852 -0.5 +v 0.145493 0.0640314 0.5 +v 0.145493 0.0640314 -0.5 +v 0.136995 0.0627463 0.5 +v 0.136995 0.0627463 -0.5 +v 0.128932 0.0614383 0.5 +v 0.128932 0.0614383 -0.5 +v 0.121282 0.0601525 0.5 +v 0.121282 0.0601525 -0.5 +v 0.114049 0.0587416 0.5 +v 0.114049 0.0587416 -0.5 +v 0.107186 0.0573482 0.5 +v 0.107186 0.0573482 -0.5 +v 0.100675 0.0559871 0.5 +v 0.100675 0.0559871 -0.5 +v 0.0945147 0.0545794 0.5 +v 0.0945147 0.0545794 -0.5 +v 0.0886858 0.0531426 0.5 +v 0.0886858 0.0531426 -0.5 +v 0.0831659 0.0517083 0.5 +v 0.0831659 0.0517083 -0.5 +v 0.0779342 0.0503006 0.5 +v 0.0779342 0.0503006 -0.5 +v 0.072975 0.0489224 0.5 +v 0.072975 0.0489224 -0.5 +v 0.0682798 0.0475559 0.5 +v 0.0682798 0.0475559 -0.5 +v 0.0638499 0.0461601 0.5 +v 0.0638499 0.0461601 -0.5 +v 0.0596656 0.0447577 0.5 +v 0.0596656 0.0447577 -0.5 +v 0.055694 0.0434126 0.5 +v 0.055694 0.0434126 -0.5 +v 0.0519364 0.0420932 0.5 +v 0.0519364 0.0420932 -0.5 +v 0.0484053 0.0407363 0.5 +v 0.0484053 0.0407363 -0.5 +v 0.0450779 0.0393756 0.5 +v 0.0450779 0.0393756 -0.5 +v 0.0419215 0.0380722 0.5 +v 0.0419215 0.0380722 -0.5 +v 0.0389288 0.0368211 0.5 +v 0.0389288 0.0368211 -0.5 +v 0.036102 0.0355928 0.5 +v 0.036102 0.0355928 -0.5 +v 0.0334425 0.034368 0.5 +v 0.0334425 0.034368 -0.5 +v 0.0309496 0.0331356 0.5 +v 0.0309496 0.0331356 -0.5 +v 0.0286117 0.0319047 0.5 +v 0.0286117 0.0319047 -0.5 +v 0.0264077 0.0307022 0.5 +v 0.0264077 0.0307022 -0.5 +v 0.0243248 0.02954 0.5 +v 0.0243248 0.02954 -0.5 +v 0.0223665 0.0284014 0.5 +v 0.0223665 0.0284014 -0.5 +v 0.0205353 0.0272716 0.5 +v 0.0205353 0.0272716 -0.5 +v 0.0188204 0.0261581 0.5 +v 0.0188204 0.0261581 -0.5 +v 0.0172057 0.0250781 0.5 +v 0.0172057 0.0250781 -0.5 +v 0.015681 0.0240389 0.5 +v 0.015681 0.0240389 -0.5 +v 0.0142472 0.0230307 0.5 +v 0.0142472 0.0230307 -0.5 +v 0.0129051 0.0220434 0.5 +v 0.0129051 0.0220434 -0.5 +v 0.0116567 0.0210699 0.5 +v 0.0116567 0.0210699 -0.5 +v 0.0105044 0.0201047 0.5 +v 0.0105044 0.0201047 -0.5 +v 0.00944864 0.0191444 0.5 +v 0.00944864 0.0191444 -0.5 +v 0.00847997 0.0181956 0.5 +v 0.00847997 0.0181956 -0.5 +v 0.00758214 0.0172702 0.5 +v 0.00758214 0.0172702 -0.5 +v 0.00674204 0.0163779 0.5 +v 0.00674204 0.0163779 -0.5 +v 0.00595671 0.0155186 0.5 +v 0.00595671 0.0155186 -0.5 +v 0.00523198 0.0146848 0.5 +v 0.00523198 0.0146848 -0.5 +v 0.00457157 0.0138701 0.5 +v 0.00457157 0.0138701 -0.5 +v 0.00397503 0.0130721 0.5 +v 0.00397503 0.0130721 -0.5 +v 0.00343506 0.0122936 0.5 +v 0.00343506 0.0122936 -0.5 +v 0.0029443 0.0115379 0.5 +v 0.0029443 0.0115379 -0.5 +v 0.0024965 0.010807 0.5 +v 0.0024965 0.010807 -0.5 +v 0.00209053 0.0101012 0.5 +v 0.00209053 0.0101012 -0.5 +v 0.00172938 0.00941821 0.5 +v 0.00172938 0.00941821 -0.5 +v 0.00141481 0.00875662 0.5 +v 0.00141481 0.00875662 -0.5 +v 0.00114703 0.00811509 0.5 +v 0.00114703 0.00811509 -0.5 +v 0.000922634 0.00749375 0.5 +v 0.000922634 0.00749375 -0.5 +v 0.00073432 0.00689421 0.5 +v 0.00073432 0.00689421 -0.5 +v 0.000575606 0.00631745 0.5 +v 0.000575606 0.00631745 -0.5 +v 0.000441178 0.00576428 0.5 +v 0.000441178 0.00576428 -0.5 +v 0.000326628 0.00523494 0.5 +v 0.000326628 0.00523494 -0.5 +v 0.000229331 0.00472926 0.5 +v 0.000229331 0.00472926 -0.5 +v 0.000147968 0.00424663 0.5 +v 0.000147968 0.00424663 -0.5 +v 8.13071e-05 0.00378656 0.5 +v 8.13071e-05 0.00378656 -0.5 +v 2.81186e-05 0.00334838 0.5 +v 2.81186e-05 0.00334838 -0.5 +v -1.28053e-05 0.00293132 0.5 +v -1.28053e-05 0.00293132 -0.5 +v -4.26138e-05 0.00253464 0.5 +v -4.26138e-05 0.00253464 -0.5 +v -6.24104e-05 0.00215753 0.5 +v -6.24104e-05 0.00215753 -0.5 +v -7.32354e-05 0.00179922 0.5 +v -7.32354e-05 0.00179922 -0.5 +v -7.6066e-05 0.00145891 0.5 +v -7.6066e-05 0.00145891 -0.5 +v -7.18149e-05 0.00113574 0.5 +v -7.18149e-05 0.00113574 -0.5 +v -6.13265e-05 0.000828962 0.5 +v -6.13265e-05 0.000828962 -0.5 +v -4.5388e-05 0.000537894 0.5 +v -4.5388e-05 0.000537894 -0.5 +v -2.47174e-05 0.000261729 0.5 +v -2.47174e-05 0.000261729 -0.5 +v 0.999428 -0.0886333 -0.5 +v 0.999428 -0.0886333 0.5 +v 0 0 0.5 +v 0 0 -0.5 +v 3.07731e-05 -0.000269468 0.5 +v 3.07731e-05 -0.000269468 -0.5 +v 6.87839e-05 -0.000551758 0.5 +v 6.87839e-05 -0.000551758 -0.5 +v 0.00011487 -0.000847395 0.5 +v 0.00011487 -0.000847395 -0.5 +v 0.000169958 -0.00115699 0.5 +v 0.000169958 -0.00115699 -0.5 +v 0.000235006 -0.00148084 0.5 +v 0.000235006 -0.00148084 -0.5 +v 0.000311085 -0.00181947 0.5 +v 0.000311085 -0.00181947 -0.5 +v 0.000399343 -0.00217329 0.5 +v 0.000399343 -0.00217329 -0.5 +v 0.000501006 -0.00254265 0.5 +v 0.000501006 -0.00254265 -0.5 +v 0.000617405 -0.00292793 0.5 +v 0.000617405 -0.00292793 -0.5 +v 0.000749918 -0.00332928 0.5 +v 0.000749918 -0.00332928 -0.5 +v 0.000900098 -0.00374706 0.5 +v 0.000900098 -0.00374706 -0.5 +v 0.00106951 -0.00418123 0.5 +v 0.00106951 -0.00418123 -0.5 +v 0.00125981 -0.00463173 0.5 +v 0.00125981 -0.00463173 -0.5 +v 0.00147278 -0.00509836 0.5 +v 0.00147278 -0.00509836 -0.5 +v 0.00171023 -0.00558073 0.5 +v 0.00171023 -0.00558073 -0.5 +v 0.0019741 -0.00607866 0.5 +v 0.0019741 -0.00607866 -0.5 +v 0.00226657 -0.00659235 0.5 +v 0.00226657 -0.00659235 -0.5 +v 0.00258985 -0.00712192 0.5 +v 0.00258985 -0.00712192 -0.5 +v 0.00294625 -0.00766749 0.5 +v 0.00294625 -0.00766749 -0.5 +v 0.0033381 -0.00822888 0.5 +v 0.0033381 -0.00822888 -0.5 +v 0.00376858 -0.00880495 0.5 +v 0.00376858 -0.00880495 -0.5 +v 0.00424144 -0.00939356 0.5 +v 0.00424144 -0.00939356 -0.5 +v 0.0047608 -0.00999197 0.5 +v 0.0047608 -0.00999197 -0.5 +v 0.00533108 -0.0105969 0.5 +v 0.00533108 -0.0105969 -0.5 +v 0.00595465 -0.0112076 0.5 +v 0.00595465 -0.0112076 -0.5 +v 0.00663108 -0.0118268 0.5 +v 0.00663108 -0.0118268 -0.5 +v 0.00735864 -0.0124589 0.5 +v 0.00735864 -0.0124589 -0.5 +v 0.00813479 -0.0131082 0.5 +v 0.00813479 -0.0131082 -0.5 +v 0.00896315 -0.0137726 0.5 +v 0.00896315 -0.0137726 -0.5 +v 0.00985143 -0.0144449 0.5 +v 0.00985143 -0.0144449 -0.5 +v 0.0108089 -0.0151156 0.5 +v 0.0108089 -0.0151156 -0.5 +v 0.0118417 -0.0157801 0.5 +v 0.0118417 -0.0157801 -0.5 +v 0.0129485 -0.0164439 0.5 +v 0.0129485 -0.0164439 -0.5 +v 0.0141258 -0.0171158 0.5 +v 0.0141258 -0.0171158 -0.5 +v 0.0153717 -0.0178024 0.5 +v 0.0153717 -0.0178024 -0.5 +v 0.0166914 -0.0185005 0.5 +v 0.0166914 -0.0185005 -0.5 +v 0.0180921 -0.0192037 0.5 +v 0.0180921 -0.0192037 -0.5 +v 0.01958 -0.019908 0.5 +v 0.01958 -0.019908 -0.5 +v 0.0211576 -0.0206151 0.5 +v 0.0211576 -0.0206151 -0.5 +v 0.0228265 -0.0213288 0.5 +v 0.0228265 -0.0213288 -0.5 +v 0.0245895 -0.0220523 0.5 +v 0.0245895 -0.0220523 -0.5 +v 0.0264506 -0.0227868 0.5 +v 0.0264506 -0.0227868 -0.5 +v 0.028415 -0.0235332 0.5 +v 0.028415 -0.0235332 -0.5 +v 0.0304905 -0.0242814 0.5 +v 0.0304905 -0.0242814 -0.5 +v 0.0326872 -0.0250146 0.5 +v 0.0326872 -0.0250146 -0.5 +v 0.0350128 -0.0257258 0.5 +v 0.0350128 -0.0257258 -0.5 +v 0.0374672 -0.0264333 0.5 +v 0.0374672 -0.0264333 -0.5 +v 0.0400497 -0.0271566 0.5 +v 0.0400497 -0.0271566 -0.5 +v 0.0427704 -0.0278802 0.5 +v 0.0427704 -0.0278802 -0.5 +v 0.0456434 -0.0285739 0.5 +v 0.0456434 -0.0285739 -0.5 +v 0.0486731 -0.0292495 0.5 +v 0.0486731 -0.0292495 -0.5 +v 0.0518554 -0.0299566 0.5 +v 0.0518554 -0.0299566 -0.5 +v 0.0551966 -0.030697 0.5 +v 0.0551966 -0.030697 -0.5 +v 0.0587179 -0.0314085 0.5 +v 0.0587179 -0.0314085 -0.5 +v 0.062431 -0.032078 0.5 +v 0.062431 -0.032078 -0.5 +v 0.0663314 -0.0327743 0.5 +v 0.0663314 -0.0327743 -0.5 +v 0.0704248 -0.033514 0.5 +v 0.0704248 -0.033514 -0.5 +v 0.0747335 -0.0342256 0.5 +v 0.0747335 -0.0342256 -0.5 +v 0.0792714 -0.0348902 0.5 +v 0.0792714 -0.0348902 -0.5 +v 0.0840416 -0.0355492 0.5 +v 0.0840416 -0.0355492 -0.5 +v 0.089054 -0.0362103 0.5 +v 0.089054 -0.0362103 -0.5 +v 0.0943226 -0.0368627 0.5 +v 0.0943226 -0.0368627 -0.5 +v 0.0998603 -0.0375041 0.5 +v 0.0998603 -0.0375041 -0.5 +v 0.105679 -0.0381355 0.5 +v 0.105679 -0.0381355 -0.5 +v 0.111793 -0.0387575 0.5 +v 0.111793 -0.0387575 -0.5 +v 0.118218 -0.0393567 0.5 +v 0.118218 -0.0393567 -0.5 +v 0.124968 -0.0399429 0.5 +v 0.124968 -0.0399429 -0.5 +v 0.132055 -0.0405782 0.5 +v 0.132055 -0.0405782 -0.5 +v 0.1395 -0.0411771 0.5 +v 0.1395 -0.0411771 -0.5 +v 0.147326 -0.041699 0.5 +v 0.147326 -0.041699 -0.5 +v 0.15451 -0.0421969 0.5 +v 0.15451 -0.0421969 -0.5 +v 0.162054 -0.042698 0.5 +v 0.162054 -0.042698 -0.5 +v 0.16998 -0.0431596 0.5 +v 0.16998 -0.0431596 -0.5 +v 0.178305 -0.0435984 0.5 +v 0.178305 -0.0435984 -0.5 +v 0.187045 -0.0440696 0.5 +v 0.187045 -0.0440696 -0.5 +v 0.196223 -0.0445349 0.5 +v 0.196223 -0.0445349 -0.5 +v 0.205864 -0.0449725 0.5 +v 0.205864 -0.0449725 -0.5 +v 0.215985 -0.045448 0.5 +v 0.215985 -0.045448 -0.5 +v 0.226615 -0.0458797 0.5 +v 0.226615 -0.0458797 -0.5 +v 0.237778 -0.0463184 0.5 +v 0.237778 -0.0463184 -0.5 +v 0.249497 -0.0468156 0.5 +v 0.249497 -0.0468156 -0.5 +v 0.261804 -0.0472732 0.5 +v 0.261804 -0.0472732 -0.5 +v 0.274727 -0.0477637 0.5 +v 0.274727 -0.0477637 -0.5 +v 0.288294 -0.0483182 0.5 +v 0.288294 -0.0483182 -0.5 +v 0.302542 -0.0488257 0.5 +v 0.302542 -0.0488257 -0.5 +v 0.317502 -0.0493844 0.5 +v 0.317502 -0.0493844 -0.5 +v 0.33321 -0.0499788 0.5 +v 0.33321 -0.0499788 -0.5 +v 0.349702 -0.0506056 0.5 +v 0.349702 -0.0506056 -0.5 +v 0.367015 -0.0513872 0.5 +v 0.367015 -0.0513872 -0.5 +v 0.385192 -0.0522281 0.5 +v 0.385192 -0.0522281 -0.5 +v 0.404277 -0.0531254 0.5 +v 0.404277 -0.0531254 -0.5 +v 0.424316 -0.0540817 0.5 +v 0.424316 -0.0540817 -0.5 +v 0.445357 -0.0550979 0.5 +v 0.445357 -0.0550979 -0.5 +v 0.467451 -0.0560874 0.5 +v 0.467451 -0.0560874 -0.5 +v 0.490649 -0.0571824 0.5 +v 0.490649 -0.0571824 -0.5 +v 0.51501 -0.0582757 0.5 +v 0.51501 -0.0582757 -0.5 +v 0.540585 -0.0594903 0.5 +v 0.540585 -0.0594903 -0.5 +v 0.567439 -0.0607815 0.5 +v 0.567439 -0.0607815 -0.5 +v 0.595635 -0.0621304 0.5 +v 0.595635 -0.0621304 -0.5 +v 0.625242 -0.0635352 0.5 +v 0.625242 -0.0635352 -0.5 +v 0.649433 -0.0648334 0.5 +v 0.649433 -0.0648334 -0.5 +v 0.672415 -0.0660494 0.5 +v 0.672415 -0.0660494 -0.5 +v 0.694245 -0.0672674 0.5 +v 0.694245 -0.0672674 -0.5 +v 0.714979 -0.0684936 0.5 +v 0.714979 -0.0684936 -0.5 +v 0.734678 -0.0696472 0.5 +v 0.734678 -0.0696472 -0.5 +v 0.753392 -0.070724 0.5 +v 0.753392 -0.070724 -0.5 +v 0.771162 -0.0718742 0.5 +v 0.771162 -0.0718742 -0.5 +v 0.788046 -0.0729552 0.5 +v 0.788046 -0.0729552 -0.5 +v 0.804086 -0.0739668 0.5 +v 0.804086 -0.0739668 -0.5 +v 0.819316 -0.0750462 0.5 +v 0.819316 -0.0750462 -0.5 +v 0.833785 -0.076061 0.5 +v 0.833785 -0.076061 -0.5 +v 0.847532 -0.0770175 0.5 +v 0.847532 -0.0770175 -0.5 +v 0.86059 -0.0779215 0.5 +v 0.86059 -0.0779215 -0.5 +v 0.872998 -0.0787716 0.5 +v 0.872998 -0.0787716 -0.5 +v 0.884776 -0.079698 0.5 +v 0.884776 -0.079698 -0.5 +v 0.89597 -0.0805061 0.5 +v 0.89597 -0.0805061 -0.5 +v 0.906605 -0.0812554 0.5 +v 0.906605 -0.0812554 -0.5 +v 0.916704 -0.0820352 0.5 +v 0.916704 -0.0820352 -0.5 +v 0.926301 -0.0827494 0.5 +v 0.926301 -0.0827494 -0.5 +v 0.935409 -0.0835384 0.5 +v 0.935409 -0.0835384 -0.5 +v 0.944071 -0.0841575 0.5 +v 0.944071 -0.0841575 -0.5 +v 0.952294 -0.0848264 0.5 +v 0.952294 -0.0848264 -0.5 +v 0.960109 -0.0854166 0.5 +v 0.960109 -0.0854166 -0.5 +v 0.967527 -0.0860602 0.5 +v 0.967527 -0.0860602 -0.5 +v 0.97458 -0.0865997 0.5 +v 0.97458 -0.0865997 -0.5 +v 0.981277 -0.0871547 0.5 +v 0.981277 -0.0871547 -0.5 +v 0.987637 -0.0876912 0.5 +v 0.987637 -0.0876912 -0.5 +v 0.993684 -0.0881407 0.5 +v 0.993684 -0.0881407 -0.5 +# </points> + +# <faces count="520"> +g WALL10 +f 1 2 3 +f 3 4 1 +f 4 3 5 +f 5 6 4 +f 6 5 7 +f 7 8 6 +f 8 7 9 +f 9 10 8 +f 10 9 11 +f 11 12 10 +f 12 11 13 +f 13 14 12 +f 14 13 15 +f 15 16 14 +f 16 15 17 +f 17 18 16 +f 18 17 19 +f 19 20 18 +f 20 19 21 +f 21 22 20 +f 22 21 23 +f 23 24 22 +f 24 23 25 +f 25 26 24 +f 26 25 27 +f 27 28 26 +f 28 27 29 +f 29 30 28 +f 30 29 31 +f 31 32 30 +f 32 31 33 +f 33 34 32 +f 34 33 35 +f 35 36 34 +f 36 35 37 +f 37 38 36 +f 38 37 39 +f 39 40 38 +f 40 39 41 +f 41 42 40 +f 42 41 43 +f 43 44 42 +f 44 43 45 +f 45 46 44 +f 46 45 47 +f 47 48 46 +f 48 47 49 +f 49 50 48 +f 50 49 51 +f 51 52 50 +f 52 51 53 +f 53 54 52 +f 54 53 55 +f 55 56 54 +f 56 55 57 +f 57 58 56 +f 58 57 59 +f 59 60 58 +f 60 59 61 +f 61 62 60 +f 62 61 63 +f 63 64 62 +f 64 63 65 +f 65 66 64 +f 66 65 67 +f 67 68 66 +f 68 67 69 +f 69 70 68 +f 70 69 71 +f 71 72 70 +f 72 71 73 +f 73 74 72 +f 74 73 75 +f 75 76 74 +f 76 75 77 +f 77 78 76 +f 78 77 79 +f 79 80 78 +f 80 79 81 +f 81 82 80 +f 82 81 83 +f 83 84 82 +f 84 83 85 +f 85 86 84 +f 86 85 87 +f 87 88 86 +f 88 87 89 +f 89 90 88 +f 90 89 91 +f 91 92 90 +f 92 91 93 +f 93 94 92 +f 94 93 95 +f 95 96 94 +f 96 95 97 +f 97 98 96 +f 98 97 99 +f 99 100 98 +f 100 99 101 +f 101 102 100 +f 102 101 103 +f 103 104 102 +f 104 103 105 +f 105 106 104 +f 106 105 107 +f 107 108 106 +f 108 107 109 +f 109 110 108 +f 110 109 111 +f 111 112 110 +f 112 111 113 +f 113 114 112 +f 114 113 115 +f 115 116 114 +f 116 115 117 +f 117 118 116 +f 118 117 119 +f 119 120 118 +f 120 119 121 +f 121 122 120 +f 122 121 123 +f 123 124 122 +f 124 123 125 +f 125 126 124 +f 126 125 127 +f 127 128 126 +f 128 127 129 +f 129 130 128 +f 130 129 131 +f 131 132 130 +f 132 131 133 +f 133 134 132 +f 134 133 135 +f 135 136 134 +f 136 135 137 +f 137 138 136 +f 138 137 139 +f 139 140 138 +f 140 139 141 +f 141 142 140 +f 142 141 143 +f 143 144 142 +f 144 143 145 +f 145 146 144 +f 146 145 147 +f 147 148 146 +f 148 147 149 +f 149 150 148 +f 150 149 151 +f 151 152 150 +f 152 151 153 +f 153 154 152 +f 154 153 155 +f 155 156 154 +f 156 155 157 +f 157 158 156 +f 158 157 159 +f 159 160 158 +f 160 159 161 +f 161 162 160 +f 162 161 163 +f 163 164 162 +f 164 163 165 +f 165 166 164 +f 166 165 167 +f 167 168 166 +f 168 167 169 +f 169 170 168 +f 170 169 171 +f 171 172 170 +f 172 171 173 +f 173 174 172 +f 174 173 175 +f 175 176 174 +f 176 175 177 +f 177 178 176 +f 178 177 179 +f 179 180 178 +f 180 179 181 +f 181 182 180 +f 182 181 183 +f 183 184 182 +f 184 183 185 +f 185 186 184 +f 186 185 187 +f 187 188 186 +f 188 187 189 +f 189 190 188 +f 190 189 191 +f 191 192 190 +f 192 191 193 +f 193 194 192 +f 194 193 195 +f 195 196 194 +f 196 195 197 +f 197 198 196 +f 198 197 199 +f 199 200 198 +f 200 199 201 +f 201 202 200 +f 202 201 203 +f 203 204 202 +f 204 203 205 +f 205 206 204 +f 206 205 207 +f 207 208 206 +f 208 207 209 +f 209 210 208 +f 210 209 211 +f 211 212 210 +f 212 211 213 +f 213 214 212 +f 214 213 215 +f 215 216 214 +f 216 215 217 +f 217 218 216 +f 218 217 219 +f 219 220 218 +f 220 219 221 +f 221 222 220 +f 222 221 223 +f 223 224 222 +f 224 223 225 +f 225 226 224 +f 226 225 227 +f 227 228 226 +f 228 227 229 +f 229 230 228 +f 230 229 231 +f 231 232 230 +f 232 231 233 +f 233 234 232 +f 234 233 235 +f 235 236 234 +f 236 235 237 +f 237 238 236 +f 238 237 239 +f 239 240 238 +f 240 239 241 +f 241 242 240 +f 242 241 243 +f 243 244 242 +f 244 243 245 +f 245 246 244 +f 246 245 247 +f 247 248 246 +f 248 247 249 +f 249 250 248 +f 250 249 251 +f 251 252 250 +f 252 251 253 +f 253 254 252 +f 254 253 255 +f 255 256 254 +f 256 255 257 +f 257 258 256 +f 258 257 259 +f 259 260 258 +f 261 262 2 +f 2 1 261 +f 260 259 263 +f 263 264 260 +f 264 263 265 +f 265 266 264 +f 266 265 267 +f 267 268 266 +f 268 267 269 +f 269 270 268 +f 270 269 271 +f 271 272 270 +f 272 271 273 +f 273 274 272 +f 274 273 275 +f 275 276 274 +f 276 275 277 +f 277 278 276 +f 278 277 279 +f 279 280 278 +f 280 279 281 +f 281 282 280 +f 282 281 283 +f 283 284 282 +f 284 283 285 +f 285 286 284 +f 286 285 287 +f 287 288 286 +f 288 287 289 +f 289 290 288 +f 290 289 291 +f 291 292 290 +f 292 291 293 +f 293 294 292 +f 294 293 295 +f 295 296 294 +f 296 295 297 +f 297 298 296 +f 298 297 299 +f 299 300 298 +f 300 299 301 +f 301 302 300 +f 302 301 303 +f 303 304 302 +f 304 303 305 +f 305 306 304 +f 306 305 307 +f 307 308 306 +f 308 307 309 +f 309 310 308 +f 310 309 311 +f 311 312 310 +f 312 311 313 +f 313 314 312 +f 314 313 315 +f 315 316 314 +f 316 315 317 +f 317 318 316 +f 318 317 319 +f 319 320 318 +f 320 319 321 +f 321 322 320 +f 322 321 323 +f 323 324 322 +f 324 323 325 +f 325 326 324 +f 326 325 327 +f 327 328 326 +f 328 327 329 +f 329 330 328 +f 330 329 331 +f 331 332 330 +f 332 331 333 +f 333 334 332 +f 334 333 335 +f 335 336 334 +f 336 335 337 +f 337 338 336 +f 338 337 339 +f 339 340 338 +f 340 339 341 +f 341 342 340 +f 342 341 343 +f 343 344 342 +f 344 343 345 +f 345 346 344 +f 346 345 347 +f 347 348 346 +f 348 347 349 +f 349 350 348 +f 350 349 351 +f 351 352 350 +f 352 351 353 +f 353 354 352 +f 354 353 355 +f 355 356 354 +f 356 355 357 +f 357 358 356 +f 358 357 359 +f 359 360 358 +f 360 359 361 +f 361 362 360 +f 362 361 363 +f 363 364 362 +f 364 363 365 +f 365 366 364 +f 366 365 367 +f 367 368 366 +f 368 367 369 +f 369 370 368 +f 370 369 371 +f 371 372 370 +f 372 371 373 +f 373 374 372 +f 374 373 375 +f 375 376 374 +f 376 375 377 +f 377 378 376 +f 378 377 379 +f 379 380 378 +f 380 379 381 +f 381 382 380 +f 382 381 383 +f 383 384 382 +f 384 383 385 +f 385 386 384 +f 386 385 387 +f 387 388 386 +f 388 387 389 +f 389 390 388 +f 390 389 391 +f 391 392 390 +f 392 391 393 +f 393 394 392 +f 394 393 395 +f 395 396 394 +f 396 395 397 +f 397 398 396 +f 398 397 399 +f 399 400 398 +f 400 399 401 +f 401 402 400 +f 402 401 403 +f 403 404 402 +f 404 403 405 +f 405 406 404 +f 406 405 407 +f 407 408 406 +f 408 407 409 +f 409 410 408 +f 410 409 411 +f 411 412 410 +f 412 411 413 +f 413 414 412 +f 414 413 415 +f 415 416 414 +f 416 415 417 +f 417 418 416 +f 418 417 419 +f 419 420 418 +f 420 419 421 +f 421 422 420 +f 422 421 423 +f 423 424 422 +f 424 423 425 +f 425 426 424 +f 426 425 427 +f 427 428 426 +f 428 427 429 +f 429 430 428 +f 430 429 431 +f 431 432 430 +f 432 431 433 +f 433 434 432 +f 434 433 435 +f 435 436 434 +f 436 435 437 +f 437 438 436 +f 438 437 439 +f 439 440 438 +f 440 439 441 +f 441 442 440 +f 442 441 443 +f 443 444 442 +f 444 443 445 +f 445 446 444 +f 446 445 447 +f 447 448 446 +f 448 447 449 +f 449 450 448 +f 450 449 451 +f 451 452 450 +f 452 451 453 +f 453 454 452 +f 454 453 455 +f 455 456 454 +f 456 455 457 +f 457 458 456 +f 458 457 459 +f 459 460 458 +f 460 459 461 +f 461 462 460 +f 462 461 463 +f 463 464 462 +f 464 463 465 +f 465 466 464 +f 466 465 467 +f 467 468 466 +f 468 467 469 +f 469 470 468 +f 470 469 471 +f 471 472 470 +f 472 471 473 +f 473 474 472 +f 474 473 475 +f 475 476 474 +f 476 475 477 +f 477 478 476 +f 478 477 479 +f 479 480 478 +f 480 479 481 +f 481 482 480 +f 482 481 483 +f 483 484 482 +f 484 483 485 +f 485 486 484 +f 486 485 487 +f 487 488 486 +f 488 487 489 +f 489 490 488 +f 490 489 491 +f 491 492 490 +f 492 491 493 +f 493 494 492 +f 494 493 495 +f 495 496 494 +f 496 495 497 +f 497 498 496 +f 498 497 499 +f 499 500 498 +f 500 499 501 +f 501 502 500 +f 502 501 503 +f 503 504 502 +f 504 503 505 +f 505 506 504 +f 506 505 507 +f 507 508 506 +f 508 507 509 +f 509 510 508 +f 510 509 511 +f 511 512 510 +f 512 511 513 +f 513 514 512 +f 514 513 515 +f 515 516 514 +f 516 515 517 +f 517 518 516 +f 518 517 519 +f 519 520 518 +f 520 519 262 +f 262 261 520 +# </faces> diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict new file mode 100644 index 00000000000..f539f6c9282 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/blockMeshDict @@ -0,0 +1,89 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (-0.5 -0.5 -0.1) + ( 2.0 -0.5 -0.1) + ( 2.0 0.5 -0.1) + (-0.5 0.5 -0.1) + (-0.5 -0.5 0.1) + ( 2.0 -0.5 0.1) + ( 2.0 0.5 0.1) + (-0.5 0.5 0.1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (12 7 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + topAndBottom + { + type patch; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } + + inlet + { + type patch; + faces + ( + (0 4 7 3) + ); + } + + outlet + { + type patch; + faces + ( + (2 6 5 1) + ); + } + + symFront + { + type symmetryPlane; + faces + ( + (4 5 6 7) + ); + } + + symBack + { + type symmetryPlane; + faces + ( + (0 3 2 1) + ); + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict new file mode 100644 index 00000000000..28130318d74 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/controlDict @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application snappyHexMesh; + +startFrom latestTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl runTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat binary; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict new file mode 100644 index 00000000000..f70b376fabb --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/decomposeParDict @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 3; + +method simple; + +simpleCoeffs +{ + n (1 3 1); + delta 0.001; +} + +hierarchicalCoeffs +{ + n (3 2 1); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile "cellDecomposition"; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes new file mode 100644 index 00000000000..52f9f1efc28 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSchemes @@ -0,0 +1,56 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss upwind; + div(phi,epsilon) Gauss upwind; + div(phi,R) Gauss upwind; + div(R) Gauss linear; + div(phid,p) Gauss limitedLinear 1; + div(phi,K) Gauss limitedLinear 1; + div(phi,e) Gauss limitedLinear 1; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear limited corrected 0.5; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution new file mode 100644 index 00000000000..04a2dd4fdbe --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/fvSolution @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-12; + relTol 0; + } + + rho + { + solver PCG; + preconditioner DIC; + tolerance 1e-08; + relTol 0; + } + + "(U|e|k|epsilon|R)" + { + $p; + tolerance 1e-08; + relTol 0; + } +} + +PISO +{ + nCorrectors 2; + nNonOrthogonalCorrectors 2; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict new file mode 100644 index 00000000000..5ad22a55c07 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/aeroFoil_snappyHexMesh/system/snappyHexMeshDict @@ -0,0 +1,300 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object snappyHexMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Which of the steps to run +castellatedMesh true; +snap true; +addLayers true; + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces are used +// - to specify refinement for any mesh cell intersecting it +// - to specify refinement for any mesh cell inside/outside/near +// - to 'snap' the mesh boundary to the surface +geometry +{ + wing_5degrees.obj + { + type triSurfaceMesh; + name wing; + } + + refinementBox + { + type searchableBox; + min (-1 -1 -1); + max ( 5 1 1); + } +}; + +// Settings for the castellatedMesh generation. +castellatedMeshControls +{ + + // Refinement parameters + // ~~~~~~~~~~~~~~~~~~~~~ + + // If local number of cells is >= maxLocalCells on any processor + // switches from from refinement followed by balancing + // (current method) to (weighted) balancing before refinement. + maxLocalCells 100000; + + // Overall cell limit (approximately). Refinement will stop immediately + // upon reaching this number so a refinement level might not complete. + // Note that this is the number of cells before removing the part which + // is not 'visible' from the keepPoint. The final number of cells might + // actually be a lot less. + maxGlobalCells 2000000; + + // The surface refinement loop might spend lots of iterations refining just + // a few cells. This setting will cause refinement to stop if <= + // minimumRefine are selected for refinement. Note: it will at least do one + // iteration (unless the number of cells to refine is 0) + minRefinementCells 100; + + // Number of buffer layers between different levels. + // 1 means normal 2:1 refinement restriction, larger means slower + // refinement. + nCellsBetweenLevels 6; + + // Explicit feature edge refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies a level for any cell intersected by its edges. + // This is a featureEdgeMesh, read from constant/triSurface for now. + features (); + + // Surface based refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies two levels for every surface. The first is the minimum level, + // every cell intersecting a surface gets refined up to the minimum level. + // The second level is the maximum level. Cells that 'see' multiple + // intersections where the intersections make an + // angle > resolveFeatureAngle get refined up to the maximum level. + + refinementSurfaces + { + wing + { + // Surface-wise min and max refinement level + level (5 5); + } + } + + // Resolve sharp angles on fridges + resolveFeatureAngle 30; + + // Region-wise refinement + // ~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies refinement level for cells in relation to a surface. One of + // three modes + // - distance. 'levels' specifies per distance to the surface the + // wanted refinement level. The distances need to be specified in + // descending order. + // - inside. 'levels' is only one entry and only the level is used. All + // cells inside the surface get refined up to the level. The surface + // needs to be closed for this to be possible. + // - outside. Same but cells outside. + + refinementRegions + { + refinementBox + { + mode inside; + levels ((1e15 2)); + } + } + + // Mesh selection + // ~~~~~~~~~~~~~~ + + // After refinement patches get added for all refinementSurfaces and + // all cells intersecting the surfaces get put into these patches. The + // section reachable from the locationInMesh is kept. + // NOTE: This point should never be on a face, always inside a cell, even + // after refinement. + locationInMesh (0.5 0.22 0); + + // Whether any faceZones (as specified in the refinementSurfaces) + // are only on the boundary of corresponding cellZones or also allow + // free-standing zone faces. Not used if there are no faceZones. + allowFreeStandingZoneFaces true; +} + +// Settings for the snapping. +snapControls +{ + //- Number of patch smoothing iterations before finding correspondence + // to surface + nSmoothPatch 3; + + //- Relative distance for points to be attracted by surface feature point + // or edge. True distance is this factor times local + // maximum edge length. + tolerance 4.0; + + //- Number of mesh displacement relaxation iterations. + nSolveIter 30; + + //- Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; +} + +// Settings for the layer addition. +addLayersControls +{ + // Are the thickness parameters below relative to the undistorted + // size of the refined cell outside layer (true) or absolute sizes (false). + relativeSizes true; + + // Per final patch (so not geometry!) the layer information + layers + { + wing + { + nSurfaceLayers 3; + } + } + + // Expansion factor for layer mesh + expansionRatio 1.3; + + // Wanted thickness of final added cell layer. If multiple layers + // is the thickness of the layer furthest away from the wall. + // Relative to undistorted size of cell outside layer. + // See relativeSizes parameter. + finalLayerThickness 0.7; + + // Minimum thickness of cell layer. If for any reason layer + // cannot be above minThickness do not add layer. + // Relative to undistorted size of cell outside layer. + // See relativeSizes parameter. + minThickness 0.25; + + // If points get not extruded do nGrow layers of connected faces that are + // also not grown. This helps convergence of the layer addition process + // close to features. + // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x) + nGrow 0; + + // Advanced settings + + // When not to extrude surface. 0 is flat surface, 90 is when two faces + // are perpendicular + featureAngle 60; + + // Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; + + // Number of smoothing iterations of surface normals + nSmoothSurfaceNormals 1; + + // Number of smoothing iterations of interior mesh movement direction + nSmoothNormals 3; + + // Smooth layer thickness over surface patches + nSmoothThickness 10; + + // Stop layer growth on highly warped cells + maxFaceThicknessRatio 0.5; + + // Reduce layer growth where ratio thickness to medial + // distance is large + maxThicknessToMedialRatio 0.3; + + // Angle used to pick up medial axis points + // Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x. + minMedianAxisAngle 90; + + // Create buffer region for new layer terminations + nBufferCellsNoExtrude 0; + + // Overall max number of layer addition iterations. The mesher will exit + // if it reaches this number of iterations; possibly with an illegal + // mesh. + nLayerIter 50; +} + +// Generic mesh quality settings. At any undoable phase these determine +// where to undo. +meshQualityControls +{ + //- Maximum non-orthogonality allowed. Set to 180 to disable. + maxNonOrtho 65; + + //- Max skewness allowed. Set to <0 to disable. + maxBoundarySkewness 20; + maxInternalSkewness 4; + + //- Max concaveness allowed. Is angle (in degrees) below which concavity + // is allowed. 0 is straight face, <0 would be convex face. + // Set to 180 to disable. + maxConcave 80; + + //- Minimum pyramid volume. Is absolute volume of cell pyramid. + // Set to a sensible fraction of the smallest cell volume expected. + // Set to very negative number (e.g. -1E30) to disable. + minVol 1e-13; + + //- Minimum quality of the tet formed by the face-centre + // and variable base point minimum decomposition triangles and + // the cell centre. Set to very negative number (e.g. -1E30) to + // disable. + // <0 = inside out tet, + // 0 = flat tet + // 1 = regular tet + minTetQuality 1e-30; + + //- Minimum face area. Set to <0 to disable. + minArea -1; + + //- Minimum face twist. Set to <-1 to disable. dot product of face normal + // and face centre triangles normal + minTwist 0.05; + + //- Minimum normalised cell determinant + // 1 = hex, <= 0 = folded or flattened illegal cell + minDeterminant 0.001; + + //- minFaceWeight (0 -> 0.5) + minFaceWeight 0.05; + + //- minVolRatio (0 -> 1) + minVolRatio 0.01; + + //must be >0 for Fluent compatibility + minTriangleTwist -1; + + // Advanced + + //- Number of error distribution iterations + nSmoothScale 4; + //- Amount to scale back displacement at error points + errorReduction 0.75; +} + +// Advanced + +// Merge tolerance. Is fraction of overall bounding box of initial mesh. +// Note: the write tolerance needs to be higher than this. +mergeTolerance 1e-6; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U new file mode 100644 index 00000000000..39534ce7d67 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/U @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform $flowVelocity; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + walls + { + type movingWallVelocity; + value uniform (0 0 0); + } + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type zeroGradient; //calculated; + value $internalField; + } + + #include "include/frontBackTopBottomfreePatches" +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon new file mode 100644 index 00000000000..73ef242b33e --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/epsilon @@ -0,0 +1,50 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object epsilon; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 2 -3 0 0 0 0]; + +internalField uniform $turbulentEpsilon; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + wall + { + type epsilonWallFunction; + value $internalField; + } + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + #include "include/frontBackTopBottomfreePatches" +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches new file mode 100644 index 00000000000..04f861bd8e0 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/frontBackTopBottomfreePatches @@ -0,0 +1,14 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +topAndBottom +{ + type slip; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions new file mode 100644 index 00000000000..f9af913104d --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/include/initialConditions @@ -0,0 +1,16 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +flowVelocity (10 0 0); +pressure 0; +turbulentKE 0.375; +turbulentOmega 3.6; +turbulentEpsilon 0.12; +#inputMode merge + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k new file mode 100644 index 00000000000..6f9c85a404b --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/k @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [ 0 2 -2 0 0 0 0 ]; + +internalField uniform $turbulentKE; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + wall + { + type kqRWallFunction; + value uniform 0; + } + + inlet + { + type turbulentIntensityKineticEnergyInlet; + intensity 0.05; // 5% turbulent intensity + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + #include "include/frontBackTopBottomfreePatches" +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda new file mode 100644 index 00000000000..2787701e9bd --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nuTilda @@ -0,0 +1,32 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: 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 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut new file mode 100644 index 00000000000..e6cf3ba42de --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/nut @@ -0,0 +1,40 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: 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 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + wall + { + type nutkWallFunction; + value uniform 0; + } + + #include "include/frontBackTopBottomfreePatches" + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega new file mode 100644 index 00000000000..6d5097ae582 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/omega @@ -0,0 +1,50 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object omega; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "include/initialConditions" + +dimensions [0 0 -1 0 0 0 0]; + +internalField uniform $turbulentOmega; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + wall + { + type omegaWallFunction; + value $internalField; + } + + inlet + { + type fixedValue; + value $internalField; + } + + outlet + { + type inletOutlet; + inletValue $internalField; + value $internalField; + } + + #include "include/frontBackTopBottomfreePatches" +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p new file mode 100644 index 00000000000..c5b82e301cc --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/p @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +#include "include/initialConditions" + +internalField uniform $pressure; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + wall + { + type zeroGradient; + } + + inlet + { + type zeroGradient; + } + + outlet + { + type fixedValue; + inletValue $internalField; + value $internalField; + } + + #include "include/frontBackTopBottomfreePatches" +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement new file mode 100644 index 00000000000..74fc54dc74b --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/pointDisplacement @@ -0,0 +1,36 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + "(walls|overset)" + { + type uniformFixedValue; + uniformValue (0 0 0); + } + + ".*" + { + type uniformFixedValue; + uniformValue (0 0 0); + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID new file mode 100644 index 00000000000..03c62b53858 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/0.org/zoneID @@ -0,0 +1,32 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #include "${WM_PROJECT_DIR}/etc/caseDicts/setConstraintTypes" + + ".*" + { + type zeroGradient; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean new file mode 100755 index 00000000000..5d96ca404a3 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allclean @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +cleanCase +rm -f constant/polyMesh/boundary +rm -f constant/polyMesh/zoneID +rm -f constant/cellInterpolationWeight + +rm -rf 0 + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun new file mode 100755 index 00000000000..35c77b01877 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun @@ -0,0 +1,11 @@ +#!/bin/sh + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Serial +#runApplication $(getApplication) + +# Parallel +runApplication decomposePar -cellDist +runParallel $application diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre new file mode 100755 index 00000000000..d45f7bfe12e --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/Allrun.pre @@ -0,0 +1,15 @@ +#!/bin/sh + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +runApplication extrudeMesh +runApplication createPatch -overwrite +mergeMeshes . ../aeroFoil_overset -overwrite +runApplication topoSet + +# Copy standard fields +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties new file mode 100644 index 00000000000..a4d5a1a869f --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/RASProperties @@ -0,0 +1,23 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object RASProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +RASModel kOmegaSST; + +turbulence on; + +printCoeffs on; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict new file mode 100644 index 00000000000..9f766ac2725 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/dynamicMeshDict @@ -0,0 +1,33 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object dynamicMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +motionSolverLibs ( "libfvMotionSolvers.so" ); + +solver displacementLaplacian; + +displacementLaplacianCoeffs +{ + diffusivity uniform 1; +} + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +// layerRelax 0.3; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties new file mode 100644 index 00000000000..312de2197d3 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/transportProperties @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +DT DT [ 0 2 -1 0 0 0 0 ] 1; //4e-05; + +transportModel Newtonian; + +nu nu [ 0 2 -1 0 0 0 0 ] 1e-05; + +CrossPowerLawCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + m m [ 0 0 1 0 0 0 0 ] 1; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +BirdCarreauCoeffs +{ + nu0 nu0 [ 0 2 -1 0 0 0 0 ] 1e-06; + nuInf nuInf [ 0 2 -1 0 0 0 0 ] 1e-06; + k k [ 0 0 1 0 0 0 0 ] 0; + n n [ 0 0 0 0 0 0 0 ] 1; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj new file mode 100644 index 00000000000..4be2aac5f2f --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/triSurface/wing_5degrees.obj @@ -0,0 +1,1054 @@ +# Wavefront OBJ file written 2010-05-13T09:12:43 +o wing_5degrees + +# points : 520 +# faces : 520 +# zones : 1 +# 0 WALL10 (nFaces: 520) + +# <points count="520"> +v 1.00488 -0.0890722 -0.5 +v 1.00488 -0.0890722 0.5 +v 0.999453 -0.0870827 0.5 +v 0.999453 -0.0870827 -0.5 +v 0.993747 -0.0849908 0.5 +v 0.993747 -0.0849908 -0.5 +v 0.98776 -0.0827959 0.5 +v 0.98776 -0.0827959 -0.5 +v 0.981475 -0.0804834 0.5 +v 0.981475 -0.0804834 -0.5 +v 0.974878 -0.0780483 0.5 +v 0.974878 -0.0780483 -0.5 +v 0.967936 -0.075535 0.5 +v 0.967936 -0.075535 -0.5 +v 0.960671 -0.0728297 0.5 +v 0.960671 -0.0728297 -0.5 +v 0.952986 -0.070149 0.5 +v 0.952986 -0.070149 -0.5 +v 0.944915 -0.067332 0.5 +v 0.944915 -0.067332 -0.5 +v 0.936442 -0.064377 0.5 +v 0.936442 -0.064377 -0.5 +v 0.927543 -0.0612777 0.5 +v 0.927543 -0.0612777 -0.5 +v 0.918171 -0.0581074 0.5 +v 0.918171 -0.0581074 -0.5 +v 0.908345 -0.0547308 0.5 +v 0.908345 -0.0547308 -0.5 +v 0.897978 -0.0513371 0.5 +v 0.897978 -0.0513371 -0.5 +v 0.887113 -0.0477115 0.5 +v 0.887113 -0.0477115 -0.5 +v 0.875671 -0.0440076 0.5 +v 0.875671 -0.0440076 -0.5 +v 0.863634 -0.0401898 0.5 +v 0.863634 -0.0401898 -0.5 +v 0.850988 -0.0362043 0.5 +v 0.850988 -0.0362043 -0.5 +v 0.837677 -0.0321259 0.5 +v 0.837677 -0.0321259 -0.5 +v 0.8237 -0.0278406 0.5 +v 0.8237 -0.0278406 -0.5 +v 0.808997 -0.0234314 0.5 +v 0.808997 -0.0234314 -0.5 +v 0.793536 -0.0188824 0.5 +v 0.793536 -0.0188824 -0.5 +v 0.777248 -0.0142896 0.5 +v 0.777248 -0.0142896 -0.5 +v 0.760144 -0.00947585 0.5 +v 0.760144 -0.00947585 -0.5 +v 0.742148 -0.0045544 0.5 +v 0.742148 -0.0045544 -0.5 +v 0.723207 0.000449948 0.5 +v 0.723207 0.000449948 -0.5 +v 0.703296 0.00561154 0.5 +v 0.703296 0.00561154 -0.5 +v 0.682345 0.010854 0.5 +v 0.682345 0.010854 -0.5 +v 0.660295 0.0161554 0.5 +v 0.660295 0.0161554 -0.5 +v 0.637103 0.0215548 0.5 +v 0.637103 0.0215548 -0.5 +v 0.606829 0.0282606 0.5 +v 0.606829 0.0282606 -0.5 +v 0.578018 0.0343978 0.5 +v 0.578018 0.0343978 -0.5 +v 0.550557 0.0397874 0.5 +v 0.550557 0.0397874 -0.5 +v 0.524436 0.0447356 0.5 +v 0.524436 0.0447356 -0.5 +v 0.499549 0.0490421 0.5 +v 0.499549 0.0490421 -0.5 +v 0.475869 0.05291 0.5 +v 0.475869 0.05291 -0.5 +v 0.45334 0.0563729 0.5 +v 0.45334 0.0563729 -0.5 +v 0.431911 0.059484 0.5 +v 0.431911 0.059484 -0.5 +v 0.411518 0.0621876 0.5 +v 0.411518 0.0621876 -0.5 +v 0.392118 0.0645445 0.5 +v 0.392118 0.0645445 -0.5 +v 0.373644 0.0664046 0.5 +v 0.373644 0.0664046 -0.5 +v 0.356081 0.0680196 0.5 +v 0.356081 0.0680196 -0.5 +v 0.339375 0.0692961 0.5 +v 0.339375 0.0692961 -0.5 +v 0.323487 0.0702815 0.5 +v 0.323487 0.0702815 -0.5 +v 0.308383 0.0710035 0.5 +v 0.308383 0.0710035 -0.5 +v 0.294024 0.0714698 0.5 +v 0.294024 0.0714698 -0.5 +v 0.28038 0.0717809 0.5 +v 0.28038 0.0717809 -0.5 +v 0.267416 0.0719191 0.5 +v 0.267416 0.0719191 -0.5 +v 0.255099 0.0718222 0.5 +v 0.255099 0.0718222 -0.5 +v 0.243399 0.0716511 0.5 +v 0.243399 0.0716511 -0.5 +v 0.232288 0.0713208 0.5 +v 0.232288 0.0713208 -0.5 +v 0.221735 0.0709249 0.5 +v 0.221735 0.0709249 -0.5 +v 0.211715 0.0704338 0.5 +v 0.211715 0.0704338 -0.5 +v 0.202202 0.0698513 0.5 +v 0.202202 0.0698513 -0.5 +v 0.19317 0.0692271 0.5 +v 0.19317 0.0692271 -0.5 +v 0.184599 0.0685108 0.5 +v 0.184599 0.0685108 -0.5 +v 0.176464 0.0677409 0.5 +v 0.176464 0.0677409 -0.5 +v 0.168741 0.0669472 0.5 +v 0.168741 0.0669472 -0.5 +v 0.161418 0.0660755 0.5 +v 0.161418 0.0660755 -0.5 +v 0.154469 0.0651852 0.5 +v 0.154469 0.0651852 -0.5 +v 0.145493 0.0640314 0.5 +v 0.145493 0.0640314 -0.5 +v 0.136995 0.0627463 0.5 +v 0.136995 0.0627463 -0.5 +v 0.128932 0.0614383 0.5 +v 0.128932 0.0614383 -0.5 +v 0.121282 0.0601525 0.5 +v 0.121282 0.0601525 -0.5 +v 0.114049 0.0587416 0.5 +v 0.114049 0.0587416 -0.5 +v 0.107186 0.0573482 0.5 +v 0.107186 0.0573482 -0.5 +v 0.100675 0.0559871 0.5 +v 0.100675 0.0559871 -0.5 +v 0.0945147 0.0545794 0.5 +v 0.0945147 0.0545794 -0.5 +v 0.0886858 0.0531426 0.5 +v 0.0886858 0.0531426 -0.5 +v 0.0831659 0.0517083 0.5 +v 0.0831659 0.0517083 -0.5 +v 0.0779342 0.0503006 0.5 +v 0.0779342 0.0503006 -0.5 +v 0.072975 0.0489224 0.5 +v 0.072975 0.0489224 -0.5 +v 0.0682798 0.0475559 0.5 +v 0.0682798 0.0475559 -0.5 +v 0.0638499 0.0461601 0.5 +v 0.0638499 0.0461601 -0.5 +v 0.0596656 0.0447577 0.5 +v 0.0596656 0.0447577 -0.5 +v 0.055694 0.0434126 0.5 +v 0.055694 0.0434126 -0.5 +v 0.0519364 0.0420932 0.5 +v 0.0519364 0.0420932 -0.5 +v 0.0484053 0.0407363 0.5 +v 0.0484053 0.0407363 -0.5 +v 0.0450779 0.0393756 0.5 +v 0.0450779 0.0393756 -0.5 +v 0.0419215 0.0380722 0.5 +v 0.0419215 0.0380722 -0.5 +v 0.0389288 0.0368211 0.5 +v 0.0389288 0.0368211 -0.5 +v 0.036102 0.0355928 0.5 +v 0.036102 0.0355928 -0.5 +v 0.0334425 0.034368 0.5 +v 0.0334425 0.034368 -0.5 +v 0.0309496 0.0331356 0.5 +v 0.0309496 0.0331356 -0.5 +v 0.0286117 0.0319047 0.5 +v 0.0286117 0.0319047 -0.5 +v 0.0264077 0.0307022 0.5 +v 0.0264077 0.0307022 -0.5 +v 0.0243248 0.02954 0.5 +v 0.0243248 0.02954 -0.5 +v 0.0223665 0.0284014 0.5 +v 0.0223665 0.0284014 -0.5 +v 0.0205353 0.0272716 0.5 +v 0.0205353 0.0272716 -0.5 +v 0.0188204 0.0261581 0.5 +v 0.0188204 0.0261581 -0.5 +v 0.0172057 0.0250781 0.5 +v 0.0172057 0.0250781 -0.5 +v 0.015681 0.0240389 0.5 +v 0.015681 0.0240389 -0.5 +v 0.0142472 0.0230307 0.5 +v 0.0142472 0.0230307 -0.5 +v 0.0129051 0.0220434 0.5 +v 0.0129051 0.0220434 -0.5 +v 0.0116567 0.0210699 0.5 +v 0.0116567 0.0210699 -0.5 +v 0.0105044 0.0201047 0.5 +v 0.0105044 0.0201047 -0.5 +v 0.00944864 0.0191444 0.5 +v 0.00944864 0.0191444 -0.5 +v 0.00847997 0.0181956 0.5 +v 0.00847997 0.0181956 -0.5 +v 0.00758214 0.0172702 0.5 +v 0.00758214 0.0172702 -0.5 +v 0.00674204 0.0163779 0.5 +v 0.00674204 0.0163779 -0.5 +v 0.00595671 0.0155186 0.5 +v 0.00595671 0.0155186 -0.5 +v 0.00523198 0.0146848 0.5 +v 0.00523198 0.0146848 -0.5 +v 0.00457157 0.0138701 0.5 +v 0.00457157 0.0138701 -0.5 +v 0.00397503 0.0130721 0.5 +v 0.00397503 0.0130721 -0.5 +v 0.00343506 0.0122936 0.5 +v 0.00343506 0.0122936 -0.5 +v 0.0029443 0.0115379 0.5 +v 0.0029443 0.0115379 -0.5 +v 0.0024965 0.010807 0.5 +v 0.0024965 0.010807 -0.5 +v 0.00209053 0.0101012 0.5 +v 0.00209053 0.0101012 -0.5 +v 0.00172938 0.00941821 0.5 +v 0.00172938 0.00941821 -0.5 +v 0.00141481 0.00875662 0.5 +v 0.00141481 0.00875662 -0.5 +v 0.00114703 0.00811509 0.5 +v 0.00114703 0.00811509 -0.5 +v 0.000922634 0.00749375 0.5 +v 0.000922634 0.00749375 -0.5 +v 0.00073432 0.00689421 0.5 +v 0.00073432 0.00689421 -0.5 +v 0.000575606 0.00631745 0.5 +v 0.000575606 0.00631745 -0.5 +v 0.000441178 0.00576428 0.5 +v 0.000441178 0.00576428 -0.5 +v 0.000326628 0.00523494 0.5 +v 0.000326628 0.00523494 -0.5 +v 0.000229331 0.00472926 0.5 +v 0.000229331 0.00472926 -0.5 +v 0.000147968 0.00424663 0.5 +v 0.000147968 0.00424663 -0.5 +v 8.13071e-05 0.00378656 0.5 +v 8.13071e-05 0.00378656 -0.5 +v 2.81186e-05 0.00334838 0.5 +v 2.81186e-05 0.00334838 -0.5 +v -1.28053e-05 0.00293132 0.5 +v -1.28053e-05 0.00293132 -0.5 +v -4.26138e-05 0.00253464 0.5 +v -4.26138e-05 0.00253464 -0.5 +v -6.24104e-05 0.00215753 0.5 +v -6.24104e-05 0.00215753 -0.5 +v -7.32354e-05 0.00179922 0.5 +v -7.32354e-05 0.00179922 -0.5 +v -7.6066e-05 0.00145891 0.5 +v -7.6066e-05 0.00145891 -0.5 +v -7.18149e-05 0.00113574 0.5 +v -7.18149e-05 0.00113574 -0.5 +v -6.13265e-05 0.000828962 0.5 +v -6.13265e-05 0.000828962 -0.5 +v -4.5388e-05 0.000537894 0.5 +v -4.5388e-05 0.000537894 -0.5 +v -2.47174e-05 0.000261729 0.5 +v -2.47174e-05 0.000261729 -0.5 +v 0.999428 -0.0886333 -0.5 +v 0.999428 -0.0886333 0.5 +v 0 0 0.5 +v 0 0 -0.5 +v 3.07731e-05 -0.000269468 0.5 +v 3.07731e-05 -0.000269468 -0.5 +v 6.87839e-05 -0.000551758 0.5 +v 6.87839e-05 -0.000551758 -0.5 +v 0.00011487 -0.000847395 0.5 +v 0.00011487 -0.000847395 -0.5 +v 0.000169958 -0.00115699 0.5 +v 0.000169958 -0.00115699 -0.5 +v 0.000235006 -0.00148084 0.5 +v 0.000235006 -0.00148084 -0.5 +v 0.000311085 -0.00181947 0.5 +v 0.000311085 -0.00181947 -0.5 +v 0.000399343 -0.00217329 0.5 +v 0.000399343 -0.00217329 -0.5 +v 0.000501006 -0.00254265 0.5 +v 0.000501006 -0.00254265 -0.5 +v 0.000617405 -0.00292793 0.5 +v 0.000617405 -0.00292793 -0.5 +v 0.000749918 -0.00332928 0.5 +v 0.000749918 -0.00332928 -0.5 +v 0.000900098 -0.00374706 0.5 +v 0.000900098 -0.00374706 -0.5 +v 0.00106951 -0.00418123 0.5 +v 0.00106951 -0.00418123 -0.5 +v 0.00125981 -0.00463173 0.5 +v 0.00125981 -0.00463173 -0.5 +v 0.00147278 -0.00509836 0.5 +v 0.00147278 -0.00509836 -0.5 +v 0.00171023 -0.00558073 0.5 +v 0.00171023 -0.00558073 -0.5 +v 0.0019741 -0.00607866 0.5 +v 0.0019741 -0.00607866 -0.5 +v 0.00226657 -0.00659235 0.5 +v 0.00226657 -0.00659235 -0.5 +v 0.00258985 -0.00712192 0.5 +v 0.00258985 -0.00712192 -0.5 +v 0.00294625 -0.00766749 0.5 +v 0.00294625 -0.00766749 -0.5 +v 0.0033381 -0.00822888 0.5 +v 0.0033381 -0.00822888 -0.5 +v 0.00376858 -0.00880495 0.5 +v 0.00376858 -0.00880495 -0.5 +v 0.00424144 -0.00939356 0.5 +v 0.00424144 -0.00939356 -0.5 +v 0.0047608 -0.00999197 0.5 +v 0.0047608 -0.00999197 -0.5 +v 0.00533108 -0.0105969 0.5 +v 0.00533108 -0.0105969 -0.5 +v 0.00595465 -0.0112076 0.5 +v 0.00595465 -0.0112076 -0.5 +v 0.00663108 -0.0118268 0.5 +v 0.00663108 -0.0118268 -0.5 +v 0.00735864 -0.0124589 0.5 +v 0.00735864 -0.0124589 -0.5 +v 0.00813479 -0.0131082 0.5 +v 0.00813479 -0.0131082 -0.5 +v 0.00896315 -0.0137726 0.5 +v 0.00896315 -0.0137726 -0.5 +v 0.00985143 -0.0144449 0.5 +v 0.00985143 -0.0144449 -0.5 +v 0.0108089 -0.0151156 0.5 +v 0.0108089 -0.0151156 -0.5 +v 0.0118417 -0.0157801 0.5 +v 0.0118417 -0.0157801 -0.5 +v 0.0129485 -0.0164439 0.5 +v 0.0129485 -0.0164439 -0.5 +v 0.0141258 -0.0171158 0.5 +v 0.0141258 -0.0171158 -0.5 +v 0.0153717 -0.0178024 0.5 +v 0.0153717 -0.0178024 -0.5 +v 0.0166914 -0.0185005 0.5 +v 0.0166914 -0.0185005 -0.5 +v 0.0180921 -0.0192037 0.5 +v 0.0180921 -0.0192037 -0.5 +v 0.01958 -0.019908 0.5 +v 0.01958 -0.019908 -0.5 +v 0.0211576 -0.0206151 0.5 +v 0.0211576 -0.0206151 -0.5 +v 0.0228265 -0.0213288 0.5 +v 0.0228265 -0.0213288 -0.5 +v 0.0245895 -0.0220523 0.5 +v 0.0245895 -0.0220523 -0.5 +v 0.0264506 -0.0227868 0.5 +v 0.0264506 -0.0227868 -0.5 +v 0.028415 -0.0235332 0.5 +v 0.028415 -0.0235332 -0.5 +v 0.0304905 -0.0242814 0.5 +v 0.0304905 -0.0242814 -0.5 +v 0.0326872 -0.0250146 0.5 +v 0.0326872 -0.0250146 -0.5 +v 0.0350128 -0.0257258 0.5 +v 0.0350128 -0.0257258 -0.5 +v 0.0374672 -0.0264333 0.5 +v 0.0374672 -0.0264333 -0.5 +v 0.0400497 -0.0271566 0.5 +v 0.0400497 -0.0271566 -0.5 +v 0.0427704 -0.0278802 0.5 +v 0.0427704 -0.0278802 -0.5 +v 0.0456434 -0.0285739 0.5 +v 0.0456434 -0.0285739 -0.5 +v 0.0486731 -0.0292495 0.5 +v 0.0486731 -0.0292495 -0.5 +v 0.0518554 -0.0299566 0.5 +v 0.0518554 -0.0299566 -0.5 +v 0.0551966 -0.030697 0.5 +v 0.0551966 -0.030697 -0.5 +v 0.0587179 -0.0314085 0.5 +v 0.0587179 -0.0314085 -0.5 +v 0.062431 -0.032078 0.5 +v 0.062431 -0.032078 -0.5 +v 0.0663314 -0.0327743 0.5 +v 0.0663314 -0.0327743 -0.5 +v 0.0704248 -0.033514 0.5 +v 0.0704248 -0.033514 -0.5 +v 0.0747335 -0.0342256 0.5 +v 0.0747335 -0.0342256 -0.5 +v 0.0792714 -0.0348902 0.5 +v 0.0792714 -0.0348902 -0.5 +v 0.0840416 -0.0355492 0.5 +v 0.0840416 -0.0355492 -0.5 +v 0.089054 -0.0362103 0.5 +v 0.089054 -0.0362103 -0.5 +v 0.0943226 -0.0368627 0.5 +v 0.0943226 -0.0368627 -0.5 +v 0.0998603 -0.0375041 0.5 +v 0.0998603 -0.0375041 -0.5 +v 0.105679 -0.0381355 0.5 +v 0.105679 -0.0381355 -0.5 +v 0.111793 -0.0387575 0.5 +v 0.111793 -0.0387575 -0.5 +v 0.118218 -0.0393567 0.5 +v 0.118218 -0.0393567 -0.5 +v 0.124968 -0.0399429 0.5 +v 0.124968 -0.0399429 -0.5 +v 0.132055 -0.0405782 0.5 +v 0.132055 -0.0405782 -0.5 +v 0.1395 -0.0411771 0.5 +v 0.1395 -0.0411771 -0.5 +v 0.147326 -0.041699 0.5 +v 0.147326 -0.041699 -0.5 +v 0.15451 -0.0421969 0.5 +v 0.15451 -0.0421969 -0.5 +v 0.162054 -0.042698 0.5 +v 0.162054 -0.042698 -0.5 +v 0.16998 -0.0431596 0.5 +v 0.16998 -0.0431596 -0.5 +v 0.178305 -0.0435984 0.5 +v 0.178305 -0.0435984 -0.5 +v 0.187045 -0.0440696 0.5 +v 0.187045 -0.0440696 -0.5 +v 0.196223 -0.0445349 0.5 +v 0.196223 -0.0445349 -0.5 +v 0.205864 -0.0449725 0.5 +v 0.205864 -0.0449725 -0.5 +v 0.215985 -0.045448 0.5 +v 0.215985 -0.045448 -0.5 +v 0.226615 -0.0458797 0.5 +v 0.226615 -0.0458797 -0.5 +v 0.237778 -0.0463184 0.5 +v 0.237778 -0.0463184 -0.5 +v 0.249497 -0.0468156 0.5 +v 0.249497 -0.0468156 -0.5 +v 0.261804 -0.0472732 0.5 +v 0.261804 -0.0472732 -0.5 +v 0.274727 -0.0477637 0.5 +v 0.274727 -0.0477637 -0.5 +v 0.288294 -0.0483182 0.5 +v 0.288294 -0.0483182 -0.5 +v 0.302542 -0.0488257 0.5 +v 0.302542 -0.0488257 -0.5 +v 0.317502 -0.0493844 0.5 +v 0.317502 -0.0493844 -0.5 +v 0.33321 -0.0499788 0.5 +v 0.33321 -0.0499788 -0.5 +v 0.349702 -0.0506056 0.5 +v 0.349702 -0.0506056 -0.5 +v 0.367015 -0.0513872 0.5 +v 0.367015 -0.0513872 -0.5 +v 0.385192 -0.0522281 0.5 +v 0.385192 -0.0522281 -0.5 +v 0.404277 -0.0531254 0.5 +v 0.404277 -0.0531254 -0.5 +v 0.424316 -0.0540817 0.5 +v 0.424316 -0.0540817 -0.5 +v 0.445357 -0.0550979 0.5 +v 0.445357 -0.0550979 -0.5 +v 0.467451 -0.0560874 0.5 +v 0.467451 -0.0560874 -0.5 +v 0.490649 -0.0571824 0.5 +v 0.490649 -0.0571824 -0.5 +v 0.51501 -0.0582757 0.5 +v 0.51501 -0.0582757 -0.5 +v 0.540585 -0.0594903 0.5 +v 0.540585 -0.0594903 -0.5 +v 0.567439 -0.0607815 0.5 +v 0.567439 -0.0607815 -0.5 +v 0.595635 -0.0621304 0.5 +v 0.595635 -0.0621304 -0.5 +v 0.625242 -0.0635352 0.5 +v 0.625242 -0.0635352 -0.5 +v 0.649433 -0.0648334 0.5 +v 0.649433 -0.0648334 -0.5 +v 0.672415 -0.0660494 0.5 +v 0.672415 -0.0660494 -0.5 +v 0.694245 -0.0672674 0.5 +v 0.694245 -0.0672674 -0.5 +v 0.714979 -0.0684936 0.5 +v 0.714979 -0.0684936 -0.5 +v 0.734678 -0.0696472 0.5 +v 0.734678 -0.0696472 -0.5 +v 0.753392 -0.070724 0.5 +v 0.753392 -0.070724 -0.5 +v 0.771162 -0.0718742 0.5 +v 0.771162 -0.0718742 -0.5 +v 0.788046 -0.0729552 0.5 +v 0.788046 -0.0729552 -0.5 +v 0.804086 -0.0739668 0.5 +v 0.804086 -0.0739668 -0.5 +v 0.819316 -0.0750462 0.5 +v 0.819316 -0.0750462 -0.5 +v 0.833785 -0.076061 0.5 +v 0.833785 -0.076061 -0.5 +v 0.847532 -0.0770175 0.5 +v 0.847532 -0.0770175 -0.5 +v 0.86059 -0.0779215 0.5 +v 0.86059 -0.0779215 -0.5 +v 0.872998 -0.0787716 0.5 +v 0.872998 -0.0787716 -0.5 +v 0.884776 -0.079698 0.5 +v 0.884776 -0.079698 -0.5 +v 0.89597 -0.0805061 0.5 +v 0.89597 -0.0805061 -0.5 +v 0.906605 -0.0812554 0.5 +v 0.906605 -0.0812554 -0.5 +v 0.916704 -0.0820352 0.5 +v 0.916704 -0.0820352 -0.5 +v 0.926301 -0.0827494 0.5 +v 0.926301 -0.0827494 -0.5 +v 0.935409 -0.0835384 0.5 +v 0.935409 -0.0835384 -0.5 +v 0.944071 -0.0841575 0.5 +v 0.944071 -0.0841575 -0.5 +v 0.952294 -0.0848264 0.5 +v 0.952294 -0.0848264 -0.5 +v 0.960109 -0.0854166 0.5 +v 0.960109 -0.0854166 -0.5 +v 0.967527 -0.0860602 0.5 +v 0.967527 -0.0860602 -0.5 +v 0.97458 -0.0865997 0.5 +v 0.97458 -0.0865997 -0.5 +v 0.981277 -0.0871547 0.5 +v 0.981277 -0.0871547 -0.5 +v 0.987637 -0.0876912 0.5 +v 0.987637 -0.0876912 -0.5 +v 0.993684 -0.0881407 0.5 +v 0.993684 -0.0881407 -0.5 +# </points> + +# <faces count="520"> +g WALL10 +f 1 2 3 +f 3 4 1 +f 4 3 5 +f 5 6 4 +f 6 5 7 +f 7 8 6 +f 8 7 9 +f 9 10 8 +f 10 9 11 +f 11 12 10 +f 12 11 13 +f 13 14 12 +f 14 13 15 +f 15 16 14 +f 16 15 17 +f 17 18 16 +f 18 17 19 +f 19 20 18 +f 20 19 21 +f 21 22 20 +f 22 21 23 +f 23 24 22 +f 24 23 25 +f 25 26 24 +f 26 25 27 +f 27 28 26 +f 28 27 29 +f 29 30 28 +f 30 29 31 +f 31 32 30 +f 32 31 33 +f 33 34 32 +f 34 33 35 +f 35 36 34 +f 36 35 37 +f 37 38 36 +f 38 37 39 +f 39 40 38 +f 40 39 41 +f 41 42 40 +f 42 41 43 +f 43 44 42 +f 44 43 45 +f 45 46 44 +f 46 45 47 +f 47 48 46 +f 48 47 49 +f 49 50 48 +f 50 49 51 +f 51 52 50 +f 52 51 53 +f 53 54 52 +f 54 53 55 +f 55 56 54 +f 56 55 57 +f 57 58 56 +f 58 57 59 +f 59 60 58 +f 60 59 61 +f 61 62 60 +f 62 61 63 +f 63 64 62 +f 64 63 65 +f 65 66 64 +f 66 65 67 +f 67 68 66 +f 68 67 69 +f 69 70 68 +f 70 69 71 +f 71 72 70 +f 72 71 73 +f 73 74 72 +f 74 73 75 +f 75 76 74 +f 76 75 77 +f 77 78 76 +f 78 77 79 +f 79 80 78 +f 80 79 81 +f 81 82 80 +f 82 81 83 +f 83 84 82 +f 84 83 85 +f 85 86 84 +f 86 85 87 +f 87 88 86 +f 88 87 89 +f 89 90 88 +f 90 89 91 +f 91 92 90 +f 92 91 93 +f 93 94 92 +f 94 93 95 +f 95 96 94 +f 96 95 97 +f 97 98 96 +f 98 97 99 +f 99 100 98 +f 100 99 101 +f 101 102 100 +f 102 101 103 +f 103 104 102 +f 104 103 105 +f 105 106 104 +f 106 105 107 +f 107 108 106 +f 108 107 109 +f 109 110 108 +f 110 109 111 +f 111 112 110 +f 112 111 113 +f 113 114 112 +f 114 113 115 +f 115 116 114 +f 116 115 117 +f 117 118 116 +f 118 117 119 +f 119 120 118 +f 120 119 121 +f 121 122 120 +f 122 121 123 +f 123 124 122 +f 124 123 125 +f 125 126 124 +f 126 125 127 +f 127 128 126 +f 128 127 129 +f 129 130 128 +f 130 129 131 +f 131 132 130 +f 132 131 133 +f 133 134 132 +f 134 133 135 +f 135 136 134 +f 136 135 137 +f 137 138 136 +f 138 137 139 +f 139 140 138 +f 140 139 141 +f 141 142 140 +f 142 141 143 +f 143 144 142 +f 144 143 145 +f 145 146 144 +f 146 145 147 +f 147 148 146 +f 148 147 149 +f 149 150 148 +f 150 149 151 +f 151 152 150 +f 152 151 153 +f 153 154 152 +f 154 153 155 +f 155 156 154 +f 156 155 157 +f 157 158 156 +f 158 157 159 +f 159 160 158 +f 160 159 161 +f 161 162 160 +f 162 161 163 +f 163 164 162 +f 164 163 165 +f 165 166 164 +f 166 165 167 +f 167 168 166 +f 168 167 169 +f 169 170 168 +f 170 169 171 +f 171 172 170 +f 172 171 173 +f 173 174 172 +f 174 173 175 +f 175 176 174 +f 176 175 177 +f 177 178 176 +f 178 177 179 +f 179 180 178 +f 180 179 181 +f 181 182 180 +f 182 181 183 +f 183 184 182 +f 184 183 185 +f 185 186 184 +f 186 185 187 +f 187 188 186 +f 188 187 189 +f 189 190 188 +f 190 189 191 +f 191 192 190 +f 192 191 193 +f 193 194 192 +f 194 193 195 +f 195 196 194 +f 196 195 197 +f 197 198 196 +f 198 197 199 +f 199 200 198 +f 200 199 201 +f 201 202 200 +f 202 201 203 +f 203 204 202 +f 204 203 205 +f 205 206 204 +f 206 205 207 +f 207 208 206 +f 208 207 209 +f 209 210 208 +f 210 209 211 +f 211 212 210 +f 212 211 213 +f 213 214 212 +f 214 213 215 +f 215 216 214 +f 216 215 217 +f 217 218 216 +f 218 217 219 +f 219 220 218 +f 220 219 221 +f 221 222 220 +f 222 221 223 +f 223 224 222 +f 224 223 225 +f 225 226 224 +f 226 225 227 +f 227 228 226 +f 228 227 229 +f 229 230 228 +f 230 229 231 +f 231 232 230 +f 232 231 233 +f 233 234 232 +f 234 233 235 +f 235 236 234 +f 236 235 237 +f 237 238 236 +f 238 237 239 +f 239 240 238 +f 240 239 241 +f 241 242 240 +f 242 241 243 +f 243 244 242 +f 244 243 245 +f 245 246 244 +f 246 245 247 +f 247 248 246 +f 248 247 249 +f 249 250 248 +f 250 249 251 +f 251 252 250 +f 252 251 253 +f 253 254 252 +f 254 253 255 +f 255 256 254 +f 256 255 257 +f 257 258 256 +f 258 257 259 +f 259 260 258 +f 261 262 2 +f 2 1 261 +f 260 259 263 +f 263 264 260 +f 264 263 265 +f 265 266 264 +f 266 265 267 +f 267 268 266 +f 268 267 269 +f 269 270 268 +f 270 269 271 +f 271 272 270 +f 272 271 273 +f 273 274 272 +f 274 273 275 +f 275 276 274 +f 276 275 277 +f 277 278 276 +f 278 277 279 +f 279 280 278 +f 280 279 281 +f 281 282 280 +f 282 281 283 +f 283 284 282 +f 284 283 285 +f 285 286 284 +f 286 285 287 +f 287 288 286 +f 288 287 289 +f 289 290 288 +f 290 289 291 +f 291 292 290 +f 292 291 293 +f 293 294 292 +f 294 293 295 +f 295 296 294 +f 296 295 297 +f 297 298 296 +f 298 297 299 +f 299 300 298 +f 300 299 301 +f 301 302 300 +f 302 301 303 +f 303 304 302 +f 304 303 305 +f 305 306 304 +f 306 305 307 +f 307 308 306 +f 308 307 309 +f 309 310 308 +f 310 309 311 +f 311 312 310 +f 312 311 313 +f 313 314 312 +f 314 313 315 +f 315 316 314 +f 316 315 317 +f 317 318 316 +f 318 317 319 +f 319 320 318 +f 320 319 321 +f 321 322 320 +f 322 321 323 +f 323 324 322 +f 324 323 325 +f 325 326 324 +f 326 325 327 +f 327 328 326 +f 328 327 329 +f 329 330 328 +f 330 329 331 +f 331 332 330 +f 332 331 333 +f 333 334 332 +f 334 333 335 +f 335 336 334 +f 336 335 337 +f 337 338 336 +f 338 337 339 +f 339 340 338 +f 340 339 341 +f 341 342 340 +f 342 341 343 +f 343 344 342 +f 344 343 345 +f 345 346 344 +f 346 345 347 +f 347 348 346 +f 348 347 349 +f 349 350 348 +f 350 349 351 +f 351 352 350 +f 352 351 353 +f 353 354 352 +f 354 353 355 +f 355 356 354 +f 356 355 357 +f 357 358 356 +f 358 357 359 +f 359 360 358 +f 360 359 361 +f 361 362 360 +f 362 361 363 +f 363 364 362 +f 364 363 365 +f 365 366 364 +f 366 365 367 +f 367 368 366 +f 368 367 369 +f 369 370 368 +f 370 369 371 +f 371 372 370 +f 372 371 373 +f 373 374 372 +f 374 373 375 +f 375 376 374 +f 376 375 377 +f 377 378 376 +f 378 377 379 +f 379 380 378 +f 380 379 381 +f 381 382 380 +f 382 381 383 +f 383 384 382 +f 384 383 385 +f 385 386 384 +f 386 385 387 +f 387 388 386 +f 388 387 389 +f 389 390 388 +f 390 389 391 +f 391 392 390 +f 392 391 393 +f 393 394 392 +f 394 393 395 +f 395 396 394 +f 396 395 397 +f 397 398 396 +f 398 397 399 +f 399 400 398 +f 400 399 401 +f 401 402 400 +f 402 401 403 +f 403 404 402 +f 404 403 405 +f 405 406 404 +f 406 405 407 +f 407 408 406 +f 408 407 409 +f 409 410 408 +f 410 409 411 +f 411 412 410 +f 412 411 413 +f 413 414 412 +f 414 413 415 +f 415 416 414 +f 416 415 417 +f 417 418 416 +f 418 417 419 +f 419 420 418 +f 420 419 421 +f 421 422 420 +f 422 421 423 +f 423 424 422 +f 424 423 425 +f 425 426 424 +f 426 425 427 +f 427 428 426 +f 428 427 429 +f 429 430 428 +f 430 429 431 +f 431 432 430 +f 432 431 433 +f 433 434 432 +f 434 433 435 +f 435 436 434 +f 436 435 437 +f 437 438 436 +f 438 437 439 +f 439 440 438 +f 440 439 441 +f 441 442 440 +f 442 441 443 +f 443 444 442 +f 444 443 445 +f 445 446 444 +f 446 445 447 +f 447 448 446 +f 448 447 449 +f 449 450 448 +f 450 449 451 +f 451 452 450 +f 452 451 453 +f 453 454 452 +f 454 453 455 +f 455 456 454 +f 456 455 457 +f 457 458 456 +f 458 457 459 +f 459 460 458 +f 460 459 461 +f 461 462 460 +f 462 461 463 +f 463 464 462 +f 464 463 465 +f 465 466 464 +f 466 465 467 +f 467 468 466 +f 468 467 469 +f 469 470 468 +f 470 469 471 +f 471 472 470 +f 472 471 473 +f 473 474 472 +f 474 473 475 +f 475 476 474 +f 476 475 477 +f 477 478 476 +f 478 477 479 +f 479 480 478 +f 480 479 481 +f 481 482 480 +f 482 481 483 +f 483 484 482 +f 484 483 485 +f 485 486 484 +f 486 485 487 +f 487 488 486 +f 488 487 489 +f 489 490 488 +f 490 489 491 +f 491 492 490 +f 492 491 493 +f 493 494 492 +f 494 493 495 +f 495 496 494 +f 496 495 497 +f 497 498 496 +f 498 497 499 +f 499 500 498 +f 500 499 501 +f 501 502 500 +f 502 501 503 +f 503 504 502 +f 504 503 505 +f 505 506 504 +f 506 505 507 +f 507 508 506 +f 508 507 509 +f 509 510 508 +f 510 509 511 +f 511 512 510 +f 512 511 513 +f 513 514 512 +f 514 513 515 +f 515 516 514 +f 516 515 517 +f 517 518 516 +f 518 517 519 +f 519 520 518 +f 520 519 262 +f 262 261 520 +# </faces> diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties new file mode 100644 index 00000000000..1ae39077556 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/constant/turbulenceProperties @@ -0,0 +1,28 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RAS; + +RAS +{ + RASModel kEpsilon; //kOmegaSST; + + turbulence on; + + printCoeffs on; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict new file mode 100644 index 00000000000..9c95d3eac67 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/blockMeshDict @@ -0,0 +1,93 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (-1.0 -1.0 -0.1) + ( 2.0 -1.0 -0.1) + ( 2.0 1.0 -0.1) + (-1.0 1.0 -0.1) + (-1.0 -1.0 0.1) + ( 2.0 -1.0 0.1) + ( 2.0 1.0 0.1) + (-1.0 1.0 0.1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (17 11 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + topAndBottom + { + type patch; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } + + inlet + { + type patch; + faces + ( + (0 4 7 3) + ); + } + + outlet + { + type patch; + faces + ( + (2 6 5 1) + ); + } + + symFront + { + type symmetryPlane; + faces + ( + (4 5 6 7) + ); + } + + symBack + { + type symmetryPlane; + faces + ( + (0 3 2 1) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict new file mode 100644 index 00000000000..28436ef928d --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/controlDict @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +libs ("liboverset.so"); + +application overSimpleFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 2000; + +deltaT 1; + +writeControl timeStep; + +writeInterval 200; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 10; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict new file mode 100644 index 00000000000..f84e309be74 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/createPatchDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object createPatchDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Do a synchronisation of coupled points after creation of any patches. +// Note: this does not work with points that are on multiple coupled patches +// with transformations (i.e. cyclics). +pointSync false; + +// Patches to create. +patches +( + { + // Name of new patch + name frontAndBack; + + // Dictionary to construct new patch from + patchInfo + { + type empty; + } + + // How to construct: either from 'patches' or 'set' + constructFrom patches; + + // If constructFrom = patches : names of patches. Wildcards allowed. + patches (symFront symBack); + + // If constructFrom = set : name of faceSet + set f0; + } + +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict new file mode 100644 index 00000000000..5a457a75200 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/decomposeParDict @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 8; + +method hierarchical; + +simpleCoeffs +{ + n (1 3 1); + delta 0.001; +} + +hierarchicalCoeffs +{ + n (8 1 1); + delta 0.001; + order xyz; +} + +manualCoeffs +{ + dataFile "cellDecomposition"; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict new file mode 100644 index 00000000000..e5f2993d226 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/extrudeMeshDict @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object extrudeMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// What to extrude: +// patch : from patch of another case ('sourceCase') +// mesh : as above but with original case included +// surface : from externally read surface + +constructFrom patch; +sourceCase "../background_snappyHexMesh"; +sourcePatches (symFront); + +// If construct from patch: patch to use for back (can be same as sourcePatch) +exposedPatchName symBack; + +// Flip surface normals before usage. Valid only for extrude from surface or +// patch. +flipNormals false; + +//- Linear extrusion in point-normal direction +extrudeModel linearNormal; + +nLayers 1; + +expansionRatio 1.0; + +linearNormalCoeffs +{ + thickness 0.05; +} + +// Do front and back need to be merged? Usually only makes sense for 360 +// degree wedges. +mergeFaces false; //true; + +// Merge small edges. Fraction of bounding box. +mergeTol 0; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes new file mode 100644 index 00000000000..08936ae7678 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSchemes @@ -0,0 +1,95 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default steadyState; +} + +gradSchemes +{ + default Gauss linear; + grad(yPsi) cellLimited Gauss linear 1.0; +} + +divSchemes +{ + default none; + div(phi,U) bounded Gauss limitedLinearV 1; + div(phi,k) bounded Gauss upwind; + div(phi,epsilon) Gauss upwind; + div(phi,R) Gauss upwind; + div(R) Gauss linear; + div(phid,p) Gauss limitedLinear 1; + div(phi,K) Gauss limitedLinear 1; + div(phi,e) Gauss limitedLinear 1; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; + div(phi,omega) bounded Gauss limitedLinear 1; + div((nuEff*dev2(T(grad(U))))) Gauss linear; + +} + +laplacianSchemes +{ + default Gauss linear limited corrected 0.5; + laplacian(diffusivity,cellDisplacement) Gauss linear corrected; + laplacian(yPsi) Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + pcorr ; + p ; + yPsi ; +} + +oversetInterpolation +{ + method inverseDistance; //trackingInverseDistance; + + // The inverseDistance method uses a 'voxel' like search structure. + // Optionally specify the extent and number of divisions n. + // Note that it will allocate an array of nx*ny*nz. If not specified: + // - searchBox : local mesh bounding box + // - searchBoxDivisions : root (2D) or cube-root(3D) of number of cells + searchBox (-0.1 -0.5 0)(1.1 0.5 1); + searchBoxDivisions (100 100 1); +} + +oversetInterpolationRequired +{ + omega; + k; + nut; +} + +wallDist +{ + method Poisson; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution new file mode 100644 index 00000000000..71cf71b4055 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/fvSolution @@ -0,0 +1,90 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + cellDisplacement + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + p + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-6; + relTol 0.01; + } + + pcorr + { + $p; + solver PCG; + preconditioner DIC; + } + + yPsi + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-5; + relTol 0.0; + } + + "(U|k|omega|epsilon)" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-6; + relTol 0.01; + } +} + +SIMPLE +{ + nOuterCorrectors 1; + nCorrectors 2; + nNonOrthogonalCorrectors 0; + + residualControl + { + p 2e-3; + U 2e-4; + "(k|epsilon|omega|f|v2)" 1e-4; + } +} + +relaxationFactors +{ + fields + { + p 0.3; + } + equations + { + U 0.6; + k 0.7; + omega 0.7; + epsilon 0.7; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict new file mode 100644 index 00000000000..8fe6333aa05 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/postProcessingDict @@ -0,0 +1,35 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object postProcessingDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +functions +{ + processorField1 + { + // Type of functionObject + type processorField; + + // Where to load it from (if not already in solver) + libs ("libfieldFunctionObjects.so"); + + // Function object enabled flag + enabled true; + + // When to output the average fields + writeControl writeTime; + } +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict new file mode 100644 index 00000000000..8efb92d6102 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/setFieldsDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue zoneID 123 +); + +regions +( + // Set cell values + // (does zerogradient on boundaries) + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict new file mode 100644 index 00000000000..92b72993854 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_overset/system/topoSetDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionsToCell; + sourceInfo + { + insidePoints ((0 -1 0.1)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre new file mode 100755 index 00000000000..75612046476 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/Allrun.pre @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # Run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Make 3D mesh in slab of cells. +# Make 3D mesh in slab of cells. +runApplication blockMesh +runApplication snappyHexMesh -overwrite diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj new file mode 100644 index 00000000000..4be2aac5f2f --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/constant/triSurface/wing_5degrees.obj @@ -0,0 +1,1054 @@ +# Wavefront OBJ file written 2010-05-13T09:12:43 +o wing_5degrees + +# points : 520 +# faces : 520 +# zones : 1 +# 0 WALL10 (nFaces: 520) + +# <points count="520"> +v 1.00488 -0.0890722 -0.5 +v 1.00488 -0.0890722 0.5 +v 0.999453 -0.0870827 0.5 +v 0.999453 -0.0870827 -0.5 +v 0.993747 -0.0849908 0.5 +v 0.993747 -0.0849908 -0.5 +v 0.98776 -0.0827959 0.5 +v 0.98776 -0.0827959 -0.5 +v 0.981475 -0.0804834 0.5 +v 0.981475 -0.0804834 -0.5 +v 0.974878 -0.0780483 0.5 +v 0.974878 -0.0780483 -0.5 +v 0.967936 -0.075535 0.5 +v 0.967936 -0.075535 -0.5 +v 0.960671 -0.0728297 0.5 +v 0.960671 -0.0728297 -0.5 +v 0.952986 -0.070149 0.5 +v 0.952986 -0.070149 -0.5 +v 0.944915 -0.067332 0.5 +v 0.944915 -0.067332 -0.5 +v 0.936442 -0.064377 0.5 +v 0.936442 -0.064377 -0.5 +v 0.927543 -0.0612777 0.5 +v 0.927543 -0.0612777 -0.5 +v 0.918171 -0.0581074 0.5 +v 0.918171 -0.0581074 -0.5 +v 0.908345 -0.0547308 0.5 +v 0.908345 -0.0547308 -0.5 +v 0.897978 -0.0513371 0.5 +v 0.897978 -0.0513371 -0.5 +v 0.887113 -0.0477115 0.5 +v 0.887113 -0.0477115 -0.5 +v 0.875671 -0.0440076 0.5 +v 0.875671 -0.0440076 -0.5 +v 0.863634 -0.0401898 0.5 +v 0.863634 -0.0401898 -0.5 +v 0.850988 -0.0362043 0.5 +v 0.850988 -0.0362043 -0.5 +v 0.837677 -0.0321259 0.5 +v 0.837677 -0.0321259 -0.5 +v 0.8237 -0.0278406 0.5 +v 0.8237 -0.0278406 -0.5 +v 0.808997 -0.0234314 0.5 +v 0.808997 -0.0234314 -0.5 +v 0.793536 -0.0188824 0.5 +v 0.793536 -0.0188824 -0.5 +v 0.777248 -0.0142896 0.5 +v 0.777248 -0.0142896 -0.5 +v 0.760144 -0.00947585 0.5 +v 0.760144 -0.00947585 -0.5 +v 0.742148 -0.0045544 0.5 +v 0.742148 -0.0045544 -0.5 +v 0.723207 0.000449948 0.5 +v 0.723207 0.000449948 -0.5 +v 0.703296 0.00561154 0.5 +v 0.703296 0.00561154 -0.5 +v 0.682345 0.010854 0.5 +v 0.682345 0.010854 -0.5 +v 0.660295 0.0161554 0.5 +v 0.660295 0.0161554 -0.5 +v 0.637103 0.0215548 0.5 +v 0.637103 0.0215548 -0.5 +v 0.606829 0.0282606 0.5 +v 0.606829 0.0282606 -0.5 +v 0.578018 0.0343978 0.5 +v 0.578018 0.0343978 -0.5 +v 0.550557 0.0397874 0.5 +v 0.550557 0.0397874 -0.5 +v 0.524436 0.0447356 0.5 +v 0.524436 0.0447356 -0.5 +v 0.499549 0.0490421 0.5 +v 0.499549 0.0490421 -0.5 +v 0.475869 0.05291 0.5 +v 0.475869 0.05291 -0.5 +v 0.45334 0.0563729 0.5 +v 0.45334 0.0563729 -0.5 +v 0.431911 0.059484 0.5 +v 0.431911 0.059484 -0.5 +v 0.411518 0.0621876 0.5 +v 0.411518 0.0621876 -0.5 +v 0.392118 0.0645445 0.5 +v 0.392118 0.0645445 -0.5 +v 0.373644 0.0664046 0.5 +v 0.373644 0.0664046 -0.5 +v 0.356081 0.0680196 0.5 +v 0.356081 0.0680196 -0.5 +v 0.339375 0.0692961 0.5 +v 0.339375 0.0692961 -0.5 +v 0.323487 0.0702815 0.5 +v 0.323487 0.0702815 -0.5 +v 0.308383 0.0710035 0.5 +v 0.308383 0.0710035 -0.5 +v 0.294024 0.0714698 0.5 +v 0.294024 0.0714698 -0.5 +v 0.28038 0.0717809 0.5 +v 0.28038 0.0717809 -0.5 +v 0.267416 0.0719191 0.5 +v 0.267416 0.0719191 -0.5 +v 0.255099 0.0718222 0.5 +v 0.255099 0.0718222 -0.5 +v 0.243399 0.0716511 0.5 +v 0.243399 0.0716511 -0.5 +v 0.232288 0.0713208 0.5 +v 0.232288 0.0713208 -0.5 +v 0.221735 0.0709249 0.5 +v 0.221735 0.0709249 -0.5 +v 0.211715 0.0704338 0.5 +v 0.211715 0.0704338 -0.5 +v 0.202202 0.0698513 0.5 +v 0.202202 0.0698513 -0.5 +v 0.19317 0.0692271 0.5 +v 0.19317 0.0692271 -0.5 +v 0.184599 0.0685108 0.5 +v 0.184599 0.0685108 -0.5 +v 0.176464 0.0677409 0.5 +v 0.176464 0.0677409 -0.5 +v 0.168741 0.0669472 0.5 +v 0.168741 0.0669472 -0.5 +v 0.161418 0.0660755 0.5 +v 0.161418 0.0660755 -0.5 +v 0.154469 0.0651852 0.5 +v 0.154469 0.0651852 -0.5 +v 0.145493 0.0640314 0.5 +v 0.145493 0.0640314 -0.5 +v 0.136995 0.0627463 0.5 +v 0.136995 0.0627463 -0.5 +v 0.128932 0.0614383 0.5 +v 0.128932 0.0614383 -0.5 +v 0.121282 0.0601525 0.5 +v 0.121282 0.0601525 -0.5 +v 0.114049 0.0587416 0.5 +v 0.114049 0.0587416 -0.5 +v 0.107186 0.0573482 0.5 +v 0.107186 0.0573482 -0.5 +v 0.100675 0.0559871 0.5 +v 0.100675 0.0559871 -0.5 +v 0.0945147 0.0545794 0.5 +v 0.0945147 0.0545794 -0.5 +v 0.0886858 0.0531426 0.5 +v 0.0886858 0.0531426 -0.5 +v 0.0831659 0.0517083 0.5 +v 0.0831659 0.0517083 -0.5 +v 0.0779342 0.0503006 0.5 +v 0.0779342 0.0503006 -0.5 +v 0.072975 0.0489224 0.5 +v 0.072975 0.0489224 -0.5 +v 0.0682798 0.0475559 0.5 +v 0.0682798 0.0475559 -0.5 +v 0.0638499 0.0461601 0.5 +v 0.0638499 0.0461601 -0.5 +v 0.0596656 0.0447577 0.5 +v 0.0596656 0.0447577 -0.5 +v 0.055694 0.0434126 0.5 +v 0.055694 0.0434126 -0.5 +v 0.0519364 0.0420932 0.5 +v 0.0519364 0.0420932 -0.5 +v 0.0484053 0.0407363 0.5 +v 0.0484053 0.0407363 -0.5 +v 0.0450779 0.0393756 0.5 +v 0.0450779 0.0393756 -0.5 +v 0.0419215 0.0380722 0.5 +v 0.0419215 0.0380722 -0.5 +v 0.0389288 0.0368211 0.5 +v 0.0389288 0.0368211 -0.5 +v 0.036102 0.0355928 0.5 +v 0.036102 0.0355928 -0.5 +v 0.0334425 0.034368 0.5 +v 0.0334425 0.034368 -0.5 +v 0.0309496 0.0331356 0.5 +v 0.0309496 0.0331356 -0.5 +v 0.0286117 0.0319047 0.5 +v 0.0286117 0.0319047 -0.5 +v 0.0264077 0.0307022 0.5 +v 0.0264077 0.0307022 -0.5 +v 0.0243248 0.02954 0.5 +v 0.0243248 0.02954 -0.5 +v 0.0223665 0.0284014 0.5 +v 0.0223665 0.0284014 -0.5 +v 0.0205353 0.0272716 0.5 +v 0.0205353 0.0272716 -0.5 +v 0.0188204 0.0261581 0.5 +v 0.0188204 0.0261581 -0.5 +v 0.0172057 0.0250781 0.5 +v 0.0172057 0.0250781 -0.5 +v 0.015681 0.0240389 0.5 +v 0.015681 0.0240389 -0.5 +v 0.0142472 0.0230307 0.5 +v 0.0142472 0.0230307 -0.5 +v 0.0129051 0.0220434 0.5 +v 0.0129051 0.0220434 -0.5 +v 0.0116567 0.0210699 0.5 +v 0.0116567 0.0210699 -0.5 +v 0.0105044 0.0201047 0.5 +v 0.0105044 0.0201047 -0.5 +v 0.00944864 0.0191444 0.5 +v 0.00944864 0.0191444 -0.5 +v 0.00847997 0.0181956 0.5 +v 0.00847997 0.0181956 -0.5 +v 0.00758214 0.0172702 0.5 +v 0.00758214 0.0172702 -0.5 +v 0.00674204 0.0163779 0.5 +v 0.00674204 0.0163779 -0.5 +v 0.00595671 0.0155186 0.5 +v 0.00595671 0.0155186 -0.5 +v 0.00523198 0.0146848 0.5 +v 0.00523198 0.0146848 -0.5 +v 0.00457157 0.0138701 0.5 +v 0.00457157 0.0138701 -0.5 +v 0.00397503 0.0130721 0.5 +v 0.00397503 0.0130721 -0.5 +v 0.00343506 0.0122936 0.5 +v 0.00343506 0.0122936 -0.5 +v 0.0029443 0.0115379 0.5 +v 0.0029443 0.0115379 -0.5 +v 0.0024965 0.010807 0.5 +v 0.0024965 0.010807 -0.5 +v 0.00209053 0.0101012 0.5 +v 0.00209053 0.0101012 -0.5 +v 0.00172938 0.00941821 0.5 +v 0.00172938 0.00941821 -0.5 +v 0.00141481 0.00875662 0.5 +v 0.00141481 0.00875662 -0.5 +v 0.00114703 0.00811509 0.5 +v 0.00114703 0.00811509 -0.5 +v 0.000922634 0.00749375 0.5 +v 0.000922634 0.00749375 -0.5 +v 0.00073432 0.00689421 0.5 +v 0.00073432 0.00689421 -0.5 +v 0.000575606 0.00631745 0.5 +v 0.000575606 0.00631745 -0.5 +v 0.000441178 0.00576428 0.5 +v 0.000441178 0.00576428 -0.5 +v 0.000326628 0.00523494 0.5 +v 0.000326628 0.00523494 -0.5 +v 0.000229331 0.00472926 0.5 +v 0.000229331 0.00472926 -0.5 +v 0.000147968 0.00424663 0.5 +v 0.000147968 0.00424663 -0.5 +v 8.13071e-05 0.00378656 0.5 +v 8.13071e-05 0.00378656 -0.5 +v 2.81186e-05 0.00334838 0.5 +v 2.81186e-05 0.00334838 -0.5 +v -1.28053e-05 0.00293132 0.5 +v -1.28053e-05 0.00293132 -0.5 +v -4.26138e-05 0.00253464 0.5 +v -4.26138e-05 0.00253464 -0.5 +v -6.24104e-05 0.00215753 0.5 +v -6.24104e-05 0.00215753 -0.5 +v -7.32354e-05 0.00179922 0.5 +v -7.32354e-05 0.00179922 -0.5 +v -7.6066e-05 0.00145891 0.5 +v -7.6066e-05 0.00145891 -0.5 +v -7.18149e-05 0.00113574 0.5 +v -7.18149e-05 0.00113574 -0.5 +v -6.13265e-05 0.000828962 0.5 +v -6.13265e-05 0.000828962 -0.5 +v -4.5388e-05 0.000537894 0.5 +v -4.5388e-05 0.000537894 -0.5 +v -2.47174e-05 0.000261729 0.5 +v -2.47174e-05 0.000261729 -0.5 +v 0.999428 -0.0886333 -0.5 +v 0.999428 -0.0886333 0.5 +v 0 0 0.5 +v 0 0 -0.5 +v 3.07731e-05 -0.000269468 0.5 +v 3.07731e-05 -0.000269468 -0.5 +v 6.87839e-05 -0.000551758 0.5 +v 6.87839e-05 -0.000551758 -0.5 +v 0.00011487 -0.000847395 0.5 +v 0.00011487 -0.000847395 -0.5 +v 0.000169958 -0.00115699 0.5 +v 0.000169958 -0.00115699 -0.5 +v 0.000235006 -0.00148084 0.5 +v 0.000235006 -0.00148084 -0.5 +v 0.000311085 -0.00181947 0.5 +v 0.000311085 -0.00181947 -0.5 +v 0.000399343 -0.00217329 0.5 +v 0.000399343 -0.00217329 -0.5 +v 0.000501006 -0.00254265 0.5 +v 0.000501006 -0.00254265 -0.5 +v 0.000617405 -0.00292793 0.5 +v 0.000617405 -0.00292793 -0.5 +v 0.000749918 -0.00332928 0.5 +v 0.000749918 -0.00332928 -0.5 +v 0.000900098 -0.00374706 0.5 +v 0.000900098 -0.00374706 -0.5 +v 0.00106951 -0.00418123 0.5 +v 0.00106951 -0.00418123 -0.5 +v 0.00125981 -0.00463173 0.5 +v 0.00125981 -0.00463173 -0.5 +v 0.00147278 -0.00509836 0.5 +v 0.00147278 -0.00509836 -0.5 +v 0.00171023 -0.00558073 0.5 +v 0.00171023 -0.00558073 -0.5 +v 0.0019741 -0.00607866 0.5 +v 0.0019741 -0.00607866 -0.5 +v 0.00226657 -0.00659235 0.5 +v 0.00226657 -0.00659235 -0.5 +v 0.00258985 -0.00712192 0.5 +v 0.00258985 -0.00712192 -0.5 +v 0.00294625 -0.00766749 0.5 +v 0.00294625 -0.00766749 -0.5 +v 0.0033381 -0.00822888 0.5 +v 0.0033381 -0.00822888 -0.5 +v 0.00376858 -0.00880495 0.5 +v 0.00376858 -0.00880495 -0.5 +v 0.00424144 -0.00939356 0.5 +v 0.00424144 -0.00939356 -0.5 +v 0.0047608 -0.00999197 0.5 +v 0.0047608 -0.00999197 -0.5 +v 0.00533108 -0.0105969 0.5 +v 0.00533108 -0.0105969 -0.5 +v 0.00595465 -0.0112076 0.5 +v 0.00595465 -0.0112076 -0.5 +v 0.00663108 -0.0118268 0.5 +v 0.00663108 -0.0118268 -0.5 +v 0.00735864 -0.0124589 0.5 +v 0.00735864 -0.0124589 -0.5 +v 0.00813479 -0.0131082 0.5 +v 0.00813479 -0.0131082 -0.5 +v 0.00896315 -0.0137726 0.5 +v 0.00896315 -0.0137726 -0.5 +v 0.00985143 -0.0144449 0.5 +v 0.00985143 -0.0144449 -0.5 +v 0.0108089 -0.0151156 0.5 +v 0.0108089 -0.0151156 -0.5 +v 0.0118417 -0.0157801 0.5 +v 0.0118417 -0.0157801 -0.5 +v 0.0129485 -0.0164439 0.5 +v 0.0129485 -0.0164439 -0.5 +v 0.0141258 -0.0171158 0.5 +v 0.0141258 -0.0171158 -0.5 +v 0.0153717 -0.0178024 0.5 +v 0.0153717 -0.0178024 -0.5 +v 0.0166914 -0.0185005 0.5 +v 0.0166914 -0.0185005 -0.5 +v 0.0180921 -0.0192037 0.5 +v 0.0180921 -0.0192037 -0.5 +v 0.01958 -0.019908 0.5 +v 0.01958 -0.019908 -0.5 +v 0.0211576 -0.0206151 0.5 +v 0.0211576 -0.0206151 -0.5 +v 0.0228265 -0.0213288 0.5 +v 0.0228265 -0.0213288 -0.5 +v 0.0245895 -0.0220523 0.5 +v 0.0245895 -0.0220523 -0.5 +v 0.0264506 -0.0227868 0.5 +v 0.0264506 -0.0227868 -0.5 +v 0.028415 -0.0235332 0.5 +v 0.028415 -0.0235332 -0.5 +v 0.0304905 -0.0242814 0.5 +v 0.0304905 -0.0242814 -0.5 +v 0.0326872 -0.0250146 0.5 +v 0.0326872 -0.0250146 -0.5 +v 0.0350128 -0.0257258 0.5 +v 0.0350128 -0.0257258 -0.5 +v 0.0374672 -0.0264333 0.5 +v 0.0374672 -0.0264333 -0.5 +v 0.0400497 -0.0271566 0.5 +v 0.0400497 -0.0271566 -0.5 +v 0.0427704 -0.0278802 0.5 +v 0.0427704 -0.0278802 -0.5 +v 0.0456434 -0.0285739 0.5 +v 0.0456434 -0.0285739 -0.5 +v 0.0486731 -0.0292495 0.5 +v 0.0486731 -0.0292495 -0.5 +v 0.0518554 -0.0299566 0.5 +v 0.0518554 -0.0299566 -0.5 +v 0.0551966 -0.030697 0.5 +v 0.0551966 -0.030697 -0.5 +v 0.0587179 -0.0314085 0.5 +v 0.0587179 -0.0314085 -0.5 +v 0.062431 -0.032078 0.5 +v 0.062431 -0.032078 -0.5 +v 0.0663314 -0.0327743 0.5 +v 0.0663314 -0.0327743 -0.5 +v 0.0704248 -0.033514 0.5 +v 0.0704248 -0.033514 -0.5 +v 0.0747335 -0.0342256 0.5 +v 0.0747335 -0.0342256 -0.5 +v 0.0792714 -0.0348902 0.5 +v 0.0792714 -0.0348902 -0.5 +v 0.0840416 -0.0355492 0.5 +v 0.0840416 -0.0355492 -0.5 +v 0.089054 -0.0362103 0.5 +v 0.089054 -0.0362103 -0.5 +v 0.0943226 -0.0368627 0.5 +v 0.0943226 -0.0368627 -0.5 +v 0.0998603 -0.0375041 0.5 +v 0.0998603 -0.0375041 -0.5 +v 0.105679 -0.0381355 0.5 +v 0.105679 -0.0381355 -0.5 +v 0.111793 -0.0387575 0.5 +v 0.111793 -0.0387575 -0.5 +v 0.118218 -0.0393567 0.5 +v 0.118218 -0.0393567 -0.5 +v 0.124968 -0.0399429 0.5 +v 0.124968 -0.0399429 -0.5 +v 0.132055 -0.0405782 0.5 +v 0.132055 -0.0405782 -0.5 +v 0.1395 -0.0411771 0.5 +v 0.1395 -0.0411771 -0.5 +v 0.147326 -0.041699 0.5 +v 0.147326 -0.041699 -0.5 +v 0.15451 -0.0421969 0.5 +v 0.15451 -0.0421969 -0.5 +v 0.162054 -0.042698 0.5 +v 0.162054 -0.042698 -0.5 +v 0.16998 -0.0431596 0.5 +v 0.16998 -0.0431596 -0.5 +v 0.178305 -0.0435984 0.5 +v 0.178305 -0.0435984 -0.5 +v 0.187045 -0.0440696 0.5 +v 0.187045 -0.0440696 -0.5 +v 0.196223 -0.0445349 0.5 +v 0.196223 -0.0445349 -0.5 +v 0.205864 -0.0449725 0.5 +v 0.205864 -0.0449725 -0.5 +v 0.215985 -0.045448 0.5 +v 0.215985 -0.045448 -0.5 +v 0.226615 -0.0458797 0.5 +v 0.226615 -0.0458797 -0.5 +v 0.237778 -0.0463184 0.5 +v 0.237778 -0.0463184 -0.5 +v 0.249497 -0.0468156 0.5 +v 0.249497 -0.0468156 -0.5 +v 0.261804 -0.0472732 0.5 +v 0.261804 -0.0472732 -0.5 +v 0.274727 -0.0477637 0.5 +v 0.274727 -0.0477637 -0.5 +v 0.288294 -0.0483182 0.5 +v 0.288294 -0.0483182 -0.5 +v 0.302542 -0.0488257 0.5 +v 0.302542 -0.0488257 -0.5 +v 0.317502 -0.0493844 0.5 +v 0.317502 -0.0493844 -0.5 +v 0.33321 -0.0499788 0.5 +v 0.33321 -0.0499788 -0.5 +v 0.349702 -0.0506056 0.5 +v 0.349702 -0.0506056 -0.5 +v 0.367015 -0.0513872 0.5 +v 0.367015 -0.0513872 -0.5 +v 0.385192 -0.0522281 0.5 +v 0.385192 -0.0522281 -0.5 +v 0.404277 -0.0531254 0.5 +v 0.404277 -0.0531254 -0.5 +v 0.424316 -0.0540817 0.5 +v 0.424316 -0.0540817 -0.5 +v 0.445357 -0.0550979 0.5 +v 0.445357 -0.0550979 -0.5 +v 0.467451 -0.0560874 0.5 +v 0.467451 -0.0560874 -0.5 +v 0.490649 -0.0571824 0.5 +v 0.490649 -0.0571824 -0.5 +v 0.51501 -0.0582757 0.5 +v 0.51501 -0.0582757 -0.5 +v 0.540585 -0.0594903 0.5 +v 0.540585 -0.0594903 -0.5 +v 0.567439 -0.0607815 0.5 +v 0.567439 -0.0607815 -0.5 +v 0.595635 -0.0621304 0.5 +v 0.595635 -0.0621304 -0.5 +v 0.625242 -0.0635352 0.5 +v 0.625242 -0.0635352 -0.5 +v 0.649433 -0.0648334 0.5 +v 0.649433 -0.0648334 -0.5 +v 0.672415 -0.0660494 0.5 +v 0.672415 -0.0660494 -0.5 +v 0.694245 -0.0672674 0.5 +v 0.694245 -0.0672674 -0.5 +v 0.714979 -0.0684936 0.5 +v 0.714979 -0.0684936 -0.5 +v 0.734678 -0.0696472 0.5 +v 0.734678 -0.0696472 -0.5 +v 0.753392 -0.070724 0.5 +v 0.753392 -0.070724 -0.5 +v 0.771162 -0.0718742 0.5 +v 0.771162 -0.0718742 -0.5 +v 0.788046 -0.0729552 0.5 +v 0.788046 -0.0729552 -0.5 +v 0.804086 -0.0739668 0.5 +v 0.804086 -0.0739668 -0.5 +v 0.819316 -0.0750462 0.5 +v 0.819316 -0.0750462 -0.5 +v 0.833785 -0.076061 0.5 +v 0.833785 -0.076061 -0.5 +v 0.847532 -0.0770175 0.5 +v 0.847532 -0.0770175 -0.5 +v 0.86059 -0.0779215 0.5 +v 0.86059 -0.0779215 -0.5 +v 0.872998 -0.0787716 0.5 +v 0.872998 -0.0787716 -0.5 +v 0.884776 -0.079698 0.5 +v 0.884776 -0.079698 -0.5 +v 0.89597 -0.0805061 0.5 +v 0.89597 -0.0805061 -0.5 +v 0.906605 -0.0812554 0.5 +v 0.906605 -0.0812554 -0.5 +v 0.916704 -0.0820352 0.5 +v 0.916704 -0.0820352 -0.5 +v 0.926301 -0.0827494 0.5 +v 0.926301 -0.0827494 -0.5 +v 0.935409 -0.0835384 0.5 +v 0.935409 -0.0835384 -0.5 +v 0.944071 -0.0841575 0.5 +v 0.944071 -0.0841575 -0.5 +v 0.952294 -0.0848264 0.5 +v 0.952294 -0.0848264 -0.5 +v 0.960109 -0.0854166 0.5 +v 0.960109 -0.0854166 -0.5 +v 0.967527 -0.0860602 0.5 +v 0.967527 -0.0860602 -0.5 +v 0.97458 -0.0865997 0.5 +v 0.97458 -0.0865997 -0.5 +v 0.981277 -0.0871547 0.5 +v 0.981277 -0.0871547 -0.5 +v 0.987637 -0.0876912 0.5 +v 0.987637 -0.0876912 -0.5 +v 0.993684 -0.0881407 0.5 +v 0.993684 -0.0881407 -0.5 +# </points> + +# <faces count="520"> +g WALL10 +f 1 2 3 +f 3 4 1 +f 4 3 5 +f 5 6 4 +f 6 5 7 +f 7 8 6 +f 8 7 9 +f 9 10 8 +f 10 9 11 +f 11 12 10 +f 12 11 13 +f 13 14 12 +f 14 13 15 +f 15 16 14 +f 16 15 17 +f 17 18 16 +f 18 17 19 +f 19 20 18 +f 20 19 21 +f 21 22 20 +f 22 21 23 +f 23 24 22 +f 24 23 25 +f 25 26 24 +f 26 25 27 +f 27 28 26 +f 28 27 29 +f 29 30 28 +f 30 29 31 +f 31 32 30 +f 32 31 33 +f 33 34 32 +f 34 33 35 +f 35 36 34 +f 36 35 37 +f 37 38 36 +f 38 37 39 +f 39 40 38 +f 40 39 41 +f 41 42 40 +f 42 41 43 +f 43 44 42 +f 44 43 45 +f 45 46 44 +f 46 45 47 +f 47 48 46 +f 48 47 49 +f 49 50 48 +f 50 49 51 +f 51 52 50 +f 52 51 53 +f 53 54 52 +f 54 53 55 +f 55 56 54 +f 56 55 57 +f 57 58 56 +f 58 57 59 +f 59 60 58 +f 60 59 61 +f 61 62 60 +f 62 61 63 +f 63 64 62 +f 64 63 65 +f 65 66 64 +f 66 65 67 +f 67 68 66 +f 68 67 69 +f 69 70 68 +f 70 69 71 +f 71 72 70 +f 72 71 73 +f 73 74 72 +f 74 73 75 +f 75 76 74 +f 76 75 77 +f 77 78 76 +f 78 77 79 +f 79 80 78 +f 80 79 81 +f 81 82 80 +f 82 81 83 +f 83 84 82 +f 84 83 85 +f 85 86 84 +f 86 85 87 +f 87 88 86 +f 88 87 89 +f 89 90 88 +f 90 89 91 +f 91 92 90 +f 92 91 93 +f 93 94 92 +f 94 93 95 +f 95 96 94 +f 96 95 97 +f 97 98 96 +f 98 97 99 +f 99 100 98 +f 100 99 101 +f 101 102 100 +f 102 101 103 +f 103 104 102 +f 104 103 105 +f 105 106 104 +f 106 105 107 +f 107 108 106 +f 108 107 109 +f 109 110 108 +f 110 109 111 +f 111 112 110 +f 112 111 113 +f 113 114 112 +f 114 113 115 +f 115 116 114 +f 116 115 117 +f 117 118 116 +f 118 117 119 +f 119 120 118 +f 120 119 121 +f 121 122 120 +f 122 121 123 +f 123 124 122 +f 124 123 125 +f 125 126 124 +f 126 125 127 +f 127 128 126 +f 128 127 129 +f 129 130 128 +f 130 129 131 +f 131 132 130 +f 132 131 133 +f 133 134 132 +f 134 133 135 +f 135 136 134 +f 136 135 137 +f 137 138 136 +f 138 137 139 +f 139 140 138 +f 140 139 141 +f 141 142 140 +f 142 141 143 +f 143 144 142 +f 144 143 145 +f 145 146 144 +f 146 145 147 +f 147 148 146 +f 148 147 149 +f 149 150 148 +f 150 149 151 +f 151 152 150 +f 152 151 153 +f 153 154 152 +f 154 153 155 +f 155 156 154 +f 156 155 157 +f 157 158 156 +f 158 157 159 +f 159 160 158 +f 160 159 161 +f 161 162 160 +f 162 161 163 +f 163 164 162 +f 164 163 165 +f 165 166 164 +f 166 165 167 +f 167 168 166 +f 168 167 169 +f 169 170 168 +f 170 169 171 +f 171 172 170 +f 172 171 173 +f 173 174 172 +f 174 173 175 +f 175 176 174 +f 176 175 177 +f 177 178 176 +f 178 177 179 +f 179 180 178 +f 180 179 181 +f 181 182 180 +f 182 181 183 +f 183 184 182 +f 184 183 185 +f 185 186 184 +f 186 185 187 +f 187 188 186 +f 188 187 189 +f 189 190 188 +f 190 189 191 +f 191 192 190 +f 192 191 193 +f 193 194 192 +f 194 193 195 +f 195 196 194 +f 196 195 197 +f 197 198 196 +f 198 197 199 +f 199 200 198 +f 200 199 201 +f 201 202 200 +f 202 201 203 +f 203 204 202 +f 204 203 205 +f 205 206 204 +f 206 205 207 +f 207 208 206 +f 208 207 209 +f 209 210 208 +f 210 209 211 +f 211 212 210 +f 212 211 213 +f 213 214 212 +f 214 213 215 +f 215 216 214 +f 216 215 217 +f 217 218 216 +f 218 217 219 +f 219 220 218 +f 220 219 221 +f 221 222 220 +f 222 221 223 +f 223 224 222 +f 224 223 225 +f 225 226 224 +f 226 225 227 +f 227 228 226 +f 228 227 229 +f 229 230 228 +f 230 229 231 +f 231 232 230 +f 232 231 233 +f 233 234 232 +f 234 233 235 +f 235 236 234 +f 236 235 237 +f 237 238 236 +f 238 237 239 +f 239 240 238 +f 240 239 241 +f 241 242 240 +f 242 241 243 +f 243 244 242 +f 244 243 245 +f 245 246 244 +f 246 245 247 +f 247 248 246 +f 248 247 249 +f 249 250 248 +f 250 249 251 +f 251 252 250 +f 252 251 253 +f 253 254 252 +f 254 253 255 +f 255 256 254 +f 256 255 257 +f 257 258 256 +f 258 257 259 +f 259 260 258 +f 261 262 2 +f 2 1 261 +f 260 259 263 +f 263 264 260 +f 264 263 265 +f 265 266 264 +f 266 265 267 +f 267 268 266 +f 268 267 269 +f 269 270 268 +f 270 269 271 +f 271 272 270 +f 272 271 273 +f 273 274 272 +f 274 273 275 +f 275 276 274 +f 276 275 277 +f 277 278 276 +f 278 277 279 +f 279 280 278 +f 280 279 281 +f 281 282 280 +f 282 281 283 +f 283 284 282 +f 284 283 285 +f 285 286 284 +f 286 285 287 +f 287 288 286 +f 288 287 289 +f 289 290 288 +f 290 289 291 +f 291 292 290 +f 292 291 293 +f 293 294 292 +f 294 293 295 +f 295 296 294 +f 296 295 297 +f 297 298 296 +f 298 297 299 +f 299 300 298 +f 300 299 301 +f 301 302 300 +f 302 301 303 +f 303 304 302 +f 304 303 305 +f 305 306 304 +f 306 305 307 +f 307 308 306 +f 308 307 309 +f 309 310 308 +f 310 309 311 +f 311 312 310 +f 312 311 313 +f 313 314 312 +f 314 313 315 +f 315 316 314 +f 316 315 317 +f 317 318 316 +f 318 317 319 +f 319 320 318 +f 320 319 321 +f 321 322 320 +f 322 321 323 +f 323 324 322 +f 324 323 325 +f 325 326 324 +f 326 325 327 +f 327 328 326 +f 328 327 329 +f 329 330 328 +f 330 329 331 +f 331 332 330 +f 332 331 333 +f 333 334 332 +f 334 333 335 +f 335 336 334 +f 336 335 337 +f 337 338 336 +f 338 337 339 +f 339 340 338 +f 340 339 341 +f 341 342 340 +f 342 341 343 +f 343 344 342 +f 344 343 345 +f 345 346 344 +f 346 345 347 +f 347 348 346 +f 348 347 349 +f 349 350 348 +f 350 349 351 +f 351 352 350 +f 352 351 353 +f 353 354 352 +f 354 353 355 +f 355 356 354 +f 356 355 357 +f 357 358 356 +f 358 357 359 +f 359 360 358 +f 360 359 361 +f 361 362 360 +f 362 361 363 +f 363 364 362 +f 364 363 365 +f 365 366 364 +f 366 365 367 +f 367 368 366 +f 368 367 369 +f 369 370 368 +f 370 369 371 +f 371 372 370 +f 372 371 373 +f 373 374 372 +f 374 373 375 +f 375 376 374 +f 376 375 377 +f 377 378 376 +f 378 377 379 +f 379 380 378 +f 380 379 381 +f 381 382 380 +f 382 381 383 +f 383 384 382 +f 384 383 385 +f 385 386 384 +f 386 385 387 +f 387 388 386 +f 388 387 389 +f 389 390 388 +f 390 389 391 +f 391 392 390 +f 392 391 393 +f 393 394 392 +f 394 393 395 +f 395 396 394 +f 396 395 397 +f 397 398 396 +f 398 397 399 +f 399 400 398 +f 400 399 401 +f 401 402 400 +f 402 401 403 +f 403 404 402 +f 404 403 405 +f 405 406 404 +f 406 405 407 +f 407 408 406 +f 408 407 409 +f 409 410 408 +f 410 409 411 +f 411 412 410 +f 412 411 413 +f 413 414 412 +f 414 413 415 +f 415 416 414 +f 416 415 417 +f 417 418 416 +f 418 417 419 +f 419 420 418 +f 420 419 421 +f 421 422 420 +f 422 421 423 +f 423 424 422 +f 424 423 425 +f 425 426 424 +f 426 425 427 +f 427 428 426 +f 428 427 429 +f 429 430 428 +f 430 429 431 +f 431 432 430 +f 432 431 433 +f 433 434 432 +f 434 433 435 +f 435 436 434 +f 436 435 437 +f 437 438 436 +f 438 437 439 +f 439 440 438 +f 440 439 441 +f 441 442 440 +f 442 441 443 +f 443 444 442 +f 444 443 445 +f 445 446 444 +f 446 445 447 +f 447 448 446 +f 448 447 449 +f 449 450 448 +f 450 449 451 +f 451 452 450 +f 452 451 453 +f 453 454 452 +f 454 453 455 +f 455 456 454 +f 456 455 457 +f 457 458 456 +f 458 457 459 +f 459 460 458 +f 460 459 461 +f 461 462 460 +f 462 461 463 +f 463 464 462 +f 464 463 465 +f 465 466 464 +f 466 465 467 +f 467 468 466 +f 468 467 469 +f 469 470 468 +f 470 469 471 +f 471 472 470 +f 472 471 473 +f 473 474 472 +f 474 473 475 +f 475 476 474 +f 476 475 477 +f 477 478 476 +f 478 477 479 +f 479 480 478 +f 480 479 481 +f 481 482 480 +f 482 481 483 +f 483 484 482 +f 484 483 485 +f 485 486 484 +f 486 485 487 +f 487 488 486 +f 488 487 489 +f 489 490 488 +f 490 489 491 +f 491 492 490 +f 492 491 493 +f 493 494 492 +f 494 493 495 +f 495 496 494 +f 496 495 497 +f 497 498 496 +f 498 497 499 +f 499 500 498 +f 500 499 501 +f 501 502 500 +f 502 501 503 +f 503 504 502 +f 504 503 505 +f 505 506 504 +f 506 505 507 +f 507 508 506 +f 508 507 509 +f 509 510 508 +f 510 509 511 +f 511 512 510 +f 512 511 513 +f 513 514 512 +f 514 513 515 +f 515 516 514 +f 516 515 517 +f 517 518 516 +f 518 517 519 +f 519 520 518 +f 520 519 262 +f 262 261 520 +# </faces> diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict new file mode 100644 index 00000000000..5151eb3c5f6 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/blockMeshDict @@ -0,0 +1,93 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (-1.2 -2.2 -0.1) + ( 5 -2.2 -0.1) + ( 5 2.2 -0.1) + (-1.2 2.2 -0.1) + (-1.2 -2.2 0.1) + ( 5 -2.2 0.1) + ( 5 2.2 0.1) + (-1.2 2.2 0.1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + topAndBottom + { + type patch; + faces + ( + (3 7 6 2) + (1 5 4 0) + ); + } + + inlet + { + type patch; + faces + ( + (0 4 7 3) + ); + } + + outlet + { + type patch; + faces + ( + (2 6 5 1) + ); + } + + symFront + { + type symmetryPlane; + faces + ( + (4 5 6 7) + ); + } + + symBack + { + type symmetryPlane; + faces + ( + (0 3 2 1) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict new file mode 100644 index 00000000000..28130318d74 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/controlDict @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application snappyHexMesh; + +startFrom latestTime; + +startTime 0; + +stopAt endTime; + +endTime 100; + +deltaT 1; + +writeControl runTime; + +writeInterval 1; + +purgeWrite 0; + +writeFormat binary; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes new file mode 100644 index 00000000000..52f9f1efc28 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSchemes @@ -0,0 +1,56 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss limitedLinearV 1; + div(phi,k) Gauss upwind; + div(phi,epsilon) Gauss upwind; + div(phi,R) Gauss upwind; + div(R) Gauss linear; + div(phid,p) Gauss limitedLinear 1; + div(phi,K) Gauss limitedLinear 1; + div(phi,e) Gauss limitedLinear 1; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear limited corrected 0.5; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution new file mode 100644 index 00000000000..04a2dd4fdbe --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/fvSolution @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-12; + relTol 0; + } + + rho + { + solver PCG; + preconditioner DIC; + tolerance 1e-08; + relTol 0; + } + + "(U|e|k|epsilon|R)" + { + $p; + tolerance 1e-08; + relTol 0; + } +} + +PISO +{ + nCorrectors 2; + nNonOrthogonalCorrectors 2; +} + +// ************************************************************************* // diff --git a/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict new file mode 100644 index 00000000000..4f7f6b1a1b1 --- /dev/null +++ b/tutorials/incompressible/overSimpleFoam/aeroFoil/background_snappyHexMesh/system/snappyHexMeshDict @@ -0,0 +1,290 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object snappyHexMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Which of the steps to run +castellatedMesh true; +snap true; +addLayers false; + +// Geometry. Definition of all surfaces. All surfaces are of class +// searchableSurface. +// Surfaces are used +// - to specify refinement for any mesh cell intersecting it +// - to specify refinement for any mesh cell inside/outside/near +// - to 'snap' the mesh boundary to the surface +geometry +{ + + refinementBox + { + type searchableBox; + min (-5 -1 -1); + max ( 5 1 1); + } +}; + +// Settings for the castellatedMesh generation. +castellatedMeshControls +{ + + // Refinement parameters + // ~~~~~~~~~~~~~~~~~~~~~ + + // If local number of cells is >= maxLocalCells on any processor + // switches from from refinement followed by balancing + // (current method) to (weighted) balancing before refinement. + maxLocalCells 100000; + + // Overall cell limit (approximately). Refinement will stop immediately + // upon reaching this number so a refinement level might not complete. + // Note that this is the number of cells before removing the part which + // is not 'visible' from the keepPoint. The final number of cells might + // actually be a lot less. + maxGlobalCells 2000000; + + // The surface refinement loop might spend lots of iterations refining just + // a few cells. This setting will cause refinement to stop if <= + // minimumRefine are selected for refinement. Note: it will at least do one + // iteration (unless the number of cells to refine is 0) + minRefinementCells 100; + + // Number of buffer layers between different levels. + // 1 means normal 2:1 refinement restriction, larger means slower + // refinement. + nCellsBetweenLevels 6; + + // Explicit feature edge refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies a level for any cell intersected by its edges. + // This is a featureEdgeMesh, read from constant/triSurface for now. + features (); + + // Surface based refinement + // ~~~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies two levels for every surface. The first is the minimum level, + // every cell intersecting a surface gets refined up to the minimum level. + // The second level is the maximum level. Cells that 'see' multiple + // intersections where the intersections make an + // angle > resolveFeatureAngle get refined up to the maximum level. + + refinementSurfaces + { + } + + // Resolve sharp angles on fridges + resolveFeatureAngle 30; + + // Region-wise refinement + // ~~~~~~~~~~~~~~~~~~~~~~ + + // Specifies refinement level for cells in relation to a surface. One of + // three modes + // - distance. 'levels' specifies per distance to the surface the + // wanted refinement level. The distances need to be specified in + // descending order. + // - inside. 'levels' is only one entry and only the level is used. All + // cells inside the surface get refined up to the level. The surface + // needs to be closed for this to be possible. + // - outside. Same but cells outside. + + refinementRegions + { + refinementBox + { + mode inside; + levels ((1e15 1)); + } + } + + // Mesh selection + // ~~~~~~~~~~~~~~ + + // After refinement patches get added for all refinementSurfaces and + // all cells intersecting the surfaces get put into these patches. The + // section reachable from the locationInMesh is kept. + // NOTE: This point should never be on a face, always inside a cell, even + // after refinement. + locationInMesh (-0.5 0 0.0); + + // Whether any faceZones (as specified in the refinementSurfaces) + // are only on the boundary of corresponding cellZones or also allow + // free-standing zone faces. Not used if there are no faceZones. + allowFreeStandingZoneFaces true; +} + +// Settings for the snapping. +snapControls +{ + //- Number of patch smoothing iterations before finding correspondence + // to surface + nSmoothPatch 3; + + //- Relative distance for points to be attracted by surface feature point + // or edge. True distance is this factor times local + // maximum edge length. + tolerance 4.0; + + //- Number of mesh displacement relaxation iterations. + nSolveIter 30; + + //- Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; +} + +// Settings for the layer addition. +addLayersControls +{ + // Are the thickness parameters below relative to the undistorted + // size of the refined cell outside layer (true) or absolute sizes (false). + relativeSizes true; + + // Per final patch (so not geometry!) the layer information + layers + { + wing + { + nSurfaceLayers 3; + } + } + + // Expansion factor for layer mesh + expansionRatio 1.3; + + // Wanted thickness of final added cell layer. If multiple layers + // is the thickness of the layer furthest away from the wall. + // Relative to undistorted size of cell outside layer. + // See relativeSizes parameter. + finalLayerThickness 0.7; + + // Minimum thickness of cell layer. If for any reason layer + // cannot be above minThickness do not add layer. + // Relative to undistorted size of cell outside layer. + // See relativeSizes parameter. + minThickness 0.25; + + // If points get not extruded do nGrow layers of connected faces that are + // also not grown. This helps convergence of the layer addition process + // close to features. + // Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x) + nGrow 0; + + // Advanced settings + + // When not to extrude surface. 0 is flat surface, 90 is when two faces + // are perpendicular + featureAngle 60; + + // Maximum number of snapping relaxation iterations. Should stop + // before upon reaching a correct mesh. + nRelaxIter 5; + + // Number of smoothing iterations of surface normals + nSmoothSurfaceNormals 1; + + // Number of smoothing iterations of interior mesh movement direction + nSmoothNormals 3; + + // Smooth layer thickness over surface patches + nSmoothThickness 10; + + // Stop layer growth on highly warped cells + maxFaceThicknessRatio 0.5; + + // Reduce layer growth where ratio thickness to medial + // distance is large + maxThicknessToMedialRatio 0.3; + + // Angle used to pick up medial axis points + // Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x. + minMedianAxisAngle 90; + + // Create buffer region for new layer terminations + nBufferCellsNoExtrude 0; + + // Overall max number of layer addition iterations. The mesher will exit + // if it reaches this number of iterations; possibly with an illegal + // mesh. + nLayerIter 50; +} + +// Generic mesh quality settings. At any undoable phase these determine +// where to undo. +meshQualityControls +{ + //- Maximum non-orthogonality allowed. Set to 180 to disable. + maxNonOrtho 65; + + //- Max skewness allowed. Set to <0 to disable. + maxBoundarySkewness 20; + maxInternalSkewness 4; + + //- Max concaveness allowed. Is angle (in degrees) below which concavity + // is allowed. 0 is straight face, <0 would be convex face. + // Set to 180 to disable. + maxConcave 80; + + //- Minimum pyramid volume. Is absolute volume of cell pyramid. + // Set to a sensible fraction of the smallest cell volume expected. + // Set to very negative number (e.g. -1E30) to disable. + minVol 1e-13; + + //- Minimum quality of the tet formed by the face-centre + // and variable base point minimum decomposition triangles and + // the cell centre. Set to very negative number (e.g. -1E30) to + // disable. + // <0 = inside out tet, + // 0 = flat tet + // 1 = regular tet + minTetQuality 1e-30; + + //- Minimum face area. Set to <0 to disable. + minArea -1; + + //- Minimum face twist. Set to <-1 to disable. dot product of face normal + // and face centre triangles normal + minTwist 0.05; + + //- Minimum normalised cell determinant + // 1 = hex, <= 0 = folded or flattened illegal cell + minDeterminant 0.001; + + //- minFaceWeight (0 -> 0.5) + minFaceWeight 0.05; + + //- minVolRatio (0 -> 1) + minVolRatio 0.01; + + //must be >0 for Fluent compatibility + minTriangleTwist -1; + + // Advanced + + //- Number of error distribution iterations + nSmoothScale 4; + //- Amount to scale back displacement at error points + errorReduction 0.75; +} + +// Advanced + +// Merge tolerance. Is fraction of overall bounding box of initial mesh. +// Note: the write tolerance needs to be higher than this. +mergeTolerance 1e-6; + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean new file mode 100755 index 00000000000..e3c5c15e9c9 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allclean @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +(cd background && ./Allclean) +(cd floatingBody && ./Allclean) + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun new file mode 100755 index 00000000000..95ffcc4bf4c --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun @@ -0,0 +1,10 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +./Allrun.pre +(cd background && runApplication $(getApplication)) + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre new file mode 100755 index 00000000000..a69774179d3 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/Allrun.pre @@ -0,0 +1,8 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# mesh floating body +(cd floatingBody && ./Allrun.pre) + +# Add background mesh +(cd background && ./Allrun.pre) diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U new file mode 100644 index 00000000000..a63b70f9b0f --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/U @@ -0,0 +1,45 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volVectorField; + location "0"; + object U; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -1 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type fixedValue; + value uniform (0 0 0); + } + atmosphere + { + type pressureInletOutletVelocity; + value uniform (0 0 0); + } + floatingObject + { + type movingWallVelocity; + value uniform (0 0 0); + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water new file mode 100644 index 00000000000..672fe184cef --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/alpha.water @@ -0,0 +1,44 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: overlap | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object alpha.water; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type zeroGradient; + } + atmosphere + { + type inletOutlet; + inletValue uniform 0; + value uniform 0; + } + floatingObject + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon new file mode 100644 index 00000000000..55bbd29c2f1 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/epsilon @@ -0,0 +1,52 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object epsilon; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -3 0 0 0 0]; + +internalField uniform 0.1; + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type epsilonWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0.1; + } + atmosphere + { + type inletOutlet; + inletValue uniform 0.1; + value uniform 0.1; + } + floatingObject + { + type epsilonWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0.1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k new file mode 100644 index 00000000000..b1a20190857 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/k @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object k; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -2 0 0 0 0]; + +internalField uniform 0.1; + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type kqRWallFunction; + value uniform 0.1; + } + atmosphere + { + type inletOutlet; + inletValue uniform 0.1; + value uniform 0.1; + } + floatingObject + { + type kqRWallFunction; + value uniform 0.1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut new file mode 100644 index 00000000000..282297cbd88 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/nut @@ -0,0 +1,51 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object nut; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 2 -1 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type nutkWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0; + } + atmosphere + { + type calculated; + value uniform 0; + } + floatingObject + { + type nutkWallFunction; + Cmu 0.09; + kappa 0.41; + E 9.8; + value uniform 0; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh new file mode 100644 index 00000000000..75ac340beaf --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/p_rgh @@ -0,0 +1,53 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + object p_rgh; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [1 -1 -2 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + oversetPatch + { + type overset; + } + stationaryWalls + { + type fixedFluxPressure; + } + atmosphere + { + type totalPressure; + p0 uniform 0; + U U; + phi phi; + rho rho; + psi none; + gamma 1; + value uniform 0; + } + floatingObject + { + type fixedFluxPressure; + } + overset + { + patchType overset; + type fixedFluxPressure; + } +} + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement new file mode 100644 index 00000000000..d23a59c0e10 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/pointDisplacement @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class pointVectorField; + object pointDisplacement; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 0 0 0 0 0]; + +internalField uniform (0 0 0); + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type fixedValue; + value uniform (0 0 0); + } + atmosphere + { + type fixedValue; + value uniform (0 0 0); + } + floatingObject + { + type calculated; + value uniform (0 0 0); + } + oversetPatch + { + patchType overset; + type zeroGradient; + } + sides + { + patchType overset; + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID new file mode 100644 index 00000000000..384338071d3 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/0.org/zoneID @@ -0,0 +1,42 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: overlap | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class volScalarField; + location "0"; + object zoneID; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 0 0 0 0 0 0]; + +internalField uniform 0; + +boundaryField +{ + //- Set patchGroups for constraint patches + #includeEtc "caseDicts/setConstraintTypes" + + stationaryWalls + { + type zeroGradient; + } + atmosphere + { + type zeroGradient; + } + floatingObject + { + type zeroGradient; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean new file mode 100755 index 00000000000..d16400a94f6 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allclean @@ -0,0 +1,11 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -rf 0 > /dev/null 2>&1 + +cleanCase + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre new file mode 100755 index 00000000000..78da51948ae --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/Allrun.pre @@ -0,0 +1,17 @@ +#!/bin/sh +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Create background mesh +runApplication blockMesh + +# Add the cylinder mesh +runApplication mergeMeshes . ../floatingBody -overwrite + +# Select cellSets for the different zones +runApplication topoSet + +# Copy standard fields +rm -rf 0 && cp -r 0.org 0 + +# Use cellSets to write zoneID +runApplication setFields diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/background.foam b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/background.foam new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict new file mode 100644 index 00000000000..197de15a524 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/dynamicMeshDict @@ -0,0 +1,104 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object motionProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +motionSolverLibs ("libsixDoFRigidBodyMotion.so"); + + +dynamicFvMesh dynamicOversetFvMesh; + +dynamicOversetFvMeshCoeffs +{ +} + +solver sixDoFRigidBodyMotion; + +sixDoFRigidBodyMotionCoeffs +{ + + patches (floatingObject); + innerDistance 100.0; + outerDistance 101.0; + + centreOfMass (0.5 0.5 0.3); + + // Cuboid dimensions + Lx 0.24; + Ly 0.24; + Lz 0.4; + + // Density of the solid + rhoSolid 700; + + // Cuboid mass + mass #calc "$rhoSolid*$Lx*$Ly*$Lz"; + + // Cuboid moment of inertia about the centre of mass + momentOfInertia #codeStream + { + codeInclude + #{ + #include "diagTensor.H" + #}; + + code + #{ + scalar sqrLx = sqr($Lx); + scalar sqrLy = sqr($Ly); + scalar sqrLz = sqr($Lz); + os << + $mass + *diagTensor(sqrLy + sqrLz, sqrLx + sqrLz, sqrLx + sqrLy)/12.0; + #}; + }; + + report on; + accelerationRelaxation 0.6; + + solver + { + type Newmark; + } + + constraints + { + + /* + fixedPoint + { + sixDoFRigidBodyMotionConstraint point; + centreOfRotation (0.5 0.45 0.1); + } + */ + + fixedLine + { + sixDoFRigidBodyMotionConstraint line; + //centreOfRotation (0.5 0.45 0.1); + direction (0 0 1); + } + + /* + fixedAxis + { + sixDoFRigidBodyMotionConstraint axis; + axis (0 1 0); + } + */ + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g new file mode 100644 index 00000000000..897615a50df --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/g @@ -0,0 +1,22 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class uniformDimensionedVectorField; + location "constant"; + object g; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +dimensions [0 1 -2 0 0 0 0]; +value ( 0 0 -9.81 ); + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties new file mode 100644 index 00000000000..3729fc7648b --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/transportProperties @@ -0,0 +1,37 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +phases (water air); + +water +{ + transportModel Newtonian; + nu nu [ 0 2 -1 0 0 0 0 ] 1e-06; + rho rho [ 1 -3 0 0 0 0 0 ] 998.2; +} + +air +{ + transportModel Newtonian; + nu nu [ 0 2 -1 0 0 0 0 ] 1.48e-05; + rho rho [ 1 -3 0 0 0 0 0 ] 1; +} + +sigma sigma [ 1 0 -2 0 0 0 0 ] 0; + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties new file mode 100644 index 00000000000..cd2daf8229b --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/constant/turbulenceProperties @@ -0,0 +1,30 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object turbulenceProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +simulationType RAS; + +RAS +{ + RASModel kEpsilon; + + turbulence on; + + printCoeffs on; +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict new file mode 100644 index 00000000000..bff73562f4c --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/blockMeshDict @@ -0,0 +1,76 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (0 0 0) + (1 0 0) + (1 1 0) + (0 1 0) + (0 0 1) + (1 0 1) + (1 1 1) + (0 1 1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (35 35 35) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + // Dummy patch to trigger overset interpolation before any other + // bcs + oversetPatch + { + type overset; + faces (); + } + + stationaryWalls + { + type wall; + faces + ( + (0 3 2 1) + (2 6 5 1) + (1 5 4 0) + (3 7 6 2) + (0 4 7 3) + ); + } + atmosphere + { + type patch; + faces + ( + (4 5 6 7) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict new file mode 100644 index 00000000000..a21e0935f31 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/controlDict @@ -0,0 +1,57 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Load the additional patches, patchFields etc. +libs ("liboverset.so"); + +application overInterDyMFoam ; + +startFrom startTime; + +startTime 0.0; + +stopAt endTime; + +endTime 4; + +deltaT 0.001; + +writeControl adjustableRunTime; + +writeInterval 0.05; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep yes; + +maxCo 2.0; +maxAlphaCo 2.0; +maxDeltaT 1; + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict new file mode 100644 index 00000000000..ede2181dfee --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/decomposeParDict @@ -0,0 +1,29 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: plus | +| \\ / A nd | Web: www.OpenFOAM.com | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 4; + +method hierarchical; + +hierarchicalCoeffs +{ + n (2 2 1); + delta 0.001; + order xyz; +} + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes new file mode 100644 index 00000000000..bc6574b81bc --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSchemes @@ -0,0 +1,70 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 2.3.0 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + div(rhoPhi,U) Gauss limitedLinearV 1; + div(U) Gauss linear; + div(phi,alpha) Gauss vanLeer; + div(phirb,alpha) Gauss linear; + div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear; + + div(phi,k) Gauss upwind; + div(phi,epsilon) Gauss upwind; + div(phi,omega) Gauss upwind; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +oversetInterpolation +{ + method inverseDistance; +} + +fluxRequired +{ + default no; + p_rgh; + pcorr; + alpha.water; +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution new file mode 100644 index 00000000000..d786f239265 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/fvSolution @@ -0,0 +1,110 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 2.3.0 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + + "cellDisplacement.*" + { + solver PCG; + preconditioner DIC; + + tolerance 1e-06; + relTol 0; + maxIter 100; + } + + "alpha.water.*" + { + nAlphaCorr 2; + nAlphaSubCycles 1; + cAlpha 1; + icAlpha 0; + + + MULESCorr yes; + nLimiterIter 5; + alphaApplyPrevCorr no; + + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0; + } + + "pcorr.*" + { + solver PCG; + preconditioner DIC; + tolerance 1e-9; + relTol 0; + } + + p_rgh + { + solver PBiCGStab; + preconditioner DILU; + tolerance 1e-9; + relTol 0.01; + } + + p_rghFinal + { + $p_rgh; + relTol 0; + } + + "(U|k|omega|epsilon).*" + { + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-08; + relTol 0; + } +} + +PIMPLE +{ + momentumPredictor no; + nOuterCorrectors 3; + nCorrectors 1; + nNonOrthogonalCorrectors 0; + + ddtCorr yes; + correctPhi no; + + moveMeshOuterCorrectors no; + turbOnFinalIterOnly no; +} + +relaxationFactors +{ + fields + { + } + equations + { + ".*" 1; + } +} + +cache +{ + grad(U); +} + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict new file mode 100644 index 00000000000..0c2bb614d27 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/setFieldsDict @@ -0,0 +1,64 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue alpha.water 0 + volScalarFieldValue zoneID 123 +); + +regions +( + boxToCell + { + box ( -100 -100 -100 ) ( 100 100 0.5368 ); + fieldValues ( volScalarFieldValue alpha.water 1 ); + } + + boxToCell + { + box ( 0.7 0.8 -100 ) ( 100 100 0.75 ); + fieldValues ( volScalarFieldValue alpha.water 1 ); + } + cellToCell + { + set c0; + + fieldValues + ( + volScalarFieldValue zoneID 0 + ); + } + cellToCell + { + set c1; + + fieldValues + ( + volScalarFieldValue zoneID 1 + ); + } + +); + + + + + + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict new file mode 100644 index 00000000000..7b957344b89 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/background/system/topoSetDict @@ -0,0 +1,48 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source regionToCell; + sourceInfo + { + insidePoints ((0.1 0.1 0.1)); + } + } + + { + name c1; + type cellSet; + action new; + source cellToCell; + sourceInfo + { + set c0; + } + } + + { + name c1; + type cellSet; + action invert; + } +); + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean new file mode 100755 index 00000000000..d16400a94f6 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allclean @@ -0,0 +1,11 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial clean functions +. $WM_PROJECT_DIR/bin/tools/CleanFunctions + +rm -rf 0 > /dev/null 2>&1 + +cleanCase + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre new file mode 100755 index 00000000000..36d051548df --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/Allrun.pre @@ -0,0 +1,14 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Set application name +application=`getApplication` + +runApplication blockMesh +runApplication topoSet +runApplication subsetMesh -overwrite c0 -patch floatingObject + +# ----------------------------------------------------------------- end-of-file diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict new file mode 100644 index 00000000000..300835baa5e --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/blockMeshDict @@ -0,0 +1,62 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 1; + +vertices +( + (0.3 0.3 0.1) + (0.7 0.3 0.1) + (0.7 0.7 0.1) + (0.3 0.7 0.1) + (0.3 0.3 0.8) + (0.7 0.3 0.8) + (0.7 0.7 0.8) + (0.3 0.7 0.8) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (20 20 30) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + sides + { + type overset; + faces + ( + (0 3 2 1) + (2 6 5 1) + (1 5 4 0) + (3 7 6 2) + (0 4 7 3) + (4 5 6 7) + ); + } + floatingObject + { + type wall; + faces (); + } +); + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict new file mode 100644 index 00000000000..6510d78a122 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/controlDict @@ -0,0 +1,54 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application interDyMFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 6; + +deltaT 0.01; + +writeControl adjustableRunTime; + +writeInterval 0.1; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 12; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +adjustTimeStep yes; + +maxCo 1; +maxAlphaCo 1; +maxDeltaT 1; + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes new file mode 100644 index 00000000000..88424a730cb --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSchemes @@ -0,0 +1,62 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; +} + +divSchemes +{ + div(rhoPhi,U) Gauss vanLeerV; + div(phi,alpha) Gauss vanLeer; + div(phirb,alpha) Gauss linear; + div(phi,k) Gauss upwind; + div(phi,epsilon) Gauss upwind; + div((muEff*dev(T(grad(U))))) Gauss linear; +} + +laplacianSchemes +{ + default Gauss linear corrected; +} + +interpolationSchemes +{ + default linear; +} + +snGradSchemes +{ + default corrected; +} + +fluxRequired +{ + default no; + p_rgh; + pcorr; + alpha.water; +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution new file mode 100644 index 00000000000..b391dcbc82a --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/fvSolution @@ -0,0 +1,139 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + "alpha.water.*" + { + nAlphaCorr 1; + nAlphaSubCycles 1; + cAlpha 1; + + MULESCorr yes; + nLimiterIter 5; + alphaApplyPrevCorr true; + + solver smoothSolver; + smoother symGaussSeidel; + tolerance 1e-8; + relTol 0; + } + + "pcorr.*" + { + solver PCG; + preconditioner + { + preconditioner GAMG; + tolerance 1e-5; + relTol 0; + smoother DICGaussSeidel; + nPreSweeps 0; + nPostSweeps 2; + nFinestSweeps 2; + cacheAgglomeration false; + nCellsInCoarsestLevel 10; + agglomerator faceAreaPair; + mergeLevels 1; + } + + tolerance 1e-05; + relTol 0; + maxIter 100; + } + + p_rgh + { + solver GAMG; + tolerance 1e-8; + relTol 0.01; + smoother DIC; + nPreSweeps 0; + nPostSweeps 2; + nFinestSweeps 2; + cacheAgglomeration true; + nCellsInCoarsestLevel 10; + agglomerator faceAreaPair; + mergeLevels 1; + } + + p_rghFinal + { + solver PCG; + preconditioner + { + preconditioner GAMG; + tolerance 1e-8; + relTol 0; + nVcycles 2; + smoother DICGaussSeidel; + nPreSweeps 2; + nPostSweeps 2; + nFinestSweeps 2; + cacheAgglomeration true; + nCellsInCoarsestLevel 10; + agglomerator faceAreaPair; + mergeLevels 1; + } + + tolerance 1e-8; + relTol 0; + maxIter 20; + } + + "(U|k|epsilon)" + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-6; + relTol 0.1; + nSweeps 1; + } + + "(U|k|epsilon)Final" + { + solver smoothSolver; + smoother GaussSeidel; + tolerance 1e-6; + relTol 0; + nSweeps 1; + } +} + +PIMPLE +{ + momentumPredictor no; + nOuterCorrectors 5; + nCorrectors 1; + nNonOrthogonalCorrectors 0; + correctPhi yes; + moveMeshOuterCorrectors yes; +} + +relaxationFactors +{ + fields + { + } + equations + { + ".*" 1; + } +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict new file mode 100644 index 00000000000..2506a693af0 --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/setFieldsDict @@ -0,0 +1,39 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object setFieldsDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defaultFieldValues +( + volScalarFieldValue alpha.water 0 +); + +regions +( + boxToCell + { + box ( -100 -100 -100 ) ( 100 100 0.5368 ); + fieldValues ( volScalarFieldValue alpha.water 1 ); + } + + boxToCell + { + box ( 0.7 0.8 -100 ) ( 100 100 0.65 ); + fieldValues ( volScalarFieldValue alpha.water 1 ); + } +); + + +// ************************************************************************* // diff --git a/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict new file mode 100644 index 00000000000..2f271d34d3e --- /dev/null +++ b/tutorials/multiphase/overInterDyMFoam/floatingBody/floatingBody/system/topoSetDict @@ -0,0 +1,38 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + { + name c0; + type cellSet; + action new; + source boxToCell; + sourceInfo + { + box (0.38 0.38 0.2) (0.62 0.62 0.6); + } + } + + { + name c0; + type cellSet; + action invert; + } +); + +// ************************************************************************* // -- GitLab