5eb72523858424e83917b31d4e3c959ea46deec2
[IRC.git] / Robust / src / Benchmarks / oooJava / DelaunayRefinement / SerialDelaunayrefinement.java
1 import java.io.PrintStream;
2 import java.util.*;
3
4 public class SerialDelaunayrefinement {
5         
6     public SerialDelaunayrefinement() {
7     }
8         
9     public static void main(String args[]) {
10         long runtime = 0L;
11         long lasttime = 0xffffffffL;
12         long mintime = 0xffffffffL;
13         for(long run = 0L; (run < 3L || Math.abs(lasttime - runtime) * 64L > Math.min(lasttime, runtime)) && run < 7L; run++) {
14             System.gc();
15             System.gc();
16             System.gc();
17             System.gc();
18             System.gc();
19             runtime = run(args);
20             if(runtime < mintime)
21                 mintime = runtime;
22         }
23                 
24         System.err.println((new StringBuilder("minimum runtime: ")).append(mintime).append(" ms").toString());
25         System.err.println("");
26     }
27         
28     public static long run(String args[]) {
29         if(isFirstRun) {
30             System.err.println();
31             System.err.println("Lonestar Benchmark Suite v2.1");
32             System.err.println("Copyright (C) 2007, 2008, 2009 The University of Texas at Austin");
33             System.err.println("http://iss.ices.utexas.edu/lonestar/");
34             System.err.println();
35             System.err.println("application: Delaunay Mesh Refinement (serial version)");
36             System.err.println("Refines a Delaunay triangulation mesh such that no angle");
37             System.err.println("in the mesh is less than 30 degrees");
38             System.err.println("http://iss.ices.utexas.edu/lonestar/delaunayrefinement.html");
39             System.err.println();
40         }
41         if(args.length < 1)
42             throw new Error("Arguments: <input file> [verify]");
43         EdgeGraph mesh = new UndirectedEdgeGraph();
44         try {
45             (new Mesh()).read(mesh, args[0]);
46         }
47         catch(Exception e) {
48             throw new Error(e);
49         }
50         Stack worklist = new Stack();
51         worklist.addAll(Mesh.getBad(mesh));
52         Cavity cavity = new Cavity(mesh);
53         if(isFirstRun) {
54             System.err.println((new StringBuilder("configuration: ")).append(mesh.getNumNodes()).append(" total triangles, ").append(worklist.size()).append(" bad triangles").toString());
55             System.err.println();
56         }
57         long id = Time.getNewTimeId();
58         while(!worklist.isEmpty())  {
59             Node bad_element = (Node)worklist.pop();
60             if(bad_element != null && mesh.containsNode(bad_element)) {
61                 cavity.initialize(bad_element);
62                 cavity.build();
63                 cavity.update();
64                 Node node;
65                 for(Iterator iterator = cavity.getPre().getNodes().iterator(); iterator.hasNext(); mesh.removeNode(node))
66                     node = (Node)iterator.next();
67                                 
68                 for(Iterator iterator1 = cavity.getPost().getNodes().iterator(); iterator1.hasNext(); mesh.addNode(node))
69                     node = (Node)iterator1.next();
70                                 
71                 Edge edge;
72                 for(Iterator iterator2 = cavity.getPost().getEdges().iterator(); iterator2.hasNext(); mesh.addEdge(edge))
73                     edge = (Edge)iterator2.next();
74                                 
75                 worklist.addAll(cavity.getPost().newBad(mesh));
76                 if(mesh.containsNode(bad_element))
77                     worklist.add(bad_element);
78             }
79         }
80         long time = Time.elapsedTime(id);
81         System.err.println((new StringBuilder("runtime: ")).append(time).append(" ms").toString());
82         if(isFirstRun && args.length > 1)
83             verify(mesh);
84         isFirstRun = false;
85         return time;
86     }
87         
88     public static void verify(Object res) {
89         EdgeGraph result = (EdgeGraph)res;
90         if(!Mesh.verify(result))
91             throw new IllegalStateException("refinement failed.");
92         int size = Mesh.getBad(result).size();
93         if(size != 0) {
94             throw new IllegalStateException((new StringBuilder("refinement failed\nstill have ")).append(size).append(" bad triangles left.\n").toString());
95         } else {
96             System.out.println("OK");
97             return;
98         }
99     }
100         
101     private static boolean isFirstRun = true;
102         
103 }