/// <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); }
/// <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); }
/// <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; } }
public ZhangPosivityPreservingLimiter(double epsilon, ImmersedSpeciesMap speciesMap, IEnumerable <IChunkRulePair <QuadRule> > quadRuleSet) { this.epsilon = epsilon; this.speciesMap = speciesMap; this.quadRuleSet = quadRuleSet; }