41 #ifndef DIFFUSIONLAYERND_H_
42 #define DIFFUSIONLAYERND_H_
50 #include "RelativeLocation.h"
51 #include "CartesianTopology.h"
52 #include "RepastProcess.h"
53 #include "ValueLayerND.h"
80 virtual int getRadius();
96 virtual T getNewValue(T* values) = 0;
153 DiffusionLayerND(vector<int> processesPerDim,
GridDimensions globalBoundaries,
int bufferSize,
bool periodic, T initialValue = 0, T initialBufferZoneValue = 0);
171 void diffuse(
Diffusor<T>* diffusor,
bool omitSynchronize =
false);
179 void diffuseDimension(T* currentDataSpacePointer, T* otherDataSpacePointer, T* vals,
Diffusor<T>* diffusor,
int dimIndex);
184 void grabDimensionData(T*& destinationPointer, T* startPointer,
int radius,
int dimIndex);
190 T initialValue, T initialBufferZoneValue):
ValueLayerNDSU<T>(processesPerDim, globalBoundaries, bufferSize, periodic,
191 initialValue, initialBufferZoneValue){
196 DiffusionLayerND<T>::~DiffusionLayerND(){
202 T* vals =
new T[countOfVals];
206 this->switchValueLayer();
208 if(!omitSynchronize) this->synchronize();
221 for(; i < bufferEdge; i++){
223 currentDataSpacePointer += pointerIncrement;
224 otherDataSpacePointer += pointerIncrement;
226 for(; i < localEdge; i++){
229 T* destLocation = vals;
230 grabDimensionData(destLocation, currentDataSpacePointer, diffusor->
getRadius(), AbstractValueLayerND<T>::numDims - 1);
231 *otherDataSpacePointer = diffusor->
getNewValue(vals);
234 diffuseDimension(currentDataSpacePointer, otherDataSpacePointer, vals, diffusor, dimIndex - 1);
237 currentDataSpacePointer += pointerIncrement;
238 otherDataSpacePointer += pointerIncrement;
243 void DiffusionLayerND<T>::grabDimensionData(T*& destinationPointer, T* startPointer,
int radius,
int dimIndex){
244 int pointerIncrement = AbstractValueLayerND<T>::places[dimIndex];
245 startPointer -= pointerIncrement * radius;
246 int size = 2 * radius + 1;
247 for(
int i = 0; i < size; i++){
249 *destinationPointer = 1;
250 double myVal = *startPointer;
251 *destinationPointer = myVal;
252 destinationPointer++;
255 grabDimensionData(destinationPointer, startPointer, radius, dimIndex - 1);
257 startPointer += pointerIncrement;