1 4 import java.awt.*; 5 import java.awt.event.*; 6 7 public class Brusselator { 8 private double _noiseFactor = 0.001; 9 private double _alpha, _beta, _d; 10 private double _time; 11 private final double[] _u, _v, _du, _dv; 12 private final double _dx; 13 private final double _dt; 14 private ActionListener _listener; 15 16 public Brusselator(double dx, double dt, double size) { 17 _dx = dx; 18 _dt = dt; 19 _u = new double[(int) (size / dx + 0.5)]; 20 _v = new double[_u.length]; 21 _du = new double[_u.length]; 22 _dv = new double[_u.length]; 23 reset(); 24 addNoise(); 25 } 26 27 public void addActionListener(ActionListener listener) { 28 _listener = AWTEventMulticaster.add(_listener, listener); 29 } 30 31 private void notifyListeners(ActionEvent event) { 32 if (_listener != null) { 33 _listener.actionPerformed(event); 34 } 35 } 36 37 public double getDx() { 38 return _dx; 39 } 40 41 public double getDt() { 42 return _dt; 43 } 44 45 public double getTime() { 46 return _time; 47 } 48 49 public void setTime(double time) { 50 _time = time; 51 } 52 53 public void setNoiseFactor(double factor) { 54 _noiseFactor = factor; 55 } 56 57 public void setAlpha(double alpha) { 58 _alpha = alpha; 59 } 60 61 public void setBeta(double beta) { 62 _beta = beta; 63 } 64 65 public void setD(double d) { 66 _d = d; 67 } 68 69 public int getNumberOfPoints() { 70 return _u.length; 71 } 72 73 public double getU(int index) { 74 return _u[index]; 75 } 76 77 public void setU(int index, double value) { 78 _u[index] = value; 79 } 80 81 public double getV(int index) { 82 return _v[index]; 83 } 84 85 public void setV(int index, double value) { 86 _v[index] = value; 87 } 88 89 public void reset() { 90 for (int i = 0; i < _u.length; i++) { 91 _u[i] = _beta; 92 _v[i] = _alpha / Math.max(0.01, _beta); 93 } 94 _time = 0; 95 notifyListeners(new ActionEvent(this, 0, "reset")); 96 } 97 98 public void addNoise() { 99 for (int i = 0; i < _u.length; i++) { 100 _u[i] *= 1 + (0.5 - Math.random()) * _noiseFactor; 101 _v[i] *= 1 + (0.5 - Math.random()) * _noiseFactor; 102 } 103 _time = 0; 104 notifyListeners(new ActionEvent(this, 0, "state changed")); 105 } 106 107 public void next() { 108 int steps = (int) (_dt / ((_dx * _dx) / (2.5 * Math.max(1, _d)))) + 1; 109 double dt = _dt / steps; 110 for (int k = 0; k < steps; k++) { 111 for (int i = 0, n = _u.length; i < n; i++) { 112 _du[i] = (_u[(i + n - 1) % n] - 2 * _u[i] + _u[(i + 1) % n]) / (_dx * _dx) 113 + _beta + _u[i] * (_u[i] * _v[i] - 1 - _alpha); 114 _dv[i] = _d * (_v[(i + n - 1) % n] - 2 * _v[i] + _v[(i + 1) % n]) / (_dx * _dx) 115 + _u[i] * (_alpha - _u[i] * _v[i]); 116 } 117 for (int i = 0, n = _u.length; i < n; i++) { 119 _u[i] += dt * _du[i]; 120 _v[i] += dt * _dv[i]; 121 } 122 } 123 _time += _dt; 124 notifyListeners(new ActionEvent(this, 0, "state changed")); 125 } 126 127 } 128 | Popular Tags |