예제 #1
0
            /// <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;
                        }
                    }
                }
            }
예제 #2
0
            /// <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++;
                        }
                    }
                }
            }