Class ValueLayerDiffuser

java.lang.Object
repast.simphony.valueLayer.ValueLayerDiffuser

public class ValueLayerDiffuser extends Object
This implements a diffusion algorithm on a grid value layer. By setting the diffusion constant and the evaporation constant you can control the way the diffusion occurs. Also, this allows you to specify whether the diffusion should act as though the space is toroidal (meaning the edges are connected to each other), or not. If the space is not toroidal then the edge of the space is considered a "value sink", meaning any values that hit it are evacuated out of the space (ie, if this space is diffusing heat, this acts as though there is a perfect heat sink around the space).

A diffusion constant of 1.0 means that all the values at a specific spot are diffused away, so if the space looks like [0, 10, 0] diffusing (assuming no evaporation) gives [5, 0, 5].

An evaporation is used as a multiplier against the values in the space, this means that a rate of 1.0 means no evaporation, and a rate of 0.0 means instantaneous evaporation. So, going off the previous example, with a diffusion constant of 1.0 and an evaporation rate of 0.0, [0, 10, 0] diffuses to be [2.5, 0, 2.5].

Author:
Jerry Vos
  • Field Details

    • DEFAULT_MAX

      public static final double DEFAULT_MAX
      See Also:
    • DEFAULT_MIN

      public static final double DEFAULT_MIN
      See Also:
    • DEFAULT_EVAP_CONST

      public static final double DEFAULT_EVAP_CONST
      See Also:
    • DEFAULT_DIFF_CONST

      public static final double DEFAULT_DIFF_CONST
      See Also:
    • valueLayer

      protected IGridValueLayer valueLayer
    • maxValue

      protected double maxValue
    • minValue

      protected double minValue
    • evaporationConst

      protected double evaporationConst
    • diffusionConst

      protected double diffusionConst
    • toroidal

      protected boolean toroidal
    • computedVals

      protected transient Object computedVals
  • Constructor Details

    • ValueLayerDiffuser

      public ValueLayerDiffuser()
      Constructs this with the default evaporation and diffusion constants. Before this diffuser can be used, a value layer must be set through the setValueLayer(GridValueLayer) method.

      This is the same as new ValueLayer(null, DEFAULT_EVAP_CONST, DEFAULT_DIFF_CONST)

      See Also:
    • ValueLayerDiffuser

      public ValueLayerDiffuser(IGridValueLayer valueLayer, double evaporationConst, double diffusionConst)
      Constructs this with the specified evaporation and diffusion constants. This also has the diffusion acting in a toroidal manner, so values from the edges will be diffused to the other side of the space.

      This is the same as new ValueLayer(valueLayer, evaporationConst, diffusionConstant, true)

      Parameters:
      valueLayer - the layer this will be diffusing values on
      evaporationConst - the constant used for evaporating values off the layer
      diffusionConst - the constant used for diffusing values on the layer
    • ValueLayerDiffuser

      public ValueLayerDiffuser(IGridValueLayer valueLayer, double evaporationConst, double diffusionConst, boolean toroidal)
      Constructs this with the specified evaporation constant, diffusion constant, and toroidal'ness.
      Parameters:
      valueLayer - the layer this will be diffusing values on
      evaporationConst - the constant used for evaporating values off the layer
      diffusionConst - the constant used for diffusing values on the layer
      toroidal - if this should act as though the edges of the layer are connected
  • Method Details

    • getValue

      protected double getValue(double... coords)
      Retrieves a value from the layer, taking into account the toroidal'ness.
      Parameters:
      coords - the coordinates
      Returns:
      the value at the specified coordinate
    • inBounds

      protected double inBounds(double... coords)
      Returns 1 if the coordinates are in the layer's bounds, otherwise returns 0.0.
      Parameters:
      coords - the coordinates to check
      Returns:
      1 or 0.0
    • constrainByMinMax

      protected double constrainByMinMax(double val)
      Massages the value into the range specified by [minValue, maxValue].
      Parameters:
      val - the value to bring into range (if necessary)
      Returns:
      the value
    • computeVals

      protected void computeVals()
      Computes all the values for the space.
    • diffuse

      public void diffuse()
      Runs the diffusion with the current rates and values. Following the Swarm class, it is roughly newValue = evap(ownValue + diffusionConstant * (nghAvg - ownValue)) where nghAvg is the weighted average of a cells neighbors, and ownValue is the current value for the current cell.

      Values from the value layer are used to calculate diffusion. This value is then written to a buffer. When this has been done for every cell in the grid, the buffer is copied to the value layer.

    • getDiffusionConst

      public double getDiffusionConst()
    • setDiffusionConst

      public void setDiffusionConst(double diffusionConst)
    • getEvaporationConst

      public double getEvaporationConst()
    • setEvaporationConst

      public void setEvaporationConst(double evapRate)
    • getMaxValue

      public double getMaxValue()
    • setMaxValue

      public void setMaxValue(double max)
    • getMinValue

      public double getMinValue()
    • setMinValue

      public void setMinValue(double min)
    • isToroidal

      public boolean isToroidal()
    • setToroidal

      public void setToroidal(boolean toroidal)
    • getValueLayer

      public ValueLayer getValueLayer()
    • setValueLayer

      public void setValueLayer(IGridValueLayer valueLayer)