Exemplo n.º 1
0
        /// <summary>
        /// Constructs the adapted subdivisions for all cells in
        /// <paramref name="mask"/>. The size of each chunk will be exactly one
        /// since, in general, we cannot expect subsequent cells to have the
        /// same subdivisions.
        /// </summary>
        /// <param name="mask">
        /// <see cref="ISubdivisionStrategy.GetSubdivisionNodes"/>
        /// </param>
        /// <returns>
        /// The subdivisions for all elements in <paramref name="mask"/>,
        /// </returns>
        public IEnumerable <KeyValuePair <Chunk, IEnumerable <SubdivisionNode> > > GetSubdivisionNodes(ExecutionMask mask)
        {
            using (new FuncTrace()) {
                foreach (int iElement in mask.ItemEnum)  // loop over all cells/edges in mask

                {
                    this.subdivisionTree.ResetToSavePoint();

                    double minDistance = EstimateMinDistance(iElement, mask);

                    NestedVertexSet currentSet = baseVertexSet;
                    for (int i = 0; i < maxDivisions; i++)
                    {
                        if (currentSet.NumberOfLocalVertices == 0)
                        {
                            // No new vertices were added during last subdivision
                            break;
                        }

                        int     cell;
                        NodeSet vertices = GetVertices(iElement, currentSet, mask, out cell);

                        MultidimensionalArray levelSetValues = LevelSetData.GetLevSetValues(vertices, cell, 1);

                        subdivisionTree.ReadDistances(levelSetValues.ExtractSubArrayShallow(0, -1));

                        currentSet = new NestedVertexSet(currentSet);
                        subdivisionTree.Subdivide(
                            currentSet,
                            true,
                            minDistance / Math.Pow(2.0, i));
                    }

                    // Finally, read level set values in leaves (needed by IsCut)
                    {
                        int     cell;
                        NodeSet vertices = GetVertices(iElement, currentSet, mask, out cell);
                        if (vertices != null)
                        {
                            MultidimensionalArray levelSetValues = LevelSetData.GetLevSetValues(vertices, cell, 1);

                            subdivisionTree.ReadDistances(levelSetValues.ExtractSubArrayShallow(0, -1));
                        }
                    }

                    yield return(new KeyValuePair <Chunk, IEnumerable <SubdivisionNode> >(
                                     new Chunk()
                    {
                        i0 = iElement,
                        Len = 1
                    },
                                     subdivisionTree.Leaves));
                }
            }
        }