Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "smoothDelta.H"
00027 #include <OpenFOAM/addToRunTimeSelectionTable.H>
00028 #include <OpenFOAM/FaceCellWave.H>
00029
00030
00031
00032 namespace Foam
00033 {
00034
00035
00036
00037 defineTypeNameAndDebug(smoothDelta, 0);
00038 addToRunTimeSelectionTable(LESdelta, smoothDelta, dictionary);
00039
00040 scalar smoothDelta::deltaData::maxDeltaRatio = 1.2;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 void smoothDelta::setChangedFaces
00057 (
00058 const polyMesh& mesh,
00059 const volScalarField& delta,
00060 DynamicList<label>& changedFaces,
00061 DynamicList<deltaData>& changedFacesInfo
00062 )
00063 {
00064 for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
00065 {
00066 scalar ownDelta = delta[mesh.faceOwner()[faceI]];
00067
00068 scalar neiDelta = delta[mesh.faceNeighbour()[faceI]];
00069
00070
00071
00072 if (ownDelta > deltaData::maxDeltaRatio * neiDelta)
00073 {
00074 changedFaces.append(faceI);
00075 changedFacesInfo.append(deltaData(ownDelta));
00076 }
00077 else if (neiDelta > deltaData::maxDeltaRatio * ownDelta)
00078 {
00079 changedFaces.append(faceI);
00080 changedFacesInfo.append(deltaData(neiDelta));
00081 }
00082 }
00083
00084
00085
00086 forAll(mesh.boundaryMesh(), patchI)
00087 {
00088 const polyPatch& patch = mesh.boundaryMesh()[patchI];
00089
00090 if (patch.coupled())
00091 {
00092 forAll(patch, patchFaceI)
00093 {
00094 label meshFaceI = patch.start() + patchFaceI;
00095
00096 scalar ownDelta = delta[mesh.faceOwner()[meshFaceI]];
00097
00098 changedFaces.append(meshFaceI);
00099 changedFacesInfo.append(deltaData(ownDelta));
00100 }
00101 }
00102 }
00103
00104 changedFaces.shrink();
00105 changedFacesInfo.shrink();
00106 }
00107
00108
00109 void smoothDelta::calcDelta()
00110 {
00111 deltaData::maxDeltaRatio = maxDeltaRatio_;
00112 const volScalarField& geometricDelta = geometricDelta_();
00113
00114
00115 DynamicList<label> changedFaces(mesh_.nFaces()/100 + 100);
00116 DynamicList<deltaData> changedFacesInfo(changedFaces.size());
00117
00118 setChangedFaces(mesh_, geometricDelta, changedFaces, changedFacesInfo);
00119
00120
00121 List<deltaData> cellDeltaData(mesh_.nCells());
00122
00123 forAll(geometricDelta, cellI)
00124 {
00125 cellDeltaData[cellI] = geometricDelta[cellI];
00126 }
00127
00128
00129 List<deltaData> faceDeltaData(mesh_.nFaces());
00130
00131
00132
00133 FaceCellWave<deltaData> deltaCalc
00134 (
00135 mesh_,
00136 changedFaces,
00137 changedFacesInfo,
00138 faceDeltaData,
00139 cellDeltaData,
00140 mesh_.globalData().nTotalCells()
00141 );
00142
00143 forAll(delta_, cellI)
00144 {
00145 delta_[cellI] = cellDeltaData[cellI].delta();
00146 }
00147 }
00148
00149
00150
00151
00152 smoothDelta::smoothDelta
00153 (
00154 const word& name,
00155 const fvMesh& mesh,
00156 const dictionary& dd
00157 )
00158 :
00159 LESdelta(name, mesh),
00160 geometricDelta_
00161 (
00162 LESdelta::New("geometricDelta", mesh, dd.subDict(type() + "Coeffs"))
00163 ),
00164 maxDeltaRatio_
00165 (
00166 readScalar(dd.subDict(type() + "Coeffs").lookup("maxDeltaRatio"))
00167 )
00168 {
00169 calcDelta();
00170 }
00171
00172
00173
00174
00175 void smoothDelta::read(const dictionary& d)
00176 {
00177 const dictionary& dd(d.subDict(type() + "Coeffs"));
00178
00179 geometricDelta_().read(dd);
00180 dd.lookup("maxDeltaRatio") >> maxDeltaRatio_;
00181 calcDelta();
00182 }
00183
00184
00185 void smoothDelta::correct()
00186 {
00187 geometricDelta_().correct();
00188
00189 if (mesh_.changing())
00190 {
00191 calcDelta();
00192 }
00193 }
00194
00195
00196
00197
00198 }
00199
00200