The benchmark works as far as I can tell (passes internal tests). We just need to...
[IRC.git] / Robust / src / Benchmarks / oooJava / DelaunayRefinement / SerialDelaunayRefinement.java
1 /*
2 Lonestar Benchmark Suite for irregular applications that exhibit 
3 amorphous data-parallelism.
4
5 Center for Grid and Distributed Computing
6 The University of Texas at Austin
7
8 Copyright (C) 2007, 2008, 2009 The University of Texas at Austin
9
10 Licensed under the Eclipse Public License, Version 1.0 (the "License");
11 you may not use this file except in compliance with the License.
12 You may obtain a copy of the License at
13
14 http://www.eclipse.org/legal/epl-v10.html
15
16 Unless required by applicable law or agreed to in writing, software
17 distributed under the License is distributed on an "AS IS" BASIS,
18 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 See the License for the specific language governing permissions and
20 limitations under the License.
21
22 File: UndirectedEdgeGraph.java 
23
24 */
25
26 public class SerialDelaunayRefinement {  
27   public boolean isFirstRun;
28   public SerialDelaunayRefinement() {
29     isFirstRun = true;
30   }
31
32   public static void main(String args[]) {
33     SerialDelaunayRefinement sdr = new SerialDelaunayRefinement();
34     sdr.runMain(args);
35   }
36   
37   public void runMain(String args[]) {
38     long runtime = 0;
39     //Numbers below are Long.Max_Value
40     long lasttime = 0x7fffffffffffffffL;
41     long mintime = 0x7fffffffffffffffL;
42     for (long run = 0; ((run < 3) || Math.abs(lasttime - runtime) * 64 > Math.min(lasttime, runtime)) && run < 7; run++) {
43       runtime = run(args);
44       if (runtime < mintime) {
45         mintime = runtime;
46       }
47     }
48
49     System.out.println("minimum runtime: " + mintime + " ms");
50     System.out.println("");
51   }
52   
53
54   public long run(String args[]) {
55     if (isFirstRun) {
56       System.out.println();
57       System.out.println("Lonestar Benchmark Suite v2.1");
58       System.out.println("Copyright (C) 2007, 2008, 2009 The University of Texas at Austin");
59       System.out.println("http://iss.ices.utexas.edu/lonestar/");
60       System.out.println();
61       System.out.println("application: Delaunay Mesh Refinement (serial version)");
62       System.out.println("Refines a Delaunay triangulation mesh such that no angle");
63       System.out.println("in the mesh is less than 30 degrees");
64       System.out.println("http://iss.ices.utexas.edu/lonestar/delaunayrefinement.html");
65       System.out.println();
66     }
67     if (args.length < 1) {
68       System.out.println("Arguments: <input file> [verify]");
69       System.exit(-1);
70     }
71
72     EdgeGraph mesh = new UndirectedEdgeGraph();
73
74     Mesh m = new Mesh();
75     m.read(mesh, args[0]);
76
77     //treat LinkedList as a stack
78 //    Stack worklist = new Stack();
79     LinkedList worklist = new LinkedList();
80
81     // worklist.addAll(Mesh.getBad(mesh));
82     HashMapIterator it = m.getBad(mesh).iterator();
83     while (it.hasNext()) {
84       worklist.add(it.next());
85     }
86
87     Cavity cavity = new Cavity(mesh);
88     if (isFirstRun) {
89       System.out.println("configuration: " + mesh.getNumNodes() + " total triangles, " + worklist.size() + " bad triangles");
90       System.out.println();
91     }
92 //    long id = Time.getNewTimeId();
93     long startTime = System.currentTimeMillis();
94     while (!worklist.isEmpty()) {
95       Node bad_element = (Node) worklist.pop();
96 //      System.out.println("Bad Node"+ ((Element)mesh.getNodeData(bad_element)).toString());
97       if (bad_element != null && mesh.containsNode(bad_element)) {
98         cavity.initialize(bad_element);
99         cavity.build();
100         cavity.update();
101         
102         //remove old data
103         Node node;
104         for (Iterator iterator = cavity.getPre().getNodes().iterator(); iterator.hasNext();) {
105           node = (Node) iterator.next();
106           mesh.removeNode(node);
107         }
108
109         //add new data
110         for (Iterator iterator1 = cavity.getPost().getNodes().iterator(); iterator1.hasNext();) {
111           node = (Node) iterator1.next();
112           mesh.addNode(node);
113         }
114
115         Edge_d edge;
116         for (Iterator iterator2 = cavity.getPost().getEdges().iterator(); iterator2.hasNext();) {
117           edge = (Edge_d) iterator2.next();
118           mesh.addEdge(edge);
119         }
120
121         // worklist.addAll(cavity.getPost().newBad(mesh));
122         it = cavity.getPost().newBad(mesh).iterator();
123         while (it.hasNext()) {
124           worklist.push((Node)it.next());
125         }
126
127         if (mesh.containsNode(bad_element)) {
128           worklist.push((Node) bad_element);
129         }
130       }
131     }
132     long time = System.currentTimeMillis() - startTime;
133     System.out.println("runtime: " + time + " ms");
134     //TODO note how we only verify on first run...
135     if (isFirstRun && args.length > 1) {
136       verify(mesh);
137     }
138     isFirstRun = false;
139     return time;
140   }
141
142   public void verify(EdgeGraph result) {
143     //Put in cuz of static issues.
144     Mesh m = new Mesh();
145     if (!m.verify(result)) {
146 //      throw new IllegalStateException("refinement failed.");
147       System.out.println("Refinement Failed.");
148       System.exit(-1);
149     }
150     
151     int size = m.getBad(result).size();
152     if (size != 0) {
153       System.out.println("refinement failed\nstill have "+size+" bad triangles left.\n");
154       System.exit(-1);
155     } else {
156       System.out.println("OK");
157       return;
158     }
159   }
160 }