Mandelbrot from Computer Language Benchmarks Game - Java Algorithm

Java examples for Algorithm:Number

Description

Mandelbrot from Computer Language Benchmarks Game

Demo Code

/* The Computer Language Benchmarks Game
 * http://benchmarksgame.alioth.debian.org/
 * /*  w  w  w .  j  a v  a2 s .com*/
 * contributed by Stefan Krause
 * slightly modified by Chad Whipkey
 * parallelized by Colin D Bennett 2008-10-04
 * reduce synchronization cost by The Anh Tran
 * optimizations and refactoring by Enotus 2010-11-11
 */

import java.io.*;
import java.util.concurrent.atomic.AtomicInteger;

public final class Mandelbrot {
    static byte[][] out;
    static AtomicInteger yCt;
    static double[] Crb;
    static double[] Cib;

    static int getByte(int x, int y) {
        double Ci = Cib[y];
        int res = 0;
        for (int i = 0; i < 8; i += 2) {
            double Zr1 = Crb[x + i];
            double Zi1 = Cib[y];

            double Zr2 = Crb[x + i + 1];
            double Zi2 = Cib[y];

            int b = 0;
            int j = 49;
            do {
                double nZr1 = Zr1 * Zr1 - Zi1 * Zi1 + Crb[x + i];
                double nZi1 = Zr1 * Zi1 + Zr1 * Zi1 + Cib[y];
                Zr1 = nZr1;
                Zi1 = nZi1;

                double nZr2 = Zr2 * Zr2 - Zi2 * Zi2 + Crb[x + i + 1];
                double nZi2 = Zr2 * Zi2 + Zr2 * Zi2 + Cib[y];
                Zr2 = nZr2;
                Zi2 = nZi2;

                if (Zr1 * Zr1 + Zi1 * Zi1 > 4)
                    b |= 2;
                if (Zr2 * Zr2 + Zi2 * Zi2 > 4)
                    b |= 1;
                if (b == 3)
                    break;
            } while (--j > 0);
            res = (res << 2) + b;
        }
        return res ^ -1;
    }

    static void putLine(int y, byte[] line) {
        for (int xb = 0; xb < line.length; xb++)
            line[xb] = (byte) getByte(xb * 8, y);
    }

    public static void main(String[] args) throws Exception {
        int N = 6000;
        if (args.length >= 1)
            N = Integer.parseInt(args[0]);

        Crb = new double[N + 7];
        Cib = new double[N + 7];
        double invN = 2.0 / N;
        for (int i = 0; i < N; i++) {
            Cib[i] = i * invN - 1.0;
            Crb[i] = i * invN - 1.5;
        }
        yCt = new AtomicInteger();
        out = new byte[N][(N + 7) / 8];

        Thread[] pool = new Thread[2 * Runtime.getRuntime()
                .availableProcessors()];
        for (int i = 0; i < pool.length; i++)
            pool[i] = new Thread() {
                public void run() {
                    int y;
                    while ((y = yCt.getAndIncrement()) < out.length)
                        putLine(y, out[y]);
                }
            };
        for (Thread t : pool)
            t.start();
        for (Thread t : pool)
            t.join();

        OutputStream stream = new BufferedOutputStream(System.out);
        stream.write(("P4\n" + N + " " + N + "\n").getBytes());
        for (int i = 0; i < N; i++)
            stream.write(out[i]);
        stream.close();
    }

    public class GUI {

    }
}

Related Tutorials