Package repast.simphony.valueLayer
Class ValueLayerDiffuser
java.lang.Object
repast.simphony.valueLayer.ValueLayerDiffuser
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 Summary
Modifier and TypeFieldDescriptionprotected Object
static final double
static final double
static final double
static final double
protected double
protected double
protected double
protected double
protected boolean
protected IGridValueLayer
-
Constructor Summary
ConstructorDescriptionConstructs this with the default evaporation and diffusion constants.ValueLayerDiffuser
(IGridValueLayer valueLayer, double evaporationConst, double diffusionConst) Constructs this with the specified evaporation and diffusion constants.ValueLayerDiffuser
(IGridValueLayer valueLayer, double evaporationConst, double diffusionConst, boolean toroidal) Constructs this with the specified evaporation constant, diffusion constant, and toroidal'ness. -
Method Summary
Modifier and TypeMethodDescriptionprotected void
Computes all the values for the space.protected double
constrainByMinMax
(double val) Massages the value into the range specified by [minValue, maxValue].void
diffuse()
Runs the diffusion with the current rates and values.double
double
double
double
protected double
getValue
(double... coords) Retrieves a value from the layer, taking into account the toroidal'ness.protected double
inBounds
(double... coords) Returns 1 if the coordinates are in the layer's bounds, otherwise returns 0.0.boolean
void
setDiffusionConst
(double diffusionConst) void
setEvaporationConst
(double evapRate) void
setMaxValue
(double max) void
setMinValue
(double min) void
setToroidal
(boolean toroidal) void
setValueLayer
(IGridValueLayer valueLayer)
-
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
-
maxValue
protected double maxValue -
minValue
protected double minValue -
evaporationConst
protected double evaporationConst -
diffusionConst
protected double diffusionConst -
toroidal
protected boolean toroidal -
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 thesetValueLayer(GridValueLayer)
method. This is the same asnew 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 asnew ValueLayer(valueLayer, evaporationConst, diffusionConstant, true)
- Parameters:
valueLayer
- the layer this will be diffusing values onevaporationConst
- the constant used for evaporating values off the layerdiffusionConst
- 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 onevaporationConst
- the constant used for evaporating values off the layerdiffusionConst
- the constant used for diffusing values on the layertoroidal
- 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
-
setValueLayer
-