Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/benchmarks/programs/b-hut/space.sml
ViewVC logotype

Annotation of /sml/trunk/benchmarks/programs/b-hut/space.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 193 - (view) (download)

1 : monnier 193 (* space.sml
2 :     *
3 :     * COPYRIGHT (c) 1993, AT&T Bell Laboratories.
4 :     *
5 :     * The quad/oct-tree representation of space.
6 :     *)
7 :    
8 :     signature SPACE =
9 :     sig
10 :    
11 :     structure V : VECTOR
12 :    
13 :     datatype body = Body of {
14 :     mass : real,
15 :     pos : real V.vec ref,
16 :     vel : real V.vec ref,
17 :     acc : real V.vec ref,
18 :     phi : real ref
19 :     }
20 :    
21 :     datatype cell
22 :     = BodyCell of body
23 :     | Cell of node Array.array
24 :    
25 :     and node
26 :     = Empty
27 :     | Node of {
28 :     mass : real ref,
29 :     pos : real V.vec ref,
30 :     cell : cell
31 :     }
32 :    
33 :     datatype space = Space of {
34 :     rmin : real V.vec,
35 :     rsize : real,
36 :     root : node
37 :     }
38 :    
39 :     val nsub : int (* number of sub cells / cell (2 ^ V.dim) *)
40 :    
41 :     val putCell : (cell * int * node) -> unit
42 :     val getCell : (cell * int) -> node
43 :     val mkCell : unit -> cell
44 :     val mkBodyNode : body -> node
45 :     val mkCellNode : cell -> node
46 :     val eqBody : body * body -> bool
47 :    
48 :     (* debugging code *)
49 :     val dumpTree : node -> unit
50 :     val prBody : body -> string
51 :     val prNode : node -> string
52 :    
53 :     end; (* SPACE *)
54 :    
55 :     functor Space (V : VECTOR) : SPACE =
56 :     struct
57 :    
58 :     structure V = V
59 :    
60 :     datatype body = Body of {
61 :     mass : real,
62 :     pos : real V.vec ref,
63 :     vel : real V.vec ref,
64 :     acc : real V.vec ref,
65 :     phi : real ref
66 :     }
67 :    
68 :     datatype cell
69 :     = BodyCell of body
70 :     | Cell of node Array.array
71 :    
72 :     and node
73 :     = Empty
74 :     | Node of {
75 :     mass : real ref,
76 :     pos : real V.vec ref,
77 :     cell : cell
78 :     }
79 :    
80 :     datatype space = Space of {
81 :     rmin : real V.vec,
82 :     rsize : real,
83 :     root : node
84 :     }
85 :    
86 :     fun eqBody(Body{mass,pos,vel,acc,phi},
87 :     Body{mass=m1,pos=p1,vel=v1,acc=a1,phi=h1}) =
88 :     (Real.==(mass, m1) andalso Real.==(!phi, !h1)
89 :     andalso V.equal(!pos, !p1) andalso V.equal(!vel, !v1)
90 :     andalso V.equal(!acc, !a1))
91 :    
92 :     (* number of sub cells per cell (2 ^ V.dim) *)
93 :     val nsub = Word.toInt(Word.<<(0w1, Word.fromInt V.dim))
94 :    
95 :     fun putCell (Cell a, i, nd) = Array.update(a, i, nd)
96 :     fun getCell (Cell a, i) = Array.sub(a, i)
97 :     fun mkCell () = Cell(Array.array(nsub, Empty))
98 :     fun mkBodyNode (body as Body{pos, mass, ...}) = Node{
99 :     cell = BodyCell body,
100 :     mass = ref mass,
101 :     pos = ref (!pos)
102 :     }
103 :     fun mkCellNode cell = Node{cell = cell, mass = ref 0.0, pos = ref V.zerov}
104 :    
105 :     (* debugging code *)
106 :     local
107 :     val rfmt = Real.toString
108 :     val vfmt = V.format{lp="[", rp="]", sep=",", cvt = rfmt}
109 :     in
110 :     fun prBody (Body{mass, pos, vel, acc, phi}) = String.concat [
111 :     "B{m=", rfmt mass,
112 :     ", p=", vfmt(!pos),
113 :     ", v=", vfmt(!vel),
114 :     ", a=", vfmt(!acc),
115 :     ", phi=", rfmt(!phi), "}"
116 :     ]
117 :     fun prNode Empty = "Empty"
118 :     | prNode (Node{mass, pos, cell}) = let
119 :     val cell = (case cell
120 :     of (Cell _) => "Cell"
121 :     | (BodyCell b) => (*prBody b*) "Body"
122 :     (* end case *))
123 :     in
124 :     String.concat [
125 :     "N{m=", rfmt(!mass),
126 :     ", p=", vfmt(!pos),
127 :     cell, "}"
128 :     ]
129 :     end
130 :     end
131 :    
132 :     fun dumpTree tree = let
133 :     fun printf items = TextIO.output(TextIO.stdOut, String.concat items)
134 :     fun indent i = StringCvt.padLeft #" " (i+1) ""
135 :     fun dump (node, l) = let
136 :     fun dump' (Node{cell=Cell a, ...}) = let
137 :     fun dump'' i = (dump(Array.sub(a, i), l+1); dump''(i+1))
138 :     in
139 :     (dump'' 0) handle _ => ()
140 :     end
141 :     | dump' _ = ()
142 :     in
143 :     printf [
144 :     StringCvt.padLeft #" " 2 (Int.toString l),
145 :     indent l,
146 :     prNode node, "\n"
147 :     ];
148 :     dump' node
149 :     end
150 :     in
151 :     dump (tree, 0)
152 :     end
153 :    
154 :     end; (* Space *)
155 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0