KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > Brusselator


1 /*
2  * Copyright 2003, Franz-Josef Elmer, All rights reserved
3  */

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       // Euler schema
118
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