|
14 | 14 | from compas_cem.plotters import Plotter
|
15 | 15 |
|
16 | 16 |
|
17 |
| -# ------------------------------------------------------------------------------ |
18 |
| -# Parameters |
19 |
| -# ------------------------------------------------------------------------------ |
20 |
| - |
21 |
| -plot = False |
22 |
| - |
23 | 17 | # ------------------------------------------------------------------------------
|
24 | 18 | # Instantiate a topology diagram
|
25 | 19 | # ------------------------------------------------------------------------------
|
|
67 | 61 | # Compute a state of static equilibrium
|
68 | 62 | # ------------------------------------------------------------------------------
|
69 | 63 |
|
70 |
| -# form = static_equilibrium(topology, eta=1e-6, tmax=100, verbose=True) |
71 |
| - |
72 |
| -# ------------------------------------------------------------------------------ |
73 |
| -# Compute a state of static equilibrium |
74 |
| -# ------------------------------------------------------------------------------ |
75 |
| - |
76 |
| -import numpy as np |
77 |
| -import equinox as eqx |
78 |
| - |
79 |
| -class EquilibriumModel(eqx.Module): |
80 |
| - pass |
81 |
| - |
82 |
| - |
83 |
| -# trails_sequences = topology.trails_sequences() |
84 |
| -# trails = {k: v[:] for k, v in topology.trails()} |
85 |
| - |
86 |
| -nodes = list(topology.nodes()) |
87 |
| -node_index = topology.key_index() |
88 |
| - |
89 |
| -edges = list(topology.edges()) |
90 |
| -edge_index = topology.uv_index() |
91 |
| -index_edge = topology.index_uv() |
92 |
| - |
93 |
| -deviation_mask = [] |
94 |
| -for edge in edges: |
95 |
| - mask_value = 0 |
96 |
| - if topology.is_deviation_edge(edge): |
97 |
| - mask_value = 1 |
98 |
| - deviation_mask.append(mask_value) |
99 |
| - |
100 |
| -print(f"{edges=}") |
101 |
| -print(f"{deviation_mask=}") |
102 |
| - |
103 |
| -# topology.shift_trail(2, 1) |
104 |
| -sequences = np.ones(( |
105 |
| - topology.number_of_sequences(), |
106 |
| - topology.number_of_trails()), |
107 |
| - dtype=np.int32) |
108 |
| -sequences *= -1 |
109 |
| - |
110 |
| -for tidx, trail in enumerate(topology.trails()): |
111 |
| - for node in trail: |
112 |
| - seq = topology.node_sequence(node) |
113 |
| - sequences[seq][tidx] = node_index[node] |
114 |
| - |
115 |
| -# trail_lengths = np.zeros(topology.number_of_edges()) |
116 |
| -# for i, edge in enumerate(edges): |
117 |
| -# if topology.is_trail_edge(edge): |
118 |
| -# trail_lengths[i] = topology.edge_length_2(edge) |
119 |
| - |
120 |
| -trail_lengths = np.zeros(topology.number_of_nodes()) |
121 |
| - |
122 |
| -for trail in topology.trails(): |
123 |
| - for u, v in pairwise(trail): |
124 |
| - edge = (u, v) |
125 |
| - if edge not in edges: |
126 |
| - edge = (v, u) |
127 |
| - trail_lengths[u] = topology.edge_length_2(edge) |
128 |
| - |
129 |
| -print(f"{trail_lengths=}") |
130 |
| - |
131 |
| -raise |
132 |
| - |
133 |
| -deviation_forces = np.zeros(topology.number_of_edges()) |
134 |
| -for i, edge in enumerate(edges): |
135 |
| - if topology.is_deviation_edge(edge): |
136 |
| - deviation_forces[i] = topology.edge_force(edge) |
137 |
| - |
138 |
| -print(f"{deviation_forces=}") |
139 |
| - |
140 |
| -loads = list(topology.node_load(node) for node in nodes) |
141 |
| -loads = np.asarray(loads) |
142 |
| - |
143 |
| -positions = list(topology.node_coordinates(node) for node in nodes) |
144 |
| -positions = np.asarray(positions) |
145 |
| - |
146 |
| -residuals = [] |
147 |
| -residual = np.zeros((topology.number_of_trails(), 3)) |
148 |
| - |
149 |
| - |
150 |
| -def residual_vector(r, d, q): |
151 |
| - return r - d - q |
152 |
| - |
153 |
| -def position_vector(p, r, l, t): |
154 |
| - return p + l * (r / t) |
155 |
| - |
156 |
| -def trail_force(r): |
157 |
| - return np.linalg.norm(residual, axis=1, keepdims=True) |
158 |
| - |
159 |
| -deviation = np.ones((topology.number_of_trails(), 3)) * -1.0 |
160 |
| - |
161 |
| -# iterate over sequences |
162 |
| -for sequence in sequences: |
163 |
| - load = loads[sequence, :] |
164 |
| - position_last = positions[sequence, :] |
165 |
| - # tlength = trail_lengths[sequence, :] |
166 |
| - |
167 |
| - # deviation = deviation_vector(sequence, positions, adjacency, deviation_mask) |
168 |
| - residual = residual_vector(residual, deviation, load) |
169 |
| - residuals.append(residual) |
170 |
| - |
171 |
| - tforce = trail_force(residual) |
172 |
| - tlength = 1. |
173 |
| - |
174 |
| - position_new = position_vector(position_last, residual, tlength, tforce) |
175 |
| - |
176 |
| - print(sequence) |
177 |
| - print(load) |
178 |
| - print(position_last) |
179 |
| - print(f"{position_last=}") |
180 |
| - print("residual\n", residual) |
181 |
| - print("trail force\n", tforce) |
182 |
| - print(f"{position_new=}") |
183 |
| - |
184 |
| - print() |
185 |
| - position_last = position_new |
186 |
| - |
187 |
| -print("ok") |
| 64 | +form = static_equilibrium(topology, eta=1e-6, tmax=100, verbose=True) |
188 | 65 |
|
189 | 66 | # ------------------------------------------------------------------------------
|
190 | 67 | # Plot results
|
191 | 68 | # ------------------------------------------------------------------------------
|
192 | 69 |
|
193 |
| -if plot: |
194 |
| - plotter = Plotter() |
| 70 | +plotter = Plotter() |
195 | 71 |
|
196 |
| - # add topology diagram to scene |
197 |
| - artist = plotter.add(topology, |
198 |
| - nodesize=0.2, |
199 |
| - nodetext="sequence", |
200 |
| - nodecolor="sequence", |
201 |
| - show_nodetext=True) |
| 72 | +# add topology diagram to scene |
| 73 | +artist = plotter.add(topology, nodesize=0.2, show_nodetext=True, show_edgetext=True) |
202 | 74 |
|
203 | 75 |
|
204 |
| - # add shifted form diagram to the scene |
205 |
| - # form = form.transformed(Translation.from_vector([0.0, -1.0, 0.0])) |
206 |
| - # plotter.add(form, nodesize=0.2, show_edgetext=True, edgetext="sequence") |
| 76 | +# add shifted form diagram to the scene |
| 77 | +form = form.transformed(Translation.from_vector([0.0, -1.0, 0.0])) |
| 78 | +plotter.add(form, nodesize=0.2, show_nodetext=True, show_edgetext=True) |
207 | 79 |
|
208 |
| - # show plotter contents |
209 |
| - plotter.zoom_extents() |
210 |
| - plotter.show() |
| 80 | +# show plotter contents |
| 81 | +plotter.zoom_extents() |
| 82 | +plotter.show() |
0 commit comments