/// <summary>
        /// Fluid cells are "0", void cells are "1"
        /// </summary>
        /// <param name="program"></param>
        /// <returns></returns>
        public (int noOfClasses, int[] cellToPerformanceClassMap) ClassifyCells(IProgram <CNSControl> program)
        {
            ImmersedSpeciesMap speciesMap = program.SpeciesMap as ImmersedSpeciesMap;
            IBMControl         ibmControl = program.Control as IBMControl;

            if (speciesMap == null || ibmControl == null)
            {
                throw new Exception("IBM classifier only valid for IBM runs");
            }

            // Fluid and cut cells are "0"
            int J = program.GridData.iLogicalCells.NoOfLocalUpdatedCells;

            int[] cellToPerformanceClassMap = new int[J];

            // Void cells are "1"
            foreach (int j in speciesMap.Tracker.Regions.GetSpeciesMask(ibmControl.VoidSpeciesName).ItemEnum)
            {
                cellToPerformanceClassMap[j] = 1;
            }

            int noOfClasses = 2;

            return(noOfClasses, cellToPerformanceClassMap);
        }
示例#2
0
        /// <summary>
        /// Standard cells are "0", cut cells are "1", void cells are "2"
        /// </summary>
        /// <param name="program"></param>
        /// <returns></returns>
        public (int noOfClasses, int[] cellToPerformanceClassMap) ClassifyCells(IProgram <CNSControl> program)
        {
            ImmersedSpeciesMap speciesMap = program.SpeciesMap as ImmersedSpeciesMap;
            IBMControl         ibmControl = program.Control as IBMControl;

            if (speciesMap == null || ibmControl == null)
            {
                throw new Exception("IBM classifier only valid for IBM runs");
            }

            // Pure fluid cells are "0"
            int[] cellToPerformanceClassMap = new int[program.Grid.NoOfUpdateCells];

            // Cut cells are "1"
            foreach (int j in speciesMap.Tracker.Regions.GetCutCellMask().ItemEnum)
            {
                cellToPerformanceClassMap[j] = 1;
            }

            // Void cells are "2"
            foreach (int j in speciesMap.Tracker.Regions.GetSpeciesMask(ibmControl.VoidSpeciesName).ItemEnum)
            {
                cellToPerformanceClassMap[j] = 2;
            }

            int noOfClasses = 3;

            return(noOfClasses, cellToPerformanceClassMap);
        }
示例#3
0
        /// <summary>
        /// Constructs a new flux builder.
        /// </summary>
        /// <param name="control"></param>
        /// <param name="boundaryMap"></param>
        /// <param name="speciesMap"></param>
        /// <param name="gridData"></param>
        public OptimizedSIPGFluxBuilder(CNSControl control, IBoundaryConditionMap boundaryMap, ISpeciesMap speciesMap, GridData gridData)
            : base(control, boundaryMap, speciesMap)
        {
            this.gridData = gridData;

            //Create Functions for calculation the cell metric, needed as Func<> because
            //LevelSet field and HMF options are not known at this point
            if (speciesMap is IBM.ImmersedSpeciesMap)
            {
                // IBM case
                ImmersedSpeciesMap IBMspeciesMap = speciesMap as ImmersedSpeciesMap;
                cellMetricFunc = delegate() {
                    SpeciesId             species    = IBMspeciesMap.Tracker.GetSpeciesId(IBMspeciesMap.Control.FluidSpeciesName);
                    MultidimensionalArray cellMetric = IBMspeciesMap.CellAgglomeration.CellLengthScales[species].CloneAs();
                    cellMetric.ApplyAll(x => 1 / x);
                    // Needed, because 1/x produces NaN in void cells and can happen that penalty factor leads then to NaN
                    cellMetric.ApplyAll(delegate(double x) {
                        if (double.IsNaN(x) || double.IsInfinity(x))
                        {
                            return(0);
                        }
                        else
                        {
                            return(x);
                        }
                    });
                    return(cellMetric);
                };
            }
            else
            {
                // Non-IBM
                cellMetricFunc = () => gridData.Cells.cj;
            }
        }
示例#4
0
 public ZhangPosivityPreservingLimiter(double epsilon, ImmersedSpeciesMap speciesMap, IEnumerable <IChunkRulePair <QuadRule> > quadRuleSet)
 {
     this.epsilon     = epsilon;
     this.speciesMap  = speciesMap;
     this.quadRuleSet = quadRuleSet;
 }