Skip to content
Snippets Groups Projects
Commit 5f674813 authored by Ryan LaMothe's avatar Ryan LaMothe
Browse files

Reverted change to resource loading that mistaken tried to load duke.jpg instead of particle.jpg

parent a7be80af
No related branches found
No related tags found
No related merge requests found
......@@ -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>&micro;sec</small></html>");
controlPanel.add(framesPerSecondTextField);
controlPanel.add(new JLabel("Score("));
final JLabel miniLabel = new JLabel("<html><small>calcs</small><hr/><small>&micro;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();
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment