/// <summary> /// Modulates the result of /// <see cref="EvaluateDivergenceOfIntegrand"/> by the weights /// given by <see cref="EvaluateWeightFunction"/>. /// </summary> protected override void Evaluate(int i0, int Length, QuadRule QR, MultidimensionalArray EvalResult) { NodeSet QuadNodes = QR.Nodes; int NoOfNodes = QuadNodes.NoOfNodes; m_Owner.EvaluateDivergenceOfIntegrand(QuadNodes, i0, Length, EvalResult); m_Owner.EvaluateWeightFunction(QuadNodes, i0, Length, m_WeightBuffer); for (int i = 0; i < Length; i++) { for (int j = 0; j < NoOfNodes; j++) { double gamma = m_WeightBuffer[i, j]; for (int k = 0; k < m_Owner.m_NoOfIntegrands; k++) { EvalResult[i, j, k] *= gamma; } } } }
/// <summary> /// Evaluates the integrand of the surface integral by making use /// of <see cref="EvaluateIntegrand"/> and /// <see cref="EvaluateWeightFunction"/>. /// </summary> protected override void Evaluate(int i0, int Length, CellBoundaryQuadRule QR, MultidimensionalArray EvalResult) { NodeSet QuadNodes = QR.Nodes; m_Owner.EvaluateIntegrand(QuadNodes, i0, Length, m_ResultBuffer); m_Owner.EvaluateWeightFunction(QuadNodes, i0, Length, m_WeightBuffer); int D = m_Owner.m_LevSetTrk.GridDat.SpatialDimension; double[] Normal = new double[D]; GridData grdDat = m_Owner.m_LevSetTrk.GridDat; // loop over cells for (int i = 0; i < Length; i++) { int cellIndex = i + i0; int[] cells2edges = grdDat.Cells.Cells2Edges[cellIndex]; // loop over the edges of a cell int nodeIndex = 0; for (int face = 0; face < CurrentRule.NumbersOfNodesPerFace.Length; face++) { // Try to determine face int edge = -1; double sign = 0.0; for (int e = 0; e < cells2edges.Length; e++) { int trialEdge = cells2edges[e]; sign = Math.Sign(trialEdge); trialEdge = Math.Abs(trialEdge) - 1; if (grdDat.Edges.FaceIndices[trialEdge, sign > 0 ? 0 : 1] == face) { edge = trialEdge; break; } } if (edge < 0) { throw new Exception(); } // load normal; for (int d = 0; d < D; d++) { Normal[d] = grdDat.Edges.NormalsForAffine[edge, d] * sign; } // loop over the nodes of an edge for (int j = 0; j < CurrentRule.NumbersOfNodesPerFace[face]; j++) { // loop over integrands... for (int k = 0; k < m_Owner.m_NoOfIntegrands; k++) { double Acc = 0; for (int d = 0; d < D; d++) { Acc += Normal[d] * m_ResultBuffer[i, nodeIndex, k, d]; } EvalResult[i, nodeIndex, k] = Acc * m_WeightBuffer[i, nodeIndex]; } nodeIndex++; } } } }