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 "face.H"
00027 #include <OpenFOAM/scalarField.H>
00028
00029
00030
00031
00032
00033
00034
00035 Foam::scalar Foam::face::areaInContact
00036 (
00037 const pointField& meshPoints,
00038 const scalarField& v
00039 ) const
00040 {
00041
00042 const labelList& labels = *this;
00043
00044 scalarField vertexValue(labels.size());
00045
00046 forAll (labels, i)
00047 {
00048 vertexValue[i] = v[labels[i]];
00049 }
00050
00051
00052
00053
00054
00055
00056 bool allPositive = true;
00057 bool allNegative = true;
00058
00059 forAll (vertexValue, vI)
00060 {
00061 if (vertexValue[vI] > 0)
00062 {
00063 allNegative = false;
00064 }
00065 else
00066 {
00067 allPositive = false;
00068 }
00069 }
00070
00071 if (allPositive)
00072 {
00073 return 0.0;
00074 }
00075
00076 if (allNegative)
00077 {
00078 return 1.0;
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 const labelList& faceLabels = *this;
00091
00092 pointField newFacePoints(2*size());
00093 label nNewFacePoints = 0;
00094
00095 for (label vI = 0; vI < size() - 1; vI++)
00096 {
00097 if (vertexValue[vI] <= 0)
00098 {
00099
00100 newFacePoints[nNewFacePoints] = meshPoints[faceLabels[vI]];
00101 nNewFacePoints++;
00102 }
00103
00104 if
00105 (
00106 (vertexValue[vI] > 0 && vertexValue[vI + 1] < 0)
00107 || (vertexValue[vI] < 0 && vertexValue[vI + 1] > 0)
00108 )
00109 {
00110
00111 point intersection =
00112 meshPoints[faceLabels[vI]]
00113 + vertexValue[vI]/(vertexValue[vI + 1] - vertexValue[vI])
00114 *(meshPoints[faceLabels[vI]] - meshPoints[faceLabels[vI + 1]]);
00115
00116 newFacePoints[nNewFacePoints] = intersection;
00117 nNewFacePoints++;
00118 }
00119 }
00120
00121
00122 if (vertexValue[size() - 1] <= 0)
00123 {
00124
00125 newFacePoints[nNewFacePoints] = meshPoints[faceLabels[size() - 1]];
00126 nNewFacePoints++;
00127 }
00128
00129 if
00130 (
00131 (vertexValue[size() - 1] > 0 && vertexValue[0] < 0)
00132 || (vertexValue[size() - 1] < 0 && vertexValue[0] > 0)
00133 )
00134 {
00135
00136 point intersection =
00137 meshPoints[faceLabels[size() - 1]]
00138 + vertexValue[size() - 1]/(vertexValue[0] - vertexValue[size() - 1])
00139 *(meshPoints[faceLabels[size() - 1]] - meshPoints[faceLabels[0]]);
00140
00141 newFacePoints[nNewFacePoints] = intersection;
00142 nNewFacePoints++;
00143 }
00144
00145 newFacePoints.setSize(nNewFacePoints);
00146
00147
00148 labelList sfl(newFacePoints.size());
00149
00150 forAll (sfl, sflI)
00151 {
00152 sfl[sflI] = sflI;
00153 }
00154
00155
00156 return face(sfl).mag(newFacePoints)/(mag(meshPoints) + VSMALL);
00157 }
00158
00159
00160