/// <summary> /// Compares the simulation cell's Tst value to the transitions Tst min and max /// </summary> /// <param name="simulationCell">The simulation cell</param> /// <param name="tr">The transition</param> /// <returns>TRUE if the cell's Tst is in range and FALSE if not.</returns> /// <remarks></remarks> private bool CompareTstValues(Cell simulationCell, Transition tr) { //If the transition's Transition Type doesn't have an associated Transition Group in //Time-Since-Transition groups then return True. TstTransitionGroup tstgroup = this.m_TstTransitionGroupMap.GetGroup( tr.TransitionTypeId, simulationCell.StratumId, simulationCell.SecondaryStratumId, simulationCell.TertiaryStratumId); if (tstgroup == null) { return(true); } //Get the matching Tst for the simulation cell Tst cellTst = simulationCell.TstValues[tstgroup.TSTGroupId]; //If the cell Tst value is within the Transition's TstMin and TstMax range then return TRUE if (cellTst.TstValue >= tr.TstMinimum && cellTst.TstValue <= tr.TstMaximum) { return(true); } return(false); }
public void AddGroup(int transitionTypeId, int?stratumId, int?secondaryStratumId, int?tertiaryStratumId, TstTransitionGroup item) { TstTransitionGroup v = this.m_Map.GetItemExact(transitionTypeId, stratumId, secondaryStratumId, tertiaryStratumId); if (v != null) { string template = "A duplicate Time-Since-Transition Group was detected: More information:" + Environment.NewLine + "Transition Type={0}, {1}={2}, {3}={4}, {5}={6}."; ExceptionUtils.ThrowArgumentException(template, this.GetTransitionTypeName(transitionTypeId), this.PrimaryStratumLabel, this.GetStratumName(stratumId), this.SecondaryStratumLabel, this.GetSecondaryStratumName(secondaryStratumId), this.TertiaryStratumLabel, this.GetTertiaryStratumName(tertiaryStratumId)); } this.m_Map.AddItem(transitionTypeId, stratumId, secondaryStratumId, tertiaryStratumId, item); this.SetHasItems(); }
private void ApplyTransitionSpread(Cell contagionCell, Cell neighboringCell, TransitionGroup spreadGroup, int iteration, int timestep, bool isDiagonal, CardinalDirection direction, Dictionary <int, double[]> rasterTransitionAttrValues, Dictionary <int, int[]> dictTransitionedPixels) { Debug.Assert(this.IsSpatial); //Get the cell probability. If it is less than or equal to zero we don't need to continue //DEVTODO: LEO, is this OK with the new Transition Prioritization Code? double CellProbability = this.SpatialCalculateCellProbability(neighboringCell, spreadGroup.TransitionGroupId, iteration, timestep); if (CellProbability <= 0.0) { return; } //Get the transition pathway. If there isn't one we don't need to continue Transition tr = this.SelectTransitionPathway(neighboringCell, spreadGroup.TransitionGroupId, iteration, timestep); if (tr == null) { return; } //Prepare a TST value with a default of 1. If we can find a TST group for the contagion cell's stratum and transition type, and //the the contagion cells TST values contains that group, then use that TST value. int tstvalue = 1; TstTransitionGroup tstgroup = this.m_TstTransitionGroupMap.GetGroup( tr.TransitionTypeId, contagionCell.StratumId, contagionCell.SecondaryStratumId, contagionCell.TertiaryStratumId); if (tstgroup != null) { if (contagionCell.TstValues.Contains(tstgroup.TSTGroupId)) { tstvalue = contagionCell.TstValues[tstgroup.TSTGroupId].TstValue; } } if (tstvalue > 0) { double MinThreshold = 0; double MaxThreshold = 0; double SpreadDistance = this.CalculateSpreadDistance(contagionCell, tstvalue, spreadGroup, iteration, timestep); double NeighborDistance = this.GetNeighborCellDistance(direction); double Slope = GetSlope(contagionCell, neighboringCell, NeighborDistance); SpreadDistance *= this.m_TransitionDirectionMultiplierMap.GetDirectionMultiplier(spreadGroup.TransitionGroupId, contagionCell.StratumId, contagionCell.SecondaryStratumId, contagionCell.TertiaryStratumId, direction, iteration, timestep); SpreadDistance *= this.m_TransitionSlopeMultiplierMap.GetSlopeMultiplier(spreadGroup.TransitionGroupId, contagionCell.StratumId, contagionCell.SecondaryStratumId, contagionCell.TertiaryStratumId, iteration, timestep, Slope); if (isDiagonal) { MinThreshold = this.m_InputRasters.GetCellSizeDiagonalMeters() / 2; MaxThreshold = this.m_InputRasters.GetCellSizeDiagonalMeters() * 1.5; } else { MinThreshold = this.m_InputRasters.GetCellSizeMeters() / 2; MaxThreshold = this.m_InputRasters.GetCellSizeMeters() * 1.5; } if (SpreadDistance >= MinThreshold && SpreadDistance <= MaxThreshold) { this.RecordSummaryTransitionOutput(neighboringCell, tr, iteration, timestep, null); this.RecordSummaryTransitionByStateClassOutput(neighboringCell, tr, iteration, timestep); this.ChangeCellForProbabilisticTransition(neighboringCell, tr, iteration, timestep, rasterTransitionAttrValues); this.UpdateTransitionedPixels(neighboringCell, tr.TransitionTypeId, dictTransitionedPixels[spreadGroup.TransitionGroupId]); this.FillProbabilisticTransitionsForCell(neighboringCell, iteration, timestep); } else if (SpreadDistance > MaxThreshold) { int randdirection = this.m_RandomGenerator.GetNextInteger(0, 360); Cell DistantCell = GetCellByDistanceAndDirection(contagionCell, randdirection, SpreadDistance); if (DistantCell != null) { Transition DistantTransition = this.SelectTransitionPathway(DistantCell, spreadGroup.TransitionGroupId, iteration, timestep); if (DistantTransition != null) { this.RecordSummaryTransitionOutput(DistantCell, DistantTransition, iteration, timestep, null); this.RecordSummaryTransitionByStateClassOutput(DistantCell, DistantTransition, iteration, timestep); this.ChangeCellForProbabilisticTransition(DistantCell, DistantTransition, iteration, timestep, rasterTransitionAttrValues); this.UpdateTransitionedPixels(DistantCell, DistantTransition.TransitionTypeId, dictTransitionedPixels[spreadGroup.TransitionGroupId]); this.FillProbabilisticTransitionsForCell(DistantCell, iteration, timestep); } } } } }