diff --git a/examples/nbody/src/com/amd/aparapi/examples/nbody/Main.java b/examples/nbody/src/com/amd/aparapi/examples/nbody/Main.java index 8be1386e5809882d92b2d28fc978c6b3dbec7e34..c2623f11e62b6d23b520f1ae1afcd8021ba4d402 100644 --- a/examples/nbody/src/com/amd/aparapi/examples/nbody/Main.java +++ b/examples/nbody/src/com/amd/aparapi/examples/nbody/Main.java @@ -34,7 +34,7 @@ to national security controls as identified on the Commerce Control List (curren of EAR). For the most current Country Group listings, or for additional information about the EAR or your obligations under those regulations, please refer to the U.S. Bureau of Industry and Security's website at http://www.bis.doc.gov/. -*/ + */ package com.amd.aparapi.examples.nbody; import java.awt.BorderLayout; @@ -42,8 +42,6 @@ import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -73,288 +71,297 @@ import com.jogamp.opengl.util.texture.Texture; import com.jogamp.opengl.util.texture.TextureIO; /** - * NBody implementing demonstrating Aparapi kernels. + * NBody implementing demonstrating Aparapi kernels. + * + * For a description of the NBody problem. * - * For a description of the NBody problem. * @see http://en.wikipedia.org/wiki/N-body_problem * - * We use JOGL to render the bodies. + * We use JOGL to render the bodies. * @see http://jogamp.org/jogl/www/ * * @author gfrost - * + * */ -public class Main{ +public class Main { - public static class NBodyKernel extends Kernel{ - protected final float delT = .005f; + public static class NBodyKernel extends Kernel { + protected final float delT = .005f; - protected final float espSqr = 1.0f; + protected final float espSqr = 1.0f; - protected final float mass = 5f; + protected final float mass = 5f; - private final Range range; + private final Range range; - private final float[] xyz; // positions xy and z of bodies + private final float[] xyz; // positions xy and z of bodies - private final float[] vxyz; // velocity component of x,y and z of bodies + private final float[] vxyz; // velocity component of x,y and z of bodies - /** - * Constructor initializes xyz and vxyz arrays. - * @param _bodies - */ - public NBodyKernel(Range _range) { - range = _range; - // range = Range.create(bodies); - xyz = new float[range.getGlobalSize(0) * 3]; - vxyz = new float[range.getGlobalSize(0) * 3]; - float maxDist = 20f; - for (int body = 0; body < range.getGlobalSize(0) * 3; body += 3) { + /** + * Constructor initializes xyz and vxyz arrays. + * + * @param _bodies + */ + public NBodyKernel(Range _range) { + range = _range; + // range = Range.create(bodies); + xyz = new float[range.getGlobalSize(0) * 3]; + vxyz = new float[range.getGlobalSize(0) * 3]; + final float maxDist = 20f; + for (int body = 0; body < (range.getGlobalSize(0) * 3); body += 3) { - float theta = (float) (Math.random() * Math.PI * 2); - float phi = (float) (Math.random() * Math.PI * 2); - float radius = (float) (Math.random() * maxDist); + final float theta = (float) (Math.random() * Math.PI * 2); + final float phi = (float) (Math.random() * Math.PI * 2); + final float radius = (float) (Math.random() * maxDist); - // get the 3D dimensional coordinates - xyz[body + 0] = (float) (radius * Math.cos(theta) * Math.sin(phi)); - xyz[body + 1] = (float) (radius * Math.sin(theta) * Math.sin(phi)); - xyz[body + 2] = (float) (radius * Math.cos(phi)); + // get the 3D dimensional coordinates + xyz[body + 0] = (float) (radius * Math.cos(theta) * Math.sin(phi)); + xyz[body + 1] = (float) (radius * Math.sin(theta) * Math.sin(phi)); + xyz[body + 2] = (float) (radius * Math.cos(phi)); - // divide into two 'spheres of bodies' by adjusting x + // divide into two 'spheres of bodies' by adjusting x - if (body % 2 == 0) { - xyz[body + 0] += maxDist * 1.5; - } else { - xyz[body + 0] -= maxDist * 1.5; - } - } - setExplicit(true); + if ((body % 2) == 0) { + xyz[body + 0] += maxDist * 1.5; + } else { + xyz[body + 0] -= maxDist * 1.5; + } } - - /** - * Here is the kernel entrypoint. Here is where we calculate the position of each body - */ - @Override public void run() { - int body = getGlobalId(); - int count = getGlobalSize(0) * 3; - int globalId = body * 3; - - float accx = 0.f; - float accy = 0.f; - float accz = 0.f; - - float myPosx = xyz[globalId + 0]; - float myPosy = xyz[globalId + 1]; - float myPosz = xyz[globalId + 2]; - for (int i = 0; i < count; i += 3) { - float dx = xyz[i + 0] - myPosx; - float dy = xyz[i + 1] - myPosy; - float dz = xyz[i + 2] - myPosz; - float invDist = rsqrt((dx * dx) + (dy * dy) + (dz * dz) + espSqr); - float s = mass * invDist * invDist * invDist; - accx = accx + s * dx; - accy = accy + s * dy; - accz = accz + s * dz; - } - accx = accx * delT; - accy = accy * delT; - accz = accz * delT; - xyz[globalId + 0] = myPosx + vxyz[globalId + 0] * delT + accx * .5f * delT; - xyz[globalId + 1] = myPosy + vxyz[globalId + 1] * delT + accy * .5f * delT; - xyz[globalId + 2] = myPosz + vxyz[globalId + 2] * delT + accz * .5f * delT; - - vxyz[globalId + 0] = vxyz[globalId + 0] + accx; - vxyz[globalId + 1] = vxyz[globalId + 1] + accy; - vxyz[globalId + 2] = vxyz[globalId + 2] + accz; + setExplicit(true); + } + + /** + * Here is the kernel entrypoint. Here is where we calculate the position of each body + */ + @Override + public void run() { + final int body = getGlobalId(); + final int count = getGlobalSize(0) * 3; + final int globalId = body * 3; + + float accx = 0.f; + float accy = 0.f; + float accz = 0.f; + + final float myPosx = xyz[globalId + 0]; + final float myPosy = xyz[globalId + 1]; + final float myPosz = xyz[globalId + 2]; + for (int i = 0; i < count; i += 3) { + final float dx = xyz[i + 0] - myPosx; + final float dy = xyz[i + 1] - myPosy; + final float dz = xyz[i + 2] - myPosz; + final float invDist = rsqrt((dx * dx) + (dy * dy) + (dz * dz) + espSqr); + final float s = mass * invDist * invDist * invDist; + accx = accx + (s * dx); + accy = accy + (s * dy); + accz = accz + (s * dz); } - - /** - * Render all particles to the OpenGL context - * @param gl - */ - - protected void render(GL2 gl) { - gl.glBegin(GL2.GL_QUADS); - - for (int i = 0; i < range.getGlobalSize(0) * 3; i += 3) { - gl.glTexCoord2f(0, 1); - gl.glVertex3f(xyz[i + 0], xyz[i + 1] + 1, xyz[i + 2]); - gl.glTexCoord2f(0, 0); - gl.glVertex3f(xyz[i + 0], xyz[i + 1], xyz[i + 2]); - gl.glTexCoord2f(1, 0); - gl.glVertex3f(xyz[i + 0] + 1, xyz[i + 1], xyz[i + 2]); - gl.glTexCoord2f(1, 1); - gl.glVertex3f(xyz[i + 0] + 1, xyz[i + 1] + 1, xyz[i + 2]); - } - gl.glEnd(); + accx = accx * delT; + accy = accy * delT; + accz = accz * delT; + xyz[globalId + 0] = myPosx + (vxyz[globalId + 0] * delT) + (accx * .5f * delT); + xyz[globalId + 1] = myPosy + (vxyz[globalId + 1] * delT) + (accy * .5f * delT); + xyz[globalId + 2] = myPosz + (vxyz[globalId + 2] * delT) + (accz * .5f * delT); + + vxyz[globalId + 0] = vxyz[globalId + 0] + accx; + vxyz[globalId + 1] = vxyz[globalId + 1] + accy; + vxyz[globalId + 2] = vxyz[globalId + 2] + accz; + } + + /** + * Render all particles to the OpenGL context + * + * @param gl + */ + + protected void render(GL2 gl) { + gl.glBegin(GL2.GL_QUADS); + + for (int i = 0; i < (range.getGlobalSize(0) * 3); i += 3) { + gl.glTexCoord2f(0, 1); + gl.glVertex3f(xyz[i + 0], xyz[i + 1] + 1, xyz[i + 2]); + gl.glTexCoord2f(0, 0); + gl.glVertex3f(xyz[i + 0], xyz[i + 1], xyz[i + 2]); + gl.glTexCoord2f(1, 0); + gl.glVertex3f(xyz[i + 0] + 1, xyz[i + 1], xyz[i + 2]); + gl.glTexCoord2f(1, 1); + gl.glVertex3f(xyz[i + 0] + 1, xyz[i + 1] + 1, xyz[i + 2]); } + gl.glEnd(); + } - } + } - public static int width; + public static int width; - public static int height; + public static int height; - public static boolean running; + public static boolean running; - public static void main(String _args[]) { + public static void main(String _args[]) { - final NBodyKernel kernel = new NBodyKernel(Range.create(Integer.getInteger("bodies", 8192))); + final NBodyKernel kernel = new NBodyKernel(Range.create(Integer.getInteger("bodies", 8192))); - JFrame frame = new JFrame("NBody"); + final JFrame frame = new JFrame("NBody"); - JPanel panel = new JPanel(new BorderLayout()); - JPanel controlPanel = new JPanel(new FlowLayout()); - panel.add(controlPanel, BorderLayout.SOUTH); + final JPanel panel = new JPanel(new BorderLayout()); + final JPanel controlPanel = new JPanel(new FlowLayout()); + panel.add(controlPanel, BorderLayout.SOUTH); - final JButton startButton = new JButton("Start"); + final JButton startButton = new JButton("Start"); - startButton.addActionListener(new ActionListener(){ - @Override public void actionPerformed(ActionEvent e) { - running = true; - startButton.setEnabled(false); - } - }); - controlPanel.add(startButton); - controlPanel.add(new JLabel(kernel.getExecutionMode().toString())); + startButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + running = true; + startButton.setEnabled(false); + } + }); + controlPanel.add(startButton); + controlPanel.add(new JLabel(kernel.getExecutionMode().toString())); - controlPanel.add(new JLabel(" Particles")); - controlPanel.add(new JTextField("" + kernel.range.getGlobalSize(0), 5)); + controlPanel.add(new JLabel(" Particles")); + controlPanel.add(new JTextField("" + kernel.range.getGlobalSize(0), 5)); - controlPanel.add(new JLabel("FPS")); - final JTextField framesPerSecondTextField = new JTextField("0", 5); + controlPanel.add(new JLabel("FPS")); + final JTextField framesPerSecondTextField = new JTextField("0", 5); - controlPanel.add(framesPerSecondTextField); - controlPanel.add(new JLabel("Score(")); - JLabel miniLabel = new JLabel("<html><small>calcs</small><hr/><small>µsec</small></html>"); + controlPanel.add(framesPerSecondTextField); + controlPanel.add(new JLabel("Score(")); + final JLabel miniLabel = new JLabel("<html><small>calcs</small><hr/><small>µsec</small></html>"); - controlPanel.add(miniLabel); - controlPanel.add(new JLabel(")")); + controlPanel.add(miniLabel); + controlPanel.add(new JLabel(")")); - final JTextField positionUpdatesPerMicroSecondTextField = new JTextField("0", 5); + final JTextField positionUpdatesPerMicroSecondTextField = new JTextField("0", 5); - controlPanel.add(positionUpdatesPerMicroSecondTextField); - GLCapabilities caps = new GLCapabilities(null); - final GLProfile profile = caps.getGLProfile(); - caps.setDoubleBuffered(true); - caps.setHardwareAccelerated(true); - final GLCanvas canvas = new GLCanvas(caps); + controlPanel.add(positionUpdatesPerMicroSecondTextField); + final GLCapabilities caps = new GLCapabilities(null); + final GLProfile profile = caps.getGLProfile(); + caps.setDoubleBuffered(true); + caps.setHardwareAccelerated(true); + final GLCanvas canvas = new GLCanvas(caps); - Dimension dimension = new Dimension(Integer.getInteger("width", 742-64), Integer.getInteger("height", 742-64)); - canvas.setPreferredSize(dimension); + final Dimension dimension = new Dimension(Integer.getInteger("width", 742 - 64), Integer.getInteger("height", 742 - 64)); + canvas.setPreferredSize(dimension); - canvas.addGLEventListener(new GLEventListener(){ - private double ratio; + canvas.addGLEventListener(new GLEventListener() { + private double ratio; - private final float xeye = 0f; + private final float xeye = 0f; - private final float yeye = 0f; + private final float yeye = 0f; - private final float zeye = 100f; + private final float zeye = 100f; - private final float xat = 0f; + private final float xat = 0f; - private final float yat = 0f; + private final float yat = 0f; - private final float zat = 0f; + private final float zat = 0f; - public final float zoomFactor = 1.0f; + public final float zoomFactor = 1.0f; - private int frames; + private int frames; - private long last = System.currentTimeMillis(); + private long last = System.currentTimeMillis(); - @Override public void dispose(GLAutoDrawable drawable) { + @Override + public void dispose(GLAutoDrawable drawable) { - } + } - @Override public void display(GLAutoDrawable drawable) { + @Override + public void display(GLAutoDrawable drawable) { - GL2 gl = drawable.getGL().getGL2(); + final GL2 gl = drawable.getGL().getGL2(); - gl.glLoadIdentity(); - gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - gl.glColor3f(1f, 1f, 1f); + gl.glLoadIdentity(); + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + gl.glColor3f(1f, 1f, 1f); - GLU glu = new GLU(); - glu.gluPerspective(45f, ratio, 0f, 1000f); + final GLU glu = new GLU(); + glu.gluPerspective(45f, ratio, 0f, 1000f); - glu.gluLookAt(xeye, yeye, zeye * zoomFactor, xat, yat, zat, 0f, 1f, 0f); - if (running) { - kernel.execute(kernel.range); - if (kernel.isExplicit()) { - kernel.get(kernel.xyz); - } - List<ProfileInfo> profileInfo = kernel.getProfileInfo(); - if (profileInfo != null && profileInfo.size() > 0) { - for (ProfileInfo p : profileInfo) { - System.out.print(" " + p.getType() + " " + p.getLabel() + (p.getEnd() - p.getStart()) / 1000 + "us"); - } - System.out.println(); - } - } - kernel.render(gl); - - long now = System.currentTimeMillis(); - long time = now - last; - frames++; - - if (time > 1000) { // We update the frames/sec every second - if (running) { - float framesPerSecond = (frames * 1000.0f) / time; - int updatesPerMicroSecond = (int) ((framesPerSecond * kernel.range.getGlobalSize(0) * kernel.range - .getGlobalSize(0)) / 1000000); - framesPerSecondTextField.setText(String.format("%5.2f", framesPerSecond)); - positionUpdatesPerMicroSecondTextField.setText(String.format("%4d", updatesPerMicroSecond)); - } - frames = 0; - last = now; - } - gl.glFlush(); - - } - - @Override public void init(GLAutoDrawable drawable) { - final GL2 gl = drawable.getGL().getGL2(); - - gl.glShadeModel(GLLightingFunc.GL_SMOOTH); - gl.glEnable(GL.GL_BLEND); - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); - try { - InputStream textureStream = Main.class.getResourceAsStream("duke.jpg"); - Texture texture = TextureIO.newTexture(textureStream, false, null); - texture.enable(gl); - } catch (IOException e) { - e.printStackTrace(); - } catch (GLException e) { - e.printStackTrace(); + glu.gluLookAt(xeye, yeye, zeye * zoomFactor, xat, yat, zat, 0f, 1f, 0f); + if (running) { + kernel.execute(kernel.range); + if (kernel.isExplicit()) { + kernel.get(kernel.xyz); + } + final List<ProfileInfo> profileInfo = kernel.getProfileInfo(); + if ((profileInfo != null) && (profileInfo.size() > 0)) { + for (final ProfileInfo p : profileInfo) { + System.out.print(" " + p.getType() + " " + p.getLabel() + ((p.getEnd() - p.getStart()) / 1000) + "us"); } + System.out.println(); + } + } + kernel.render(gl); + + final long now = System.currentTimeMillis(); + final long time = now - last; + frames++; + + if (time > 1000) { // We update the frames/sec every second + if (running) { + final float framesPerSecond = (frames * 1000.0f) / time; + final int updatesPerMicroSecond = (int) ((framesPerSecond * kernel.range.getGlobalSize(0) * kernel.range + .getGlobalSize(0)) / 1000000); + framesPerSecondTextField.setText(String.format("%5.2f", framesPerSecond)); + positionUpdatesPerMicroSecondTextField.setText(String.format("%4d", updatesPerMicroSecond)); + } + frames = 0; + last = now; + } + gl.glFlush(); + + } - } + @Override + public void init(GLAutoDrawable drawable) { + final GL2 gl = drawable.getGL().getGL2(); + + gl.glShadeModel(GLLightingFunc.GL_SMOOTH); + gl.glEnable(GL.GL_BLEND); + gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); + try { + final InputStream textureStream = Main.class.getResourceAsStream("particle.jpg"); + final Texture texture = TextureIO.newTexture(textureStream, false, null); + texture.enable(gl); + } catch (final IOException e) { + e.printStackTrace(); + } catch (final GLException e) { + e.printStackTrace(); + } - @Override public void reshape(GLAutoDrawable drawable, int x, int y, int _width, int _height) { - width = _width; - height = _height; + } + + @Override + public void reshape(GLAutoDrawable drawable, int x, int y, int _width, int _height) { + width = _width; + height = _height; - GL2 gl = drawable.getGL().getGL2(); - gl.glViewport(0, 0, width, height); + final GL2 gl = drawable.getGL().getGL2(); + gl.glViewport(0, 0, width, height); - ratio = (double) width / (double) height; + ratio = (double) width / (double) height; + + } - } + }); - }); + panel.add(canvas, BorderLayout.CENTER); + frame.getContentPane().add(panel, BorderLayout.CENTER); + final FPSAnimator animator = new FPSAnimator(canvas, 100); - panel.add(canvas, BorderLayout.CENTER); - frame.getContentPane().add(panel, BorderLayout.CENTER); - final FPSAnimator animator = new FPSAnimator(canvas, 100); - - frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - frame.pack(); - frame.setVisible(true); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frame.pack(); + frame.setVisible(true); - animator.start(); + animator.start(); - } + } }