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
00027
00028
00029
00030 #include "primitiveMesh.H"
00031
00032
00033
00034 void Foam::primitiveMesh::calcCellCentresAndVols() const
00035 {
00036 if (debug)
00037 {
00038 Pout<< "primitiveMesh::calcCellCentresAndVols() : "
00039 << "Calculating cell centres and cell volumes"
00040 << endl;
00041 }
00042
00043
00044
00045 if (cellCentresPtr_ || cellVolumesPtr_)
00046 {
00047 FatalErrorIn("primitiveMesh::calcCellCentresAndVols() const")
00048 << "Cell centres or cell volumes already calculated"
00049 << abort(FatalError);
00050 }
00051
00052
00053 cellCentresPtr_ = new vectorField(nCells());
00054 vectorField& cellCtrs = *cellCentresPtr_;
00055
00056
00057 cellVolumesPtr_ = new scalarField(nCells());
00058 scalarField& cellVols = *cellVolumesPtr_;
00059
00060
00061 makeCellCentresAndVols(faceCentres(), faceAreas(), cellCtrs, cellVols);
00062
00063 if (debug)
00064 {
00065 Pout<< "primitiveMesh::calcCellCentresAndVols() : "
00066 << "Finished calculating cell centres and cell volumes"
00067 << endl;
00068 }
00069 }
00070
00071
00072 void Foam::primitiveMesh::makeCellCentresAndVols
00073 (
00074 const vectorField& fCtrs,
00075 const vectorField& fAreas,
00076 vectorField& cellCtrs,
00077 scalarField& cellVols
00078 ) const
00079 {
00080
00081 cellCtrs = vector::zero;
00082 cellVols = 0.0;
00083
00084 const labelList& own = faceOwner();
00085 const labelList& nei = faceNeighbour();
00086
00087
00088
00089
00090 vectorField cEst(nCells(), vector::zero);
00091 labelField nCellFaces(nCells(), 0);
00092
00093 forAll (own, facei)
00094 {
00095 cEst[own[facei]] += fCtrs[facei];
00096 nCellFaces[own[facei]] += 1;
00097 }
00098
00099 forAll (nei, facei)
00100 {
00101 cEst[nei[facei]] += fCtrs[facei];
00102 nCellFaces[nei[facei]] += 1;
00103 }
00104
00105 forAll(cEst, celli)
00106 {
00107 cEst[celli] /= nCellFaces[celli];
00108 }
00109
00110 forAll (own, facei)
00111 {
00112
00113 scalar pyr3Vol =
00114 max(fAreas[facei] & (fCtrs[facei] - cEst[own[facei]]), VSMALL);
00115
00116
00117 vector pc = (3.0/4.0)*fCtrs[facei] + (1.0/4.0)*cEst[own[facei]];
00118
00119
00120 cellCtrs[own[facei]] += pyr3Vol*pc;
00121
00122
00123 cellVols[own[facei]] += pyr3Vol;
00124 }
00125
00126 forAll (nei, facei)
00127 {
00128
00129 scalar pyr3Vol =
00130 max(fAreas[facei] & (cEst[nei[facei]] - fCtrs[facei]), VSMALL);
00131
00132
00133 vector pc = (3.0/4.0)*fCtrs[facei] + (1.0/4.0)*cEst[nei[facei]];
00134
00135
00136 cellCtrs[nei[facei]] += pyr3Vol*pc;
00137
00138
00139 cellVols[nei[facei]] += pyr3Vol;
00140 }
00141
00142 cellCtrs /= cellVols;
00143 cellVols *= (1.0/3.0);
00144 }
00145
00146
00147
00148
00149 const Foam::vectorField& Foam::primitiveMesh::cellCentres() const
00150 {
00151 if (!cellCentresPtr_)
00152 {
00153 calcCellCentresAndVols();
00154 }
00155
00156 return *cellCentresPtr_;
00157 }
00158
00159
00160 const Foam::scalarField& Foam::primitiveMesh::cellVolumes() const
00161 {
00162 if (!cellVolumesPtr_)
00163 {
00164 calcCellCentresAndVols();
00165 }
00166
00167 return *cellVolumesPtr_;
00168 }
00169
00170
00171