File: evhelp.txt

package info (click to toggle)
evolver 2.70%2Bds-8
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, trixie
  • size: 17,148 kB
  • sloc: ansic: 127,395; makefile: 209; sh: 98
file content (17212 lines) | stat: -rw-r--r-- 742,274 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800
9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968
9969
9970
9971
9972
9973
9974
9975
9976
9977
9978
9979
9980
9981
9982
9983
9984
9985
9986
9987
9988
9989
9990
9991
9992
9993
9994
9995
9996
9997
9998
9999
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10117
10118
10119
10120
10121
10122
10123
10124
10125
10126
10127
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
10191
10192
10193
10194
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234
10235
10236
10237
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10273
10274
10275
10276
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10432
10433
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467
10468
10469
10470
10471
10472
10473
10474
10475
10476
10477
10478
10479
10480
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
10732
10733
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793
10794
10795
10796
10797
10798
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822
10823
10824
10825
10826
10827
10828
10829
10830
10831
10832
10833
10834
10835
10836
10837
10838
10839
10840
10841
10842
10843
10844
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
10874
10875
10876
10877
10878
10879
10880
10881
10882
10883
10884
10885
10886
10887
10888
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945
10946
10947
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
10963
10964
10965
10966
10967
10968
10969
10970
10971
10972
10973
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000
11001
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019
11020
11021
11022
11023
11024
11025
11026
11027
11028
11029
11030
11031
11032
11033
11034
11035
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
11051
11052
11053
11054
11055
11056
11057
11058
11059
11060
11061
11062
11063
11064
11065
11066
11067
11068
11069
11070
11071
11072
11073
11074
11075
11076
11077
11078
11079
11080
11081
11082
11083
11084
11085
11086
11087
11088
11089
11090
11091
11092
11093
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103
11104
11105
11106
11107
11108
11109
11110
11111
11112
11113
11114
11115
11116
11117
11118
11119
11120
11121
11122
11123
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139
11140
11141
11142
11143
11144
11145
11146
11147
11148
11149
11150
11151
11152
11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11200
11201
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11276
11277
11278
11279
11280
11281
11282
11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
11302
11303
11304
11305
11306
11307
11308
11309
11310
11311
11312
11313
11314
11315
11316
11317
11318
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349
11350
11351
11352
11353
11354
11355
11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11399
11400
11401
11402
11403
11404
11405
11406
11407
11408
11409
11410
11411
11412
11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11456
11457
11458
11459
11460
11461
11462
11463
11464
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11475
11476
11477
11478
11479
11480
11481
11482
11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
11500
11501
11502
11503
11504
11505
11506
11507
11508
11509
11510
11511
11512
11513
11514
11515
11516
11517
11518
11519
11520
11521
11522
11523
11524
11525
11526
11527
11528
11529
11530
11531
11532
11533
11534
11535
11536
11537
11538
11539
11540
11541
11542
11543
11544
11545
11546
11547
11548
11549
11550
11551
11552
11553
11554
11555
11556
11557
11558
11559
11560
11561
11562
11563
11564
11565
11566
11567
11568
11569
11570
11571
11572
11573
11574
11575
11576
11577
11578
11579
11580
11581
11582
11583
11584
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597
11598
11599
11600
11601
11602
11603
11604
11605
11606
11607
11608
11609
11610
11611
11612
11613
11614
11615
11616
11617
11618
11619
11620
11621
11622
11623
11624
11625
11626
11627
11628
11629
11630
11631
11632
11633
11634
11635
11636
11637
11638
11639
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659
11660
11661
11662
11663
11664
11665
11666
11667
11668
11669
11670
11671
11672
11673
11674
11675
11676
11677
11678
11679
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
11698
11699
11700
11701
11702
11703
11704
11705
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11741
11742
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755
11756
11757
11758
11759
11760
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
11787
11788
11789
11790
11791
11792
11793
11794
11795
11796
11797
11798
11799
11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823
11824
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11845
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857
11858
11859
11860
11861
11862
11863
11864
11865
11866
11867
11868
11869
11870
11871
11872
11873
11874
11875
11876
11877
11878
11879
11880
11881
11882
11883
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907
11908
11909
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11920
11921
11922
11923
11924
11925
11926
11927
11928
11929
11930
11931
11932
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11958
11959
11960
11961
11962
11963
11964
11965
11966
11967
11968
11969
11970
11971
11972
11973
11974
11975
11976
11977
11978
11979
11980
11981
11982
11983
11984
11985
11986
11987
11988
11989
11990
11991
11992
11993
11994
11995
11996
11997
11998
11999
12000
12001
12002
12003
12004
12005
12006
12007
12008
12009
12010
12011
12012
12013
12014
12015
12016
12017
12018
12019
12020
12021
12022
12023
12024
12025
12026
12027
12028
12029
12030
12031
12032
12033
12034
12035
12036
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063
12064
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12094
12095
12096
12097
12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108
12109
12110
12111
12112
12113
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
12143
12144
12145
12146
12147
12148
12149
12150
12151
12152
12153
12154
12155
12156
12157
12158
12159
12160
12161
12162
12163
12164
12165
12166
12167
12168
12169
12170
12171
12172
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
12208
12209
12210
12211
12212
12213
12214
12215
12216
12217
12218
12219
12220
12221
12222
12223
12224
12225
12226
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12266
12267
12268
12269
12270
12271
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12306
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656
12657
12658
12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12677
12678
12679
12680
12681
12682
12683
12684
12685
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12824
12825
12826
12827
12828
12829
12830
12831
12832
12833
12834
12835
12836
12837
12838
12839
12840
12841
12842
12843
12844
12845
12846
12847
12848
12849
12850
12851
12852
12853
12854
12855
12856
12857
12858
12859
12860
12861
12862
12863
12864
12865
12866
12867
12868
12869
12870
12871
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881
12882
12883
12884
12885
12886
12887
12888
12889
12890
12891
12892
12893
12894
12895
12896
12897
12898
12899
12900
12901
12902
12903
12904
12905
12906
12907
12908
12909
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13001
13002
13003
13004
13005
13006
13007
13008
13009
13010
13011
13012
13013
13014
13015
13016
13017
13018
13019
13020
13021
13022
13023
13024
13025
13026
13027
13028
13029
13030
13031
13032
13033
13034
13035
13036
13037
13038
13039
13040
13041
13042
13043
13044
13045
13046
13047
13048
13049
13050
13051
13052
13053
13054
13055
13056
13057
13058
13059
13060
13061
13062
13063
13064
13065
13066
13067
13068
13069
13070
13071
13072
13073
13074
13075
13076
13077
13078
13079
13080
13081
13082
13083
13084
13085
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
13154
13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13165
13166
13167
13168
13169
13170
13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13182
13183
13184
13185
13186
13187
13188
13189
13190
13191
13192
13193
13194
13195
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13209
13210
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373
13374
13375
13376
13377
13378
13379
13380
13381
13382
13383
13384
13385
13386
13387
13388
13389
13390
13391
13392
13393
13394
13395
13396
13397
13398
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
13478
13479
13480
13481
13482
13483
13484
13485
13486
13487
13488
13489
13490
13491
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13565
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13606
13607
13608
13609
13610
13611
13612
13613
13614
13615
13616
13617
13618
13619
13620
13621
13622
13623
13624
13625
13626
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647
13648
13649
13650
13651
13652
13653
13654
13655
13656
13657
13658
13659
13660
13661
13662
13663
13664
13665
13666
13667
13668
13669
13670
13671
13672
13673
13674
13675
13676
13677
13678
13679
13680
13681
13682
13683
13684
13685
13686
13687
13688
13689
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781
13782
13783
13784
13785
13786
13787
13788
13789
13790
13791
13792
13793
13794
13795
13796
13797
13798
13799
13800
13801
13802
13803
13804
13805
13806
13807
13808
13809
13810
13811
13812
13813
13814
13815
13816
13817
13818
13819
13820
13821
13822
13823
13824
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843
13844
13845
13846
13847
13848
13849
13850
13851
13852
13853
13854
13855
13856
13857
13858
13859
13860
13861
13862
13863
13864
13865
13866
13867
13868
13869
13870
13871
13872
13873
13874
13875
13876
13877
13878
13879
13880
13881
13882
13883
13884
13885
13886
13887
13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
13908
13909
13910
13911
13912
13913
13914
13915
13916
13917
13918
13919
13920
13921
13922
13923
13924
13925
13926
13927
13928
13929
13930
13931
13932
13933
13934
13935
13936
13937
13938
13939
13940
13941
13942
13943
13944
13945
13946
13947
13948
13949
13950
13951
13952
13953
13954
13955
13956
13957
13958
13959
13960
13961
13962
13963
13964
13965
13966
13967
13968
13969
13970
13971
13972
13973
13974
13975
13976
13977
13978
13979
13980
13981
13982
13983
13984
13985
13986
13987
13988
13989
13990
13991
13992
13993
13994
13995
13996
13997
13998
13999
14000
14001
14002
14003
14004
14005
14006
14007
14008
14009
14010
14011
14012
14013
14014
14015
14016
14017
14018
14019
14020
14021
14022
14023
14024
14025
14026
14027
14028
14029
14030
14031
14032
14033
14034
14035
14036
14037
14038
14039
14040
14041
14042
14043
14044
14045
14046
14047
14048
14049
14050
14051
14052
14053
14054
14055
14056
14057
14058
14059
14060
14061
14062
14063
14064
14065
14066
14067
14068
14069
14070
14071
14072
14073
14074
14075
14076
14077
14078
14079
14080
14081
14082
14083
14084
14085
14086
14087
14088
14089
14090
14091
14092
14093
14094
14095
14096
14097
14098
14099
14100
14101
14102
14103
14104
14105
14106
14107
14108
14109
14110
14111
14112
14113
14114
14115
14116
14117
14118
14119
14120
14121
14122
14123
14124
14125
14126
14127
14128
14129
14130
14131
14132
14133
14134
14135
14136
14137
14138
14139
14140
14141
14142
14143
14144
14145
14146
14147
14148
14149
14150
14151
14152
14153
14154
14155
14156
14157
14158
14159
14160
14161
14162
14163
14164
14165
14166
14167
14168
14169
14170
14171
14172
14173
14174
14175
14176
14177
14178
14179
14180
14181
14182
14183
14184
14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229
14230
14231
14232
14233
14234
14235
14236
14237
14238
14239
14240
14241
14242
14243
14244
14245
14246
14247
14248
14249
14250
14251
14252
14253
14254
14255
14256
14257
14258
14259
14260
14261
14262
14263
14264
14265
14266
14267
14268
14269
14270
14271
14272
14273
14274
14275
14276
14277
14278
14279
14280
14281
14282
14283
14284
14285
14286
14287
14288
14289
14290
14291
14292
14293
14294
14295
14296
14297
14298
14299
14300
14301
14302
14303
14304
14305
14306
14307
14308
14309
14310
14311
14312
14313
14314
14315
14316
14317
14318
14319
14320
14321
14322
14323
14324
14325
14326
14327
14328
14329
14330
14331
14332
14333
14334
14335
14336
14337
14338
14339
14340
14341
14342
14343
14344
14345
14346
14347
14348
14349
14350
14351
14352
14353
14354
14355
14356
14357
14358
14359
14360
14361
14362
14363
14364
14365
14366
14367
14368
14369
14370
14371
14372
14373
14374
14375
14376
14377
14378
14379
14380
14381
14382
14383
14384
14385
14386
14387
14388
14389
14390
14391
14392
14393
14394
14395
14396
14397
14398
14399
14400
14401
14402
14403
14404
14405
14406
14407
14408
14409
14410
14411
14412
14413
14414
14415
14416
14417
14418
14419
14420
14421
14422
14423
14424
14425
14426
14427
14428
14429
14430
14431
14432
14433
14434
14435
14436
14437
14438
14439
14440
14441
14442
14443
14444
14445
14446
14447
14448
14449
14450
14451
14452
14453
14454
14455
14456
14457
14458
14459
14460
14461
14462
14463
14464
14465
14466
14467
14468
14469
14470
14471
14472
14473
14474
14475
14476
14477
14478
14479
14480
14481
14482
14483
14484
14485
14486
14487
14488
14489
14490
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501
14502
14503
14504
14505
14506
14507
14508
14509
14510
14511
14512
14513
14514
14515
14516
14517
14518
14519
14520
14521
14522
14523
14524
14525
14526
14527
14528
14529
14530
14531
14532
14533
14534
14535
14536
14537
14538
14539
14540
14541
14542
14543
14544
14545
14546
14547
14548
14549
14550
14551
14552
14553
14554
14555
14556
14557
14558
14559
14560
14561
14562
14563
14564
14565
14566
14567
14568
14569
14570
14571
14572
14573
14574
14575
14576
14577
14578
14579
14580
14581
14582
14583
14584
14585
14586
14587
14588
14589
14590
14591
14592
14593
14594
14595
14596
14597
14598
14599
14600
14601
14602
14603
14604
14605
14606
14607
14608
14609
14610
14611
14612
14613
14614
14615
14616
14617
14618
14619
14620
14621
14622
14623
14624
14625
14626
14627
14628
14629
14630
14631
14632
14633
14634
14635
14636
14637
14638
14639
14640
14641
14642
14643
14644
14645
14646
14647
14648
14649
14650
14651
14652
14653
14654
14655
14656
14657
14658
14659
14660
14661
14662
14663
14664
14665
14666
14667
14668
14669
14670
14671
14672
14673
14674
14675
14676
14677
14678
14679
14680
14681
14682
14683
14684
14685
14686
14687
14688
14689
14690
14691
14692
14693
14694
14695
14696
14697
14698
14699
14700
14701
14702
14703
14704
14705
14706
14707
14708
14709
14710
14711
14712
14713
14714
14715
14716
14717
14718
14719
14720
14721
14722
14723
14724
14725
14726
14727
14728
14729
14730
14731
14732
14733
14734
14735
14736
14737
14738
14739
14740
14741
14742
14743
14744
14745
14746
14747
14748
14749
14750
14751
14752
14753
14754
14755
14756
14757
14758
14759
14760
14761
14762
14763
14764
14765
14766
14767
14768
14769
14770
14771
14772
14773
14774
14775
14776
14777
14778
14779
14780
14781
14782
14783
14784
14785
14786
14787
14788
14789
14790
14791
14792
14793
14794
14795
14796
14797
14798
14799
14800
14801
14802
14803
14804
14805
14806
14807
14808
14809
14810
14811
14812
14813
14814
14815
14816
14817
14818
14819
14820
14821
14822
14823
14824
14825
14826
14827
14828
14829
14830
14831
14832
14833
14834
14835
14836
14837
14838
14839
14840
14841
14842
14843
14844
14845
14846
14847
14848
14849
14850
14851
14852
14853
14854
14855
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866
14867
14868
14869
14870
14871
14872
14873
14874
14875
14876
14877
14878
14879
14880
14881
14882
14883
14884
14885
14886
14887
14888
14889
14890
14891
14892
14893
14894
14895
14896
14897
14898
14899
14900
14901
14902
14903
14904
14905
14906
14907
14908
14909
14910
14911
14912
14913
14914
14915
14916
14917
14918
14919
14920
14921
14922
14923
14924
14925
14926
14927
14928
14929
14930
14931
14932
14933
14934
14935
14936
14937
14938
14939
14940
14941
14942
14943
14944
14945
14946
14947
14948
14949
14950
14951
14952
14953
14954
14955
14956
14957
14958
14959
14960
14961
14962
14963
14964
14965
14966
14967
14968
14969
14970
14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
14988
14989
14990
14991
14992
14993
14994
14995
14996
14997
14998
14999
15000
15001
15002
15003
15004
15005
15006
15007
15008
15009
15010
15011
15012
15013
15014
15015
15016
15017
15018
15019
15020
15021
15022
15023
15024
15025
15026
15027
15028
15029
15030
15031
15032
15033
15034
15035
15036
15037
15038
15039
15040
15041
15042
15043
15044
15045
15046
15047
15048
15049
15050
15051
15052
15053
15054
15055
15056
15057
15058
15059
15060
15061
15062
15063
15064
15065
15066
15067
15068
15069
15070
15071
15072
15073
15074
15075
15076
15077
15078
15079
15080
15081
15082
15083
15084
15085
15086
15087
15088
15089
15090
15091
15092
15093
15094
15095
15096
15097
15098
15099
15100
15101
15102
15103
15104
15105
15106
15107
15108
15109
15110
15111
15112
15113
15114
15115
15116
15117
15118
15119
15120
15121
15122
15123
15124
15125
15126
15127
15128
15129
15130
15131
15132
15133
15134
15135
15136
15137
15138
15139
15140
15141
15142
15143
15144
15145
15146
15147
15148
15149
15150
15151
15152
15153
15154
15155
15156
15157
15158
15159
15160
15161
15162
15163
15164
15165
15166
15167
15168
15169
15170
15171
15172
15173
15174
15175
15176
15177
15178
15179
15180
15181
15182
15183
15184
15185
15186
15187
15188
15189
15190
15191
15192
15193
15194
15195
15196
15197
15198
15199
15200
15201
15202
15203
15204
15205
15206
15207
15208
15209
15210
15211
15212
15213
15214
15215
15216
15217
15218
15219
15220
15221
15222
15223
15224
15225
15226
15227
15228
15229
15230
15231
15232
15233
15234
15235
15236
15237
15238
15239
15240
15241
15242
15243
15244
15245
15246
15247
15248
15249
15250
15251
15252
15253
15254
15255
15256
15257
15258
15259
15260
15261
15262
15263
15264
15265
15266
15267
15268
15269
15270
15271
15272
15273
15274
15275
15276
15277
15278
15279
15280
15281
15282
15283
15284
15285
15286
15287
15288
15289
15290
15291
15292
15293
15294
15295
15296
15297
15298
15299
15300
15301
15302
15303
15304
15305
15306
15307
15308
15309
15310
15311
15312
15313
15314
15315
15316
15317
15318
15319
15320
15321
15322
15323
15324
15325
15326
15327
15328
15329
15330
15331
15332
15333
15334
15335
15336
15337
15338
15339
15340
15341
15342
15343
15344
15345
15346
15347
15348
15349
15350
15351
15352
15353
15354
15355
15356
15357
15358
15359
15360
15361
15362
15363
15364
15365
15366
15367
15368
15369
15370
15371
15372
15373
15374
15375
15376
15377
15378
15379
15380
15381
15382
15383
15384
15385
15386
15387
15388
15389
15390
15391
15392
15393
15394
15395
15396
15397
15398
15399
15400
15401
15402
15403
15404
15405
15406
15407
15408
15409
15410
15411
15412
15413
15414
15415
15416
15417
15418
15419
15420
15421
15422
15423
15424
15425
15426
15427
15428
15429
15430
15431
15432
15433
15434
15435
15436
15437
15438
15439
15440
15441
15442
15443
15444
15445
15446
15447
15448
15449
15450
15451
15452
15453
15454
15455
15456
15457
15458
15459
15460
15461
15462
15463
15464
15465
15466
15467
15468
15469
15470
15471
15472
15473
15474
15475
15476
15477
15478
15479
15480
15481
15482
15483
15484
15485
15486
15487
15488
15489
15490
15491
15492
15493
15494
15495
15496
15497
15498
15499
15500
15501
15502
15503
15504
15505
15506
15507
15508
15509
15510
15511
15512
15513
15514
15515
15516
15517
15518
15519
15520
15521
15522
15523
15524
15525
15526
15527
15528
15529
15530
15531
15532
15533
15534
15535
15536
15537
15538
15539
15540
15541
15542
15543
15544
15545
15546
15547
15548
15549
15550
15551
15552
15553
15554
15555
15556
15557
15558
15559
15560
15561
15562
15563
15564
15565
15566
15567
15568
15569
15570
15571
15572
15573
15574
15575
15576
15577
15578
15579
15580
15581
15582
15583
15584
15585
15586
15587
15588
15589
15590
15591
15592
15593
15594
15595
15596
15597
15598
15599
15600
15601
15602
15603
15604
15605
15606
15607
15608
15609
15610
15611
15612
15613
15614
15615
15616
15617
15618
15619
15620
15621
15622
15623
15624
15625
15626
15627
15628
15629
15630
15631
15632
15633
15634
15635
15636
15637
15638
15639
15640
15641
15642
15643
15644
15645
15646
15647
15648
15649
15650
15651
15652
15653
15654
15655
15656
15657
15658
15659
15660
15661
15662
15663
15664
15665
15666
15667
15668
15669
15670
15671
15672
15673
15674
15675
15676
15677
15678
15679
15680
15681
15682
15683
15684
15685
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695
15696
15697
15698
15699
15700
15701
15702
15703
15704
15705
15706
15707
15708
15709
15710
15711
15712
15713
15714
15715
15716
15717
15718
15719
15720
15721
15722
15723
15724
15725
15726
15727
15728
15729
15730
15731
15732
15733
15734
15735
15736
15737
15738
15739
15740
15741
15742
15743
15744
15745
15746
15747
15748
15749
15750
15751
15752
15753
15754
15755
15756
15757
15758
15759
15760
15761
15762
15763
15764
15765
15766
15767
15768
15769
15770
15771
15772
15773
15774
15775
15776
15777
15778
15779
15780
15781
15782
15783
15784
15785
15786
15787
15788
15789
15790
15791
15792
15793
15794
15795
15796
15797
15798
15799
15800
15801
15802
15803
15804
15805
15806
15807
15808
15809
15810
15811
15812
15813
15814
15815
15816
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826
15827
15828
15829
15830
15831
15832
15833
15834
15835
15836
15837
15838
15839
15840
15841
15842
15843
15844
15845
15846
15847
15848
15849
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
15873
15874
15875
15876
15877
15878
15879
15880
15881
15882
15883
15884
15885
15886
15887
15888
15889
15890
15891
15892
15893
15894
15895
15896
15897
15898
15899
15900
15901
15902
15903
15904
15905
15906
15907
15908
15909
15910
15911
15912
15913
15914
15915
15916
15917
15918
15919
15920
15921
15922
15923
15924
15925
15926
15927
15928
15929
15930
15931
15932
15933
15934
15935
15936
15937
15938
15939
15940
15941
15942
15943
15944
15945
15946
15947
15948
15949
15950
15951
15952
15953
15954
15955
15956
15957
15958
15959
15960
15961
15962
15963
15964
15965
15966
15967
15968
15969
15970
15971
15972
15973
15974
15975
15976
15977
15978
15979
15980
15981
15982
15983
15984
15985
15986
15987
15988
15989
15990
15991
15992
15993
15994
15995
15996
15997
15998
15999
16000
16001
16002
16003
16004
16005
16006
16007
16008
16009
16010
16011
16012
16013
16014
16015
16016
16017
16018
16019
16020
16021
16022
16023
16024
16025
16026
16027
16028
16029
16030
16031
16032
16033
16034
16035
16036
16037
16038
16039
16040
16041
16042
16043
16044
16045
16046
16047
16048
16049
16050
16051
16052
16053
16054
16055
16056
16057
16058
16059
16060
16061
16062
16063
16064
16065
16066
16067
16068
16069
16070
16071
16072
16073
16074
16075
16076
16077
16078
16079
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
16104
16105
16106
16107
16108
16109
16110
16111
16112
16113
16114
16115
16116
16117
16118
16119
16120
16121
16122
16123
16124
16125
16126
16127
16128
16129
16130
16131
16132
16133
16134
16135
16136
16137
16138
16139
16140
16141
16142
16143
16144
16145
16146
16147
16148
16149
16150
16151
16152
16153
16154
16155
16156
16157
16158
16159
16160
16161
16162
16163
16164
16165
16166
16167
16168
16169
16170
16171
16172
16173
16174
16175
16176
16177
16178
16179
16180
16181
16182
16183
16184
16185
16186
16187
16188
16189
16190
16191
16192
16193
16194
16195
16196
16197
16198
16199
16200
16201
16202
16203
16204
16205
16206
16207
16208
16209
16210
16211
16212
16213
16214
16215
16216
16217
16218
16219
16220
16221
16222
16223
16224
16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238
16239
16240
16241
16242
16243
16244
16245
16246
16247
16248
16249
16250
16251
16252
16253
16254
16255
16256
16257
16258
16259
16260
16261
16262
16263
16264
16265
16266
16267
16268
16269
16270
16271
16272
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307
16308
16309
16310
16311
16312
16313
16314
16315
16316
16317
16318
16319
16320
16321
16322
16323
16324
16325
16326
16327
16328
16329
16330
16331
16332
16333
16334
16335
16336
16337
16338
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
16364
16365
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
16426
16427
16428
16429
16430
16431
16432
16433
16434
16435
16436
16437
16438
16439
16440
16441
16442
16443
16444
16445
16446
16447
16448
16449
16450
16451
16452
16453
16454
16455
16456
16457
16458
16459
16460
16461
16462
16463
16464
16465
16466
16467
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
16485
16486
16487
16488
16489
16490
16491
16492
16493
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
16509
16510
16511
16512
16513
16514
16515
16516
16517
16518
16519
16520
16521
16522
16523
16524
16525
16526
16527
16528
16529
16530
16531
16532
16533
16534
16535
16536
16537
16538
16539
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554
16555
16556
16557
16558
16559
16560
16561
16562
16563
16564
16565
16566
16567
16568
16569
16570
16571
16572
16573
16574
16575
16576
16577
16578
16579
16580
16581
16582
16583
16584
16585
16586
16587
16588
16589
16590
16591
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
16609
16610
16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
16628
16629
16630
16631
16632
16633
16634
16635
16636
16637
16638
16639
16640
16641
16642
16643
16644
16645
16646
16647
16648
16649
16650
16651
16652
16653
16654
16655
16656
16657
16658
16659
16660
16661
16662
16663
16664
16665
16666
16667
16668
16669
16670
16671
16672
16673
16674
16675
16676
16677
16678
16679
16680
16681
16682
16683
16684
16685
16686
16687
16688
16689
16690
16691
16692
16693
16694
16695
16696
16697
16698
16699
16700
16701
16702
16703
16704
16705
16706
16707
16708
16709
16710
16711
16712
16713
16714
16715
16716
16717
16718
16719
16720
16721
16722
16723
16724
16725
16726
16727
16728
16729
16730
16731
16732
16733
16734
16735
16736
16737
16738
16739
16740
16741
16742
16743
16744
16745
16746
16747
16748
16749
16750
16751
16752
16753
16754
16755
16756
16757
16758
16759
16760
16761
16762
16763
16764
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774
16775
16776
16777
16778
16779
16780
16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
16796
16797
16798
16799
16800
16801
16802
16803
16804
16805
16806
16807
16808
16809
16810
16811
16812
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835
16836
16837
16838
16839
16840
16841
16842
16843
16844
16845
16846
16847
16848
16849
16850
16851
16852
16853
16854
16855
16856
16857
16858
16859
16860
16861
16862
16863
16864
16865
16866
16867
16868
16869
16870
16871
16872
16873
16874
16875
16876
16877
16878
16879
16880
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891
16892
16893
16894
16895
16896
16897
16898
16899
16900
16901
16902
16903
16904
16905
16906
16907
16908
16909
16910
16911
16912
16913
16914
16915
16916
16917
16918
16919
16920
16921
16922
16923
16924
16925
16926
16927
16928
16929
16930
16931
16932
16933
16934
16935
16936
16937
16938
16939
16940
16941
16942
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
16959
16960
16961
16962
16963
16964
16965
16966
16967
16968
16969
16970
16971
16972
16973
16974
16975
16976
16977
16978
16979
16980
16981
16982
16983
16984
16985
16986
16987
16988
16989
16990
16991
16992
16993
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004
17005
17006
17007
17008
17009
17010
17011
17012
17013
17014
17015
17016
17017
17018
17019
17020
17021
17022
17023
17024
17025
17026
17027
17028
17029
17030
17031
17032
17033
17034
17035
17036
17037
17038
17039
17040
17041
17042
17043
17044
17045
17046
17047
17048
17049
17050
17051
17052
17053
17054
17055
17056
17057
17058
17059
17060
17061
17062
17063
17064
17065
17066
17067
17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
17096
17097
17098
17099
17100
17101
17102
17103
17104
17105
17106
17107
17108
17109
17110
17111
17112
17113
17114
17115
17116
17117
17118
17119
17120
17121
17122
17123
17124
17125
17126
17127
17128
17129
17130
17131
17132
17133
17134
17135
17136
17137
17138
17139
17140
17141
17142
17143
17144
17145
17146
17147
17148
17149
17150
17151
17152
17153
17154
17155
17156
17157
17158
17159
17160
17161
17162
17163
17164
17165
17166
17167
17168
17169
17170
17171
17172
17173
17174
17175
17176
17177
17178
17179
17180
17181
17182
17183
17184
17185
17186
17187
17188
17189
17190
17191
17192
17193
17194
17195
17196
17197
17198
17199
17200
17201
17202
17203
17204
17205
17206
17207
17208
17209
17210
17211
17212
evhelp.txt
Run-time help file used by Surface Evolver.

 The Surface Evolver

 Kenneth A. Brakke
 Mathematics Department
 Susquehanna University
 Selinsgrove, PA, 17870
 brakke@susqu.edu

<----------------------------- __bhead_index ------------------------------>

A body attribute used internally by Hessian routines.

<----------------------------- __vhead_index ------------------------------>

A vertex attribute used internally by Hessian routines.

<------------------------------ __vgrad_head ------------------------------>

A vertex attribute used internally.

<------------------------------- __volgrad -------------------------------->

A vertex attribute used internally for debugging.  Not declared
by default, but if the user declares it as a 2D array, volume
gradients will be stored for later examination, as one gradient
vector for each body.  Sample declaration at runtime:
   define vertex attribute __volgrad[body_count][3]

<------------------------------ __vgrad_head ------------------------------>

Internal vertex attribute used in volume gradient calculations.

<----------------------------- __volvelocity ------------------------------>

A vertex attribute used internally for debugging.  Not declared
by default, but if the user declares it as a 2D array, volume
velocities will be stored for later examination, as one volume
correction vector vector for each body, i.e. the volume gradient
after application of the metric.  Sample declaration at runtime:
   define vertex attribute __volvelocity[body_count][3]

<------------------------------- v_boundary ------------------------------->

Built-in vertex attribute.
If there are parameterized boundaries, then there is a read-only
integer vertex attribute v_boundary that holds the number of
the boundary the vertex is on, or 0 if it is not on a boundary.  Note
that named parameterized boundaries are internally assigned numbers,
which are what show up here. Use the "set vertex boundary ..." or 
"unset vertex boundary" commands to change the boundary status of 
a vertex; do not try to assign a value to v_boundary.

<------------------------------- e_boundary ------------------------------->

Built-in edge attribute.
If there are parameterized boundaries, then there is a read-only
integer edge attribute e_boundary that holds the number of
the boundary the edge is on, or 0 if it is not on a boundary.  Note
that named parameterized boundaries are internally assigned numbers,
which are what show up here.  Use the "set edge boundary ..." or 
"unset edge boundary" commands to change the boundary status of an 
edge; do not try to assign a value to e_boundary.

<------------------------------- f_boundary ------------------------------->

Built-in facet attribute.
If there are parameterized boundaries, then there is a read-only
integer facet attribute f_boundary that holds the number of
the boundary the facet is on, or 0 if it is not on a boundary.  Note
that named parameterized boundaries are internally assigned numbers,
which are what show up here.  Use the "set facet boundary ..." or 
"unset facet boundary" commands to change the boundary status of an 
facet; do not try to assign a value to f_boundary.

<---------------------------------- __x ----------------------------------->

Built-in read-write vertex attribute name for the coordinates. This is a
vector of length equal to the space dimension.  Useful in referring to 
the coordinates as a whole as a vector, as in a dot product, e.g.
   print vertex[1].__x
   prod := vertex[1].__x * vertex[2].__x
   set vertex __x  2*__x
The underscores in front are to distinguish it from the scalar x attribute.

<--------------------------------- v_oldx --------------------------------->

Internal vertex attribute used to store the old coordinates when doing a 
move to find minimum energy in the "g" or "hessian_seek" commands.  v_oldx 
is writable by the user, just in case you might find it handy, but
any values you store there are very temporary.  v_oldx is a vector of
length equal to the space dimension.

<------------------------------ edge_vector ------------------------------->

Built-in edge array attribute containing the vector components of an edge from 
tail to head.  It is the unwrapped vector in case of torus or symmetry groups, 
i.e. the vector you really want.  The individual scalar components are
available as the edge attributes x,y,z, but edge_vector is able to be used 
as a vector in dot products and the like.   Read only.
Examples:  dprod := edge[1].edge_vector * edge[2].edge_vector
           print edge[1].edge_vector

<------------------------------- e_wrap_list -------------------------------->

Built-in edge integer vector attribute.  Internal name for the "wrap"
attribute of an edge in a torus or symmetry model. It holds the integer used 
to encode the wrap of an edge. Note that this is implemented as an array of 
length 1 rather than just a value, so it could be length 0 if not needed.  
Listed here just because this is the name that shows up in the
"list attributes" command. Readable and writable.
Example:  print edge[3].e_wrap_list[1]
          print edge[3].wrap  // equivalent

<----------------------------------- p ------------------------------------>

Built-in vertex vector attribute name for the parameter values of a vertex
when parameterized boundaries are present.  This is a vector whose
length is equal to the maximum number of parameters in any boundary.
Readable and writable.

<----------------------------- v_method_list ------------------------------>

Built-in vertex vector attribute holding the id numbers of the method
instances that this vertex contributes to.  Size expands as needed.
Read-only.  Meant for internal use only.   Use "set vertex method ... " 
or "unset vertex method .." to change the status of a vertex.

<----------------------------- e_method_list ------------------------------>

Built-in edge vector attribute holding the id numbers of the method
instances that this edge contributes to.  Size expands as needed.
Read-only. Meant for internal use only.  Use "set edge method ... " 
or "unset edge method .." to change the status of a edge.

<----------------------------- f_method_list ------------------------------>

Built-in facet vector attribute holding the id numbers of the method
instances that this facet contributes to.  Size expands as needed.
Read-only.   Meant for internal use only.   Use "set facet method ... " 
or "unset facet method .." to change the status of a facet.

<------------------------------- f_vertices ------------------------------->

Internal facet array attribute holding the id numbers of the vertices
of the facet.  Not accessible to users since the datatype is element_id,
which is not implemented in the user interface.  Mentioned here since
it does show up when you do the list_attributes command.

<------------------------------ facet_normal ------------------------------>

Built-in facet read-only vector attribute holding the normal vector
of the facet, normalized so its length is equal to the area of the
facet.  Synonymous with x[] or x,y,z, (that is, facet[1].x[2] is equal
to facet[1].y is equal to facet[1].facet_normal[2]),  but it is useful 
where it is needed to refer to the normal as a vector, as in dot products. 
Example:
    dprod := facet[1].facet_normal * facet[2].facet_normal

<------------------------------ f_body_list ------------------------------->

Internal facet array attribute holding the front and back body ids.
Not directly accessible to users since its datatype is element_id.
Users access it through the frontbody and backbody attributes of
a facet.  The array size is 0 if no bodies are present, to save room.  
Mentioned here since it does show up when you do the list_attributes command.

<------------------------------ next_vfacet ------------------------------->

Internal facet attribute used to implement linked list of facets
adjacent to a vertex.  This is used in commands that iterate over the
facets adjacent to a vertex, like
   print sum(vertex[1].facet,area)
This attribute is not directly accessible to the user, since its
datatype is element_id.
Mentioned here since it does show up when you do the list_attributes command.

<------------------------------ next_bfacet ------------------------------->

Internal facet attribute used to implement linked lists of facets
comprising bodies.  This is used in commands that iterate over the
facets of a body, like
   print sum(body[1].facet,area)
This attribute is not directly accessible to the user, since its
datatype is element_id.
Mentioned here since it does show up when you do the list_attributes command.

<----------------------------- b_method_list ------------------------------>

Built-in body attribute holding the id numbers of the method
instances that this body contributes to.  Size expands as needed.
Read-only.  Meant for internal use.  Use "set body method_instance ..." 
or "unset body method_instance ... " to change.

    
<----------------------------------- A ------------------------------------>

Single letter main command. Lists the current values of variables.  You 
are allowed you to enter new values. The new value is entered as the number 
of the variable (from the list) and the new value. Exit by hitting RETURN on 
a blank line. All changes that can be made here can also be made with 
assignment commands.  The "A" command dates from the time before
there were assignment commands; now I use this command just for scanning
the values of variables.


<----------------------------------- a ------------------------------------>

Single letter main command. Toggles area normalization of vertex forces
and other gradients, to model motion by mean curvature.  That is, the
velocity of a vertex is the force divided by the area associated to the
vertex (or length in the string model).  Meant to be used with a fixed 
scale factor. Be sure you have a small enough scale factor or else 
things tend to blow up. Reduce the scale factor temporarily after
refinement, since triangle areas are cut by a factor of 4 but the old
creases remain. When this option is toggled ON, you are asked whether
you want an optional check that can be made for facets that move too much. 
This is done by computing the ratio of the length of the normal change to 
the length of the old normal. If this exceeds the user-specified value, 
then all vertices are restored to their previous position. The user should 
reduce the motion scale factor and iterate again.  Same as the 
area_normalization toggle command, except that does not ask about the 
optional check.

<--------------------------------- abort ---------------------------------->

Main prompt command. Causes immediate termination of the executing command
and returns to the command prompt. Meant for stopping execution of a
command when an error condition is found. There will be an error message
output, giving the file and line number where the abort occurred, but it is
still wise to have a script or procedure or function print an error message
using errprintf before doing the abort command, so the user knows why. 
If used at a "subcommand" prompt, the abort command will return to the main
prompt. 
 
<---------------------------------- abs ----------------------------------->

 abs(x) : Absolute value of x.

<-------------------------------- ackerman -------------------------------->

Named method. Description: Not actually an energy, but a kludge to put
inertia on vertices. Uses extra velocity coordinates to represent vertex in
phase space. Invocation actually transfers computed forces from space
coordinates to velocity coordinates, so forces become acceleration instead
of velocity. 

Element: vertex. 
Parameters: none. 
Models: any. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity jeremy energy method ackerman global


<---------------------------------- acos ---------------------------------->
<---------------------------------- asin ---------------------------------->
<---------------------------------- atan ---------------------------------->

acos(x),asin(x),atan(x): Inverse trig functions. acos, asin arguments are
clamped to [-1,1]. Results in radians.  asin(x) range is -pi/2 to pi/2,
acos(x) range is 0 to pi, and atan(x) range is -pi/2 to pi/2.  Also see
atan2(y,x).

<--------------------------------- acosh ---------------------------------->
<--------------------------------- asinh ---------------------------------->
<--------------------------------- atanh ---------------------------------->

asinh(x),acosh(x),atanh(x): Inverse hyperbolic functions.  acosh(x)
domain is x >= 1; other values will give run-time errors.

<----------------------------- actual_volume ------------------------------>

Body datafile attribute. Actual_volume is an optional number that can be 
specified in the datafile definition of a body in the rare circumstances 
where the torus volume volconst calculation gives the wrong answer; volconst 
will be adjusted to give this volume of the body.  Example:
  bodies
    1   1 2 3 4 5  volume 1  actual_volume 0.8
This means the target volume is 1, but the volume of the body as loaded
from the datafile should be 0.8, and the body's volconst will be adjusted
to make that true.

<-------------------------------- addload --------------------------------->

Main prompt command. 
Loads a new datafile without deleting the current surface, permitting the
simultaneous loading of multiple copies of the same datafile or different
datafiles. Syntax: 
 
   ADDLOAD string 

where string is either a sting literal in double quotes, or a string
variable name such as datafilename. Elements in the new datafile are
re-numbered to not conflict with existing elements. This is actually the
same as the default behavior of Evolver when loading a single datafile.
Thus the -i command line option or the keep_originals keyword is not obeyed
for the new datafile. The "read" section of the new datafile is not executed;
this permits a datafile to use the addload command in its read section to
load more copies of itself. Your loading script is responsible for all
initialization that would ordinarily be done in the read section of the new
datafile. Declarations in the top section of the new datafile will
overwrite any existing declarations. This is usually not a problem when
loading multiple copies of the same datafile, but requires attention when
loading different datafiles. For example, numbered constraints are a bad
idea; use named constraints instead. See the sample datafile
addload_example.fe for an example of how to load and distinguish between
multiple copies of the same surface.  For variables you don't want 
written, you can set the no_dump property of a variable to prevent it 
from being dumped in the top of the datafile; it will be dumped in the 
bottom section instead. 
Example (as commands, not in the top of the datafile):
  htvar := 2.3
  htvar.no_dump on
 
<-------------------------- aggregate functions --------------------------->
<---------------------------------- avg ----------------------------------->
<---------------------------------- sum ----------------------------------->
<---------------------------------- min ----------------------------------->
<---------------------------------- max ----------------------------------->
<--------------------------------- count ---------------------------------->

Aggregate functions give a result from a specified set of geometric
elements.  The maximum, minimum, sum, count, or average of an expression over
a set of elements may be done with aggregate functions. The syntax is

   max(generator,expr)
   min(generator,expr)
   sum(generator,expr)
   avg(generator,expr)
   count(generator,expr)

Example: this prints the total area of all green facets:

   print sum(facet where color == green, area)

"Count" is an aggregate function that gives the number of elements
generated, regardless of the expression.

Use maximum(a,b) or minimum(a,b) for the arithmetical maximum or minimum
of two numbers.

<--------------------------- aggregate commands --------------------------->

Certain commands (fix, unfix, set, unset, list, delete, dissolve, 
refine, edgeswap, foreach, vertex_average, equiangulate, pop, 
t1_edgeswap, reverse_orientation, etc.) act on sets of elements. By 
default, the set is all elements of the appropriate type, but the
set may be narrowed by use of a "where" clause.  Examples:
   list vertices
   delete edges where length < 0.001
   set edge[23] color red
   set vertex[2].facets color green

<------------------------- MPI aggregate commands ------------------------->

When MPI Evolver executes an aggregate command (fix, unfix, set, unset, 
histogram, list, delete, dissolve, refine, edgeswap, foreach, 
vertex_average, equiangulate, pop, t1_edgeswap, reverse_orientation, 
etc.) or aggregate function (sum, min, max, avg, count) from the
main prompt, the set of elements used in each task includes only
elements belonging to that task, not imported elements.  However,
when used in a parallel_exec or task_exec command, an aggregate
will include all elements, native and imported.

<--------------------------------- alice ---------------------------------->

A keyword for a special purpose command not documented.


<---------------------------- ambient_pressure ---------------------------->

Run-time toggle command that toggles ideal gas mode with ambient pressure 
outside bodies. The external pressure can be set with the pressure phrase in 
the top of the datafile, or at runtime with the command "p 10" for example, 
to set the external pressure to 10.

<------------------------- ambient_pressure_value ------------------------->

Built-in read-write variable. Value of the external pressure in the
ideal gas model.

<--------------------------- boolean operators ---------------------------->
<---------------------------------- and ----------------------------------->
<----------------------------------- or ----------------------------------->
<---------------------------------- not ----------------------------------->
<------------------------------ greater than ------------------------------>
<------------------------------- less than -------------------------------->
<--------------------------------- equal ---------------------------------->
<------------------------------- not equal -------------------------------->

Boolean operator.  Boolean expressions are a subclass of arithmetic
expressions, with zero as false and nonzero as true; true results
evaluate as 1. The Boolean operators available are, in precedence order:

 ==,>,<,>=,<=,!=    Numerical comparison.
 NOT, !             Boolean NOT.
 AND, &&            Boolean AND, with short-circuit evaluation.
 OR, ||             Boolean OR, with short-circuit evaluation.

I advise you to use parentheses freely in compound boolean expressions,
to be sure you get your desired order of evaluation.

<------------------------------ approx_curv ------------------------------->

Evolver toggle command. Uses polyhedral curvature (linear interpolation
over facets for metric) for mean curvature vector. Actually establishes the
inner product for forms or vectors to be integration over facets of
euclidean inner products of linear interpolation of values at vertices.
Synonyms: APPROX_CURV, APPROX_CURVATURE.


<---------------------------- approx_curvature ---------------------------->

Evolver toggle command. Uses polyhedral curvature (linear interpolation
over facets for metric) for mean curvature vector. Actually establishes the
inner product for forms or vectors to be integration over facets of
euclidean inner products of linear interpolation of values at vertices.
Synonyms: APPROX_CURV, APPROX_CURVATURE.


<------------------------- approximate_curvature -------------------------->

Evolver toggle command. Uses polyhedral curvature (linear interpolation
over facets for metric) for mean curvature vector. Actually establishes the
inner product for forms or vectors to be integration over facets of
euclidean inner products of linear interpolation of values at vertices.
Synonyms: APPROX_CURV, APPROX_CURVATURE.


<---------------------------------- area ---------------------------------->

As a keyword, "area" is a read-only attribute of facets.  Examples:
    print facet[4].area
    histogram(facet where color == blue, area)
Area is normally the Euclidean area as calculated from vertex coordinates
(using Gaussian integration in quadratic and lagrange models), but it is
altered when there is a metric or an area_method_name.

<--------------------------- area_normalization --------------------------->

Toggle command for a type of surface mobility. In motion by mean curvature, 
the resistance to motion is really due to the surfaces, not the vertices. One
way to approximate this is to say the resistance to motion of a vertex is
proportional to the area associated with the vertex. So this mode counts the
area of a vertex as equal to 1/3 of the area of the star of facets around it
(or 1/2 the length of the star of edges in the string model). This is easy
to calculate, since it is a local calculation for each vertex.  The result
is that velocity = force/area, which is a much better approximation to
motion by mean curvature than the default of velocity = force.  This mode
is not restricted to motion by mean curvature.  Area normalization can be
 toggled with the "a" command or the "area_normalizaton" toggle.

<------------------------------- area_fixed ------------------------------->
<------------------------------- fixed_area ------------------------------->

An obsolete way of declaring the total area of the surface fixed in the
datafile. Synonym: fixed_area. The preferred way of doing this now is to
define a fixed named quantity in the datafile, such as
       quantity the_area fixed = 2.3 global_method facet_area
This permits all the named quantity features to be used.


<---------------------------- area_method_name ---------------------------->

This optional top-of-datafile item, area_method_name, specifies the name of the
pre-defined method to be used as the method to compute facet areas in
place of the default edge_area method in the string model or facet_area
method in the soapfilm model. It is optional. Developed so circular arcs
can be used in two-dimensional foams. Current reasonable methods are
circular_arc_area and spherical_arc_area. Synonymous with volume_method_name
in the string model.  Usage implies converting to everything_quantities mode.
Datafile syntax:

    area_method_name quoted_method_name

For example,

    string
    space_dimension 2
    area_method_name "circular_arc_area"
    length_method_name "circular_arc_length"


<------------------------------ area_square ------------------------------->

Named method. Description: Energy of a facet is the square of the facet
area. 

Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

   quantity asquare energy method area_square global


<-------------------------------- areaweed -------------------------------->

Main prompt command. For deleting facets with less than a given area.
Syntax:

   AREAWEED expr

Same as 'w' command, except does not need interactive response. Also same
as "delete facets where area < expr". Examples:
   areaweed 0.001
   areaweed 2*min(facet,area)


<--------------------------------- arrays --------------------------------->


It is possible to define multidimensional arrays of integers or reals with
the syntax

   DEFINE variablename  REAL|INTEGER|STRING [expr]...

This syntax works both in the datafile header and at the command prompt.
If the array already exists, it will be resized, with old elements kept as
far as possible. Do not resize with a different number of dimensions. Note
that array indexing starts at 1. A size of 0 is legal, and useful if you
are not using an array at the moment and want to free storage space. There
is runtime checking of array bounds. Example:

  define fvalues integer[10][4]
  define basecoord real[10][space_dimension]

Identifier names declared local can be used in array declarations in 
procedures and functions; dynamic sizes can be used, but static sizes 
may be a bit faster since memory doesn't need to be dynamically allocated.

In the top of the datafile, arrays may be initialized with
nested bracket initializers following the definition.  For example:
  define qwerty integer[4] = { 23, 45, 12, 2 }
  define vmat real[3][2] = {{1,2},{3,4},{5,6}}
  define primcol string[3] = {"red","green","blue"}
Initializers need not be complete; missing values will be zero.
Array initializers also work at runtime for assignments, for example:
  vmat[2] := { total_energy, total_area }

Array elements may be used and assigned as is usual for programming
languages:
  fvalues[3][4] := 234;
  if basecoord[3][1] > 2 then print "hello world!\n";

The print command may be used to print whole arrays or array slices in
bracketed form. Example:

   print fvalues
   print fvalues[4]

There are some basic whole-array operations that permit arrays on
the left side of an assignment statement:
   array := scalar
   array := array
   array := scalar * array
   array := array + array
   array := array - array
   array := array * array
Here "array" on both sides of the assignment means a single whole array;
not an array-producing expression  or array slice.  But "scalar" can be 
any expression that evaluates to a single value.  For multiplication, 
the arrays must be two-dimensional with properly matching sizes.  These 
operations also apply to element attributes that are arrays.

See also matrix_inverse.

<-------------------------- array initialization -------------------------->

Array initialization syntax works for runtime assignments to 
arrays and array slices, including element attributes that
are arrays.  The entries in the initializer must be single
numbers, not arrays.  The number of dimensions on the left 
and right side of the assignment must agree, but the sizes
in each dimension need not agree.  Missing elements on the 
right side are regarded as zero.  Examples:
   vertex[1].__x := { 1.2, 3.1, 4.7 }
   define mat real[2][2];
   mat := {{1,2},{3,4}}
The right side is evaluated each time the assignment is 
executed, so the entries on the right can be any expressions
that evaluate to numbers.  Assignment with += and -= also
work, as does *= and /=, but note that all of these
work element-wise (i.e. *= and /= are not matrix multiplication
and division).


<------------------------------- array slice ------------------------------->

A special syntax for the "print" command lets one print various
dimensioned slices of multi-dimensional arrays.  Syntax:

   PRINT arrayslice

The "print" command can take an array name or a partially indexed array
name. If more than one element results, the slice is printed in nested
curly braces. The array slice can also be that of an array attribute of an
element.   Examples:

  define parts real[3][2][3];
  print parts;
  print parts[1][1];

Array slices may also be used in array expressions anywhere full arrays
can be used.

<------------------------------- arrow keys ------------------------------->

Graphics mode command keys. Move the image in the appropriate direction.
May be prefixed by a real number, which is multiple of thirds of screen
width to move. Default move is 1/12 screen width. May not work on all
terminals.  Arrow keys alone may work in the graphics window, again
depending on the system.



<------------------------------- assignment ------------------------------->

The assignment operator := can be used to assign numeric and non-numeric
values to various entities. Note that ':=' is used for assignment, not '='.
The C-style arithmetic assignments +=, -=, *=, and /= work for numerical
variables. For example, val += 2 is equivalent to val := val + 2. These
also work in other assignment situations where I thought they made sense,
such as attribute assignment.  The postincrement operator ++ and 
postdecrement operator -- also exist for single variables as stand-alone
commands.  
Possible assignments:

 > User-defined commands, Ex: gogo := {g 100; r; g 100}
 > User-defined variables, Ex: foo := 2.3
 > Writable internal variables, Ex: scale := 0.1
 > Named quantity modulus, target, and volconst. Syntax:
   quantityname.modulus := expr
   quantityname.target := expr
   quantityname.volconst := expr

 > Method instance modulus. Syntax:
   instancename.modulus := expr

<---------------------------- assume_oriented ----------------------------->

Evolver toggle command. Tells squared mean curvature routines that they
can assume the surface is locally consistently oriented. Significant only
for extreme shapes.


<--------------------------------- atan2 ---------------------------------->

atan2(y,x): Inverse tangent, range -pi to pi.


<----------------------------- atomic values ------------------------------>

The following evaluate to single numbers in expressions:
 number: An integer, real, hexadecimal, or binary constant. Hex numbers
   begin with 0x; binary numbers have a trailing 'b'.
 pi: Mathematical constant, ratio of circle circumference to radius.
 x1,x2,...; x,y,z,w : Depending on context, space coordinates, vertex
   coordinates, edge vector components, or facet normal components.
 p1,p2,...: Parameters of vertices on boundaries.
 G : Current gravitational constant for calculating gravitational energy.
 User-defined variables : Arbitrary variables defined in the datafile or at
    runtime.
 Fully indexed array variables.
 Internal variables : Special pre-defined variables.
 Element attributes : Things like vertex coordinates, edge length facet
    area, colors.  Array attributes must be fully indexed.
 Named quantity attributes : Including modulus, target, value, pressure.
 Method instance attributes : Including modulus, value.
 Toggle name : Any toggle command name may be used as a Boolean variable in
    an expression (full word toggles, not single letters). But beware the
    ambiguity in interpreting a toggle as a command or a value. You may have 
    to use parentheses to force the toggle to be interpreted as a value. Thus
    "ad := autodisplay" sets ad as a command synonym for autodisplay, while
    "ad := (autodisplay)" records the current boolean value.

<------------------------------- attribute -------------------------------->

As a keyword, "attribute" is used in the define command for element extra
attributes, for example,
   define facet attribute myattrname real
   define vertex attribute newx real[3]
This syntax works both in the top of the datafile and at runtime.
For a list of pre-defined attributes, see "attributes".
To list all attributes with stored values, do "list attributes".

<------------------------------- attributes ------------------------------->

The surface is defined in terms of its geometric elements of each
dimension. Each element has its own set of attributes. Some may be set by
the user; others are set internally but may be queried by the user. It is
also possible to dynamically define extra attributes for any type of
element, which may be single values or vectors of values. Attribute values
can be specified in the datafile, and queried with commands.
The following attributes are pre-defined for all types of elements:
 ID: Element identifying number
 OID: Oriented element identifying number
 ORIGINAL: Number of parent datafile element
 ON_QUANTITY quantityname: True if the given named quantity applies to the
   element.
 ON_METHOD_INSTANCE instancename: True if the given method instance applies
   to the element.
For other attributes, see specific types of elements: vertices, edges,
facets, bodies, facet-edges.   A list of the attributes stored within
element data structures can be printed with the "list attributes" command.


<--------------------------- augmented_hessian ---------------------------->

Evolver toggle command. Solves constrained Hessians by putting the body
and quantity constraint gradients in an augmented matrix with the Hessian,
and using sparse matrix techniques to factor. Vastly speeds things up when
there are thousands of sparse constraints, as in a foam. The default state
is unset (prints as a value of -1), in which case augmentation is used for
50 or more constraints, but not for less.


<-------------------------------- autochop -------------------------------->

Evolver toggle command. Do automatic refining of long edges each iteration. 
Use "autochop_length := expr" to set autochop length. Each iteration, any 
edge that is projected to become longer than the cutoff is bisected. If any 
bisections are done, the motion calculation is redone.  The autochop length 
may be accessed by the read/write internal variable autochop_length;
but note that simply assigning a value to autochop_length does not
toggle autochop on.

<---------------------------- autochop_length ----------------------------->

Evolver internal read-write variable that autochop mode uses as 
the critical length; longer edges will be refined.

<------------------------------ autodisplay ------------------------------->

Evolver toggle command. Toggles automatic redrawing of graphics whenever
the surface changes. Default ON. Same function as the 'D' command.

<-------------------------------- autopop --------------------------------->

Evolver toggle command. Toggles automatic deletion of short edges and
popping of improper vertices each iteration. Before each iteration, any
edge projected to shorten to under the critical length is deleted by
identifying its endpoints. The critical length is calculated as L =
sqrt(2*dt), where dt is the time step or scale factor. Hence this should be
used only with a fixed scale, not optimizing scale factor. The critical
length is chosen so that instabilities do not arise in motion by mean
curvature in the string model. If any edges are deleted, then vertices
are examined for improper vertices as in the 'o' command. Useful in the
string model.

Autopop is also implemented for small facets as of Evolver version 2.30.
The critical area is calculated as sqrt(2*dt)*perimeter/2, where perimeter
is the sum of the lengths of the three sides of the facet.

See also the immediate_autopop and autopop_quartic toggles.

<---------------------------- autopop_quartic ----------------------------->

Toggle.  Modifies the autopop mode.  The critical length for edges is
set to 2*sqrt(sqrt(dt)) and the critical area for facets is set to
2*sqrt(sqrt(dt))*perimeter/2; meant for quantities such as 
laplacian_mean_curvature where velocity is proportional to fourth 
derivative of surface.

<------------------------------- autorecalc ------------------------------->

Evolver toggle command. Toggles automatic recalculation of the surface
whenever adjustable parameters or energy quantity moduli are changed.
Default is OFF.  Alternatively, the user can use the "recalc" command
to force recalculation if the default recalculations are not timely.


<--------------------------- average_crossings ---------------------------->

Named method. Description: To calculate the average crossing number in all
projections of a knot. Contributed by John Sullivan) 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

    quantity across energy method average_crossings global

<------------------------------ axial_point ------------------------------->

Vertex read-write attribute. Certain symmetry groups (e.g. cubocta or
rotate) have axes of rotation that are invariant under some non-identity
group element. A vertex on such an axis must be labeled in the datafile
with the attribute axial_point, since these vertices pose special problems
for the wrap algorithms. If you are only using a subgroup of the full
group, then you only need to label vertices on the axes of the subgroup.
The net wrap around a facet containing an axial point need not be the
identity. Edges out of an axial point must have the axial point at their
tail, and must have zero wrap. Facets including an axial point must have
the axial point at the tail of the first edge in the facet. It is your
responsibility to use constraints to guarantee the vertex remains on the
axis.

<----------------------------------- b ------------------------------------>

Single letter main command. Permits user to interactively change body
prescribed volumes or pressures, depending on which is prescribed.
Prints old value for each body and prompts for new.

Graphics mode command. Toggles display of bounding box. Useful for
visualizing orientation. In the native graphics window, the 'o' key does
the same thing.  The default color of the bounding box is blue, but
that can be changed by setting the variable bounding_box_color to the
desired color, for example
    bounding_box_color := red


<----------------------------------- B ------------------------------------>

Graphics mode command. Toggles display of facets on boundaries or
equality level-set constraints (as opposed to one-sided constraints).


<-------------------------------- backbody -------------------------------->

Facet read-write attribute. The id of the body of which the facet is on
the negatively oriented boundary.  This may disagree with what you think
ought to be the "back body" of a facet, but it's the way I see it.
As a read attribute, the value is 0 if there is no such body. As a write 
attribute, it can be used to assign facets to bodies, and assigning 0 
removes it from its back body. Examples:

  newb := new_body; set facet[1] frontbody newb;
  set facet backbody newb where id == 2 or id == 4;
  print facet[4].backbody

Backbody also works for adding edges to a facet in the string model, but
the added edge must be attach to one end of the edge arc, or close the arc.
See also "frontbody".

<------------------------------- backcolor -------------------------------->

Facet read-write attribute. Color of negative side of facet for graphics.
Default is white. Set also when the "color" attribute is set. Datafile
example:
  Faces
  1   1 2 3 frontcolor green backcolor red

 Command examples:
  list facets where backcolor == red
  set facet[3] backcolor green
  set facet backcolor red where area > 2

If frontcolor and backcolor of a facet are different, the native
graphics display may draw the facet as a double layer.  The "thickness"
variable controls the distance between layers.  If thickness is too small,
the frontcolor and backcolor may both show in a confused manner.

<-------------------------------- backcull -------------------------------->

Evolver toggle command. Prevents display of facets with normal away from
viewer. May have different effects in different graphics displays. For
example, to see the inside back of a body only, "set frontcolor clear"
alone works in 2D displays, but needs backcull also for direct 3D.

<------------------------------- background ------------------------------->

Internal read-write variable. Background color used in certain screen
graphics (xgraph and Windows, at the moment).  See "colors" for the
available colors.  Example:
   background := white

<---------------------------------- bare ---------------------------------->

As a keyword, "bare" is a vertex attribute or an edge attribute set by the
user that tells the Evolver not to expect the vertex or edge to be attached
to a facet.  Useful in a datafile to prevent a lot of warning messages.
But it is not a synonym for "valence 0", since it doesn't check the 
actual valence when you apply it or use it.

<------------------------------- bare edge -------------------------------->

Edge read-write attribute. Declaring an edge "bare" indicates that an edge
does not have an adjacent facet (soapfilm model). Best declared in the
datafile, by adding the keyword bare to the line defining an edge. Useful
in avoiding warning messages. Bare edges are useful to show wires,
frameworks, outlines, etc. in graphics. Example:

  list edge where bare

But it is not a synonym for "valence 0", since it doesn't check the 
actual valence when you apply it or use it.

<------------------------------ bare vertex ------------------------------->

Vertex read-write attribute. Declaring a vertex "bare" says that a vertex
does not have an adjacent edge (string model) or an adjacent facet
(soapfilm model). Useful in avoiding warning messages. A vertex may be
declared bare in the vertices section of the datafile by adding the keyword
bare to the line defining the vertex. Example:

   list vertex where bare

But it is not a synonym for "valence 0", since it doesn't check the 
actual valence when you apply it or use it.

<------------------------------ bezier_basis ------------------------------>

Evolver toggle command. When Evolver is using the Lagrange model for
geometric elements, this toggle replaces the Lagrange interpolation
polynomials (which pass through the control points) with Bezier basis
polynomials (which do not pass through interior control points, but have
positive values, which guarantees the edge or facet is within the convex
hull of the control points). This is experimental at the moment, and not
all features such as graphing or refinement have been suitably adjusted.


<------------------------------- big_endian ------------------------------->

Evolver toggle command. Controls the order of bytes in binary_printf
numerical output. Big-endian is most significant byte first. To change to
little-endian, use little_endian, not "little_endian off".

<----------------------------- binary numbers ----------------------------->

Integer values may be given in binary notation, such as 11001b, indicated
by a trailing 'b'.

<---------------------------- binary_off_file ----------------------------->

Main prompt command.  Produces one frame file for my 3D movie program
evmovie (see http://www.susqu.edu/brakke/evmovie/evmovie-doc.html
for more details).  Syntax:

   binary_off_file string

where string is the name of the output file, either a
double-quoted string, a string variable, or a string-generating
expression (typically using sprintf).

<----------------------------- binary_printf ------------------------------>

Main prompt command. For printing formatted binary output to files.
Syntax:

   BINARY_PRINTF string,expr,expr,...

Prints to standard output using a binary interpretation of the standard C
formats:
   %c    one byte
   %d    two byte integer
   %ld   four byte integer
   %f    four byte float
   %lf   eight byte float
   %s    string, without the trailing null
   non-format characters are copied verbatim as single bytes.

The byte order for numbers can be set with the big_endian or little_endian
toggles. NOTE: Either big_endian or little_endian must be set for
binary_printf to work! The format string can be a string variable or a
quoted string. There is a limit of 1000 characters on the format string,
otherwise there is no limit on the number of arguments. Meant to be use
with redirection to a file. In Microsoft Windows, the output file type is
temporarily changed from TEXT to BINARY so newline bytes don't get
converted. Example:

  binary_printf "%ld%ld%ld",vertex_count,edge_count,facet_count >>"out.bin"

<------------------------------- bi_surface ------------------------------->

Named method of the knot energy family.   Double integral over surface, i.e.
all pairs of vertices weighted with adjacent facet areas.  Adapted from 
facet_knot_energy. Uses an arbitrary formula for the pair energy, a function 
of the vector between the vertices.  The formula is given by the 
"scalar_integrand" in datafile definition.  Example datafile definition:
   quantity qqqq energy method bi_surface
   scalar_integrand  x^2 + y^2 + z^2 

The vertex pairs it is evaluated over can be controlled. If the vertex integer
attribute bi_surface_attr is defined, only those with different values of 
bi_surface_attr will be included; otherwise all pairs are included.

<---------------------------- bi_surface_attr ----------------------------->

Vertex attribute used by the bi_surface named method to control which pairs
of vertices are integrated.

<--------------------------------- colors --------------------------------->
<--------------------------------- black ---------------------------------->
<---------------------------------- blue ---------------------------------->
<--------------------------------- green ---------------------------------->
<---------------------------------- red ----------------------------------->
<---------------------------------- cyan ---------------------------------->
<-------------------------------- magenta --------------------------------->
<--------------------------------- brown ---------------------------------->
<------------------------------- lightgray -------------------------------->
<------------------------------- lightgrey -------------------------------->
<---------------------------------- grey ---------------------------------->
<---------------------------------- gray ---------------------------------->
<-------------------------------- darkgray -------------------------------->
<-------------------------------- darkgrey -------------------------------->
<------------------------------- lightblue -------------------------------->
<------------------------------- lightgreen ------------------------------->
<--------------------------------- clear ---------------------------------->
<------------------------------ transparent ------------------------------->
<-------------------------------- lightred -------------------------------->
<------------------------------- lightcyan -------------------------------->
<--------------------------------- yellow --------------------------------->
<------------------------------ lightmagenta ------------------------------>
<--------------------------------- white ---------------------------------->

The colors of edges and facets are normally recorded as integers in the 
range -1 through 15 (see "rgb_colors" for an alternate mode). How these 
integers translate to colors on the screen is determined by how Evolver's 
graphics drivers are written. The following synonyms are supplied, and it 
is hoped that the graphics drivers will be written to display these correctly:

 -1 CLEAR
 0 BLACK
 1 BLUE
 2 GREEN
 3 CYAN
 4 RED
 5 MAGENTA
 6 BROWN
 7 LIGHTGRAY
 8 DARKGRAY
 9 LIGHTBLUE
 10 LIGHTGREEN
 11 LIGHTCYAN
 12 LIGHTRED
 13 LIGHTMAGENTA
 14 YELLOW
 15 WHITE

 The special color value CLEAR (-1) makes a facet transparent. 
"Transparent" is a synonym for clear. These tokens are simply 
translated to integer values wherever they occur, so these are
reserved words. Edge and facet colors may be set in the datafile or by the
set command.  See "rgb_colors" for more detailed control of colors.

<------------------------------- blas_flag -------------------------------->

Evolver toggle command. Toggles using BLAS versions of some matrix
routines, if the Evolver program has been compiled with the -DBLAS option
and linked with some BLAS library. For developer use only at the moment.


<--------------------------------- bodies --------------------------------->
<---------------------------------- body ---------------------------------->


A "body" is an Evolver element type representing a full-dimensional region of 
space. Body interiors are not meshed.  Rather, bodies are determined by their
boundary facets (or edges in 2D).  These facets are used for calculating
body volume and gravitational energy.  Only those facets needed for correct
calculation need be given. In the string model, usually a body corresponds
to one facet. Bodies of the original surface are defined in the "bodies"
section of the datafile; for datafile syntax, see "bodies section".
 Attributes:
  facets
  id
  density
  volume
  target
  volfixed
  actual_volume
  volconst
  pressure
  phase
  extra attributes

As a command keyword, "body" is an element name in element generators,
either as the main element type, or as a subelement of a facet.
Examples:
   foreach body bb do printf "Body %d has volume %f\n",bb.id,bb.volume;
   list facet[1].bodies
Bodies may be created with the "newbody" command, and destroyed with
the "dissolve" command.

<----------------------------- bodies section ----------------------------->

The datafile body list follows the face list, and is started by the
keyword BODIES at the start of a line. It is followed by lines with one
body specification per line in this format:

k  f1 f2 f3 .... [VOLUME constexpr] [VOLCONST constexpr]
   [ACTUAL_VOLUME constexpr] [PRESSURE p] [DENSITY constexpr] [PHASE]

Here k is the body number, and f1 f2 f3 ... is an unordered list of signed
facet numbers. Positive sign indicates that the facet normal (as given by
the right-hand rule from the edge order in the facet list) is outward from
the body and negative means the normal is inward. Giving a VOLUME value
constexpr means the body has a volume constraint, unless the ideal gas
model is in effect, in which case constexpr is the volume at the ambient
pressure. VOLCONST is a value added to the volume; it is useful when the
volume calculation from facet and edge integrals differs from the true
volume by a constant amount, as may happen in the torus model.
ACTUAL_VOLUME is a number that can be specified in the rare circumstances
where the torus volume volconst calculation gives the wrong answer;
volconst will be adjusted to give this volume of the body. Giving a
PRESSURE value means that the body is deemed to have a constant internal
pressure; this is useful for prescribed mean curvature problems. It is
incompatible with prescribed volume. Giving a DENSITY value means that
gravitational potential energy will be included.

To endow a facet with VOLUME, PRESSURE, or DENSITY attributes in the
string model, define a body with just the one facet.

The PHASE number is used in the soapfilm model to determine the surface
tension of facets between bodies of different phases, if phases are used.

The BODIES section is optional.
The "list bodies" command prints the datafile format listing of bodies.


<----------------------------- bodies_predicted ------------------------------>

Datafile keyword in the top section of the datafile that specifies the
initial allocation of body structures.  Optional.  The purpose is to
prevent repeated reallocation of memory as the body list grows or as 
the surface is evolved.  Should be faster, and prevents memory fragmentation.
Automatically put in dump files by the "d" or "dump" commands, based on
the current number of bodies.
Example:
    vertices_predicted 3074
    edges_predicted    9216
    facets_predicted   6144
    bodies_predicted      1
    facetedges_predicted  18432

<------------------------------ body density ------------------------------>

Body read-write attribute. This is the density used for gravitational potential
energy. It can be set in the bodies section of the datafile, or with the
set command, or by assignment. Command examples:
  print body[2].density
  set body density 3
  body[2].density := 5


<------------------------------ body facets ------------------------------->

Body read-only attribute. Generates facets bounding a body, with proper
facet orientation with respect to the body. Examples:
  list body[1].facets
  set body[2] facet frontcolor red

<------------------------------- body phase ------------------------------->

Body read-write attribute. For determining facet tension in soapfilm
model, if a phase file is used.

<----------------------------- body pressure ------------------------------>

Body read-write attribute. If a body has a prescribed volume, this is a
read-only attribute, which is the Lagrange multiplier for the volume
constraint. If a body is given a prescribed pressure, then there is an
energy term equal to pressure times volume. A body cannot have a prescribed
volume and a prescribed pressure at the same time. Prescribed volume or
pressure can be set in the bodies section of the datafile. If pressure is
prescribed, then the value can be changed interactively with the b command,
the set command, or by assignment. Examples:
  print body[2].pressure
  body[2].pressure := 1.3
  set body[2] pressure 1.3


<----------------------------- body volconst ------------------------------>

Body read-write attribute. A constant added to the calculated volume.
Useful for correcting for omitted parts of body boundaries. Also used
internally as a correction in the torus model, which will use the target
volume to calculate volconst internally. In the torus model, the target
volume should be set within 1/12 of a torus volume of the actual volume for
each body, so the correct volconst can be computed. Each volconst will be
adjusted proportionately when the volume of a fundamental torus domain is
change by changing the period formulas. Volconst can be set in the datafile
bodies section, or interactively by the set command or by assignment.
Examples:
  print body[1].volconst
  set body[2] volconst 1.2
  body[2].volconst := 1.2

It is best to avoid using volconst except in the torus model. Rather, use
edge content integrals so that the proper adjustments will be made if the
boundary of the surface is moved, or rebody is done.

<------------------------------ body volume ------------------------------->

Body read-only attribute. Actual volume of a body. This is the sum of
three parts, in the soapfilm model:
  1. An integral over the facets bounding the body. This is \int z dx dy
     normally, but \int (x dy dz + y dz dx + z dx dy)/3 if SYMMETRIC_CONTENT is
     in effect.
  2. Any constraint or boundary content edge integrals applying to the body.
  3. The body's volconst attribute.
In the string model, the parts are
  1. An integral over the edges bounding the body's facet. This is \int -y dx.
  2. Any constraint or boundary content vertex integrals applying to the body.
  3. The body's volconst attribute.
Body volumes can be displayed with the v command, or with standard
attribute syntax. Example:
  print body[1].volume
  foreach body where volume > 2 do print id


<------------------------------- body_count ------------------------------->

Internal read-only variable. Number of bodies.

<-------------------------- body_dissolve_count --------------------------->

Internal read-only variable. Number of bodies dissolved by the "dissolve"
command. Prints and resets to 0 at the end of a command execution, or
when flush_counts is done. Also reset by reset_counts.

<------------------------------- body_metis ------------------------------->

Main prompt command. Partitions the set of bodies into n parts using the
METIS library of Karypis and Kumar, if this library has been compiled into
the Evolver. The partition number of each body is left in its extra
attribute bpart (which will be created if it does not already exist).
BODY_METIS works only in the soapfilm model; for the string model,
partition facets using metis or kmetis. BODY_METIS uses the PMETIS
algorithm. Meant for experiments in partitioning the surface for
multiprocessors. Syntax:
 BODY_METIS n

 Example:

  body_metis 50;
  for each body bb do set bb.facet frontcolor (bb.bpart imod 15)+1;


<------------------------------- bottominfo ------------------------------->

The runtime command "list bottominfo" prints what would be dumped in the "read"
section at the end of a dumpfile: command definitions and various toggle states.

<------------------------------- boundaries ------------------------------->
<-------------------------------- boundary -------------------------------->

Parametric "boundary" curves and surfaces can be used for locating vertices.
Vertex locations may be given in terms of parameters on a parameterized
curve or surface. Such curves or surfaces are called "boundaries" in
Evolver terminology, since they are usually used as boundary curves of
surfaces, for example a soap film on a wire loop could have the wire
implemented as a boundary. Vertices, edges, and facets may be deemed to lie
in a boundary. For a vertex, this means that the fundamental parameters of
the vertex are the parameters of the boundary, and its coordinates are
calculated from these. Vertices on boundaries may move during iteration,
unless declared fixed. See cat.fe for an example.

Boundaries are defined in the top section of the datafile. Vertices on
boundaries are listed in the datafile with their parameter values instead
of their coordinates, with "boundary n" appended to each such vertex
definition. Edges and faces on boundaries are defined as usual, but with
"boundary n" appended to each definition. So the datafile has lines like
these:

boundary 1 parameters 1
x1:  cos(p1)
x2:  sin(p1)
x3:  0.75
...
Vertices
1   0.0  boundary 1
2   pi/3 boundary 1
...
Edges
1   1 2 boundary 1
...

Putting an edge on a boundary means that vertices created on that edge will
be on the boundary. An edge on a boundary must have at least one endpoint
on the boundary, for use in extrapolating the boundary parameters of any
created vertices. Extrapolating instead of interpolating midpoint
parameters solves the problem of wrap-arounds on a boundary such as a
circle or cylinder. However if you do want interpolation, you can use the
keyword INTERP_BDRY_PARAM in the top of the datafile, or use the toggle
command interp_bdry_param. Interpolation requires that both endpoints of an
edge be on the same boundary, which cannot happen where edges on different
boundaries meet. To handle that case, it is possible to add extra boundary
information to a vertex by declaring two particular vertex extra
attributes, extra_boundary and extra_boundary_param:

interp_bdry_param
define vertex attribute extra_boundary integer
define vertex attribute extra_boundary_param real[1]

Then declare attribute values on key vertices, for example

vertices
1    0.00  boundary 1   fixed extra_boundary 2 extra_boundary_param 2*pi

If the extra_boundary attribute is not set on a vertex when wanted,
Evolver will silently fall back on interpolation.

Putting a face on a boundary means that all edges and vertices created
from refining the face will be on the boundary. In this case, the boundary
should have two parameters (or whatever the dimension of the surface is).
This is good for getting a surface to conform to a known parametric shape.
Edges on boundaries have energy and content integrals like level-set
constraints edges, but they are internally implemented as named
quantities.

Whether an element is on a particular boundary can be queried with the
on_boundary Boolean attribute. Elements can be removed from boundaries with
the unset command, and they can be set on boundaries. A typical use of
unset is to define an initial surface using a 2-parameter boundary, refine
a couple of times, then unset. Examples:
  list vertex where on_boundary 2
  unset vertex boundary 1 where on_boundary 1
  unset edge boundary 1
  unset facet boundary 1
  set vertex[10] boundary 1
It does not hurt to unset an element not on the boundary.

Vertex parameters can be accessed in expressions as the attribute p1 (and
p2,... for further parameters). Vertex parameters can be changed with the
set command. Example:
  print vertex[5].p1
  set vertex p1 p1+.1 where id < 4
  vertex[2].p1 := 3

It is not an error to access the parameters of a vertex not on a boundary
as long as some vertex is on a boundary (so that space is allocated in the
vertex structure for parameters).

A general guideline is to use constraints for two-dimensional walls and
boundaries for one-dimensional wires. If you are using a boundary wire, you
can probably declare the vertices and edges on the boundary to be FIXED.
Then the boundary becomes just a guide for refining the boundary edges.

NOTE: A vertex on a boundary cannot also have constraints.

<-------------------------- boundary declaration -------------------------->

A parameterized boundary may be declared in the top section of the
datafile with the syntax

BOUNDARY n PARAMETERS k [CONVEX]
X1: expr
X2: expr
X3: expr
[ENERGY:
 E1: expr
 E2: expr
 E3: expr]
[CONTENT:
 C1: expr
 C2: expr
 C3: expr]

This defines boundary number n, where n is a positive integer and k is the
number of parameters. If CONVEX is given, then an additional gap energy is
attributed to edges on the boundary to prevent them from trying to
short-circuit a convex boundary. The following lines have the functions for
the coordinates in terms of the parameters P1 and maybe P2, P3,.... See the
catenoid example.  Optional energy and content integrals for boundaries are
implemented, with the same syntax as for level set constraints.

<--------------------------- boundary_curvature --------------------------->

Evolver toggle command. When doing integrals of mean curvature or squared
curvature, the curvature of a boundary vertex cannot be defined by its
neighbor vertices, so the area of the boundary vertex star instead is
counted with an adjacent interior vertex.


<------------------------------ bounding box ------------------------------>

 b : Graphics mode command. Toggles display of bounding box. Useful for
visualizing orientation. In the native graphics window, the 'o' key does
the same thing.  Also see "full_bounding_box".

The default color of the bounding box is blue, but that can be changed 
by setting the variable bounding_box_color to the desired color, for example
    bounding_box_color := red

<-------------------------- bounding_box_color ----------------------------->

The default color of the bounding box in the graphics display is blue, but
that can be changed by setting the variable bounding_box_color to the
desired color, for example
    bounding_box_color := red

<--------------------------------- break ---------------------------------->

Command syntax for exiting loops. Syntax:

   BREAK

   BREAK n

The first form exits the innermost current loop. The second form exits n
loops. Note: Commands with repetition counts do not qualify as loops.
Example:

   foreach vertex do { print x; if y < 0 then break; print z }


<----------------------- break after warning option ----------------------->
<-------------------------------- option ---------------------------------->

Command line option -y causes Evolver to cease execution of commands
and return to the command prompt after any warning message. Same effect
as break_after_warning runtime toggle.

<-------------------------- break_after_warning --------------------------->

Runtime toggle command. Causes Evolver to cease execution of commands and
return to command prompt after any warning message. The break does not
happen until the executing command or subcommand completes; use
break_on_warning for an instantanous break. Same effect as
command line option -y. Default is OFF.

<-------------------------- break_on_warning --------------------------->

Runtime toggle command. Causes Evolver to cease execution of commands and
return to command prompt immediately after any warning message. Does not
delay until completion of current command as break_after_warning does.
Default is OFF.

<------------------------------- breakflag -------------------------------->

Internal read-write variable. When set to a non-zero value, this
causes the command interpreter to abort and return to the command prompt.
Software equivalent of hitting the keyboard interrupt (typically CTRL-C).
The break doesn't happen immediately, but at a certain point in the
interpreter loop when it periodically checks for user interrupt. Meant for
bailing out of nested commands, since "return" only breaks out of the current
procedure.

<------------------------------- breakpoint ------------------------------->

Main prompt command. The user may set a breakpoint in an already loaded
script with the breakpoint command. The syntax is 
 
  BREAKPOINT scriptname linenumber 

where scriptname is the name of the function or procedure and linenumber
is the line number in the file where the breakpoint is to be set. There
must be executable code on the line, or you will get an error. linenumber
may be an expression. 
 
Breakpoints may be unset individually with 
 
  UNSET BREAKPOINT scriptname linenumber 

or as a group with 
 
  UNSET BREAKPOINTS 

When a breakpoint is reached, Evolver will enter into a subcommand prompt,
at which the user may enter any Evolver commands (although some commands,
such as load would be very unwise). To exit from the subcommand prompt, use
q or exit or quit. 
 
<------------------------------- brightness ------------------------------->

Internal read-only variable. Median gray level used in PostScript output and 
screen graphics.  Default value 0.65.

<---------------------------- buck_knot_energy ---------------------------->

Named method. Description: Energy between pair of edges given by formula
suggested by Greg Buck. Power law of potential is adjustable via the global
parameter `knot_power'. 

Element: edge. 
Parameters: none. 
Models: string; linear.
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

parameter knot_power  2     // the default
quantity knotten energy method buck_knot_energy global


<---------------------------------- bugs ---------------------------------->

Bug reports should be submitted by email to brakke@susqu.edu. Please
include the Evolver version number, a description of the problem, the
initial data file, and the sequence of commands necessary to reproduce the
problem.

<----------------------------- bunch_kauffman ----------------------------->
<----------------------------- bunch_kaufman ------------------------------>

Evolver toggle command. Toggles Bunch-Kaufman factoring of the Hessian in
the alternative minimal degree factoring method (ysmp off). This factors
the Hessian as LBL^T where L is lower triangular with ones on the diagonal,
and B is block diagonal, with 1x1 or 2x2 blocks. Supposed to be more stable
when factoring indefinite Hessians.


<-------------------------------- burchard -------------------------------->

A keyword for a special purpose command not documented.

<---------------------------------- bye ----------------------------------->
<---------------------------------- exit ---------------------------------->
<---------------------------------- quit ---------------------------------->

Main prompt command. Syntax:
    quit
    quit value
Alone, "quit" brings up a prompt to enter a new datafile.  At this prompt,
hitting the Enter key will return to the current surface, 'q' will exit
Evolver, and anything else will be taken to be the name of a new datafile.
When "quit" is followed by a value, Evolver exits immediately, and uses
the value as the exit code, which is useful when running Evolver in a
script or from some other program.  Quitting Evolver automatically 
closes any graphics windows, and does not save anything. Same as `q' command. 
"quit", "bye", and "exit" are synonyms.


<----------------------------------- c ------------------------------------>

Single letter main command. Prints counts of elements and memory used. The
memory is just the total of the element structures. On some systems,
enabling the "verbose" toggle will print more complete statistics on total 
memory usage. Synonym: counts.

Graphics mode command. Rotate clockwise about center of screen,
default 6 degrees. Integer prefix is taken as multiples of 6 degrees, and
a decimal prefix is taken as degrees for the rotation.
Examples: `15c' does 90 degree rotation, `15.0c' does 15 degree rotation.
Use upper-case C for counterclockwise rotation.

<--------------------------------- counts --------------------------------->

Main prompt command.  Long form of single-letter command 'c'.
Prints counts of elements and memory used.   The memory is just the total 
of the element structures. On some systems, enabling the  "verbose" toggle
will print more complete statistics on total memory
usage. Synonym: c.

<----------------------------------- C ------------------------------------>

Single letter main command. Runs various internal consistency checks.
Synonym: check. If no problems, just prints "Checks completed." The number
of errors found is stored in the variable check_count. The checks are:
 1. Element list integrity - checks that data structures are intact.
    This kind of error is probably an Evolver bug and should be reported.
 2. Facet-edge check - that if a facet adjoins an edge, then the edge
    adjoins the facet, and that the three edges around a facet link up.
    This kind of error is probably an Evolver bug and should be reported.
 3. Facet-body check - whether adjacent facets have the same body on the
    same side.  Probably a user problem due to mis-oriented faces in 
    body definitions in the datafile, or due to the surface getting
    kinked up at triple lines.
 4. Collapsed elements - check if endpoints of an edge are the same, and
    whether neighboring facets share more than one edge and two vertices.
    Not illegal, but you probably want to avoid.

After "C" or "check" command finishes, there are some variables that 
hold the number of errors of various types that were found:
  bad_next_prev_count - bad links in element linked lists.
  inconsistent_bodies_count - violations of adjacent facets having
     same bodies.
  edge_loop_count - edges that are loops on single vertices.
  edges_same_vertices_count - edge pairs with the same endpoints.
  facets_same_vertices_count - facet pairs with the same endpoints.
  bad_error_count - sum of the various types of errors that I consider
     serious enough that you should revise your evolution to avoid
     them. Bad links within element lists, and bad links between
     elements. 


Graphics mode command. Rotate counterclockwise about center of screen,
default 6 degrees. Integer prefix is taken as multiples of 6 degrees, and
a decimal prefix is taken as degrees for the rotation.
Examples: `15C' does 90 degree rotation, `15.0C' does 15 degree rotation.
Use lower-case c for clockwise rotation.

<---------------------- bad_next_prev_count ------------------------>
<---------------------- inconsistent_bodies_count ----------------------->
<---------------------- edge_loop_count ---------------------------->
<---------------------- edges_same_vertices_count ------------------------>
<---------------------- facets_same_vertices_count ------------------------>
<---------------------- bad_error_count -------------------------->
After "C" or "check" command finishes, there are some variables that 
hold the number of errors of various types that were found:
  bad_next_prev_count - bad links in element linked lists.
  inconsistent_bodies_count - violations of adjacent facets having
     same bodies.
  edge_loop_count - edges that are loops on single vertices.
  edges_same_vertices_count - edge pairs with the same endpoints.
  facets_same_vertices_count - facet pairs with the same endpoints.
  bad_error_count - sum of the various types of errors that I consider
     serious enough that you should revise your evolution to avoid
     them. Bad links within element lists, and bad links between
     elements. 

<----------------------------- calculate_in_3d ------------------------------>

Evolver toggle command.  The squared mean curvature named methods
star_sq_mean_curvature, star_eff_area_sq_mean_curvature,
star_normal_mean_curvature, and star_perp_sq_mean_curvature
work in any dimension space, but if for some reason the space
has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the
toggle "calculate_in_3d" will do that.


<----------------------------- carter_energy ------------------------------>

Named method. Description: Craig Carter's energy. pre> Given bodies $B_1$
and $B_2$ in $R^3$, define the energy E = \int_{B_1}\int_{B_2} {1 \over
|z_1 - z_2|^{p} } d^3 z_2 d^3 z_1 This reduces to E = {1\over
(3-p)(2-p)}\sum_{F_2\in\partial B_2}\sum_{F_1\in\partial B_1} N_1 \cdot N_2
\int_{F_2}\int_{F_1}{1\over |z_1 - z_2|^{p-2}} d^2 z_1 d^2 z_2. And if we
crudely approximate with centroids $\bar z_1$ and $\bar z_2$, E = {1\over
(3-p)(2-p)}\sum_{F_2\in\partial B_2}\sum_{F_1\in\partial B_1} {A_1 \cdot
A_2 \over |\bar z_1 - \bar z_2|^{p-2}}, where $A_1$ and $A_2$ are
unnormalized area vectors for the facets. The power p is set by the
variable carter_power (default 6).

Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: 3.
Hessian: no. 
Example datafile declaration:

   parameter carter_power  6     // the default
   quantity craig energy method carter_energy global


<------------------------------ carter_power ------------------------------>

Internal read-write variable for the denominator power in the formula for
the named method carter_energy.  Default value 6.

<---------------------------------- case ---------------------------------->

Upper and lower case is not significant in the datafile, except for #define
macro names.  In run-time commands, case is only significant for single-letter 
commands.


<---------------------------- catenoid example ---------------------------->

The catenoid is the minimal surface formed between two rings not too far
apart. In cylindrical coordinates (r,z), its equation is r = b*cosh(z/b), 
where b is the radius of the neck. In the sample datafile cat.fe, both the 
upper and lower rings are given as one-parameter boundary wires. The 
separation and radius are parameters, so you can change them during a run 
with assignment statements or the A command. The initial radius given is the 
minimum for which a catenoid can exist for the given separation of the rings. 
To get a stable catenoid, you will have to increase this value. However, if
you do run with the original value, you can watch the neck pinch out. The
initial surface consists of six rectangles forming a cylinder between the
two circles. The vertices on the boundaries are fixed, elsewise they would
slide along the boundary to short-cut the curvature; two diameters is
shorter than one circumference. The boundary edges are fixed so that
vertices arising from subdividing the edges are likewise fixed.


Here is the catenoid datafile:

// cat.fe
// Evolver data for catenoid.

parameter  rmax = 1.5088795   // minimum radius for height
parameter  zmax = 1.0

boundary 1 parameters 1     //  upper ring
x1:  rmax * cos(p1)
x2:  rmax * sin(p1)
x3:  zmax

boundary 2 parameters 1    //   lower ring
x1:  rmax * cos(p1)
x2:  rmax * sin(p1)
x3:  -zmax

vertices   // given in terms of boundary parameter
1    0.00  boundary 1   fixed
2    pi/3  boundary 1   fixed
3  2*pi/3  boundary 1   fixed
4    pi    boundary 1   fixed
5  4*pi/3  boundary 1   fixed
6  5*pi/3  boundary 1   fixed
7    0.00  boundary 2   fixed
8    pi/3  boundary 2   fixed
9  2*pi/3  boundary 2   fixed
10   pi    boundary 2   fixed
11 4*pi/3  boundary 2   fixed
12 5*pi/3  boundary 2   fixed

edges
1    1  2  boundary 1   fixed
2    2  3  boundary 1   fixed
3    3  4  boundary 1   fixed
4    4  5  boundary 1   fixed
5    5  6  boundary 1   fixed
6    6  1  boundary 1   fixed
7    7  8  boundary 2   fixed
8    8  9  boundary 2   fixed
9    9  10 boundary 2   fixed
10   10 11 boundary 2   fixed
11   11 12 boundary 2   fixed
12   12 7  boundary 2   fixed
13   1  7
14   2  8
15   3  9
16   4  10
17   5  11
18   6  12


faces
1   1 14 -7 -13
2   2 15 -8 -14
3   3 16 -9 -15
4   4 17 -10 -16
5   5 18 -11 -17
6   6 13 -12 -18

// End of datafile cat.fe


The parameter in a boundary definition is always P1 (and P2 in a
two-parameter boundary). The Evolver can handle periodic parameterizations,
as is done in this example.

Try this sequence of commands (displaying at your convenience):

    r       (refine to get a crude, but workable, triangulation)
    u       (equiangulation makes much better triangulation)
    g 120   (takes this many iterations for neck to collapse)
    t 0.05  (collapse neck to single vertex by eliminating all
                      edges shorter than 0.05)
    o       (split neck vertex to separate top and bottom surfaces)
    g       (spikes collapse)

The catenoid shows some of the subtleties of evolution. Suppose the
initial radius is set to rmax = 1.0 and the initial height to zmax = 0.55
(these are pre-set in catman.fe). Fifty iterations with optimizing scale
factor result in an area of 6.458483. At this point, each iteration is
reducing the area by only .0000001, the triangles are all nearly
equilateral, everything looks nice, and the innocent user might conclude
the surface is very near its minimum. But this is really a saddle point of
energy. Further iteration shows that the area change per iteration bottoms
out about iteration 70, and by iteration 300 the area is down to 6.4336.
The triangulation really wants to twist around so that there are edges
following the lines of curvature, which are vertical meridians and
horizontal circles. Hence the optimum triangulation appears to be
rectangles with diagonals.

The evolution can be speeded up by turning on the conjugate gradient
method with the U command. With catman.fe, try the script "r; u; U; g 70".
For conjugate gradient cognoscenti, the saddle point demonstrates the
difference between the Fletcher-Reeves and Polak-Ribiere versions of
conjugate gradient. The saddle point seems to confuse the Fletcher-Reeves
version (which used to be the default). However, the Polak-Ribiere version
(the current default) has little problem. The U toggles conjugate gradient
on and off, and ribiere toggles the Polak-Ribiere version. With
Fletcher-Reeves conjugate gradient in effect, the saddle point is reached
at iteration 17 and area starts decreasing again until iteration 30, when
it reaches 6.4486. But then iteration stalls out, and the conjugate
gradient mode has to be turned off and on to erase the history vector. Once
restarted, another 20 iterations will get the area down to 6.4334. In
Polak-Ribiere mode, no restart is necessary.

Exercise for the reader: Get the Surface Evolver to display an unstable
catenoid by declaring the catenoid facets to be the boundary of a body, and
adjusting the body volume with the b command to get zero pressure. See the
sample datafile catbody.fe.


<---------------------------------- ceil ---------------------------------->

 ceil(x),floor(x): Round up or down to integer.

<------------------------------ centerofmass ------------------------------>

Boolean body attribute.  Applies to the "connected" bodies mode of graphical
display in the torus model. When this is set for a body, the center of mass
of the body as displayed is remembered, and the next time a body is graphed,
its wrap is such that its new center of mass is near its previous center
of mass.  This prevents bodies near the boundaries of the fundamental 
region from jumping back and forth as they shift slightly during evolution.
Default on.  Example: 
   set bodies centerofmass

<---------------------------- central_symmetry ---------------------------->

This is the order 2 symmetry group of inversion through the origin, X -> -X.
Datafile declaration:

  symmetry_group "central_symmetry"

Group element encoding: 0 for identity, 1 for inversion.


<---------------------------- charge_gradient ----------------------------->

Named method. Description: This energy is the gradient^2 of the
knot_energy method, assuming the points are constrained to the unit sphere.

Element: vertex. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knotten energy method knot_energy global


<--------------------------------- chdir ---------------------------------->

Main prompt command. Changes the current directory, used for searching for
files before EVOLVERPATH is used. Syntax:
   CHDIR stringexpr
In MS-Windows, use a front slash '/' or a double backslash '\\' instead of
a single backslash as the path character. Example:
  chdir "/usr/smith/project"


<--------------------------------- check ---------------------------------->

Main command. Runs various internal consistency checks.
Synonym: C. If no problems, just prints "Checks completed." The number
of errors found is stored in the variable check_count. The checks are:
 1. Element list integrity - checks that data structures are intact.
    This kind of error is probably an Evolver bug and should be reported.
 2. Facet-edge check - that if a facet adjoins an edge, then the edge
    adjoins the facet, and that the three edges around a facet link up.
    This kind of error is probably an Evolver bug and should be reported.
 3. Facet-body check - whether adjacent facets have the same body on the
    same side.  Probably a user problem due to mis-oriented faces in 
    body definitions in the datafile, or due to the surface getting
    kinked up at triple lines.
 4. Collapsed elements - check if endpoints of an edge are the same, and
    whether neighboring facets share more than one edge and two vertices.
    Not illegal, but you probably want to avoid.

After "C" or "check" command finishes, there are some variables that 
hold the number of errors of various types that were found:
  bad_next_prev_count - bad links in element linked lists.
  inconsistent_bodies_count - violations of adjacent facets having
     same bodies.
  edge_loop_count - edges that are loops on single vertices.
  edges_same_vertices_count - edge pairs with the same endpoints.
  facets_same_vertices_count - facet pairs with the same endpoints.
  bad_error_count - sum of the various types of errors that I consider
     serious enough that you should revise your evolution to avoid
     them. Bad links within element lists, and bad links between
     elements. 


<------------------------------ check_count ------------------------------->

Internal read-only variable. Number of errors found by the
most recent "C" or "check" command.

<----------------------------- check_increase ----------------------------->

Evolver toggle command. Toggles checking for increase of energy in an
iteration step. If energy increases, then the step is undone and any
iteration loop is halted. Meant for early detection of instabilities and
other problems causing the surface to misbehave. Useful in doing a multiple
iteration with a fixed scale. Also applies to the hessian command. Caution:
there are circumstances where an energy increase is appropriate, for
example when there are volume or quantity constraints and conforming to the
constraints means an energy increase initially.


<-------------------------------- checking -------------------------------->

Checking your datafile

You should always check your initial datafile to be sure it is doing
exactly what you want. It is easy to get signs on integrands wrong, or
apply quantities to the wrong elements. When you load the initial datafile,
the initial energy, body volumes, and quantities values should be exactly
what you expect, either from hand calculation or from another datafile you
trust. In particular, when using constraint integrals to replace omitted
facets, I suggest you make a separate datafile with facets instead of
integrals just for checking the agreement between the two.
 With the named methods and quantities feature, it is possible to get very
detailed information on where numbers are coming from. If you give the
"convert_to_quantities" command, every energy, volume, and constraint
integrand will be internally converted to named methods and quantities
(although the user interface for all remains the same). These internal
quantities are ordinarily not displayed by the 'v' or 'Q' commands, but if
you do "show_all_quantities" then they will be displayed. Further, 'Q' will
show all the component method instances also. For an example, consider the
following output:
 Enter command: convert_to_quantities
 Enter command: show_all_quantities
 Enter command: Q
Quantities and instances:
(showing internal quantities also; to suppress, do "show_all_quantities off")
 1. default_length                        64.2842712474619  info_only quantity
                            modulus       1.00000000000000
 2. default_area                          4.00000000000000  energy quantity
                            modulus       1.00000000000000
 3. constraint_1_energy                 -0.342020143325669  energy quantity
                            modulus       1.00000000000000
 4. constraint_2_energy                 -0.342020143325669  energy quantity
                            modulus       1.00000000000000
 5. body_1_vol                            1.00000000000000  fixed quantity
                             target       1.00000000000000
                            modulus       1.00000000000000
    body_1_vol_meth                      0.000000000000000  method instance
                            modulus       1.00000000000000
    body_1_con_2_meth                     1.00000000000000  method instance
                            modulus       1.00000000000000
 6. gravity_quant                        0.000000000000000  energy quantity
                            modulus      0.000000000000000

Here's a detailed explanation of the output of the Q command above:

default_length - total edge length, using the edge_length method. This
   would be the default energy in the string model, and I guess it really
   doesn't need to exist here. But it's an info_only quantity, which means it
   is only evaluated when somebody asks to know its value.
default_area - the default energy in the soapfilm model, and included in
   the energy here, as indicated by "energy quantity" at the right.
constraint_1_energy - the energy integral of constraint 1, using the
edge_vector_integral method applied to all edges on constraint 1.
constraint_2_energy - the energy integral of constraint 2, using the
   edge_vector_integral method applied to all edges on constraint 2.
body_1_vol - the volume of body 1, as a sum of several method instances.
body_1_vol_meth is the facet_vector_integral of (0,0,z) over all the facets
   on the body. body_con_2_meth is the integral of the constraint 2 content
   integrand over all edges on facets of body 1 which are edges on constraint 2.
gravity_quant - the total gravitational energy of all bodies with assigned
   densities. This quantity is always present even if you don't have any
   bodies, or don't have any body densities. But you'll notice the modulus is
   0, which means its evaluation is skipped, so the presence of this quantity
   doesn't harm anything.

You can find the quantity or method contribution of single elements by
using the quantity or method name as an attribute of elements. Using a
quantity name really means summing over all its constituent methods that
apply to the element. For example, in plates_column,

 Enter command: foreach edge ee where on_constraint 2 do printf "%d  %f\n",id, 
   ee.body_1_con_2_meth
 5  0.000000
 6  0.000000
 7  1.000000
 8  0.000000
 Enter command: foreach edge where constraint_1_energy != 0 do 
    print constraint_1_energy
  -0.342020143325669


<--------------------------- circle_knot_energy --------------------------->

Named method. Description: This energy is due to Peter Doyle, who says it
is equivalent in the continuous case to the insulating wire with power 2.
Its form is

  E_{e_1e_2} = {L_1L_2 (1 - \cos\alpha)^2 \over |x_1 - x_2|^2},

where x_1,x_2 are the midpoints of the edges and \alpha is the angle
between edge 1 and the circle through x_1 tangent to edge 2 at x_2. Only
power 2 is implemented. 

Element: edge. 
Parameters: none. 
Models: string; linear.
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity knotten energy method circle_knot_energy global

<---------------------------- circle_willmore ----------------------------->
circle_willmore
Named method. Description: Alexander Bobenko's circle-based discrete
Willmore energy, which is conformally invariant. At each vertex, energy is
(sum of the angles between facet circumcircles) - 2*pi. More simply done as
edge quantity, since angles at each end are the same. For edge e, if
adjacent facet edge loops are a,e,d and b,c,-e, then circle angle beta for
edge has 
 
   cos(beta) = (<a,c><b,c>-<a,b><c,d>-<b,c><d,a>)/|a|/|b|/|c|/|d| 

For now, assumes all vertices are faceted, and fully starred. Severe
numerical difficulties: Not smooth when angle beta is zero, which is all
too common. Set of zero angles should be codimension 2, which means
generally avoided, but still crops up. 

Element: edge. 
Parameters: none.
Models: soapfilm; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration: 
 
  quantity bobenko energy method circle_willmore global 

<--------------------------- circular_arc_area ---------------------------->

Named method. Description: Area between an edge and the y axis, with the
edge modelled as a circular arc through three points. Useful in the
quadratic model; in other models it is the same as edge_area. It is
particularly meant to be used as area_method_name.  

Element: edge. 
Parameters: none. 
Models: string; quadratic. 
Ambient dimension: 2. 
Orientable: yes. 
Hessian: yes. 
Example datafile declaration:

   string
   space_dimension 2
   length_method_name "circular_arc_length"
   area_method_name "circular_arc_area"

Or as a stand-alone quantity:

   quantity arcarea energy method circular_arc_area global

<--------------------------- circular_arc_draw ---------------------------->

Toggle command.  If on, then in quadratic string mode, an edge is drawn as a 
circular arc (actually 16 subsegments) through the endpoints and midpoint, 
instead of a quadratic spline.  Meant to be used when circular_arc_length and
circular_arc_area are being used.


<-------------------------- circular_arc_length --------------------------->

Named method. Description: Edge length, modelling the edge as a circular
arc through three points, hence useful only in the quadratic model. If not
in the quadratic model, it evaluates as the edge_length method. The
presence of this quantity has the side effect of automatically toggling
circular_arc_draw, causing edges to display as circular arcs in the
quadratic model. Particularly meant for length_method_name.

Element: edge. 
Parameters: none. 
Models: string; quadratic.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

   string
   space_dimension 2
   length_method_name "circular_arc_length"
   area_method_name "circular_arc_area"

Or as a stand-alone quantity:

   quantity arclen energy method circular_arc_length global

<-------------------------------- clipped --------------------------------->
<----------------------------- clipped_cells ------------------------------>

Evolver toggle command. Sets torus model graphics display to clip to the
unit cell parallelogram or parallelpiped. Not an on-off toggle, but a 3-way 
toggle with raw_cells and connected. Clipped_cells and clipped are synonyms.
The origin (lower left back corner) of the unit cell can be set by setting 
entries in the display_origin vector.

Default is unset, so Evolver prompts the user when graphics are first 
displayed.  The setting persists when loading a new surface.  But loading a 
torus model when a non-torus model is currently displayed will not prompt.

Also see display_periods and display_origin for more control of "clipped" 
mode.

<------------------------------- clip_coeff ------------------------------->

Internal 2-dimensional array holding clip plane coefficients for graphics
displays.  See clip_view for details.

<------------------------------- clip_view -------------------------------->

Main prompt command that toggles user-defined clipping planes. It is 
possible to have the graphics display clip the surface with multiple
clipping planes. A clipping plane is defined by a plane of the form 
ax + by + cz = d. The visible volume is ax + by + cz <= d. Up to 10 
clipping planes may be stored in the array clip_coeff[][], with the 
first plane coefficients a,b,c,d stored in clip_coeff[1][1] through 
clip_coeff[1][4], etc. The user does not have to create clip_coeff[][],
and Evolver will initialize it with a default vertical plane through
the middle of the surface. 

To use clip view, first set the coefficients of however many clip planes 
you want and then use the clip_view toggle. For example, to get a vertical 
clipping plane parallel to the y and z axes and a little in front of them: 
 
   clip_coeff[1][1] := 1; 
   clip_coeff[1][2] := 0; 
   clip_coeff[1][3] := 0; 
   clip_coeff[1][4] := .2; 
   clip_view; 

With OpenGL graphics, the first clip plane plane can be varied interactively 
by hitting the 'l' key (lower case L) in the graphics window and dragging 
the mouse horizontally.  The 'k' key will make mouse dragging change the 
orientation of the clip plane. Hit 'r' or 'c' or 't' to get back to
another mouse mode.  The 'L' key will end clip_view.

Clip_view works separately, and after, torus model viewing modes such as
clipped and connected, so it is no problem to have them together. 
In case clip_view and slice_view are both in effect, slice_view operates
instead of clip_view. 

<--------------------------------- clock ---------------------------------->

Internal read-only variable. Total elapsed Evolver execution time
in seconds. Reads system process elapsed time, which often has a fairly
coarse resolution of 0.01 seconds. For nanosecond timing, see cpu_counter.

<------------------------------- close_show ------------------------------->

Main prompt command. Closes the native graphics window started by the "s"
or "show" commands. Does not affect geomview version. Synonym: show_off.

<--------------------------------- color ---------------------------------->

As a keyword, "color" is a read-write attribute of edges and facets. For the
permitted values, see "colors".

<------------------------------- colorfile -------------------------------->

Internal read-write variable.  Name of colormap file used in certain
graphics output.  See the P command. Use COLORFILE := "filename" to set file.

<-------------------------------- colormap -------------------------------->

Evolver toggle command. Use a colormap from a file in certain graphics output.
See the P command. Use COLORFILE := "filename" to set file.

<----------------------------- column example ----------------------------->

Example: Column of liquid solder

Here we have a tiny drop of liquid solder that bridges between two
parallel, horizontal planes at z = 0 and z = ZH. On each plane there is a
circular pad that the solder perfectly wets, and the solder is perfectly
nonwetting off the pads. This would be just a catenoid problem with fixed
volume, except that the pads are offset, and it is desired to find out what
aligning force the solder exerts. The surface is defined the same way as in
the catenoid example, except the lower boundary ring has a shift variable
"SHIFT" in it to provide an offset in the y direction. This makes the shift
adjustable at run time. Since the top and bottom facets of the body are not
included, the constant volume they account for is provided by content
integrals around the upper boundary, and the gravitational energy is
provided by an energy integral. One could use the volconst attribute of the
body instead for the volume, but then one would have to reset that every
time ZH changed.

The interesting part of this example is the calculation of the forces. One
could incrementally shift the pad, minimize the energy at each shift, and
numerically differentiate the energy to get the force. Or one could set up
integrals to calculate the force directly. But the simplest method is to
use the Principle of Virtual Work by shifting the pad, recalculating the
energy without re-evolving, and correcting for the volume change.
Re-evolution is not necessary because when a surface is at an equilibrium,
then by definition any perturbation that respects constraints does not
change the energy to first order. To adjust for changes in constraints such
as volume, the Lagrange multipliers (pressure for the volume constraint)
tell how much the energy changes for given change in the constraints:

          DE = L*DC

where DE is the energy change, L is the row vector of Lagrange multipliers
and DC is the column vector of constraint value changes. Therefore, the
adjusted energy after a change in a parameter is

          E_adj = E_raw - L*DC

where E_raw is the actual energy and DC is the vector of differences of
constraint values from target values. The commands do_yforce and do_zforce
in the datafile do central difference calculations of the forces on the top
pad, and put the surface back to where it was originally. Note that the
perturbations are made smoothly, i.e. the shear varies linearly from bottom
to top. This is not absolutely necessary, but it gives a smoother
perturbation and hence a bit more accuracy.

The initial column skeleton, with vertices and edges numbered.



// column.fe
// Example of calculating forces exerted by a
// column of liquid solder in shape of skewed catenoid.


// All units cgs
parameter RAD = 0.05     // ring radius
parameter ZH = 0.08      // total height
parameter SHIFT = 0.025    // shift
#define SG 8      // specific gravity of solder
#define TENS 460  // surface tension of solder
#define GR  980   // acceleration of gravity

gravity_constant GR

BOUNDARY 1  PARAMETERS 1
X1: RAD*cos(P1)
X2: RAD*sin(P1) + SHIFT
X3: ZH
CONTENT  // used to compensate for missing top facets
c1: 0
c2: -ZH*x
c3: 0
ENERGY  // used to compensate for gravitational energy under top facets
e1: 0
e2: GR*ZH^2/2*x
e3: 0

BOUNDARY 2  PARAMETERS 1
X1: RAD*cos(P1)
X2: RAD*sin(P1)
X3: 0

vertices   // given in terms of boundary parameter
1    0.00  boundary 1   fixed
2    pi/3  boundary 1   fixed
3  2*pi/3  boundary 1   fixed
4    pi    boundary 1   fixed
5  4*pi/3  boundary 1   fixed
6  5*pi/3  boundary 1   fixed
7    0.00  boundary 2   fixed
8    pi/3  boundary 2   fixed
9  2*pi/3  boundary 2   fixed
10   pi    boundary 2   fixed
11 4*pi/3  boundary 2   fixed
12 5*pi/3  boundary 2   fixed

edges
1    1  2  boundary 1   fixed
2    2  3  boundary 1   fixed
3    3  4  boundary 1   fixed
4    4  5  boundary 1   fixed
5    5  6  boundary 1   fixed
6    6  1  boundary 1   fixed
7    7  8  boundary 2   fixed
8    8  9  boundary 2   fixed
9    9  10 boundary 2   fixed
10   10 11 boundary 2   fixed
11   11 12 boundary 2   fixed
12   12 7  boundary 2   fixed
13   1  7
14   2  8
15   3  9
16   4  10
17   5  11
18   6  12

faces
1   1 14  -7 -13   density TENS
2   2 15  -8 -14   density TENS
3   3 16  -9 -15   density TENS
4   4 17 -10 -16   density TENS
5   5 18 -11 -17   density TENS
6   6 13 -12 -18   density TENS

bodies
1    -1 -2 -3 -4 -5 -6 volume 0.00045 density SG

read

// horizontal force on upper pad by central differences
dy := .0001
do_yforce := { oldshift := shift; shift := shift + dy;
               set vertex y  y+dy*z/zh; // uniform shear
               recalc;
               energy1 := total_energy -
                     body[1].pressure*(body[1].volume - body[1].target);
               oldshift := shift; shift := shift - 2*dy;
               set vertex y  y-2*dy*z/zh; // uniform shear
               recalc;
               energy2 := total_energy -
                     body[1].pressure*(body[1].volume - body[1].target);
               yforce := -(energy1-energy2)/2/dy;
               printf "restoring force: %20.15f\n",yforce;
               // restore everything
               oldshift := shift; shift := shift + dy;
               set vertex y  y+dy*z/zh; // uniform shear
               recalc;
             }


// vertical force on upper pad by central differences.
dz := .0001
do_zforce := { oldzh := zh; zh := zh + dz;
               set vertex z  z+dz*z/oldzh; recalc; // uniform stretch
               energy1 := total_energy -
                     body[1].pressure*(body[1].volume - body[1].target);
               oldzh := zh; zh := zh - 2*dz;
               set vertex z  z-2*dz*z/oldzh; recalc; // uniform stretch
               energy2 := total_energy -
                     body[1].pressure*(body[1].volume - body[1].target);
               zforce := -(energy1-energy2)/2/dz;
               printf "vertical force:  %20.15f\n",zforce;
               // restore everything
               oldzh := zh; zh := zh + dz;
               set vertex z  z+dz*z/oldzh; recalc; // uniform stretch
             }

// end of datafile

<----------------------------- combinatorics ------------------------------>

Surface representation and combinatorics:
All surfaces are simplicial complexes made of the basic elements:
vertices, edges, and facets. The Evolver has three different ways of
representing the combinatorics of the surface, depending on the dimension
of the surface. Any of these may be used in any ambient space dimension at
least as great at the surface dimension.
 String model for dimension 1 surface.
 Soapfilm model (default) for dimension 2 surface.
 Simplex model for dimension 3 or higher surface.

<--------------------------- command definition --------------------------->

User-defined commands:
Users may define their own commands with the syntax

   identifier := command

The shortest complete command on the right side is used. Thus "gg := g 10;
u" would give gg the same value as "gg := g 10". It is wise and strongly
advised to use braces to enclose the command on the right side so the
parser can tell it's a command and not an expression. Also multiline
commands then don't need linesplicing. Do not try to redefine single-letter
commands this way; use :::=. Example:

   gg := {g 10; u}

<--------------------------- command repetition --------------------------->

Certain types of commands can be repeated a number of times by following
the command with an integer. Be sure to leave a space between a
single-letter command and the expression lest your command be interpreted
as one identifier. To avoid several types of confusion, only certain types
of commands are repeatable:
  Single letter commands that don't have optional arguments
      (K,k,l,t,j,m,n,p,w,y,P,M,G have optional arguments),
  Compound commands in braces,
  User-defined command names,
  Redefined single-letter commands.
 Examples:
   g 10
   U 2
   { g 20; u; V; u } 20
   myc := { g 20; V }; myc 10

<--------------------------- command separator ---------------------------->
<------------------------------- semicolon -------------------------------->

Several commands on the same line or within a compound command must be
separated by a semicolon. A semicolon is not needed after the last command,
but won't hurt. Do not use a semicolon after the first command in an IF
THEN ELSE command. You do need to use a semicolon to separate a compound 
command from the next command. Example:

      g 10; r; g 10; u
      myc := { print 5;
               g 10;
               if qwer < foo then print 3 else { print 2; print 4; };
               aa := 23
             };  // note the semicolon, even after }
      g 10;

<-------------------------------- comments -------------------------------->

Comments may be enclosed in /* */ pairs (as in C) and may span lines.
Also, // indicates the rest of the line is a comment, as in C++.


<--------------------------- compound commands ---------------------------->

Curly braces group a list of commands into one command. The commands are
separated by semicolons. A semicolon is needed after a compound command
within a compound command to separate it from following commands (note this
is different from the C language). Do not use a semicolon after the first
command in an IF THEN ELSE command. An empty compound command {} is legal.
Examples:

  if ( foo > 4 ) then { g;g;u; } else print 4;
  while ( xx < 2 ) do { g; xx := xx + 1 }
  aa := { g 5;
          foreach vertex vv do {
              printf "id: %g  coord: %f %f %f\n",id,x,y,z;
              count := count + 1;
              };  // note semicolon here!
          printf "done.\n"
        }

<------------------------- compressibility energy ------------------------->

If the ideal gas mode is in effect (set by the PRESSURE keyword in the
datafile), then each body contributes an energy

         E = P*V_0*ln(V/V_0)

where P is the ambient pressure, V_0 is the target volume of the body, and
V is the actual volume. To account for work done against the ambeint
pressure, each body also makes a negative contribution of

         E = -P*V.

The ambient pressure can be set in the datafile or with the p command.
This energy is calculated only for bodies given a target volume.

<------------------------------ conditional ------------------------------->

A conditional expression has the same syntax as in the C language:

 expr1 ? expr2 : expr3

evaluates to expr2 if expr1 is nonzero and to expr3 if expr1 is zero.
It is wise to use parentheses around the expressions to ensure the correct
order of evaluation.


<------------------------- conducting_knot_energy ------------------------->

Datafile keyword that automatically creates an energy named quantity using
the method knot_energy as a global method. May be followed in the datafile
with a modulus value.

<------------------------------- conf_edge -------------------------------->

Evolver toggle command. Calculation of squared curvature by fitting sphere
to edge and adjacent vertices (conformal curvature).  Only applies to
square_curvature as declared in the top of the datafile, not to
the squared curvature named methods.

<---------------------------- conformal_metric ---------------------------->

The ambient space can be endowed with a conformal Riemannian metric by
putting the keyword CONFORMAL_METRIC in the datafile followed by a formula
for the conformal factor, i.e. the multiple of the identity matrix that
gives the metric. Only one coordinate patch is allowed, but the quotient
space feature makes this quite flexible. Edges and facets are linear in
coordinates, they are not geodesic. The metric is used solely to calculate
lengths and areas. It is not used for volume. To get a volume constraint on
a body, you will have to define your own named quantity constraint. See
quadm.fe for an example of a metric. Example datafile declaration:

  CONFORMAL_METRIC 1/(1 - x^2 - y^2 - z^2)

<------------------------------- conj_grad -------------------------------->

Evolver toggle command. Use the conjugate gradient method in g command.
Synonym for "U" command.  See "conjugate gradient" for an explanation
of the method.

<--------------------------- conjugate gradient --------------------------->

"Conjugate gradient" is a method of accelerating gradient descent. In
ordinary gradient descent, one uses the gradient of energy to find the
steepest downhill direction, then moves along that line to the minimum
energy in that direction. Hence successive steps are at right angles.
However, this can be very inefficient, as you can spend a lot of time
zigzagging across an energy "valley" without making much progress
"downstream". With conjugate gradient, the search direction is chosen to be
in a "conjugate" direction to the previous direction. For a mathematical
explanation, see any decent book in numerical analysis, such as [P]. In
practice, the conjugate gradient method remembers a cumulative "history
vector", which it combines with the ordinary gradient to figure out the
conjugate gradient direction. The upshot is that conjugate gradient can
converge much faster than ordinary gradient descent.

Conjugate gradient can be toggled with the "U" command, or with the
"conj_grad" toggle. It should always be used with optimizing scale.

Notes: The conjugate gradient method is designed for quadratic energy
functions. As long as the energy function is nearly quadratic, as it should
be near an energy minimum, conjugate gradient works well. Otherwise, it may
misbehave, either by taking too big steps or by getting stalled. Both
effects are due to the history vector being misleading. To prevent too big
steps, one should iterate without conjugate gradient for a few steps
whenever significant changes are made to the surface (refining, changing a
constraint, etc.). On the other hand, if it looks like conjugate gradient
is converging, it may have simply become confused by its own history. See
the catenoid example for a case in point. A danger signal is the scale
factor going to zero. If you are suspicious, toggle conjugate gradient off
and on ("U 2" does nicely) to erase the history vector and start over.
See the "ribiere" toggle for switching between the default Fletcher-Reeves
version and the Ribiere version of conjugate gradient.

<------------------------------- connected -------------------------------->
<---------------------------- connected_cells ----------------------------->

Evolver toggle command. Sets torus model display to do each body as a
connected, wrapped surface. Not an on-off toggle, but a 3-way toggle with 
"clipped" and "raw_cells". Synonym: "connected_cells".  Since slight motions 
during evolution can cause the wrap to change suddenly, there is a body 
boolean attribute "centerofmass" that causes the center of mass of a
body to be remembered, and the next time a body is plotted, the wrap
is adjusted so the center of mass is close to the previous center of mass.
"Connected" and "connected_cells" are synonyms.

Default is unset, so Evolver prompts the user when graphics are first 
displayed.  The setting persists when loading a new surface.  But loading 
a torus model when a non-torus model is currently displayed will not prompt.


<------------------------------- conserved -------------------------------->
<--------------------------- conserved quantity --------------------------->

A use-type of named quantity, along with "energy", "fixed", and "info_only".
A "conserved" named quantity is like a fixed quantity, but the value is
irrelevant. The quantity gradient is used to eliminate a degree of freedom
in motion.  Rarely used, but useful to eliminate rotational degrees of
freedom, for example. Will not work with optimizing parameters, since they
do gradients by numerical differences.

<------------------------------- console_title -------------------------------->

Evolver internal read-write string variable.  This is the title that is
displayed on the Evolver command console window.  The default value is 
"Surface Evolver - datafilename" (with the name of the current datafile, of
course).  Useful when you are simultaneously running various instances, and
you want to tell which is running in which console window.  Just assigning
a string to console_title automatically changes the title on the window.

<-------------------------- constant expressions -------------------------->
<------------------------------- constexpr -------------------------------->

Constant expressions are evaluated when parsed. They are denoted by
constexpr in various syntax definitions. They occur mostly in the datafile.
Although they may contain variables, changing the variable value after
parsing has no effect. Variable expressions (denoted by expr in syntax
definitions) are recorded as parse trees and are re-evaluated each time
needed.

<------------------------------- constraint ------------------------------->
<------------------------------ constraints ------------------------------->

"Constraint" can be used in a general sense, but as a keyword it refers to
level set constraints. "Constraint" and "constraints" are interchangeable
in syntax.  See "level set constraints" for more, and "constraint decl"
for datafile syntax.

<------------------------- constraint declaration ------------------------->

The format for declaring a level set constraint in the top section of the
datafile is

CONSTRAINT n [GLOBAL] [CONVEX] [NONNEGATIVE] [NONPOSITIVE] [NONWALL]
FORMULA FUNCTION  expr
[ENERGY:
 E1: expr
 E2: expr
 E3: expr]
[CONTENT:
 C1: expr
 C2: expr
 C3: expr]

The same syntax also works at runtime, but it is wise to enclose the
entire definition in curly braces to guarantee Evolver reads the definition
as a single unit and is not confused by line breaks.

You may use EQUATION or FUNCTION as synonyms for FORMULA. This defines
constraint number n, where n is a positive integer. The optional keyword
GLOBAL means the constraint automatically applies to all vertices (but not
automatically to edges or faces). GLOBAL constraints count in the number
limit. If CONVEX is given, then an additional gap energy is attributed to
edges on the constraint to prevent them from trying to short-circuit a
convex boundary. NONWALL indicates this constraint is to be ignored in
vertex and edge popping. If NONNEGATIVE or NONPOSITIVE is given, then this
is a one-sided constraint, and all vertices will be forced to conform
appropriately to the constraint at each iteration. The FORMULA expression
defines the zero level set which is the actual constraint. It may be
written as an equation, since '=' is parsed as a low-precedence minus sign.
The formula may include any expressions whose values are known to the
Evolver, given the particular vertex. Most commonly one just uses the
coordinates (x,y,z) of the vertex, but one can use variables, quantity
values, or vertex extra attributes. Using a vertex extra attribute is a
good way to customize one formula to individual vertices. For example, if
there were a vertex extra attribute called zfix, one could force vertices
to individual z values with one constraint with the formula z = zfix, after
of course assigning proper values to zfix for each vertex (be sure to fix
up zfix after refining or otherwise creating vertices). Do not use '>' or
'<' to indicate inequalities; use NONNEGATIVE or NONPOSITIVE. Conditional
expressions, as in C language, are useful for defining constraints composed
of several surfaces joined smoothly, such as a cylinder with hemispherical
caps. Assignments to variables may be made at the start of expressions,
mainly for the purpose of evaluating common subexpressions only once in the
integrands. The syntax for such a compound expression is

    variable :=  expr, expr

The value of the expression is the value of the second expression.

The optional ENERGY section signifies that vertices or edges on the
constraint are deemed to have an energy. In the soapfilm model, the next
lines give components of a vectorfield that will be integrated along each
edge on the constraint. In the string model, just one component is needed,
which is evaluated at each vertex on the constraint. The main purpose of
this is to permit facets entirely on the constraint to be omitted. Any
energy they would have had should be included here. One use is to get
prescribed contact angles at a constraint. This energy should also include
gravitational potential energy due to omitted facets. Integrals are now
also evaluated on fixed edges, which is a change from earlier versions of
Evolver.

The optional CONTENT section signifies that vertices (string model ) or
edges (soapfilm model) on the constraint contribute to the area or volume
of bodies. If the part of a body boundary that is on a constraint is not
defined by facets, then the body volume must get a contribution from a
content integral. It is important to understand how the content is added to
the body in order to get the signs right. The integral is evaluated along
the positive direction of the edge. If the edge is positively oriented on a
facet, and the facet is positively oriented on a body, then the integral is
added to the body. This may wind up giving the opposite sign to the
integrand from what you think may be natural. Always check a new datafile
when you load it to be sure the integrals come out right.


<---------------------- constraint energy integrals ----------------------->

An edge on a level-set constraint may have an energy given by integrating
a vectorfield F over the oriented edge:

           E = \int_{edge} F . dl.

The integrand is defined in the constraint declaration in the datafile.
The integral uses the innate orientation of the edge, but if the
orientation attribute of the edge is negative, the value is negated. This
is useful for prescribed contact angles on walls (in place of wall facets
with equivalent tension) and for gravitational potential energy that would
otherwise require facets in the constraint. The mound example illustrates
this.   See "constraint decl" for syntax.

<-------------------------- constraint fixed -------------------------->

Whether a particular level-set constraint is an equality constraint or
a one-sided constraint can be queried at runtime by the expression
     is_constraint[number].fixed
or   is_constraint[name].fixed
"number" may be an expression; "name" is the unquoted name of the
constraint, if it has one. This has value 1 if the constraint is an 
equality constraint, else the value is zero.  Example of listing all 
the equality constraints that vertices are on:
   foreach vertex vv do
   { for ( inx := 1 ; inx < vv.v_constraint_list[1] ; inx++ )
       if is_constraint[vv.v_constraint_list[i+1]].fixed then
         printf "Vertex %d on equality constraint %d\n",
           vv.id,vv.v_constraint_list[i+1];
   };

<-------------------------- constraint normal -------------------------->

The unit normal vector of a level-set constraint at a vertex may be
found with the vertex vector attribute 
             constraint[number].normal
or           constraint[name].normal
"number" may be an expression; "name" is the unquoted name of the
constraint, if it has one.  Example:
  print vertex[1].constraint[floorcon].normal
would print the unit normal of constraint floorcon at vertex 1.  And
you can put on a subscript to get individual components.  For example,
the y component:
  print vertex[1].constraint[floorcon].normal[2]

There is no necessity for the constraint to be applied to the vertex; 
the vertex is just used as a source of coordinates for evaluating the 
gradient of the constraint formula.



<-------------------------- constraint_tolerance -------------------------->

Internal read-write variable. When vertices are projected to level-set
constraints, projection by Newton's method is repeated until the level-set
function is smaller than constraint_tolerance.  Default value 1e-12.
Example runtime usage:

  constraint_tolerance := 1e-10;
  
There is also a top-of-datafile declaration with the syntax

  CONSTRAINT_TOLERANCE constexpr

<-------------------------------- content --------------------------------->

"Content" is used to mean volume (or area, in the string model) in
constraint integrals.  See "constraint decl".

<------------------------------ content_rank ------------------------------>

A level-set constraint attribute used in conjunction with content integrals.  
If a vertex (string model) or an edge (soapfilm model) is on multiple 
constraints with content integrals (say where walls meet) then if content 
ranks are present, the content integral with the least rank will contribute 
to the content on the negative side body and the highest rank content
will contribute to the content of the positive side body.

<-------------------------------- continue -------------------------------->

Command syntax for skipping the rest of the body of the current loop, and
going to the next iteration of the loop.  Syntax:

   CONTINUE

   CONTINUE n

where n is a positive integer.  The second form exits the innermost n-1 loops,
and skips to the loop control of the nth innermost loop. Note: Commands with
repetition counts do not qualify as loops. Example:

   foreach vertex vv do {
       foreach vv.edge do {
         print length; if length < .4 then continue 2;
       }
   }

<--------------------------- control structures --------------------------->

The following control structures are available in the Evolver commmand
language:
   if ... then ... else
   do ... while ....
   while .... do ...
   for
   foreach
   break
   continue
   return
   abort

<------------------------- convert_to_quantities -------------------------->

Evolver main prompt command. This will do an automatic conversion of old-style
energies to new-style named quantities. This has the same effect as the -q
command line option, but can be done from the Evolver command prompt.
A few energies don't convert yet. It is my intention that this will be the
default sometime in the near future, if it can be made sufficiently fast
and reliable. If everything has been converted to quantities one way or 
another, the internal variable everything_quantities is set to 1.
Convert_to_quantities cannot be undone. Useful when hessian complains 
about not being able to do a type of energy. It is also useful when 
setting up a datafile, since the `Q' command will show all the internal 
quantities individually (when the show_all_quantities toggle is on), so 
you can tell what value each constraint integral has and so forth.


<--------------------------------- convex --------------------------------->
<--------------------------- convex constraint ---------------------------->

A keyword used in declaring a constraint in the datafile that causes a gap
energy to be included. The idea is to prevent straight edges and facets
from short-cutting curved constraints with big gaps.  See "gap energy".

A constraint may be declared CONVEX, in which case edges in the constraint
have an energy associated with them that is proportional to the area
between the straight edge and the curved wall. This energy (referred to as
"gap energy") is meant to compensate for the tendency for flat facets
meeting a curved wall to minimize their area by lengthening some edges on
the wall and shortening others, with the net effect of increasing the net
gap between the edges and the wall. See tankex.fe for an example.

<------------------------------ coordinates ------------------------------->

Vertex read-write attribute. The coordinates of a vertex are its location
in space. By default, these are Euclidean coordinates, but they may
represent any coordinate system if the user defines appropriate length,
area, volume, etc. integrals. But graphics always treat the coordinates as
Euclidean. The individual coordinates may be referred to as x,y,z,w or
x1,x2,x3,... or x[1], x[2], x[3],... In the vertices section of the datafile,
 vertices of the original surface have their coordinates given unless they
are on a parametric boundary. Vertices on parametric boundaries have their
coordinates calculated from their parameter values. Coordinates may be read
or modified with the command language. Examples:

  foreach vertex do printf "%g  %f %f %f\n",id,x,y,z
  set vertex z z+.1*x

The coordinates may also be referred to as a vector __x, which is useful
in vector expressions such as

   define vertex attribute savedx real[3];
   set vertex savedx __x;
   vertex[7].__x := {1.2,0.4,2.3}
  
<------------------------------ corona_state ------------------------------>
corona_state 
Internal read-write variable for MPI  Evolver.  The "corona" of
a task's piece of surface is the set of elements imported from 
other tasks, so the task has sufficient knowlegde to do its work.
The possible corona_state values are 0 (no corona), 1 (import
neighbor edges and vertices), or 2 (import neighbor vertices, 
edges, and facets). Setting this variable changes the corona state. 
It is a very bad idea to set it to 0. 

<---------------------------------- cos ----------------------------------->

 sin(x),cos(x),tan(x): Trig functions, argument in radians.

<---------------------------------- cosh ---------------------------------->

 sinh(x),cosh(x),tanh(x): Hyperbolic functions.

<------------------------------ cpu_counter ------------------------------->

Internal read-only variable. Processor cycle counter, available only on
systems where I know how to access this (x86 for now). Gives the number 
of CPU cycles since the system booted. Note that this is wall clock time, 
not process time. Also note that it resets to zero when a notebook 
computer hibernates, so it is not guaranteed to be monotone
increasing during the life of a process!

<---------------------------- ps_crossingflag ----------------------------->
<------------------------------ crossingflag ------------------------------>

Evolver toggle command. When "on" and the string model is in effect,
postscript output will show background edges with a break where foreground
edges pass in front.  "crossingflag" is an old name for "ps_crossingflag".


<------------------------------- crossings -------------------------------->

The interactive PostScript command "P 3" asks about several options.
"Do crossings?" is asked if the surface is 1-dimensional (the string
model) and the dimension of space is at least 3. If you reply 'y', a 3D
effect will be created by plotting edges back to front, with each edge
plotted first as a thick white line and then as a thin black line. This
creates a broken back line and continuous foreground line at each crossing.
Default 'n'. The postscript command uses the ps_crossingflag toggle to control
this.

<--------------------------- crystalline energy --------------------------->

The Evolver can model energies of crystalline surfaces. These energies are
proportional to the area of a facet, but they also depend on the direction
of the normal. The energy is given by the largest dot product of the
surface normal with a set of vectors known as the Wulff vectors. Surface
area can be regarded as a crystalline integrand whose Wulff vectors are the
unit sphere. See the datafile section on Wulff vectors for more. A surface
has either crystalline energy or surface tension, not both. Use is not
recommended since nonsmoothness makes Evolver work poorly.
 Example datafile: crystal.fe

<------------------------------ cube example ------------------------------>

Example: Cube evolving into a sphere.

A sample datafile cube.fe comes with Evolver. The initial surface is a
unit cube. The surface bounds one body, and the body is constrained to have
volume 1. There is no gravity or any other force besides surface tension.
Hence the minimal energy surface will turn out to be a sphere. This example
illustrates the basic datafile format and some basic commands.

This is the datafile that specifies the initial unit cube:

// cube.fe
// Evolver data for cube of prescribed volume.

vertices  /* given by coordinates */
1  0.0 0.0 0.0
2  1.0 0.0 0.0
3  1.0 1.0 0.0
4  0.0 1.0 0.0
5  0.0 0.0 1.0
6  1.0 0.0 1.0
7  1.0 1.0 1.0
8  0.0 1.0 1.0

edges  /* given by endpoints */
1   1 2
2   2 3
3   3 4
4   4 1
5   5 6
6   6 7
7   7 8
8   8 5
9   1 5
10  2 6
11  3 7
12  4 8

faces  /* given by oriented edge loop */
1   1 10 -5  -9
2   2 11 -6 -10
3   3 12 -7 -11
4   4  9 -8 -12
5   5  6  7   8
6  -4 -3 -2  -1

bodies  /* one body, defined by its oriented faces */
1   1 2 3 4 5 6  volume 1

// end of cube.fe

The datafile is organized in lines, with one geometric element defined per
line. Vertices must be defined first, then edges, then faces, then bodies.
Each element is numbered for later reference in the datafile.
Comments are delimited by /* to begin and */ to close as in C, or from //
until the end of the line as in C++. Case is not significant, and all input
is made lower-case immediately. Hence error messages about your datafiles
will refer to items in lower case, even when you typed them in upper case.

The datafile syntax is based on keywords. The keywords VERTICES, EDGES,
FACES, and BODIES signal the start of the respective sections. Note that
the faces are not necessarily triangles (which is why they are called FACES
and not FACETS). Any non-triangular face will be automatically triangulated
by putting a vertex at its center and putting in edges to each of the
original vertices. Faces don't have to be planar. Note that a minus sign on
an edge means that the edge is traversed in the opposite direction from
that defined for it in the EDGES section. A face's oriented normal is
defined by the usual right hand rule. The cube faces all have outward
normals, so they all are positive in the body list. In defining a body, the
boundary faces must have outward normals. If a face as defined has an
inward normal, it must be listed with a minus sign.

That the body is constrained to have a volume of 1 is indicated by the
keyword VOLUME after the body definition, with the value of the volume
following. Any attributes or properties an element has are given on the
same line after its definition.


Start Evolver and load the datafile with the command line

     evolver cube.fe

(or you can drag cube.fe and drop it on the evolver executable, or whatever
you do to launch evolver.)

You should get a prompt

     Enter command:

Give the command s to show the surface. You should see a square divided
into four triangles by diagonals. This is the front side of the cube; you
are looking in along the positive x-axis, with the z axis vertical and the
positive y axis to the right. On most systems, you can manipulate the
displayed surface with the mouse: dragging the mouse over the surface with
the left button down rotates the surface; you can change to "zoom" mode by
hitting the z key, to "translate" by hitting t, to "spin" by hitting c, and
back to "rotate" by hitting r. Hit the 'h' key with the mouse focus in the
graphics window to get a summary of the possibilities. You can also give
graphics commands at the graphics command prompt; this is good for precise
control. The graphics command prompt is

     Graphics command:

It takes strings of letters, each letter making a viewing transformation
on the surface: The most used ones are

           r   rotate right by 6 degrees
           l   rotate left by 6 degrees
           u   rotate up by 6 degrees
           d   rotate down by 6 degrees
           R   reset to original position
           q   quit back to main command prompt

Try typing rrdd to get an oblique view of the cube. Any transformations
you make will remain in effect the next time you show the surface. Now do q
to get back to the main prompt.  Actually, it's a lot simpler to use the
mouse to drag around the graphics image, but the graphics prompt remains
for backwards compatibility and the ability to do precision motions.

If you are using geomview for graphics, do command P option 8 to get a
display, or just "P 8" for short. Geomview takes a couple of seconds to
initialize. You can manipulate the geomview display as usual independently
of the Evolver. Evolver will automatically update the image whenever the
surface changes.

Now do some iterations. Give the command "g 5" to do 5 iterations. You
should get this:

  5. area:  5.11442065156005 energy:  5.11442065156005  scale: 0.186828
  4. area:  5.11237323810972 energy:  5.11237323810972  scale: 0.21885
  3. area:  5.11249312304592 energy:  5.11249312304592  scale: 0.204012
  2. area:  5.11249312772740 energy:  5.11249312772740  scale: 0.204386
  1. area:  5.11249312772740 energy:  5.11249312772740  scale: 0
Enter command:

Note that after each iteration a line is printed with the iterations
countdown, area, energy, and current scale factor. By default, the Evolver
seeks the optimal scale factor to minimize energy. At first, there are
large motions, and the volume constraint may not be exactly satisfied.
There may be an energy increase due to the volume constraint taking hold.
At the end, the scale is 0 because the surface has converged as well as it
can at this coarse a triangulation. (Different systems may not give a zero
scale here due to numerics.)

Volume constraints are not strictly enforced, but each iteration tries to
bring the volume closer to the target. Here that results in increases in
area. You can find the current volumes with the v command:

  Body       target volume         actual volume        pressure
    1     1.000000000000000     0.999999779366360   3.408026016427987

The pressure in the last column is actually the Lagrange multiplier for
the volume constraint. Now let's refine the triangulation with the r
command. This subdivides each facet into four smaller similar facets. The
printout here gives the counts of the geometric elements and the memory
they take:

  Vertices: 50 Edges: 144 Facets: 96  Facetedges: 288 Memory: 27554

Iterate another 10 times:

 10. area: 4.908899804670224 energy: 4.908899804670224  scale: 0.268161
  9. area: 4.909526310166165 energy: 4.909526310166165  scale: 0.204016
  8. area: 4.909119925577212 energy: 4.909119925577212  scale: 0.286541
  7. area: 4.908360229118204 energy: 4.908360229118204  scale: 0.304668
  6. area: 4.907421919968726 energy: 4.907421919968726  scale: 0.373881
  5. area: 4.906763705259419 energy: 4.906763705259419  scale: 0.261395
  4. area: 4.906032256943935 energy: 4.906032256943935  scale: 0.46086
  3. area: 4.905484754688263 energy: 4.905484754688263  scale: 0.238871
  2. area: 4.904915540917190 energy: 4.904915540917190  scale: 0.545873
  1. area: 4.904475138593070 energy: 4.904475138593070  scale: 0.227156

You can continue iterating and refining as long as you have time and memory.
Eventually, you will want to quit. So give the q command. You get

     Enter new datafile name (none to continue, q to quit):

You can start a new surface by entering a datafile name (it can be the
same one you just did, to start over), or continue with the present surface
by hitting ENTER with no name (in case you pressed q by accident, or
suddenly you remember something you didn't do), or you can really quit with
another q.

<-------------------------------- cubelat --------------------------------->
<------------------------- cubelat symmetry group ------------------------->

Cubelat is the full symmetry group of the unit cubic lattice.  That is, all 
permutations and sign changes of the coordinates, together with translating
by integer vectors.

Datafile declaration: symmetry_group "cubelat"

Wrap encoding: wrap&{1,2,4} give sign changes for x,y,z; 
              (wrap&24)/8 is power of (xyz) to cycle 
              (wrap&32)/32 tells whether to then swap x,y; that is, wrap&63 
                 is the same as for cubocta. 
              Then wrap/64 is a torus wrap as in the torus symmetry group: 
                 three six-bit signed fields for translation in each 
                 coordinate.  
Translation is to be applied after other operations.

<-------------------------------- cubocta --------------------------------->
<------------------------- cubocta symmetry group ------------------------->

Cubocta is the full symmetry group of the cube. It can be viewed as all
permutations and sign changes of (x,y,z).
Datafile declaration: symmetry_group "cubocta"
Group element encoding: 
    wrap & {1,2,4} give the sign changes for x,y,z;
    (wrap&24)/8 is the power of the (xyz) permutation cycle; 
    (wrap&32)/32 tells whether to then swap x,y. 
(By John Sullivan; source in quotient.c under name pgcube)

<--------------------------- curvature_binormal --------------------------->

Named method. Description: For string model. The energy evaluates to zero,
but the force calculated is the mean curvature vector rotated to the
binormal direction. 

Element: vertex. 
Parameters: none. 
Models: string; linear.
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

   quantity curbi energy method curvature_binormal global


<--------------------------- curvature_function --------------------------->

Named method. Description: Calculates forces as function of mean and
Gaussian curvatures at vertices. Function may be changed by user by
altering teix.c. No energy, just forces. 

Element: vertex. 
Parameters: none.
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity curfun energy method curvature_function global

<---------------------------- curvature_power ----------------------------->

Internal read-write variable that sets the power of curvature used
in the string model when squared_curvature is declared in the top
of the datafile or the sqcurve_string named method is used.

<----------------------------------- d ------------------------------------>

Single letter main command. Dumps data to ASCII file in same format as an
initial data file. You will be prompted for a filename. An empty reponse
will use the default dump name, which is the datafile name with a ".dmp"
extension. Same as the "dump" command, except the dump command requires the
filename as part of the command. Useful for checking your input is being
read correctly, for saving current configuration, and for debugging.
See "no_dump" for suppressing dumping of particular variables.

Graphics mode command. Tip down. Rotates image about horizontal axis, 
default 6 degrees down. An integer prefix indicates how many 6 degree rotations
to do, and a decimal prefix indicates an angle in degrees.
Example: `15d' does 90 degree rotation, `15.0d' does 15 degree rotation.


<----------------------------------- D ------------------------------------>

Single letter main command. Toggles updating graphics every iteration or
other surface change. Default is ON. Status can also be changed or
queried with the autodisplay toggle.

<------------------------------ datafilename ------------------------------>

Internal read-only variable. String containing the name of the current datafile.
It is the datafile name as given by the user, without any path or extension 
added by the file finding routine.

<----------------------------- date_and_time ------------------------------>

Internal read-only variable. String containing the current date and time,
as provided by the operating system.

<------------------------------ ddd_gamma_sq ------------------------------>

Named method. Description: Third derivative of curve position as function
of arclength, squared.       

Element: vertex. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:
  
   quantity ddd energy method ddd_gamma_sq global

<--------------------------------- debug ---------------------------------->

Evolver toggle command. Print YACC debug trace of parsing of commands.
Don't do this!

<------------------------------ debug option ------------------------------>
<--------------------------------- option --------------------------------->

Command line option -d :
Prints YACC debugging trace as datafile is parsed.  Not too useful to
end users.

<----------------------------- default_length ----------------------------->

The name of the energy quantity created for the total length of edges in
the string model when convert_to_quantities is done.  Shown by the "v"
or "Q" commands when the show_all_quantities toggle is on.

<------------------------------ default_area ------------------------------>

The name of the energy quantity created for the total area of facets in
the soapfilm model when convert_to_quantities is done. Shown by the "v" 
or "Q" commands when the show_all_quantities toggle is on.

<----------------------------- gravity_quant ------------------------------>

The name of the energy quantity created for the gravitational potential
energy when convert_to_quantities is done. Shown by the "v" or "Q" commands 
when the show_all_quantities toggle is on.


<------------------------------- gap_quant -------------------------------->

The name of the energy quantity created for the convex edge gap energy when 
convert_to_quantities is done. Shown by the "v" or "Q" commands when the 
show_all_quantities toggle is on.

<------------------------ sq_mean_curvature_quant ------------------------->

The name of the energy quantity created for the squared mean curvature
energy when convert_to_quantities is done, if squared_curvature is 
specified in the top of the datafile. Shown by the "v" or "Q" commands when the 
show_all_quantities toggle is on.

<---------------------------- default symmetry ---------------------------->

By default, the domain of a surface is Euclidean space. A symmetric
surface can be done this way if its fundamental domain is bounded by mirror
planes. Each mirror plane should be implemented as a linear level set
constraint.

<--------------------------------- define --------------------------------->

Syntax for defining various things in the top of the datafile:
variables, arrays, and extra attributes of elements.  "Define" can also
be used at runtime to additionally define level set constraints, boundaries,
named methods, and named quantities.  Note that #define for macro definition
is entirely different; see "macros".

The syntax for defining single variables is
    DEFINE variable type
where type is REAL, INTEGER, or STRING. Note that this way of declaring a
variable does not take an initial value; thus it is a way of making sure a
variable is defined without overwriting an existing value of the variable.
The syntax for defining arrays and extra attributes is the same as in the
top of the datafile; for constraints, boundaries, named quantities, and
method instances, it is the same as in the top of the datafile except the
word "define" comes first. Multi-line definitions should be enclosed in
brackets and terminated with a semicolon. Or they can be enclosed in quotes
and fed to the exec command. Of course, using exec means the parser doesn't
know about the define until the exec is executed, so you cannot use the
defined item in commands until then. It is legal to re-define an existing
array or array extra attribute with different dimensions (but the same
number of dimensions); data will be preserved as best as possible in the
resized array. An array may be given the dimension 0 to free its memory
allocation. Examples:

  define fudge_factor real
  define pqlist real[imax][jmax]
  define edge attribute charlie real
  define vertex attribute newx real[3]
  define facet attribute knots real[5][5][5]
  { define constraint frontcon formula z = 0
    energy:
    e1: -y/2
    e2:  x/2
    e3:  0; }
  exec "define boundary newboundary parameters 1
    x: sin(p1)
    y: cos(p1)
    z: 3"
  exec "define quantity qarea info_only method facet_area global"


<--------------------------------- delete --------------------------------->

Main prompt command. For collapsing and removing edges or facets. Syntax:

   DELETE  generator

Deletes edges by shrinking the edge to zero length (as in the tiny edge
weed command t) and facets by eliminating one edge of the facet. Facet
edges will be tried for elimination in shortest to longest order. Edges
will not be deleted if both endpoints are fixed, or both endpoints have
different constraints or boundaries from the edge.  In the soapfilm model,
DELETE will also fail if it would create two edges with the same endpoints,
unless the force_deletion toggle is on; also see star_finagling. DELETE 
maintains the continuity and connectedness of the surface, as opposed to 
DISSOLVE.  Examples:

      delete edges where length < 0.01 and valence == 2
      delete facets where area < 0.0001

<------------------------------ delete_count ------------------------------>

Internal read-only variable. Sum of edge_delete_count and
facet_delete_count. Kept for backwards compatibility.
Prints and resets to 0 at the end of a command execution, or
when flush_counts is done. Also reset by reset_counts.

<------------------------------ delete_text ------------------------------->

Main prompt command to delete a text string from the graphics display. 
Syntax: 
 
   delete_text(text_id) 

where text_id is the value returned by the call to display_text that
created the string. 
 
<-------------------------------- density --------------------------------->

An element attribute referring either to the gravitational density
of a body, or to the surface tension of a facet, or to the linear
tension of an edge. In the latter two cases, "density" is synonymous
with "tension".

<-------------------------- density_edge_length --------------------------->

Named method. Description: Length of edge, multiplied by the edge density.
Quadratic model uses Gaussian quadrature of order integral_order_1D.

Element: edge. 
Parameters: none. 
Models: string, soapfilm; linear, quadratic, Lagrange.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  quantity len energy method density_edge_length global


<--------------------------- density_facet_area --------------------------->

Named method. Description: Area of facet, multiplied by its density.
Otherwise same as facet_area. 

Element: facet.
Parameters:  none.
Models: soapfilm, simplex; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  quantity farea energy method density_facet_area global

<-------------------------- density_facet_area_u -------------------------->
<------------------------------ facet_area_u ------------------------------>

Named method. Description: Area of facet. In the quadratic model, it is an
upper bound of area, by the Schwarz Inequality. For the paranoid. In the 
linear model, the same as facet_area. Sets integral_order_2D to 6, since it 
doesn't work well with less. Using the density_facet_area_u name automatically
incorporates the facet tension, but facet_area_u doesn't. 

Element: facet.
Parameters: none. 
Models: soapfilm; linear, quadratic. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

   quantity area_u energy method facet_area_u global

<-------------------------------- detorus --------------------------------->

Main prompt command that converts the displayed surface to a real surface.
It is meant for situations like the torus model where one wants to unwrap 
the torus in reality in order to write an export file for some other 
program.  After detorus, the torus model is not in effect.  Detorus also 
works with view transforms.  Beware that after detorus vertices and 
edges may be removed from boundaries and constraints, so considerable
patching up may be necessary to get an evolvable surface.  But quantities,
colors, and other attributes are inherited, which you may or may not need
to patch also.

There is a toggle detorus_sticky that makes detorus merge 
vertices, edges, and facets that coincide; it defaults to on. The tolerance 
for detorus to identify vertices when detorus_sticky is toggled on is the 
internal variable detorus_epsilon, with default value 1e-6.

<---------------------------- detorus_epsilon ----------------------------->

Variable that is the tolerance for detorus to identify vertices when
detorus_sticky is toggled on.  Default value 1e-6.

<----------------------------- detorus_sticky ----------------------------->

Toggle that controls whether the detorus command will identify
coincident vertices, edges, and facets.

<-------------------------------- deturck --------------------------------->

Evolver toggle command. Motion by unit velocity along normal, instead of
by curvature vector.


<------------------------------- diffusion -------------------------------->
<----------------------------- edge_diffusion ----------------------------->
<---------------------------- facet_diffusion ----------------------------->

The Evolver can simulate the real-life phenomenon of gas diffusion between
neighboring bubbles. This diffusion is driven by the pressure difference
across a surface. This is invoked by the keyword DIFFUSION in the first
part of the datafile, followed by the value of the diffusion constant,
which is the internal variable diffusion_coeff.  Example datafile declaration:

   diffusion 0.1

The amount diffused across a facet during an iteration is calculated as
scale*diffusion_coeff*facet_area*pressure_difference. The scale factor
is included as the time step of an iteration. The amount is added to or
subtracted from the prescribed volumes of the bodies on either side of the
facet.

If you want finer control over the rate of diffusion across various
surfaces, you can define the edge_diffusion edge attribute in the string
model or the facet_diffusion facet attribute in the soapfilm model and give
individual values for edges or facets as you desire. If the attribute is
defined, then its value is used instead of the global diffusion constant.

Diffusion can be toggled at runtime with the "diffusion" toggle command.

<---------------------------- diffusion_coeff ----------------------------->

Internal read-write variable controlling the rate of diffusion of
volume across surfaces when "diffusion" is in effect.  Initially set by the
diffusion statement in the top of the datafile, for example,

   diffusion 0.1

If you want finer control over the rate of diffusion across various
surfaces, you can define the edge_diffusion edge attribute in the string
model or the facet_diffusion facet attribute in the soapfilm model and give
individual values for edges or facets as you desire. If the attribute is
defined, then its value is used instead of the global diffusion constant. 

<-------------------------------- dihedral -------------------------------->

Vertex read-only attribute in the string model. This is the angle in radians
from straightness of two edges at a vertex. If there are less than two edges,
the value is 0. If two or more edges, the value is 2*asin(F/2), where F is
the magnitude of the net force on the vertex, assuming each edge has
tension 1. Upper limit clamped to pi.

Edge read-only attribute in the soapfilm model. The angle in radians
between the normals of two facets on an edge. Zero if there are not
exactly two facets. 

This attribute is not stored, but recalculated each time it is used.


<----------------------------- dihedral_hooke ----------------------------->

Named method. Description: Energy of an edge is edge length times square
of angle between normals of adjacent facets. Actually,
  energy = (1 - cos(angle))*length.

Element: edge. 
Parameters: none. 
Models: soapfilm; linear.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  quantity bender energy method dihedral_hooke global


<------------------------------- dirichlet -------------------------------->

Main prompt command. Does one iteration of minimizing the Dirichlet
integral of the surface. The current surface is the domain, and the
Dirichlet integral is of the map from the current surface to the next. This
is according to a scheme of Konrad Polthier and Ulrich Pinkall [PP]. At
minimum Dirichlet integral, the area is minimized also. Works only on area
with fixed boundary; no volume constraints or anything else. Seems to
converge very slowly near minimum, so not a substitute for other iteration
methods. But if you have just a simple soap film far, far from the minimum,
then this method can make a big first step. DIRICHLET_SEEK will do an
energy-minimizing search in the direction.


<----------------------------- dirichlet_area ----------------------------->

Named method. Description: Same as the facet_tension method, but the
Hessian is modified to be guaranteed positive definite, after the scheme of
Polthier and Pinkall. The energy is taken to be the Dirichlet integral
of the perturbation from the current surface, which is exactly quadratic
and positive definite. Hence the hessian command always works, but final
convergence may be slow (no faster than regular iteration) since it is only
an approximate Hessian. Also see the dirichlet command.

Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

  quantity dirarea energy method dirichlet_area global

<--------------------------- dirichlet_elastic ---------------------------->

Named method. Description: Calculate the Dirichlet elastic strain energy
for facets, minimization of which gives conformal mapping. Let S be Gram
matrix of unstrained facet (dots of sides). Let Q be the inverse of S. Let
F be Gram matrix of strained facet. Let C = FQ, the linear deformation
matrix. Then energy density is Tr(CC^T) Each facet has an extra attribute
array form_factors[3] = {s11,s12,s22}, which are the entries in S. That is,
s11 = dot(v2-v1,v2-v1), s12 = dot(v2-v1,v3-v1), and s22 = dot(v3-v1,v3-v1).
If form_factor is not defined by the user, it will be created by Evolver,
and the initial facet shape will be assumed to be unstrained. 

Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: 3. 
Hessian: yes. 
Example datafile declaration: 
 
  quantity dirich energy method dirichlet_elastic global 

 
<----------------------------- dirichlet_mode ----------------------------->

When the facet_area method is being used to calculate areas in hessian
commands, this toggles using an approximate facet_area hessian that is
positive definite. This permits hessian iteration to make big steps in a
far-from-minimal surface without fear of blowing up. However, since it is
only an approximate hessian, final convergence to the minimum can be slow.
Linear model only. Does convert_to_quantities implicitly. Another variant
of this is triggered by sobolev_mode.

<----------------------------- dirichlet_seek ----------------------------->

Main prompt command. Calculates a motion as in the DIRICHLET command, but
uses this as a direction of motion instead of as the motion itself.
DIRICHLET_SEEK then uses a line-search along this direction to find a
minimum of energy.

<----------------------------- display_origin ----------------------------->

For a torus mode surface, if clipped mode is in effect, the lower back left 
of the clip box is set with the display_origin[] array whose dimension 
is the dimension of the ambient space. This array does not exist
by default, it has to be created by the user in the top of the datafile
with the syntax 
 
  display_origin x y z 

where x y z are the coordinates for the desired center of the clip box. At
runtime, the array elements may be changed as normal for an array: 
 
 display_origin[2] := 0.5 

Changing display_origin will automatically cause the graphics to
re-display. 
 
<---------------------------- display_periods ----------------------------->

The displayed parallelogram unit cell can be different from the actual
unit cell if you put an array called display_periods in the top of the
datafile, in addition to the regular periods. For a string model example,

   parameter shear = 1
   torus_filled
   periods
   4  0
   shear  4
   display_periods
   4 0
   0 4

This will always display a square, no matter how much the actual unit cell
is sheared. This feature works well for shears; it may not work nicely for
other kinds of deformation. Display_periods works better for the string
model than the soapfilm model. For the soapfilm model, it seems to do
horizontal shears best, but it can't cope with large shears, so if your
shear gets too large, I advise resetting your fundamental region to less
shear, say with the unshear command in unshear.cmd.

<------------------------------ display_text ------------------------------>

Main prompt command. Causes the display of simple text on the graphics
display. Currently implemented for OpenGL and PostScript graphics. Syntax: 
 
  text_id := display_text(x,y,height,string) 

The x,y coordinates of the start of the string are in window units, i.e.
the window coordinates run from (0,0) in the lower left to (1,1) in the
upper right. The "height" argument gives the height of the font in window
coordinates, so 0.04 is a reasonable value.  The return value should be 
saved in a variable in case you want to delete the text later with 
delete_text(text_id); even if you don't want to delete it, you must have 
something on the left of the assignment for syntax purposes. No font type 
or color implemented. Meant for captioning images, for example a timer in 
frames of a movie.  Example:

  framelabel := display_text(0.10,0.10,0.03,"Frame 1");
 
The font on the screen can look a bit rough sometimes, but postscript
output is smooth.
 
<-------------------------------- dissolve -------------------------------->

Main prompt command. Removes elements from the surface without closing the
gap left. Syntax:

  DISSOLVE  generator

The effect is the same as if the line for the element were erased from a
datafile. Hence no element will be dissolved that is used by a higher
dimensional element. (There are three exceptions: dissolving an edge on a
facet in the string model, and dissolving a facet on one body or with both
adjacent bodies the same in the soapfilm model.) Thus "dissolve edges;
dissolve vertices" is safe because only unused edges and vertices will be
dissolved. No error messages are generated by doing this. Good for poking
holes in a surface. Examples:

  dissolve facets where original == 2;
  dissolve edges; dissolve vertices

Thus "dissolve edges; dissolve vertices" is safe because only unused edges
and vertices will be dissolved. No error messages are generated by doing
this.


<----------------------------- dissolve_count ----------------------------->

Internal read-only variable. Sum of vertex_dissolve_count, edge_dissolve_count,
facet_dissolve_count, and body_dissolve_count. Kept for backwards 
compatibility.  Prints and resets to 0 at the end of a command execution, or
when flush_counts is done. Also reset by reset_counts.


<-------------------------- div_normal_curvature -------------------------->

Toggle to make sq_mean_curvature energy calculate the mean curvature by
the divergence of the normal vectors at the vertices of a facet.


<----------------------------------- do ----------------------------------->

Command syntax for post-test iteration loop. Syntax:

   DO command WHILE expr

where expr is true if nonzero. Parentheses around expr are not needed, but do
not hurt. Example:

   do { oldenergy := total_energy; g 10 }
   while (oldenergy-total_energy < 1e-6)


<---------------------- dodecahedron symmetry group ----------------------->

The defined surface can be treated as the fundamental region of a larger
surface with a symmetry.  See "symmetry group".

"Dodecahedron" is the symmetry group of translations of hyperbolic 3 space tiled
with right-angled dodecahedra. The elements of the group are represented as
integers. There are 32 generators of the group so each generator is
represented by five bits. Under this scheme any element that is the
composition of up to five generators can be represented. If you want to use
this group, you'll have to check out the source code in dodecgroup.c, since
somebody else wrote this group and I don't feel like figuring it all out
right now.
Datafile declaration:

   Klein_metric
   symmetry_group "dodecahedron"


<------------------------------ dot_product ------------------------------->

Binary operator for vectors (1-dimensional arrays).  Used in infix
position.  Example:

  print vertex[1].__x dot_product vertex[2].__x

You can now also just use the * operator for dot product:

  print vertex[1].__x * vertex[2].__x


<---------------------------------- dump ---------------------------------->

Main prompt command. Dumps current surface to named file in datafile
format. Syntax:

  DUMP filename

filename is a string. With no filename, dumps to the default dump
file, which is the current datafile name with ".dmp" extension. Same as the
'd' command, except 'd' requires a response from the user for the filename.
Examples:

   dump "foo.dmp"
   dump sprintf "%s.%g.dmp",datafilename,counter

See "no_dump" for suppressing dumping of particular variables.

<------------------------------ dump_memlist ------------------------------>

Main prompt command. Lists the currently allocated memory blocks. For my
own use in debugging memory problems. 


<-------------------------- dynamic load library -------------------------->

Many Evolver features, such as level set constraints, parametric
boundaries, named method integrands, and Riemannian metrics require
user-defined functions of a set of arguments. The expressions for these
functions are ordinarily stored as a parse tree and interpreted each time
needed, which can be much slower that evaluating compiled expressions.
There is a way to use a set of compiled functions specific to a datafile
through a mechanism known as dynamic loading. Here a library of functions
for a datafile is separately compiled, and then loaded at runtime when a
the datafile is loaded. Currently, the Evolver only implements a dynamic
loading mechanism found on many unix systems, whose presence can be tested
by looking for the existence of the file /usr/include/dlfcn.h. If it
exists, you can enable dynamic loading by including -DENABLE_DLL in the
CFLAGS line in the Makefile. On some systems, you may need to include -ldl
on the GRAPHLIB line also, to link Evolver with functions such as dlopen().

To create the library for a datafile, write a source file containing C
code for the desired functions, compile it, and link it into a shared
library. The function should be able to compute the value and the partial
derivatives of the function, and its second partials if you are going to
use any Hessian features. A sample source file for a 2-dimensional
datafile:


#define FUNC_VALUE  1
#define FUNC_DERIV  2
#define FUNC_SECOND 3
#define MAXCOORD 4   /* must be same as in Evolver!! */
#define REAL double  /* long double if Evolver compiled with -DLONGDOUBLE */
struct dstack { REAL value;
                REAL deriv[2*MAXCOORD];
                REAL second[2*MAXCOORD][2*MAXCOORD]; };

void func1 ( mode, x, s )
int mode; /* FUNC_VALUE, FUNC_DERIV, FUNC_SECOND */
REAL *x;  /* pointer to list of arguments */
struct dstack *s;  /* for return values */
{ REAL value;

  s->value = x[0] + x[1]*x[1];

  if ( mode == FUNC_VALUE ) return;

  /* first partials */
  s->deriv[0] = 1.0;
  s->deriv[1] = 2*x[1];

  if ( mode == FUNC_DERIV ) return;

  /* second partials */
  s->second[0][0] = 0.0;
  s->second[0][1] = 0.0;
  s->second[1][0] = 0.0;
  s->second[1][1] = 2.0;

  return;
}


Supposing the sourcefile name to be foo.c, compile and link on SGI systems
(IRIX 5.0.1 or above) with

cc -c foo.c
ld -shared foo.o -o foo.so

 Sun systems are the same, but with -s in place of -shared. For other
systems, consult the ld documentation for the option to make a shared
library or dynamic load library.
 To use the functions in a datafile, include a line at the top of the
datafile before any of the functions are used:

load_library "foo.so"

 The current directory and the EVOLVERPATH will be searched for the
library. Up to 10 libraries may be loaded. Afterwards, any of the functions
may be invoked just by using their name, without an explicit argument list
because the argument list is always implicit where these functions are
legal. Examples, supposing func2 is also defined with one argument:

constraint 1
formula: func1


boundary 1 parameters 2
x1: func2
x2: 3*func2 + sin(p1)

 It is up to you to make sure the number of arguments your function expects
is the same as the number implicit in the use of the function. You do not
need to explicitly declare your functions in the datafile. Any undefined
identifier is checked to see if it is a dynamically loaded function.
 NOTE: This implementation of dynamic loading is experimental, and the
interface described here may change in the future.


<----------------------------------- e ------------------------------------>

Single letter main command.  Extrapolates the total energy to infinite
refinement if at least two r commands have been done. Uses the last energy
values at three successive levels of refinement, and uses a power law fit
for the error. For best results, use only the r command to refine, and
iterate to complete convergence at each level of refinement. Synonym:
extrapolate.

Graphics mode command. Toggle showing all the facet edges vs. showing
just those that satisfy the current "show edges where ..." condition.


<--------------------------- e_constraint_list ---------------------------->

This read-only edge attribute gives access to the list of constraints an 
edge is on. e_constraint_list[1] is the number of constraints in the list,
followed by the numbers of the constraints. Note that for named
constraints, the internally assigned numbers are used.


<------------------------------ echo option ------------------------------->
<--------------------------------- option --------------------------------->

Command line option -e : Echo input. Meant for echoing commands of
piped input to screen so the user can follow what is going on in case
Evolver is being controlled by another process.

<---------------------------------- edge ---------------------------------->

In general, one of the basic geometric elements. As a keyword, it is used
in element generators. Synonym: edges.  Examples:
   list edges where on_constraint 2
   set edge[3] color red
   list facet[2].edge[2]

<----------------------------- edge boundary ------------------------------>

Edge read-write attribute. If an edge is on a parametric boundary, then
any edges and vertices generated from the edge will inherit the boundary.
By default, new vertex parameter values are calculated by extrapolating
from one end of the edge. This avoids wrap-around problems that would arise
from interpolating parameter values. But if the interp_bdry_param toggle is
on, then interpolation is used. The status of whether an edge is on a
boundary can be queried with the Boolean attribute on_boundary. Edges can
be unset from boundaries, and set on them (but care is needed to do this
properly). Examples:

  list edges where on_boundary 1
  unset edges boundary 2

<------------------------------- edge color ------------------------------->

Edge read-write attribute. Color for graphics. The default color is black.
Color may be set in the datafile, or with the set command. In geomview, the
edge color will show up only for edges satisfying the show edge condition,
and then they will have to compete with the edges geomview draws, unless
you turn off geomview's drawing of edges with "ae" in the geomview window.
Examples:

  set edge color red where length > 1
  show edge where color != black

<---------------------------- edge constraints ---------------------------->

Edge read-write attribute. An edge may be put on a level set constraint.
For such an edge, any vertices and edges generated by refining the edge
will inherit the constraint. An edge may be put on constraints in the edges
section of the datafile by listing the constraint numbers after the keyword
constraint on the line defining the edge. Putting an edge on a constraint
does not put its existing vertices on the constraint. In commands, the
status of an edge can be read with the "on_constraint" attribute. The
status can be changed with the set or unset commands. Examples:

  list edge where on_constraint 2
  set edge constraint 1 where id == 4 or id == 6
  unset edge constraint 3

<------------------------------ edge density ------------------------------>
<------------------------------ edge tension ------------------------------>

Edge read-write attribute. "Density" and "tension" are synonyms. Energy
per unit length of edge. Default 1 in string model, 0 in soapfilm model.
The tension may be modified in the datafile edges section by adding
"tension value" to the line defining the edge. The tension may be modified
with the set command. Examples:

  set edge tension .5 where id < 10
  loghistogram(edge,density)

<------------------------------ edge facets ------------------------------->

Edge read-only attribute. Generates facets attached to an edge, in order
around the edge when meaningful, with facet orientation agreeing with edge
orientation. Examples:

   list edge[2].facets
   foreach edge ee do print max(ee.facets,area)

<------------------------------ edge length ------------------------------->

Edge read-only attribute. Length of the edge. Examples:

 histogram(edge where on_constraint 1, length)
 print edge[3].length

<---------------------------- edge noncontent ----------------------------->

Edge read-write attribute. When set, indicates this facet should not 
be used in volume calculations in the soapfilm model or facet area
calculations in the string model. Useful, for example, if you want to have
edges be part of a body boundary for display purposes, but want to use
constraint integrands for greater accuracy in volume calculations. Example:

   set edge noncontent where on_constraint 1

<---------------------------- edge orientation ---------------------------->

Edge read-write attribute. Controls the sign of oriented integrals on an
edge. Value +1 or -1. Useful when triangulation manipulations create an
edge going the wrong way. Example:

  set edge[2] orientation -1

<------------------------------ edge tangent ------------------------------>

Edge read-only attribute. The components of the edge vector in the linear
model can be accessed as edge attributes x,y,z or x1,x2,x3,.... In a
command, the vector between edge endpoints is used in quadratic model or
lagrange model. But when used in an integral, the tangent is evaluated at
the Gaussian integration points. Not defined in the simplex model. Example
to list nearly vertical edges:

   list edges where z^2 > 10*(x^2 + y^2)

<------------------------------ edge valence ------------------------------>

Edge read-only attribute. The valence of an edge is the number of facets
adjacent to it. Examples:

  list edges where valence == 1
  refine edge where valence != 2

<----------------------------- edge vertices ------------------------------>

Edge read-only attribute. Acts as a generator for the two endpoints in the
linear and quadratic models, and for all vertices on an edge in the
Lagrange and simplex models. Example:

   list edge[2].vertices
   list edge ee where ee.vertex[1].on_constraint 1

<------------------------------- edge_area -------------------------------->

Named method. Description: For calculating the area of a body in the
string model. Implemented as the exact integral of -y dx over the edge.
Valid for torus model, but not general symmetry groups. You may have to set
the quantity volconst attribute in the torus model, since the area
calculation is ambiguous up to one torus area. 

Element: edge.
Parameters: none. 
Models: string; linear, quadratic, Lagrange. 
Ambient dimension: 2. 
Hessian: yes. 
Example datafile declaration:

quantity cell1_area fixed = 1.3 method edge_area

<------------------------------- edge_count ------------------------------->

Internal read-only variable. Number of edges in the total surface.

<--------------------------- edge_delete_count ---------------------------->

Internal read-only variable. Number of edges deleted by the delete command. 
This does not count the secondary edge deletions caused by deleting an edge. 
Prints and resets to 0 at the end of a command execution, or when flush_counts 
is done. Also reset by reset_counts.

<-------------------------- edge_dissolve_count --------------------------->

Internal read-only variable. Number of edges dissolved by dissolve command.
Prints and resets to 0 at the end of a command execution, or when flush_counts
is done. Also reset by reset_counts.

<------------------------------ edge_divide ------------------------------->

Main command, synonym of 'l' (lower-case 'L'). Subdivides long edges,
creating new facets as necessary. Syntax:

   edge_divide expr

You will be prompted for a cutoff edge length, if you don't give
a value with the command. Existing edges longer than the cutoff will be
divided once only. Newly created edges will not be divided. Hence there may
be some long edges left afterward. If you enter h, you will get a histogram
of edge lengths. If you hit RETURN with no value, nothing will be done. It
is much better to use the refine command r than to subdivide all edges.
This command does not respect the no_refine attribute.



<------------------------- edge_edge_knot_energy -------------------------->

Named method. Description: Between pairs of edges, energy is inverse
square power of distance between midpoints of edges. Can also be called
just edge_knot_energy. See also edge_knot_energy_normalizer. (by John
Sullivan) 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

  quantity knotten energy method edge_edge_knot_energy global


<------------------------- edge_general_integral -------------------------->

Named method. Description: Integral of a scalar function of position and
tangent over an edge. The components of the tangent vector are represented
by continuing the coordinate indices. That is, in 3D the position
coordinates are x1,x2,x3 and the tangent components are x4,x5,x6. For
proper behavior, the integrand should be homogeneous of degree 1 in the
tangent components. Uses Gaussian quadrature of order integral_order_1D.

Element: edge. 
Parameters: scalar_integrand. 
Models: string, soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration: the edge length in 3D could be calculated
  with this quantity:

  quantity arclength energy method edge_general_integral
  scalar_integrand: sqrt(x4^2 + x5^2 + x6^2)

<------------------------- edge_k_vector_integral ------------------------->

Named method. Description: Integral of a simple (n-k)-vector over an
oriented k-dimensional simplicial edge in n-space. The vector integrand
lists the components of each of the k vectors sequentially. Evaluation is
done by forming a determinant whose first k rows are k vectors spanning the
edge, and last (n-k) rows are vectors of the integrand. 

Element: edge.
Parameters: k_vector_order, vector_integrand. 
Models: string, soapfilm; linear, quadratic, simplex. 
Ambient dimension: any. 
Hessian: yes. 
Orientable: yes. 
Example datafile declaration, for 3D edges of a 4D surface in 5D:

   quantity kvec energy method edge_k_vector_integral
   k_vector_order 3
   vector_integrand:
   q1: 0   // first vector
   q2: 0
   q3: 0
   q4: 0
   q5: x4
   q6: 0   // second vector
   q7: 0
   q8: 0
   q9: x3
   q10: 0

<---------------------------- edge_knot_energy ---------------------------->

Named method. Description: Between pairs of edges, energy is inverse
square power of distance between midpoints of edges. Can also be called
just edge_knot_energy. See also edge_knot_energy_normalizer. (by John
Sullivan) 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity knotten energy method edge_edge_knot_energy global

<---------------------- edge_knot_energy_normalizer ----------------------->

Named method. Description: Calculates internal knot energy to normalize
singular divergence of integral of edge_edge_knot_energy. 

Element: edge.
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3. 
Hessian: no.
Example datafile declaration:

  quantity knotten energy method edge_edge_knot_energy global
                          method edge_knot_energy_normalizer global


<------------------------------ edge_length ------------------------------->
<------------------------------ edge_tension ------------------------------>

Named method. Description: Length of edge. Quadratic or Lagrange model
uses Gaussian quadrature of order integral_order_1D. edge_length and
edge_tension are synonyms.  

Element: edge. 
Parameters: none.
Models: string, soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes.
Example datafile declaration:

  quantity len energy method edge_length global


<------------------------------- edge_merge ------------------------------->

Main prompt command. Merges two edges into one in a side-by-side fashion.
Meant for joining together surfaces that bump into each other. Should not
be used on edges already connected by a facet, but merging edges that
already have a common endpoint(s) is fine. Syntax:

  edge_merge(integer,integer)

Note the arguments are signed integer ids for the elements, not element
generators. The tails of the edges are merged, and so are the heads.
Orientation is important. Example:

   edge_merge(3,-12)

The first edge is the surviving edge.

<-------------------------- edge_min_knot_energy -------------------------->

Named method. Description: Between pairs of edges, energy is inverse
square power of distance between closest points of edges:

    Energy = 1/d^2 * |e1||e2|

This should be roughly the same as edge_edge_knot_energy, but distances
are calculated from edge midpoints there. This is not a smooth function, so
we don't try to compute a gradient. DO NOT use as an energy; use just for
info_only quantities.
 
Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3.
Hessian: no. 
Example datafile declaration:

  quantity eminknot info_only method edge_min_knot_energy global

<----------------------------- edge_order_key ----------------------------->

Integer edge attribute used by reorder_storage to determine the new
order of edges in storage.  See reorder_storage for details of use.


<---------------------------- e_partition_proc ---------------------------->

Internal edge attribute used when the multiprocessor option -pn is used.
Determines which thread owns an edge.

<--------------------------- e_partition_stage ---------------------------->

Internal edge attribute used when the multiprocessor option -pn is used.
Coordinates the sequencing of iteration over edges in certain operations
so different threads don't conflict and time-consuming locks are not
necessary.

<--------------------------- edge_pop_attribute --------------------------->

Edge integer attribute used by pop commands when kraynikpopedge mode is 
toggled on. Poppable edges look for adjacent facets of different 
edge_pop_attribute values to split off from the original edge; failing
that it reverts to the regular mode of popping the edge. This is meant
to give the user greater control on how edge popping is done. It is up
to the user to declare the edge_pop_attribute integer facet attribute
and assign values.

<----------------------------- edge_pop_count ----------------------------->

Internal read-only variable. Number of edges popd by pop edges, o, or O,
commands. Prints and resets to 0 at the end of a command execution, or when 
flush_counts is done. Also reset by reset_counts.

<--------------------------- edge_refine_count ---------------------------->

Internal read-only variable. Number of edges refined by refine edges command. 
Prints and resets to 0 at the end of a command execution, or when flush_counts 
is done. Also reset by reset_counts.

<-------------------------- edge_scalar_integral -------------------------->

Named method. Description: Integral of a scalar function over arclength.
Uses Gaussian quadrature of order integral_order_1D. 

Element: edge.
Parameters: scalar_integrand. 
Models: string, soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes.
Example datafile declaration:

  quantity edge_sint energy method edge_scalar_integral
  scalar_integrand: x^2 - 3*y + 4


<---------------------------- edge_torus_area ----------------------------->

Named method. Description: For 2D torus string model body area
calculations. Contains adjustments for torus wraps. You may have to set the
quantity volconst attribute in the torus model, since the area calculation
is ambiguous up to one torus area. 

Element: edge. 
Parameters: none. 
Models: torus; string; linear,quadratic,Lagrange. 
Ambient dimension: 2. 
Hessian: yes. 
Example datafile declaration:

  quantity cell_area fixed = 1.3 method edge_torus_area


<-------------------------- edge_vector_integral -------------------------->

Named method. Description: Integral of a vectorfield over an oriented
edge. Uses Gaussian quadrature of order integral_order_1D. 

Element: edge.
Parameters: vector_integrand. 
Models: string, soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Orientable: yes. 
Example datafile declaration:

   quantity edge_vint energy method edge_vector_integral
vector_integrand:
q1: 0
q2: 0
q3: z^2/2

<--------------------------------- edges ---------------------------------->

An edge is a one-dimensional geometric element. In the linear model, an
edge is an oriented line segment between a tail vertex and a head vertex.
In the quadratic model, an edge is defined by quadratic intepolation of two
endpoints and a midpoint. In the lagrange model, an edge is defined by the
appropriate order interpolation with the edge vertices. In the string
model, edges carry a default surface tension energy proportional to their
length. Edges may also carry energy by being on level set constraints in
the soapfilm model, or by having named quantity energies applied to them.
The edges of the original surface are defined in the edges section of the
datafile.
 Attributes:

 > id
 > oid
 > original
 > length
 > density or tension
 > fixed
 > constraints
 > on_constraint
 > e_constraint_list
 > boundary
 > on_boundary
 > wrap
 > color
 > noncontent
 > bare

 > no_refine
 > orientation
 > vertices
 > midv
 > facets
 > valence
 > backbody
 > frontbody
 > dihedral
 > tangent vector
 > quantities
 > on_quantity
 > on_method_instance
 > extra attributes


<----------------------------- edges_predicted ------------------------------>

Datafile keyword in the top section of the datafile that specifies the
initial allocation of edge structures.  Optional.  The purpose is to
prevent repeated reallocation of memory as the edge list grows or as 
the surface evolves.  Should be faster, and prevents memory fragmentation.
Automatically put in dump files by the "d" or "dump" commands, based on
the current number of edges.
Example:
    vertices_predicted 3074
    edges_predicted    9216
    facets_predicted   6144
    bodies_predicted      1
    facetedges_predicted  18432


<----------------------------- edges section ------------------------------>

The datafile edge list follows the vertex list, and is started by the
keyword EDGES at the start of a line. It is followed by lines with one edge
specification per line in this format (linespliced here):

k v1 v2 [midv] [s1 s2 s3] [WRAP w] [FIXED] [BOUNDARY b] \
   [CONSTRAINTS c1 [c2 ...]] [TENSION constexpr] [COLOR n] \
     [BARE]  [quantityname ...] [methodname ...]

Here k is the edge number, with numbering following the same rules as for
vertices. v1 and v2 are the numbers of the tail and head vertices of the
edge. In the quadratic model, the edge midpoint may be listed as a third
vertex midv (otherwise a midpoint vertex will be created). In the torus
model, there must follow signs s1 s2 s3 indicating how the edge wraps
around each unit cell direction: + for once positive, * for none, and - for
once negative. In non-torus symmetry groups, each edge should have a WRAP
symmetry group element encoded as an integer. FIXED means that all vertices
and edges resulting from subdividing this edge will have the FIXED
attribute; it does not mean that the endpoints will be automatically fixed.
Likewise the BOUNDARY and CONSTRAINT attributes will be inherited by all
edges and vertices derived from this edge. If a constraint has energy or
content integrands, these will be done for this edge. IMPORTANT: If a
constraint number is given as negative, the edge energy and content
integrals will be done in the opposite orientation. In the string model,
the default tension is 1, and in the soapfilm model, the default tension is
0. However, edges may be given nonzero tension in the soapfilm model, and
they will contribute to the energy.

If the simplex model is in effect, edges are one less dimension than
facets and given by an ordered list of vertices. Only edges on constraints
with integrals need be listed.

The BARE attribute is just an instruction to the checking routines that
this ede is not supposed to have an adjacent facet in the soapfilm model,
so spurious warnings will not be generated. This is useful when you want to
show bare wires or outline fundamental domains.

An arbitrary number of named quantities or method instances may be listed.
These add method values for this element to the must have been declared in
the top section of the datafile. If the quantity or instance has
orientation-dependent methods, the name may be followed by a dash to
reverse the applied orientation.

The "list edges where ..." command prints the datafile format listing of edges.

<-------------------------------- edgeswap -------------------------------->

Main prompt command. For changing the endpoints of edges. Syntax:

 EDGESWAP edgegenerator

If any of the qualifying edges are diagonals of quadrilaterals, they are
flipped in the same way as in equiangulation, regardless of whether
equiangularity is improved. "edgeswap edge" will try to swap all edges, and
is not recommended, unless you like weird things. Various conditions will
prevent an edge from being swapped:
 > The edge is fixed.
 > There are not exactly two facets adjacent to the edge.
 > The adjacent facets do not have equal density.
 > The adjacent facets are not on the same level set constraints as the
edge.
 > The adjacent facets are not on the same parametric boundary as the edge.
 > Swapping would create an edge with both endpoints the same (a loop).
 > Swapping would create two edges with the same endpoints (an "ear").
 All but the first two reasons print messages. This is a compromise between
informing the user why edges were not switched and preventing a cascade of
messages. When edge swapping is invoked through the 'u' command, none of
these messages are printed. Examples:

 edgeswap edge[22]
 edgeswap edge where color == red


<----------------------------- edgeswap_count ----------------------------->

Internal read-only variable. Number of edges swapped by edgeswap command.
Prints and resets to 0 at the end of a command execution,
or when flush_counts is done. Also reset by reset_counts.

<-------------------------------- edgeweed -------------------------------->

Main prompt command. Deletes edges shorter than given value. Syntax:

 EDGEWEED expr

Same as 't' command, except does not need interactive response. Same as
"delete edge where length < expr".


<----------------------- eff_area_sq_mean_curvature ----------------------->

Named method. Description: Integral of squared mean curvature of a
surface, with a slightly different definition from sq_mean_curvature or
normal_sq_mean_curvature. The area around a vertex is taken to be the
magnitude of the gradient of the volume. This is less than the true area,
so makes a larger curvature. This also eliminates the spike instability,
since a spike has more area gradient but the same volume gradient. Letting
N be the volume gradient at vertex v,
   h = (1/2)(F/N)),
and
   E = h^2 A/3 =  (3/4)(F.F/N.N)A.
The facets of the surface must be consistently oriented for this to work,
since the evolver needs an `inside' and `outside' of the surface to
calculate the volume gradient. There are still possible instabilities where
some facets grow at the expense of others.

If the parameter or vertex attribute h_zero is defined, then the value per
vertex is
  E = (h-h_0)^2 A/3 = (3/4)(F.N/N.N-2h_0)^2A.
This does not reduce to the non-h_zero formula when h_zero has the value
zero, but is actually a pretty good formula in its own right (see
star_perp_sq_mean_curvature .

If the vertex is on one or several constraints, the F and N are projected
to the constraints, essentially making the constraints act as mirror
symmetry planes.

WARNING: For some extreme shapes, Evolver may have problems detecting
consistent local surface orientation. The assume_oriented toggle lets
Evolver assume that the facets have been defined with consistent local
orientation.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

  quantity effsq energy method eff_area_sq_mean_curvature global

<----------------------------- effective area ----------------------------->

A type of mobility. Simple area normalization as described in
"area_normalization" paragraph isn't what's really wanted in certain
circumstances, since it has equal resistance for motion in all
directions, both parallel and normal to the surface. If a vertex
is a triple junction and migrating along the direction of one of
the edges, it shouldn't matter how long that edge is. Therefore,
if the effective area mode is in effect, the area associated with a vertex
is the area of its star projected normal to the force at the vertex. This
is a little more complicated calculation, but it is still local. S and M
are block diagonal matrices, with one block for each vertex (see mobility).
At a free edge not on any constraint, the force is tangent to the surface,
the resistance is zero, and the mobility is infinite. But this accurately
describes a popping soapfilm. Effective area can be toggled with the
effective_area toggle. Note that area normalization itself must still be
toggled with a or area_normalizaton.

<-------------------------- effective polyhedral -------------------------->

Approximate polyhedral curvature with effective area.
Polyhedral curvature does not make any distinction between motion parallel
and perpendicular to the surface. A better approximation is to count only
motion perpendicular to the surface. This can be done by projecting the
interpolated vectorfields normal to the facets before integrating their
scalar product. Now the rate of area decrease is equal to the rate
geometric volume is swept out, as opposed to the slightly flaky way one had
to calculate volume sweeping in the previous paragraph. Again S is a sparse
matrix with entries corresponding to each pair of vertices joined by an
edge, and M is its dense inverse. The effective area option may be toggled
with effective_area.

<----------------------------- effective_area ----------------------------->


Evolver toggle command. In area normalization, the resistance factor to
motion is taken to be only the projection of the vertex star area
perpendicular to the motion. If squared mean curvature is being calculated,
this projected area is used in calculating the curvature.


<--------------------------------- efixed --------------------------------->

Obsolete datafile attribute to make an edge fixed without fixing its
endpoints. Keyword retained just for compatibility with old dump files.

<------------------------------- eigen_neg -------------------------------->
<-------------------------------- eigenneg -------------------------------->

Internal read-only variable. Number of negative eigenvalues in
last Hessian factoring.  eigen_neg and eigenneg are synonyms.

<------------------------------- eigen_pos -------------------------------->
<-------------------------------- eigenpos -------------------------------->

Internal read-only variable. Number of positive eigenvalues in
last Hessian factoring.  eigen_pos and eigenpos are synonyms.

<------------------------------- eigen_zero ------------------------------->
<------------------------------- eigenzero -------------------------------->

Internal read-only variable. Number of zero eigenvalues in
last Hessian factoring.  eigen_zero and eigenzero are synonyms.


<------------------------------- eigenprobe ------------------------------->

Main prompt command. For finding the number of eigenvalues of the energy
Hessian that are less than, equal to, and greater than a given value.
Syntax:

EIGENPROBE expr
EIGENPROBE(expr,expr)

The first form prints the number of eigenvalues of the energy Hessian that
are less than, equal to, and greater than expr. It is OK to use an exact
eigenvalue (like 0, often) for the value, but not really recommended.
Useful for probing stability. Second form will further do inverse power
iteration to find an eigenvector. The second argument is the limit on the
number of iterations. The eigenvalue will be stored in the last_eigenvalue
internal variable, and the eigenvector can be used by the move command. The
direction of the eigenvector is chosen to be downhill in energy, if the
energy gradient is nonzero.

<------------------------------ eigenvalues ------------------------------->

Internal read-only array. Contains the list of eigenvalues
produced by the ritz command. Example:
   ritz(-1,10)
   print eigenvalues[2]

<----------------------------- element lists ------------------------------>

The datafile lists of geometric elements follow a general format. Each element 
is defined on one line. The first entry on a line is the element number.
Numbering need not be consecutive, and may omit numbers, but be aware that
internally elements will be renumbered in order. The original number in the
datafile is accessible as the original attribute of an element. After the
element number comes the basic defining data, followed by optional
attributes in arbitrary order. Besides the particular attributes for each
element type listed below, one may specify values for any extra attributes
defined earlier. The syntax is attribute name followed by the appropriate
number of values. Also an arbitrary number of named quantities or method
instances may be listed. These add method values for this element to the
named quantity. The named quantity or instance must have been declared in
the top section of the datafile.

<-------------------------- element orientation --------------------------->

Some methods, those that logically depend on the orientation of the
element, can be applied with a relative orientation. When applied to
individual elements in the datafile, a negative orientation is indicated by
a '-' after the instance name. When applied at runtime with the set
command, the orientation will be negative if the element is generated with
negative orientation, i.e. set body[1].facet method_instance qqq. The
methods currently implementing this feature are: edge_vector_integral,
string_gravity, facet_vector_integral, facet_2form_integral, facet_volume,
facet_torus_volume, simplex_vector_integral, simplex_k_vector_integral,
edge_k_vector_integral, gravity_method, and full_gravity_method.

See also "edge orientation" and "facet orientation".  

See the reverse_orientation command for reversing the orientation of 
selected edges or facets, and see the "orientation" help entry for use of
the "set" command for declaring orientation.

Beware that in reversing an orientation, oriented quantities may not change
as you expect, since the edge gets marked as reversed.  It may be necessary
to remove edges or facets from constraints or quantities, reverse them,
declare their orientation positive, and re-apply constraints and quantities.


<---------------------------- element_modulus ----------------------------->

A method instance may be declared to use a different modulus for each
element by specifying an element extra attribute to use for that purpose.
The extra attribute has to have already been declared. Example:

  define facet attribute mymod real
  quantity myquant energy method facet_area global element_modulus mymod

Of course, it is up to the user to properly initialize the values of the
extra attribute.


<------------------------------- ellipticE -------------------------------->

 ellipticE(x),ellipticK(x): Complete elliptic functions.

<------------------------------- ellipticK -------------------------------->

 ellipticE(x),ellipticK(x): Complete elliptic functions.

<---------------------------------- else ---------------------------------->

 IF ... THEN ... ELSE
 Commands may be conditionally executed by the syntax

   IF expr THEN command

   IF expr THEN command ELSE command

expr is true if nonzero. Parentheses around expr are not needed, but do
not hurt. Do not use a semicolon to end the first command. Example:

   if max(edges,length) > 0.02 then {r; g 100} else g 4

<-------------------------------- energies -------------------------------->
<--------------------------------- energy --------------------------------->

The Evolver usually works by minimizing the total energy of the surface,
subject to constraints. This energy can have several components:
 > Surface tension
 > Gravitational potential energy
 > Constraint energy integrals
 > Named quantity energies
 > Convex constraint gap energy
 > Prescribed pressure energy
 > Compressibility energy
 > Crystalline energy
The read-only variable total_energy has the total energy of the surface.

<---------------------------- energy quantity ----------------------------->

Each named quantity is one of four types:
 > "energy" quantities which are added to the total energy of the surface;
 > "fixed" quantities that are constrained to a fixed target value (by
   Newton steps at each iteration); and
 > "conserved" quantities are like fixed, but the value is irrelevant. The
   quantity gradient is used to eliminate a degree of freedom in motion.
   Rarely used, but useful to eliminate rotational degree of freedom, for
   example. Will not work with optimizing parameters, since they do gradients
   by differences.
 > "info_only" quantities whose values are merely reported to the user.
   This type is initially set in a quantity's datafile declaration. A
   quantity can be toggled between fixed and info_only with the "fix
   quantityname" and "unfix quantityname" commands.

<--------------------------------- eprint --------------------------------->

Function that prints an expression and returns the value. Syntax: eprint
expr. Meant for debugging; probably an archaic leftover from when the
command language was not as developed. Example:
   print sum(facet, eprint area)
will print out all the facet areas and then the sum.

<------------------------------- equi_count ------------------------------->

Internal read-only variable. Number of edges flipped by the "u" or 
"equiangulate" commands.  Prints and resets to 0 at the end of a command 
execution, or when flush_counts is done. Also reset by reset_counts.

<------------------------------ equiangulate ------------------------------>

Main prompt command.
This command tests the given edges to see if flipping them would improve
equiangularity. It is the u command applied to a specified set of edges. It
differs from the edgeswap command in that only edges that pass the test are
flipped. Syntax:

  EQUIANGULATE edge_generator

 Examples:

  equiangulate edge[3];
  equilangulate edge where color == red;

The number of edges flipped is available in the variable equi_count.

<----------------------------- equiangulation ----------------------------->
<----------------------------------- u ------------------------------------>

Main command. The command "u", called equiangulation, tries
to polish up the triangulation. In the soapfilm model, each edge that has
two neighboring facets (and hence is the diagonal of a quadrilateral) is
tested to see if switching the quadrilateral diagonal would make the
triangles more equiangular. For a plane triangulation, a fully
equiangulated triangulation is a Delaunay triangulation, but the test makes
sense for skew quadrilaterals in 3-space also. It may be necessary to
repeat the command several times to get complete equiangulation. The
edgeswap command can force flipping of prescribed edges.

In the simplex model, equiangulation works only for surface dimension 3.
There, two types of move are available when a face of a tetrahedron
violates the Delaunay void condition: replacing two tetrahedra with a
common face by three, or the reverse operation of replacing three
tetrahedra around a common edge by two, depending on how the condition is
violated. This command is inoperative in the string model.

The number of edges flipped is available in the variable equi_count.

For selective testing and flipping of edges, see the "equiangulate" command.

<---------------------------------- ergb ---------------------------------->

Edge attribute used for RGB colors.  See rgb_colors.

<----------------------------- error handling ----------------------------->

When the Surface Evolver detects an error, it prints an error message and
tries to take appropriate action. If the -x command line option was given
when Evolver was started, then Evolver exits immediately with a nonzero
error code. This is useful when running Evolver from shell scripts. There
are several categories of errors:

 > WARNING - Something has happened that you should know about, but Evolver
proceeds normally after printing the message.

 > SYNTAX ERROR - The parser has detected an error. Recent input up to the
detection of the error is printed, but the actual problem may be earlier.

 > DATAFILE ERROR - There is an error in the datafile being read in.
Evolver attempts to recover by skipping to the next recognizable part of
the datafile, but will abandon the datafile after 5 such errors. The
surface data that was read in is available for your inspection, but it
probably forms an inconsistent surface and you should not try to evolve it.

 > ERROR - This is an error encountered during the execution of a command.
The command is abandoned and Evolver returns to the main prompt. The
actions of the command are not undone.

 > FATAL ERROR - An error from which recovery is impossible. Evolver exits
immediately.


<------------------------------- errprintf -------------------------------->

Main prompt command. Same as printf, except it sends its output to stderr
instead of stdout. Useful in reporting error messages in scripts that have
their output redirected to a file.


<-------------------------------- estimate -------------------------------->

Evolver toggle command. Activates estimation of energy decrease in each
gradient descent step (g command). For each "g" iteration, it prints the
estimated and actual change in energy. The estimate is computed by the
inner product of energy gradient with actual motion. Useful only for a
fixed scale factor much less than optimizing, so linear approximation is
good. The internal variable estimated_change records the estimated value.


<---------------------------- estimated_change ---------------------------->

Internal read-only variable. Estimated change of energy
during last iteration with estimate option in effect.

<---------------------------- Euclidean metric ---------------------------->

The default metric on the ambient space is the ordinary Euclidean metric.
There are no built-in units of measurement like meters or grams, so the
user should express all physical quantities in some consistent system of
units, such as MKS or cgs.

<------------------------- everything_quantities -------------------------->

Keyword in top section of the datafile. Causes all areas, volumes, etc. to
be converted to named quantities and methods. Equivalent to the command
line option -q, or the convert_to_quantities command.

<---------------------------- evolver_version ----------------------------->

If a datafile contains features present only after a certain version of
the Evolver, the datafile can contain a line of the form
   evolver_version "2.10"
This will generate a version error message if the current version is
earlier, or just a syntax error if run on an Evolver version earlier than
2.10.

Also, evolver_version is an internal read-only string variable, so one
can find the running version with "print evolver_version".


<------------------------------ EVOLVERPATH ------------------------------->

Evolver consults the system environment variable EVOLVERPATH for
a list of directories to search when it tries to open a file.
The format and setting of EVOLVERPATH depend on the system, but
is the same as the standard PATH environment variable.

 Unix C shell:
    setenv EVOLVERPATH /usr/you/evolver/fe:/usr/you/evolver/doc

 Bourne shell: 
    EVOLVERPATH=/usr/you/evolver/fe:/usr/you/evolver/doc
    export EVOLVERPATH

 Windows:
    Open Control Panel/System/Advanced/Environment Variables. Click "New"
    under System Variables, entering EVOLVERPATH for the Variable name,
    and c:\evolver\fe;c:\evolver\doc for the Variable value.  You may
    add further paths of your own to this list if you wish.

<---------------------------------- exec ---------------------------------->

Main prompt command. Executes a command in string form. Good for runtime
generation of commands. Syntax:

   EXEC stringexpr

Example:

   exec sprintf "define vertex attribute prop%d real",propnumber


<--------------------------- exit error option ---------------------------->
<--------------------------------- option --------------------------------->

Command line option -x : Causes Evolver to exit whenever a warning occurs.
Meant to be used when Evolver is run in a shell script.

<-------------------------- exit warning option --------------------------->
<--------------------------------- option --------------------------------->

Command line option -w : Causes Evolver to exit whenever a warning occurs.
Meant to be used when Evolver is run in a shell script.

<---------------------------------- exp ----------------------------------->

 log(x), exp(x) : Natural log, exponentiation base e.


<------------------------------ expressions ------------------------------->

Arithmetic expressions

Arithmetic expressions evaluate to real numbers. Boolean expressions are a
subclass, with zero as false and nonzero as true; true results evaluate as 1.
Ordinary algebraic notation is used.  Types of expressions:

  atomic values
  arithmetic operators
  boolean operators
  operator precedences
  math functions
  aggregate functions

<-------------------------------- exprint --------------------------------->

Main prompt command. Prints the original input string defining a
user-defined command, including comments. Syntax:

   EXPRINT commandname

Example:

  Enter command: aa := { print 5; /* this is a test */ }
  Enter command: exprint aa
  { print 5; /* this is a test */ }

Actually, the regular "print" command does the same thing, so you can
forget aboutn exprint.

<---------------------------- extra attributes ---------------------------->

Geometric element read-write attributes. If extra attributes have been
defined in the datafile or with a define command, they can be accessed with
attribute syntax. Extra attribute values in the datafile can be initialized
for an element by adding the attribute name and value to the line defining
the element. Example:

  define vertex attribute newx real
  vertices
  1   2 0 0 newx 3

The command language can use the name with the same syntax as built-in
attributes, and can define extra attributes at run time:

  set vertex newx x
  define edge attribute vibel real[2]
  set edge[2] vibel[1] 3; set edge[2] vibel[2] 4
  print vertex[3].newx

The value of an extra attribute can also be calculated by user-supplied
code. The attribute definition is followed by the keyword "function" and
then the code in brackets. In the code, the keyword "self" is used to refer
to the element the attribute is being calculated for. Example: To implement
the lowest z value of a facet as an attribute:

   define facet attribute minz real function
    {self.minz := min(self.vertex,z);}

These attributes can also be indexed. Due to current parser limitations on
parsing executable code, this type of extra attribute definition cannot
occur in the top section of the datafile, although the non-function version
can to declare the attribute name, and the function part added in a
re-definition in the READ section of the datafile.

<--------------------------- extra declaration ---------------------------->

Extra attribute declarations.
It is possible for the user to define extra attributes for elements, which
may be single values or up to eight-dimensional arrays. If these attributes
are to be included in the datafile, then the top section of the datafile
must contain appropriate definitions. The definition syntax is the same as
used by the define runtime command:

 DEFINE elementtype ATTRIBUTE name type [dim]...

where elementtype is vertex, edge, facet, or body, name is an identifier
of your choice, type is REAL or INTEGER (internally, there is also a ULONG
unsigned long type also), and dim is an optional expression for the vector
dimension. There is no practical distinction between real and integer types
at the moment, since everything is stored internally as reals. But there
may be more datatypes added in the future. Extra attributes are inherited
by elements of the same type generated by subdivision. The type may be
followed by FUNCTION followed by a procedure in brackets to be evaluated
whenever the value of the attribute is read; in the formula, self may be
used to refer to the element in question to use its attributes, in
particular to at some point assign a value to the attribute. The print
command may be used to print attribute arrays or array slices in bracketed
form. Examples:
  define edge attribute charlie real
  define vertex attribute newx real[3]
  define facet attribute knots real[5][5][5]
  define edge attribute bbb real function { self.bbb := self.x+self.y }

WARNING: there is a syntax ambiguity if you mean to define a stand-alone
function in the top of the datafile and put it after an attribute
declaration. You should define stand-alone functions before attributes, or
separate them with some other kind of declaration.


<----------------------------- extra_boundary ----------------------------->
<-------------------------- extra_boundary_param -------------------------->

Interpolation requires that both endpoints of an edge be on the same
boundary, which cannot happen where edges on different boundaries meet. To
handle that case, it is possible to add extra boundary information to a
vertex by declaring two particular vertex extra attributes, extra_boundary
and extra_boundary_param:

  interp_bdry_param
  define vertex attribute extra_boundary integer
  define vertex attribute extra_boundary_param real[1]

Then declare attribute values on key vertices, for example

vertices
1    0.00  boundary 1   fixed extra_boundary 2 extra_boundary_param 2*pi

If the extra_boundary attribute is not set on a vertex when wanted,
Evolver will silently fall back on interpolation.


<------------------------------ extrapolate ------------------------------->

Main command. Same as 'e'.  Extrapolates total energy to infinite
refinement if at least two r commands have been done. Uses last energy
values at three successive levels of refinement, and uses a power law fit
for the error. For best results, use only the r command to refine, and
iterate to complete convergence at each level of refinement.


<----------------------------------- f ------------------------------------>

Single letter main command. Sets diffusion constant. Prints old and
prompts for new.  The diffusion constant can also be set by assigning
a value to the variable diffusion_constant.

<----------------------------------- F ------------------------------------>

Single letter main command. Toggle logging of commands in file. If
starting logging, you will be prompted for the name of a log file. Any
existing file of that name will be appended to. Logging stops automatically
when the surface is exited. Only correctly parsed commands are logged.
Output resulting from commands is not logged. Responses to interactive
single-letter commands are logged, but not responses to other interactive
commands.

<--------------------------- f_constraint_list ---------------------------->

This read-only attribute gives access to the list of constraints a facet
is on. f_constraint_list[1] is the number of constraints in the list,
followed by the numbers of the constraints. Note that for named
constraints, the internally assigned numbers are used.

<---------------------------------- face ---------------------------------->
<--------------------------------- faces ---------------------------------->
<----------------------------- faces section ------------------------------>

The datafile face list follows the edge list, and is started by the
keyword FACES at the start of a line. It is followed by lines with one
facets specification per line in this format:

  k   e1 e2 ...  [FIXED] [TENSION constexpr] [BOUNDARY b] \
  [CONSTRAINTS c1 [c2 ...]]     [NODISPLAY]   \
   [COLOR n]} [FRONTCOLOR n] [BACKCOLOR n] \
   [PHASE n] [quantityname ...] [methodname ...]

Here k is the face number, with numbering following the same rules as for
vertices. There follows a list of oriented edge numbers in counterclockwise
order around the face. A negative edge number means the opposite
orientation of the edge from that defined in the edge list. The head of the
last edge must be the tail of the first edge (except if you're being tricky
in the string model). There is no limit on the number of edges. The face
will be automatically subdivided into triangles if it has more than three
edges in the soapfilm model. The TENSION (synonym: DENSITY) value is the
energy per unit area (the surface tension) of the facet; the default is 1.
Density 0 facets exert no force, and can be useful to define volumes or in
displays. Fractional density is useful for prescribed contact angles.
NODISPLAY prevents the facet from being displayed. The COLOR attribute
applies to both sides of a facet; FRONTCOLOR applies to the positive side
(edges going counterclockwise) and BACKCOLOR to the negative side. The
PHASE number is used in the string model to determine the surface tension
of edges between facets of different phases, if phases are used.
If the simplex model is in effect, the edge list should be replaced by an
oriented list of vertex numbers.

An arbitrary number of named quantities or method instances may be listed.
These add method values for this element to the must have been declared in
the top section of the datafile. If the quantity or instance has
orientation-dependent methods, the name may be followed by a dash to
reverse the applied orientation.

The faces section is optional in the string model.

The "list facets" command prints the datafile format listing of facets.


<--------------------------------- facet ---------------------------------->

In general, one of the basic geometric elements.  In the soapfilm model,
a facet is defined as a closed loop of three edges.  In the string model,
a facet is a closed loop or a single open chain of edges.  As a keyword, 
"facets" is used in element generators. Synonym: facets.  Examples:
   list facets where area < 0.02
   set edge[2].facet color red

<------------------------------- facet area ------------------------------->

Facet read-only attribute. The area of the facet. Example:
    list facet where area < .1


<------------------------------ facet bodies ------------------------------>

Facet read-only attribute. Generates bodies around a facet, first the body
the facet is positive boundary of, then the body the facet is negative
boundary of, if they exist. "body" and "bodies" are synonymous. Example:

  list facet[3].bodies

See also "frontbody" and "backbody".


<----------------------------- facet boundary ----------------------------->

Facet read-write attribute. If a facet is on a parametric boundary, then
any facets, edges, and vertices generated from the facet will inherit the
boundary. By default, new vertex parameter values are calculated by
extrapolating from one vertex of the facet. This avoids wrap-around
problems that would arise from interpolating parameter values. But if the
interp_bdry_param toggle is on, then interpolation is used. The status of
whether a facet is on a boundary can be queried with the Boolean attribute
on_boundary. Facets can be unset from boundaries, and set on them (but care
is needed to do this properly). Examples:

  list facets where on_boundary 1
  unset facets boundary 2


<------------------------------ facet color ------------------------------->

Facet read-write attribute. Color of both sides of facet for graphics.
Default is white. Datafile example:
  Faces
  1   1 2 3 color red

 Command examples:
  list facets where color == red
  set facet[3] color green
  set facet color red where area > 2


<--------------------------- facet constraints ---------------------------->

Facet read-write attribute. Putting a facet on a constraint means that
every vertex, edge, or facet generated by refining the facet will inherit
that constraint. Setting a facet on a constraint does not set any of its
existing edges or vertices on the constraint. Facets may be put on
constraints in the datafile by listing the constraint numbers after the
keyword constraint on the line defining the facet, or with the set command.
They may be removed with the unset command. Examples:

  list facets where on_constraint 1
  set facet[2] constraint 2
  unset facet constraint 1


<----------------------------- facet density ------------------------------>
<----------------------------- facet tension ------------------------------>

Facet read-write attribute. Energy per unit area of facet; surface
tension. Default 0 in string model, 1 in soapfilm model. May be set in the
datafile by adding "tension value" to the line defining the facet. The
density is inherited by any facets generated by refining. "Tension" and
"density" are synonyms. Examples:

  set facet tension 3 where original == 1
  list facet where density < .4



<------------------------------ facet edges ------------------------------->

Facet read-only attribute. Generates edges around a facet, oriented as the
facet boundary. "edge" and "edges" are synonymous. In the string model, if
the edges of the facet do not make a closed loop, then the edges will be
listed in order starting from one end. If the given facet has negative
orientation, the edges will be listed accordingly. Example:
  list facet[3].edges
  list facet[-3].edge[2]
  set facet ff color red where ff.edge[3].length < 1


<---------------------------- facet noncontent ---------------------------->

Facet read-write attribute. When set, indicates this facet should not be
used in volume calculations. Useful, for example, if you want to have
facets be part of a body boundary for display purposes, but want to use
constraint integrands for greater accuracy in volume calculations. Example:

   set facet noncontent where on_constraint 1


<------------------------------ facet normal ------------------------------>

Facet read-only attribute. The components of the facet normal vector may
be referred to as x,y,z or x1,x2,x3,... in the linear model. Length is
equal to facet area. In quadratic model or lagrange model, only the three
facet corner vertices are used to calculate the normal. When used in
integrals, the normal is calculated at each integration points. Not defined
in simplex model.

The facet normal may be referred to as a vector attribute facet_normal,
as in taking a dot product:

    print facet[1].facet_normal * facet[2].facet_normal

<------------------------------ facet phase ------------------------------->

Facet read-write attribute. If there is a phasefile, this attribute
determines the edge tension of an edge between two facets in the string
model. Example:
   list facet where phase == 1


<----------------------------- facet valence ------------------------------>

Facet read-only attribute. The valence of a facet is the number of edges
(or vertices) that it contains. Most useful in the string model. Example:

  list facets where valence != 3


<----------------------------- facet vertices ----------------------------->

Facet read-only attribute. Generates vertices around a facet, oriented as
the facet boundary. "vertex" and "vertices" are synonymous. In the string
model, if the facet is not a closed loop of edges, the vertices will be
generated in order from one end. If the given facet has negative
orientation, then the vertices will be generated accordingly. Examples:
  list facet[3].vertex
  printf facet[2].vertex[1].id


<-------------------------- facet_2form_integral -------------------------->

Named method. Description: Integral of a 2-form over a facet. Meant for
ambient dimensions higher than 3. Uses Gaussian cubature of order
integral_order_2D. 

Element: facet. 
Parameters: form_integrand (components in lexicographic order). 
Models: soapfilm, simplex; linear, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Orientable: yes. 
Example datafile declaration in 4D:

   quantity formex energy method facet_2form_integral
   form_integrand:
   q1: x2     // 12 component
   q2: 0      // 13 component
   q3: x4     // 14 component
   q4: 0      // 23 component
   q5: 0      // 24 component
   q6: x3*x2  // 34 component
   

<------------------------ facet_2form_sq_integral ------------------------->

Named method. Description: Integral of the square of a 2-form over a
facet. Meant for ambient dimensions higher than 3. Uses Gaussian cubature
of order integral_order_2D. 

Element: facet. 
Parameters: form_integrand (components in lexicographic order). 
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Orientable: no. 
Example datafile declaration in 4D: 
 
   space_dimension 4 
   // symplectic area 
   // Correspondence: z1 = (x1,x2)  z2 = (x3,x4) 
   #define DENOM ((x1^2+x2^2+x3^2+x4^2)^2) 
   quantity symplectic_sq energy method facet_2form_sq_integral global 
   form_integrand: 
   q1: -2*(x3^2 + x4^2)/DENOM    // dx1 wedge dx2 term 
   q2:  2*(x2*x3-x1*x4)/DENOM    // dx1 wedge dx3 term 
   q3:  2*(x1*x3+x2*x4)/DENOM    // dx1 wedge dx4 term 
   q4: -2*(x1*x3+x2*x4)/DENOM    // dx2 wedge dx3 term 
   q5:  2*(x2*x3-x1*x4)/DENOM    // dx2 wedge dx4 term 
   q6: -2*(x1^2 + x2^2)/DENOM    // dx3 wedge dx4 term 

 

<------------------------------- facet_area ------------------------------->
<----------------------------- facet_tension ------------------------------>

Named method. Description: Area of facet. Does not multiply by facet
density; density_facet_area does that. Quadratic model uses Gaussian
cubature of order integral_order_2D. Beware that this is an approximation
to the area, and if the facets in the quadratic or Lagrange model get too
distorted, it can be a bad approximation. Furthermore, facets can distort
themselves in seeking the lowest numerical area. By default, changing the
model to quadratic or Lagrange will set an appropriate integral_order_2D.

Element: facet. 
Parameters: none. 
Models: soapfilm, simplex; linear, quadratic, Lagrange.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

   quantity farea energy method facet_area global


<------------------------------ facet_area_u ------------------------------>

Named method. Description: Area of facet. In quadratic model, it is an
upper bound of area, by the Schwarz Inequality. For the paranoid. Same as
facet_area in linear model. Sets integral_order_2D to 6, since it doesn't
work well with less. Using the density_facet_area_u name automatically
incorporates the facet tension, but facet_area_u doesn't. 

Element: facet.
Parameters: none. 
Models: soapfilm; linear, quadratic. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

   quantity area_u energy method facet_area_u global

<------------------------------ facet_colors ------------------------------>

Evolver toggle command. Enables coloring of facets in certain graphics
interfaces (e.g. xgraph). If off, facet color is white. Default on.


<------------------------------ facet_count ------------------------------->

Internal read-only variable. Number of facets in the current surface.

<----------------------------- facet_crosscut ----------------------------->

Function. In the string model, it subdivides a facet by constructing
a diagonal edge between given vertices.  The return value is the
id number of the new edge.  The new facet will be on the same body
as the old facet.  Syntax: 
   newedge := facet_crosscut(facet_id,tail_id,head_id)
   

<--------------------------- facet_delete_count --------------------------->

Internal read-only variable. Number of facets deleted
by delete command. Prints and resets to 0 at the end of a command
execution, or when flush_counts is done. Also reset by reset_counts.

<-------------------------- facet_dissolve_count -------------------------->

Internal read-only variable. Number of facets dissolved by dissolve
command. Prints and resets to 0 at the end of a command execution,
or when flush_counts is done. Also reset by reset_counts.

<------------------------------- facet_edge ------------------------------->
<------------------------------- facetedge -------------------------------->
<------------------------------ facet_edges ------------------------------->
<------------------------------- facetedges ------------------------------->

In general, a facetedge is an internal data structure representing the 
incidence of an edge and a facet. As a keyword, it can used in element 
generators in LIST commands. For gurus only. But it is the source of the 
standard "fe" extension I use for datafilenames, since in early versions of 
Evolver, the datafile had to explicitly list all the facetedges.
Synonyms: facetedges, facet_edge, facet_edges.

<------------------------- facet_general_integral ------------------------->

Named method. Description: Integral of a scalar function of position and
normal vector over a facet in 3D space. Uses Gaussian cubature of order
integral_order_2D. The components of the normal vector are represented by
continuing the coordinate indices. That is, in 3D the position coordinates
are x1,x2,x3 and the normal components are x4,x5,x6. For proper behavior,
the integrand should be homogeneous of degree 1 in the normal components.

Element: facet. 
Parameters: scalar_integrand. 
Models: soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: 3. 
Hessian: yes. 
Example: The facet area could be calculated with this quantity:

  quantity surfacearea energy method facet_general_integral
  scalar_integrand: sqrt(x4^2 + x5^2 + x6^2)


<------------------------- facet_general_hi_d_integral ------------------------->

Named method. Description: Integral of a scalar function of position and
normal vector over a 2D facet in any ambient dimension space. 
Uses Gaussian cubature of order integral_order_2D.  The 2D facet is represented
by a 2-vector.  The components of the 2-vector are named as xn, where the number
n ranges from  N+1 to N+N*(N+1)/2, continuing the coordinate indices. That is, 
in 4D the position coordinates are x1,x2,x3,x4 and the 2-vector components are
x5 = x1 wedge x2, x6 = x1 wedge x3, x7 = x1 wedge x4, x8 = x2 wedge x3, 
x9 = x2 wedge x4, and x10 = x3 wedge x4. For proper behavior,
the integrand should be homogeneous of degree 1 in the 2-form components.


Element: facet. 
Parameters: scalar_integrand. 
Models: soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Example: The facet area could be calculated with this quantity:

  space_dimension 4
  quantity surfacearea energy method facet_general_hi_d_integral
  scalar_integrand: sqrt(x5^2 + x6^2 + x7^2 + x8^2 + x9^2 + x10^2) )


<--------------------------- facet_knot_energy ---------------------------->

Named method. Description: Charge on vertex is proportional to area of
neighboring facets. Meant for knotted surfaces in 4D. Power law of
potential is adjustable via the global parameter `surface_knot_power'. See also
facet_knot_energy_fix. 

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear.
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   parameter knot_power  2     // the default
   quantity knotten energy method facet_knot_energy global


<------------------------- facet_knot_energy_fix -------------------------->

Named method. Description: Provides adjacent vertex correction to
facet_knot_energy. 

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear.
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

  parameter surface_knot_power  2     // the default
  quantity knotten energy method facet_knot_energy global
                          method facet_knot_energy_fix global


<------------------------------ facet_merge ------------------------------->

Main prompt command. Merges two soapfilm-model facets into one in a
side-by-side fashion. Meant for joining together surfaces that bump into
each other. The pairs of vertices to be merged are selected in a way to
minimize the distance between merged pairs subject to the orientations
given, so there are three choices the algorithm has to choose from. It is
legal to merge facets that already have some vertices or edges merged.
Syntax:

  facet_merge(integer,integer)

Note the syntax is a function taking signed integer facet id arguments,
not element generators. IMPORTANT: The frontbody of the first facet should
be equal to the backbody of the second (this includes having no body); this
is the body that will be squeezed out when the facets are merged. If this
is not true, then facet_merge will try flipping the facets orientations
until it finds a legal match. Example:

   facet_merge(3,-12)

The merged facet will keep the number and attributes of the first facet.


<---------------------------- facet_order_key ----------------------------->

Integer facet attribute used by reorder_storage to determine the new
order of facets in storage.  See reorder_storage for details of use.


<----------------------------- facets_predicted ------------------------------>

Datafile keyword in the top section of the datafile that specifies the
initial allocation of facet structures.  Optional.  The purpose is to
prevent repeated reallocation of memory as the facet list grows or as 
the surface evolves.  Should be faster, and prevents memory fragmentation.
Automatically put in dump files by the "d" or "dump" commands, based on
the current number of facets.
Example:
    vertices_predicted 3074
    edges_predicted    9216
    facets_predicted   6144
    bodies_predicted      1
    facetedges_predicted  18432


<-------------------------- facetedges_predicted --------------------------->

Datafile keyword in the top section of the datafile that specifies the
initial allocation of facetedge structures.  Optional.  The purpose is to
prevent repeated reallocation of memory as the facetedge list grows or as 
the surface evolves.  Should be faster, and prevents memory fragmentation.
Automatically put in dump files by the "d" or "dump" commands, based on
the current number of facetedges.
Example:
    vertices_predicted 3074
    edges_predicted    9216
    facets_predicted   6144
    bodies_predicted      1
    facetedges_predicted  18432

<-------------------------- facetedge_order_key --------------------------->

Integer facetedge attribute used by reorder_storage to determine the new
order of facetedges in storage.  See reorder_storage for details of use.

<---------------------------- f_partition_proc ---------------------------->

Internal facet attribute used when the multiprocessor option -pn is used.
Determines which thread owns a facet.

<--------------------------- f_partition_stage ---------------------------->

Internal facet attribute used when the multiprocessor option -pn is used.
Coordinates the sequencing of iteration over facets in certain operations
so different threads don't conflict and time-consuming locks are not
necessary.

<--------------------------- facet_refine_count --------------------------->

Internal read-only variable. Number of facets refined by refine facets
command. Prints and resets to 0 at the end of a command execution, or when 
flush_counts is done. Also reset by reset_counts.


<------------------------- facet_scalar_integral -------------------------->

Named method. Description: Integral of a scalar function over facet area.
Uses Gaussian cubature of order integral_order_2D. 

Element: facet.
Parameters: scalar_integrand. 
Models: soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

   quantity fint energy method facet_scalar_integral global
   scalar_integrand: x^2+y^2


<--------------------------- facet_torus_volume --------------------------->

Named method. Description: For 3D soapfilm model, calculates body volume
integral for a facet, with corrections for edge wraps. You may have to set
the quantity volconst attribute in the torus model, since the volume
calculation is ambiguous up to one torus volume. 

Element: facet.
Parameters: none. 
Models: soapfilm; linear,quadratic,Lagrange. 
Ambient dimension: 3.
Hessian: yes. 
Orientable: yes. 
Example datafile declaration:

   quantity body_vol energy method facet_torus_volume


<------------------------- facet_vector_integral -------------------------->

Named method. Description: Integral of a vectorfield inner product with
the surface normal over a facet. The normal is the right-hand rule normal
of the facet as defined in the datafile. Uses Gaussian cubature of order
integral_order_2D. 

Element: facet. 
Parameters: vector_integrand. 
Models: soapfilm, simplex; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes.
Orientable: yes. 
Example datafile declaration, for volume equivalent:

   quantity fvint energy method facet_vector_integrand
   vector_integrand:
   q1: 0
   q2: 0
   q3: z


<------------------------------ facet_volume ------------------------------>

Named method. Description: Integral of z dx dy over an oriented facet.
Valid in the torus domain. Not valid for other symmetry groups. You may
have to set the quantity volconst attribute in the torus model, since the
volume calculation is ambiguous up to one torus volume. 

Element: facet.
Parameters: none. 
Models: soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: 3. 
Hessian: yes. 
Orientable: yes. 
Example datafile declaration:

   quantity vol fixed = 1.3 method facet_volume


<---------------------------- facetedge_count ----------------------------->

Internal read-only variable. Number of facetedges.

<--------------------------------- facets --------------------------------->

In the soapfilm model, a facet is an oriented triangle defined by a cycle
of three edges. In the linear model, a facet is a flat triangle. In the
quadratic model, the facet is a curved surface defined by quadratic
interpolation among the three facet corner vertices and the three edge
midpoints. In the Lagrange model, lagrange_order interpolation is done
among (lagrange_order+1)(lagrange_order+2)/2 vertices. Although individual
facets are oriented, there are no restrictions on the orientations of
adjacent facets. By default, a facet carries a surface tension energy equal
to its area.

In the string model, a facet is a chain of an arbitrary number of edges.
The chain need not be closed. Usually a facet is defined in the string
model in order to define a body, so the space dimension is 2 and the facet
is planar, one facet corresponding to a body. Facets carry no energy by
themselves.

In the simplex model, a facet is a simplex of dimension surface_dimension
defined by surface_dimension+1 vertices. The surface_dimension may be any
dimension less than or equal to the space_dimension. The simplex is
oriented according to the order of the vertices. By default, a simplex
carries a surface tension energy proportional to its volume.

Facets may carry additional energy by having named quantity energies
applied to them.

The facets of the original surface are defined in the faces section of the
datafile.

Attributes:

 > id
 > oid
 > original
 > area
 > fixed
 > constraints
 > on_constraint
 > constraint list
 > boundary
 > on_boundary
 > density or tension
 > color
 > frontcolor
 > backcolor
 > no_refine
 > noncontent

 > edges
 > vertices
 > bodies
 > frontbody
 > backbody
 > valence
 > normal vector
 > phase
 > quantities
 > on_quantity
 > on_method_instance
 > nodisplay
 > extra attributes


<--------------------------------- fbrgb ---------------------------------->

Facet extra attribute used for rgb colors used for facet backcolor.
See rgb_colors.


<------------------------------ file option ------------------------------->
<--------------------------------- option --------------------------------->

Command line option -f filename : Specifies the name of a file to be used
as command input after the datafile is read. At the end of this file,
input reverts to standard input.  The effect is the same as redirecting
input from the file, except that -f will echo commands to the screen and
revert to standard input at the end.  Also note that errors will cause
input to revert to standard input.

<---------------------------------- fix ----------------------------------->

Main prompt command. For setting the FIXED attribute of elements. Syntax:

   FIX generator

Example:

   fix vertices where on_constraint 2

Can also convert a parameter from optimizing to non-optimizing. Example:

  fix radius

Can also convert a named quantity from info_only to fixed.
See also unfix.


<------------------------------- fix_count -------------------------------->

Internal read-only variable. Number of elements fixed by fix
command. Prints and resets to 0 at the end of a command execution, or when
flush_counts is done. Also reset by reset_counts.

<--------------------------------- fixed ---------------------------------->

Attribute that can be applied to vertices, edges, facets, or named
quantities. See "fixed vertex", etc.

<------------------------------- fixed edge ------------------------------->

Edge read-write attribute. For an edge to be "fixed" means that any vertex
or edge created by refining the edge will inherit the "fixed" attribute.
Declaring an edge fixed in the datafile will also fix all vertices on the
edge. However, fixing an edge from the command prompt will not fix any
vertices. An edge may be declared fixed in the datafile edges section by
adding fixed to the line defining the edge. From the command prompt, one
can fix or unfix edges with the fix and unfix commands. Examples:
  fix edge where on_constraint 1
  list edges where fixed
  set edge color red where fixed
  unfix edge[3]


<------------------------------ fixed facet ------------------------------->

Facet read-write attribute. For a facet to be "fixed" means that any
vertex, edge, or facet created by refining a facet will inherit the fixed
attribute. Fixing a facet in the datafile or at the command prompt does not
fix any edges or vertices. A face may be declared fixed in the datafile by
putting fixed on the line defining the face, after the coordinates. From
the command prompt, one can fix or unfix facets with the fix and unfix
commands.  Examples:

  fix facet where on_constraint 1
  list facets where fixed
  set facet color red where fixed
  unfix facet[3]

<----------------------------- fixed quantity ----------------------------->

 Each named quantity is one of four types:
 > "energy" quantities which are added to the total energy of the surface;
 > "fixed" quantities that are constrained to a fixed target value (by
   Newton steps at each iteration); and
 > "conserved" quantities are like fixed, but the value is irrelevant. The
   quantity gradient is used to eliminate a degree of freedom in motion.
   Rarely used, but useful to eliminate rotational degree of freedom, for
   example. Will not work with optimizing parameters, since they do gradients
   by differences.
 > "info_only" quantities whose values are merely reported to the user.
   This type is initially set in a quantity's datafile declaration. A
   quantity can be toggled between fixed and info_only with the "fix
   quantityname" and "unfix quantityname" commands.

<------------------------------ fixed vertex ------------------------------>

Vertex read-write attribute. A fixed vertex will not move during iteration
(except to satisfy level set constraints) or other operations, except if
coordinates are explicitly changed by a "set vertices ..." command. A
vertex may be declared fixed in the datafile by putting fixed on the line
defining the vertex, after the coordinates. From the command prompt, one
can fix or unfix vertices with the fix and unfix commands. Examples:

  list vertex where fixed
  fix vertex where on_constraint 1
  unfix vertices where on_boundary 1


<----------------------- flip-rotate symmetry group ----------------------->

The defined surface can be treated as the fundamental region of a larger
surface with a symmetry.  See "symmetry group".

Flip_rotate is the cyclic symmetry group of rotations in the x-y plane with a
flip z -> -z on every odd rotation, where the order of the group is given
by the internal variable rotation_order, which had better be even. Note:
Since this group has points that are fixed under an even number of
rotations, some special precautions are necessary. Vertices on the rotation
axis must be labelled with the attribute "double_axial_point" in the
datafile. Edges out of an axial point must have the axial point at their
tail, and must have zero wrap. Facets including an axial point must have
the axial point at the tail of the first edge in the facet.
Datafile declaration:
  symmetry_group "flip_rotate"
  parameter rotate_order = 6

Group element encoding: An element is encoded as the power of the group
generator.


<--------------------------------- floor ---------------------------------->

 ceil(x),floor(x): Round up or down to integer.

<------------------------------ flush_counts ------------------------------>

Main prompt command. Causes the printing of various internal counters that
have become nonzero. The counters are:
    body_dissolve_count     notch_count
    edge_delete_count       pop_edge_to_tri_count
    edge_dissolve_count     pop_quad_to_quad_count
    edge_pop_count          pop_tri_to_edge_count 
    edge_refine_count       t1_edgeswap_count
    edgeswap_count          unfix_count 
    equi_count              vertex_dissolve_count 
    facet_delete_count      vertex_pop_count
    facet_dissolve_count    where_count 
    facet_refine_count 
    fix_count,
Normally, these counts are accumulated during the execution of a command 
and printed at the end of the command. Flush_counts can be used to display 
them at some point within a command. Flush_counts is usually followed by 
reset_counts, which resets all these counters to 0.


<---------------------------------- for ----------------------------------->

This is the Evolver's version of the C language "for" construct. Syntax:

  FOR ( command1 ; expr ; commmand2 ) command3

The first command is the initialization command; note that it is a single
command, rather than an expression as in C. If you want multiple commands
in the initialization, use a compound command enclosed in curly braces. The
middle expression is evaluated at the start of each loop iteration; if its
value is true (i.e. nonzero) then the loop is executed; otherwise the flow
of control passes to the command after command3. The command2 is executed
at the end of each loop iteration; again, it is a single command. The body
of the loop is the single command command3, often a compound] command.
Note: Command3 should end with a semicolon, unless it is the if clause of
an if-then statement. Examples:

   for ( inx := 1 ; inx < 3 ; inx += 1 )
      print facet[inx].area;
   for ( {inx := 1; factorial := 1; } ; inx < 7 ; inx += 1 )
   { factorial *= inx;
     printf "factorial %d is %d\n",inx,factorial;
   };


<-------------------------------- v_force --------------------------------->

Vertex read-only array attribute. This is an indexed attribute giving the
components of the force (negative energy gradient). 
Meant for debugging use. This is not directly used for the motion; 
see v_velocity.

<----------------------------- force_pos_def ------------------------------>

Toggle. If this is on during YSMP factoring of Hessian and the Hessian
turns up indefinite, something will be added to the diagonal element to
make it positive definite. Left over from some experiment probably.


<----------------------------- force_deletion ----------------------------->

Toggle.  In the soapfilm model, overrides the refusal of the
delete command to delete edges or facets when that would create 
two edges with the same endpoints.  Sometimes it is necessary to 
have such edges, for example in pinching off necks. But usually 
it is a bad idea.  Also see star_finagling.  Default is off.

<----------------------------- force_edgeswap ----------------------------->

Toggle.  Makes the "u" or "equiangulate" or "edgeswap" commands skip 
certain tests and do the swap anyway.  The skipped tests are: (1) the
two vertices of the flipped edge are distinct, (2) creating two facets
with the same vertices.  Meant only for rare cases when you really know
what you are doing.  You should not leave this toggle in the ON state;
turn it OFF after you have done the recalcitrant edge swap.


<-------------------------------- foreach --------------------------------->

Repeat a command for each element produced by an element generator.
Syntax:

  FOREACH generator DO command

Examples:

 foreach vertex do print x^2 + y^2 + z^2

 foreach edge ee where ee.dihedral > .4 do {
   printf "id %g\n",id;
   foreach ee.vertex do printf " %g %g %g\n",x,y,z;
 }



<----------------------------- form_integrand ----------------------------->

Certain named methods require an n-form integrand.  The syntax is
 FORM_INTEGRAND:
 Q1: expr
 Q2: expr
 Q3: expr
 ...

where the expressions are functions of the coordinates. Element
attributes of the appropriate type element may also be used. When used in
the facet_2form_integral method. The form components are listed in
lexicographic order, i.e. in 4D the six components 12,13,14,23,24,34 would
be listed as Q1 through Q6.

<------------------------------ form_factors ------------------------------>

A facet extra attribute vector used by several elastic energy named
methods: linear_elastic, neo_hookean, relaxed_elastic, relaxed_elastic_A,
SVK_elastic, and dirichlet_elastic.  The entries are the dot products of 
the sides of the relaxed facet. Due to symmetry, there are only three 
distinct dot products, so form_factors just has length 3.  The entries 
are {s11,s12,s22}, where s11 = dot(v2-v1,v2-v1), s12 = dot(v2-v1,v3-v1), 
and s22 = dot(v3-v1,v3-v1).  If form_factor is not defined by the user, 
it will be created by Evolver, and the initial facet shape will be assumed 
to be unstrained. 

<-------------------------------- formula --------------------------------->

Datafile keyword used in level set constraints to introduce the function
formula. Synonym: function

<----------------------------- free_discards ------------------------------>

Main prompt command. Frees deleted elements in internal storage.
Ordinarily, deleting elements does not free their memory for re-use until
the command completes, so that element iteration loops do not get
disrupted. If for some reason this behavior leads to excess memory usage or
some other problem, the user may use the free_discards command to free
element storage of deleted elements. Just be sure not to do this inside any
element iteration loop that might be affected. 
 
 
<---------------------------------- frgb ---------------------------------->

Facet array extra attribute for facet color used when rgb colors are used.
See rgb_colors.

<------------------------------- frontbody -------------------------------->

Facet read-write attribute. The id of the body of which the facet is on
the positively oriented boundary. Useful after creating a new body with the
new_body command. As a read attribute, the value is 0 if there is no such
body. Examples:

  newb := new_body; set facet frontbody newb where color == red
  print facet[2].frontbody

Frontbody also works for adding edges to a facet in the string model, but
the added edge must be attach to one end of the edge arc, or close the arc.

<------------------------------- frontcolor ------------------------------->

Facet read-write attribute. Color of positive side of facet for graphics.
Default is white. Datafile example:
  Faces
  1   1 2 3 frontcolor green backcolor red

 Command examples:
  list facets where frontcolor == red
  set facet[3] frontcolor green
  set facet frontcolor red where area > 2


<--------------------------- full_bounding_box ---------------------------->

Evolver toggle command. Causes bounding box in PostScript output to be the
full window, rather than the actual extent of the surface within the
window. Default off.


<-------------------------- full_gravity_method --------------------------->
<----------------------------- gravity_method ----------------------------->

Named method. Description: Gravitational energy, integral of p z^2/2 dxdy
over a facet, where p is the difference in adjacent body densities. Note: this
method uses the gravitational constant as the modulus if invoked as
full_gravity_method. Just gravity_method does not automatically use the
gravitational constant. 

Element: facet. 
Parameters: none. 
Models: soapfilm; linear, quadratic, Lagrange. 
Ambient dimension: 3. 
Hessian: yes. 
Orientable: yes.
Example datafile declaration:

  quantity grav energy modulus 980*8.5 method gravity_method


<-------------------------------- function -------------------------------->

Datafile keyword used in level set constraints to introduce the function
formula. Synonym: function

<-------------------------- function definition --------------------------->

Users may define their own functions that have arguments and return values
with the syntax

   function type identifier ( type arg1, type arg2, ... )
   { commands }

This syntax works both in the top of the datafile and at runtime.
Right now the implemented types for return value and arguments are real
and integer. The argument list can be empty. The return value is given in a
return expr statement. Example:

   function real func1 ( real ht, real wd )
   { local prod;
     prod := ht*wd;
     return prod;
   }

Note that the function arguments act as local variables, i.e. their scope
is the function body, and they have stack storage so functions may be
recursive. Function prototypes may be used to declare functions before
their bodies are defined with the same syntax, just replacing the body of
the function with a semicolon. Prototype syntax:

   function type identifier ( type arg1, type arg2, ... );

Note that a procedure is used as a command, and a function is used in a
numerical expression.


<------------------------------- functions -------------------------------->

Usually stand-alone user-defined functions and procedures are defined in
the read section of the datafile, but sometimes it is necessary to define
them in the top section of the datafile so they may be used in other top
section declarations. It is possible to define them in the top section with
the same syntax as in the read section. Note this applies to the
parameter-passing variety of functions and procedures, denoted by the
leading keyword "function" or "procedure", and not command definitions like
"gg := {...}". WARNING: there is a syntax ambiguity if you mean to define a
stand-alone function in the top of the datafile and put it after an
attribute declaration. You should define stand-alone functions before
attributes, or separate them with some other kind of declaration.

<------------------------ function_quantity_sparse ------------------------>

Toggle command controlling whether sparse matrices are used in
evaluation of Hessians of quantities using functions of methods.
Default is off, but I recomment on if you are using a quantity
function applying to anything but a small number of elements.

<----------------------------------- g ------------------------------------>
<----------------------------------- go ----------------------------------->

Single letter main command. Do one iteration step. The output consists of
the number of iterations left (for people who wonder how close their 1000
iterations are to ending), the area and energy, and the scale factor. g is
commonly used with an iteration count, as in "g 100". The user can abort
repeated iterations by sending an interrupt to the process (SIGINT, to be
precise; CTRL-C or whatever on your keyboard). As a special dispensation to
lazy users, the syntax "gn" is equivalent to "g n". Synonym: go
See "iteration step" for a detailed explanation of what happens during
a 'g' step.


<----------------------------------- G ------------------------------------>

Single letter main command. Toggles gravity on or off. Gravity starts ON
if any body has a nonzero density; otherwise OFF. If followed by a value,
sets gravity to that value. Otherwise prints old value of gravitational
constant and prompts for new.  When used in numerical expressions, G
evaluates to the current value of the gravitational constant.


<------------------------ gap constant declaration ------------------------>

The initial value of the gap constant for gap energy may be set in the
datafile with the syntax

  GAP_CONSTANT value

The default value is 1. Synonym: spring_constant.


<------------------------------- gap energy ------------------------------->

Convex constraint can have what I call a gap energy.
Consider a soap film spanning a circular cylinder. The Evolver must
approximate this surface with a collection of facets. The straight edges of
these facets cannot conform to the curved wall, and hence the computed area
of the surface leaves out the gaps between the outer edges and the wall.
The Evolver will naturally try to minimize area by moving the outer
vertices around so the gaps increase, ultimately resulting in a surface
collapsed to a line. This is not good. Therefore there is provision for a
"gap energy" to discourage this. A level-set constraint may be declared
CONVEX in the datafile. For an edge on such a constraint, an energy is
calculated as
  E = k\left\Vert \vec S \times \vec Q \right\Vert / 6

where \vec S is the edge vector and \vec Q is the projection of the edge
on the tangent plane of the constraint at the tail vertex of the edge. The
constant k is a global constant called the "gap constant". A gap constant
of 1 gives the best approximation to the actual area of the gap. A larger
value minimizes gaps and gets vertices nicely spread out along a
constraint. You can set the value of k in the datafile or with the k
command.

The gap energy falls off quadratically as the surface is refined. That is,
refining once reduces the gap energy by a factor of four. You can see if
this energy has a significant effect on the surface by changing the gap
constant.

 Note: gap energy is effective only in the linear model.
 Example datafile: tankex.fe

As an alternative to gap energy, you should consider a system of "guide
lines", i.e. a plane level set constraint whose coefficients are
extra attributes of vertices.  This can keep the contact line vertices
evenly spaced without adding extra energy, and permitting Hessian
operations.

<------------------------------ gap_constant ------------------------------>

The initial value of the gap constant for gap energy may be set in the
datafile with the syntax
  GAP_CONSTANT value
The default value is 1. Synonym: spring_constant.
See "gap energy" for more.


<------------------------------- gap_energy ------------------------------->

Named method. Description: Implementation of gap energy, which is designed
to keep edges from short-cutting curved constraint surfaces. This method
serves the same purpose as declaring a constraint convex. Automatically
incorporates the gap_constant set in the datafile or by the k command.

Element: edge. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

   quantity gappy energy method gap_energy global

As an alternative to gap_energy, you should consider a system of "guide
lines", i.e. a plane level set constraint whose coefficients are
extra attributes of vertices.  This can keep the contact line vertices
evenly spaced without adding extra energy, and permitting Hessian
operations.


<------------------------------ gauss_bdry_e ------------------------------>

Edge extra attribute used by gauss_curvature_integral.

<------------------------------ gauss_bdry_v ------------------------------>

Vertex extra attribute used by gauss_curvature_integral.

<------------------------ gauss_curvature_integral ------------------------>

Named method. Description: This computes the total Gaussian curvature of a
surface with boundary. The Gaussian curvature of a polyhedral surface may
be defined at an interior vertex as the angle deficit of the adjacent
angles. But as is well-known, total Gaussian curvature can be computed
simply in terms of the boundary vertices, which is what is done here. The
total Gaussian curvature is implemented as the total geodesic curvature
around the boundary of the surface. The contribution of a boundary vertex is

  E =  (\sum_i \theta_i) - pi.

For reasons due to the Evolver's internal architecture, the sum is
actually broken up as a sum over facets, adding the vertex angle for each
facet vertex on the boundary and subtracting pi for each boundary edge. The
total over all boundary vertices is exactly equal to the total angle
deficit of all interior vertices plus 2*pi*chi, where chi is the Euler
characteristic of the surface. Boundary vertices are deemed to be those
that are fixed or on a parametric boundary. Alternately, one may define a
vertex extra attribute gauss_bdry_v and an edge extra attribute
gauss_bdry_e and set them nonzero on the relevant vertices and edges; this
overrides the fixed/boundary criterion. 

Element: facet. 
Parameters: none.
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity gint energy method gauss_curvature_integral global


<---------------------------- gauss_curvature ----------------------------->

Datafile keyword that automatically creates an energy named quantity using
the method gauss_curvature_integral as a global method. May be followed in
the datafile with a modulus value.


<----------------------------- elastic_basis ------------------------------>

Facet extra attribute used by the general_linear_elastic named method.
See general_linear_elastic for details.

<----------------------------- elastic_coeff ------------------------------>

Facet extra attribute used by the general_linear_elastic named method.
See general_linear_elastic for details.

<------------------------- general_linear_elastic ------------------------->

Named method. Description: To calculate the nonisotropic linear elastic
strain energy energy for facets. Let A be the linear transformation from
the unstrained shape to the strained shape. Then the Cauchy-Green strain
tensor is C = (A^TA - I)/2. Let S_1 and S_2 be the sides of the unstrained
facet. Let W_1 and W_2 be the transformed facet sides. Let F be the Gram
matrix of strained facet. Define

    S = [ S_1 S_2 ],  Q = S^-1

    W = [ W_1 W_2 ] = AS

    F = W^TW = S^TA^TAS

 Then

    A^TA = Q^TFQ

    C = (Q^TFQ - I)/2

 The energy density is

    (1/2)C_ij K_ijkl C_kl

where K_ijkl is the full tensor of elastic constants. By using symmetries,
this can be reduced to

 (1/2) [ C_11 C_22 C_12 ]  [ E_1 E_3 E_4 ] [ C_11 ]
                           [ E_3 E_2 E_5 ] [ C_22 ]
                           [ E_4 E_5 E_6 ] [ C_12 ]

Each facet has extra attribute elastic_coeff of size 6 containing { E_1,
E_2, E_3, E_4, E_5, E_6 }, and extra attribute array elastic_basis of size
2x2 containing { {s11,s12},{s21,s22}}, which are the two sides of the
unstrained facet. Note that the E_i are defined with respect to the
original sides as defined by the form factors, so it is up to you to make
sure everything works out right. Test carefully!!! The elastic_coeff
attribute must be created and initialized by the user.
 
Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: 3.
Hessian: yes. 
Example datafile declaration:

   define facet attribute elastic_basis real[2][2]
   define facet attribute elastic_coeff real[6]
   quantity genlastic energy method general_linear_elastic global


<---------------------------- generator_power ----------------------------->

Variable optionally used by the symmetry group "rotate" so that the angle of 
rotation is 2*pi*generator_power/rotation_order.  Default 1.  The variable
does not exist until the user assigns a value to it.

<------------------------------- generators ------------------------------->

Various commands can act on specified sets of elements, which are defined 
by "element generator" syntax.  Attributes of the iteration element may be 
used later in the command. The general form of a generator is

  elementgen name where expr

elementgen may be
 1. A multiple element generator, which can be
    A. An element type, vertex, edge, facet, facetedge, or body, which 
       generates all elements of that type in the surface. But new elements 
       created during a loop will not be generated, so "refine edges" will 
       refine all existing edges just once.
    B. A single element subelement. The implemented subelements are:
       of a vertex: edge, facet (in no particular order)
       i. of an edge: vertex (in tail, head order), facet (in geometric order)
      ii. of a facet: vertex, edge, body (all in order around the facet)
     iii. of a body: facet (in no particular order)
 2. A single element, which can be
    A. an element name of an active generator
    B. an indexed element type, vertex, edge, facet, or body. Indexing starts
       at 1. The index may be negative, in which case the generated element has
       negative orientation.
    C. an indexed subelement of an element (error if no element of that
       index). Indexing starts at 1. The indexing is the same as the order
       produced by the foreach generator. Indexed subelements of an edge or
       facet follow the orientation of the edge or facet.

"name" is an optional identifier which can be used in the body of a loop to
refer to the generated element. expr is interpreted as a boolean
expression, 0 for false, nonzero for true. Only elements for which expr is
true are generated. The where expr clause is optional. The innermost
generator generates a default element, which can have its attributes
referred to just by attribute name. But be sure to remember that in a
nested iteration, an unqualified element type generates all elements of
that type, not just those associated with the parent element. Examples:

   list facet where color == red
   foreach edge ee where ee.length < .3 do list ee.vertex
   print facet[2].edge[1].vertex[2].id
   foreach facet ff do { printf "facet %g:\n"; list ff.edge }
   print max(edge where on_constraint 1, length)


<------------------------- genus2 symmetry group -------------------------->

The defined surface can be treated as the fundamental region of a larger
surface with a symmetry.  See "symmetry group".

genus2 is a symmetry group on the Klein model of hyperbolic space whose
quotient group is a genus 2 hyperbolic manifold. The fundamental region is
an octagon.

Datafile declaration:

   Klein_metric
   symmetry_group "genus2"

Group element encoding: There are 8 translation elements that translate
the fundamental region to one of its neighbors. Translating around a vertex
gives a circular string of the 8 elements. The group elements encoded are
substrings of the 8, with null string being the identity. Encoding is 4
bits for each element. See khyp.fe for an example.


<--------------------------- geometric elements --------------------------->

The surface is defined in terms of its geometric elements of each
dimension. Each element has its own set of attributes. Some may be set by
the user; others are set internally but may be queried by the user. It is
also possible to dynamically define extra attributes for any type of
element, which may be single values or vectors of values. Attribute values
can be specified in the datafile, and queried with commands.
Elements: vertices, edges, facets, bodies, facet-edges.

<-------------------------------- geompipe -------------------------------->

Main prompt command. Redirects Evolver's geomview output to a command in
place of sending it to geomview. Syntax:

   geompipe stringexpr

The redirection can be closed with the command "P 9". geompipe is useful
for debugging geomview data; but be sure to toggle gv_binary OFF to get
ascii data to look at.

<-------------------------------- geomview -------------------------------->

Excellent screen graphics on Unix systems can be done through the free 3D
viewing program geomview. Geomview can be started with the P command,
option 8. One caution: geomview does not deal well with object sizes below
1e-5, so displaying micron-size objects using MKS units is ill-advised.

Main prompt commands relevant to geomview:
   "geomview" or "P 8" to start geomview
   "P 9" to end geomview
   "geompipe" to pipe geomview input someplace else
   "geomview string" to send user commands to geomview
   "gv_binary" toggle to control interface mode
   "view_4D" to toggle sending 3D or 4D info to geomview
   "D" or "autodisplay" for toggling automatic redraw when the surface changes.
       Default is automatic redraw when geomview is started.


<---------------------------- geomview command ---------------------------->

Main prompt command. The plain form "geomview" toggles the geomview
display on and off. The form

   geomview stringexpr

will send a command to an already started geomview. This string must be in
the geomview command language, for which consult the geomview
documentation.

<---------------------------- geomview install ---------------------------->

If your system does not have OpenGL/GLUT, I suggest you get the geomview
package from www.geomview.org There are pre-compiled binaries for many
unix systems here. Follow geomview's installation directions, and make sure
that geomview is accessible through your PATH. NOTE: The X windows versions
of geomview seem to require some event to occur in the geomview display
window before it will redraw after loading a new datafile. So if geomview
seems hung, just run the mouse over the window to give it an event to wake
it up.

<--------------------------------- global --------------------------------->

Named method instance or named quantity attribute indicating the
instance or quantity is to be applied to all geometric elements of
the proper type.  This can only be done in the datafile top. Example:

   quantity george info_only edge_length global


<----------------------------- global_method ------------------------------>

The methodlist version of the quantity definition may contain one or more
method instances. To incorporate a previously explicitly defined instance,
include METHOD instancename. GLOBAL_METHOD may be used instead of METHOD to
indicate the method applies to all elements of the appropriate type; it is
equivalent to using GLOBAL in the method definition. To instantiate a
method in the quantity definition, you essentially incorporate the instance
definition, but without an instance name. Example of a quantity with one
predefined method instance and one implicitly defined instance:

   method_instance qwerty method facet_scalar_integral
     scalar_integrand: x^2
   quantity foobar energy method qwerty method edge_scalar_integral
     scalar_integrand: y^3

Usually the second, implicit definition will be more convenient. Several
method instances may be included in one methodlist (up to a current limit
of 50), and their values are added together and multiplied by the quantity
modulus to get the quantity value. The FUNCTION methodexpr variant defines
the quantity as a function of previously defined method instances. Example:

   method_instance qwerty method facet_scalar_integral
     scalar_integrand: x^2
   quantity foobar energy function qwerty.value^3

Non-global quantities may be applied to elements individually by adding
the quantity name to the datafile line defining an element. They may also
be applied or unapplied at runtime with the set and unset commands.
Orientable methods can be applied with negative orientation in the datafile
by following the name with a dash. The orientation in a set command follows
the orientation the element is generated with.

Methods applying to different types of elements may be combined in one
quantity. If such a quantity is applied to an element, then all method
instances of that quantity of the appropriate type are applied to the
element. Original attachments of quantities are remembered, so if an edge
method is applied to a facet, then edges created from refining that facet
will inherit the edge method.


<-------------------------------- graphics -------------------------------->

Surface Evolver graphics consists of drawing edges and facets. There is a
single graphics driver routine which produces colored edges and facets in
3D and sends them to a set of display routines. There are three main sets
of display routines:
 > Native screen graphics, built-in Evolver graphics of various qualities
   on various platforms,
 > Interface to the Geomview 3D viewer, for Unix/Linux users without
   OpenGL/GLUT graphics compiled into Evolver,
 > PostScript files, for everybody wanting to make 2D images for
   publications, web sites, etc.

Internal Evolver state information relevant to graphics:
 > edge color
 > facet color, frontcolor, and backcolor
 > edge show expression
 > facet show expression
 > facet shading toggle
 > facet brightness
 > facet_colors toggle
 > view matrix
 > view transform expression
 > transforms toggle
 > torus model display mode: raw_cells, clipped, or connected
 > surface thickness
 > show_inner and show_outer toggles
 > background color
 > window_aspect_ratio variable

 Datafile features that are relevant to graphics are:
 > edge color
 > facet color, frontcolor, and backcolor
 > view transforms
 > view transform generators
 > viewing matrix

 Main prompt commands that are relevant to all graphics are:
 > show, showq, and show_expr for controlling which elements are displayed.
 > set edge color
 > set facet color, frontcolor, backcolor
 > transforms toggle
 > transform_expr
 > thickness
 > torus model display mode toggles: raw_cells, clipped, or connected
 > show_inner and show_outer toggles


<---------------------------- graphics actions ---------------------------->

There are many mouse and keyboard actions that can be performed in the
graphics window itself. Holding down and dragging the left mouse button
moves the surface continuously, and the clicking right mouse button picks
vertices, edges, and facets. Picked element id numbers are printed in the
console window. With the graphics window in the foreground, these keyboard
commands are active:

h Print a help screen on the console window.
r Rotate mode for left mouse button.
t Translate mode for left mouse button.
z Zoom mode for left mouse button (and use F to focus on particular
  vertex).
c Clockwise/counterclockwise spin mode for left mouse button.
+ Widen edges.
- Narrow edges.
l Activate clipping plane (lower-case L) in translation mode for 
    left mouse button.
L Deactivate clipping plane.
k Activate clipping plane rotation mode for left mouse button.
b Decrement edge front bias by .001.
B Increment edge front bias by .001 (to show edges more clearly).
R Reset the view.
m Center the image.
M Have the right mouse button bring up a menu instead of picking.
P Have the right mouse button do picking instead of menu (default).
p Toggle orthogonal/perspective projection.
s Toggle cross-eyed stereo.
e Toggle showing edges, regardless of "show edge" condition.
f Toggle showing facets obeying "show facet" condition or no facets.
F Move the rotate/zoom origin to the last picked vertex.
G Start another graphics window with independent camera.
o Toggle drawing a bounding box.
g Toggle Gourard (smooth) shading.
x Close the graphics window.
arrow keys Translate a bit.

And some more advanced commands most users will never use, but are listed
here for completeness:

H Print advanced help.
a Toggle using OpenGL element arrays.
i Toggle interleaved elements in OpenGL arrays.
I Toggle indexed OpenGL arrays.
S Toggle OpenGL triangle strips.
Y Toggle strip coloring (I was curious as to what OpenGL triangle strips
   would look like).
D Toggle using a display list.
Q Toggle printing drawing statistics.


<--------------------------- graphics commands ---------------------------->

When the native graphics display is invoked by the 's' command or the
various `show' commands, the Evolver enters graphics mode, with the prompt
`Graphics command: '. A graphics command is a string of letters followed by
RETURN. Each letter causes an action. Some commands may be preceded by an
integer count of how many repetitions to do. Example command: 15u2z, which
does 'u' 15 times and 'z' twice. Rotation commands may be preceded by a
real number giving the degrees of rotation; an integer will give a
repetition count with the default angle of 6 degrees. A real number is
indicated by including a decimal point.

The letter commands in graphics mode are:
 u    Rotate up 6 degrees.
 d    Rotate down 6 degrees
 r    Rotate right 6 degrees.
 l    Rotate left 6 degrees.
 c    Rotate clockwise 6 degrees.
 C    Rotate counterclockwise 6 degrees.
 z    Zoom by factor of 1.2.
 s    Shrink by factor of 1.2.
 arrow keys - Translate image.
 m    Center image.
 R    Reset viewing parameters.
 T    Toggle additional viewing transforms.
 e    Toggle facet edge drawing.
 B    Toggle display of boundary facets.
 v    Toggle ridge and valley coloring.
 w    Toggle facets with three vertices on constraints.
 b    Draw bounding box.
 +,- Increment, decrement fill color.
 H    Toggle hidden surface removal.
 t    Set clipping mode for torus.
 ?,h help (this display)
 x,q Exit to main menu.

See help topics on individual letters, "r", "l", etc., for more details.

<-------------------------- graphics_title -------------------------------->
<-------------------------- graphics_title2 ------------------------------->
<-------------------------- graphics_title3 ------------------------------->

Internal read-write string variable.  This is the title that is displayed 
on the Evolver graphics window.  The default value is the datafile name.  
Useful when you are simultaneously running various instances, and you want 
to tell which is running in which graphics window.  Just assigning a string 
to graphics_title automatically changes the title on the window.
There are also graphics_title2 and graphics_title3 variables if you
have a second or third graphics window.
	
<-------------------------------- gravity --------------------------------->

Evolver toggle command. Includes the gravitational energy of bodies with
density in total energy. The gravitational constant can be set in the top
of the datafile with "gravity_constant = value", or with the runtime
commandis "G value" or "gravity_constant := value".

<---------------------------- gravity_constant ---------------------------->

Internal read-write variable for the strength of gravity in gravitational
potential energy. The gravitational constant can be set in the top
of the datafile with "gravity_constant value", or with the runtime
commands "G value" or "gravity_constant := value".


<----------------------------- gravity energy ----------------------------->

If a body has a density, then that body contributes its gravitational
energy to the total. The acceleration of gravity G is under user control
with the G command. Letting \rho be the body density, the energy is defined
as

  E = \int\int\int_{body} G \rho  z  dV

but is calculated using the Divergence Theorem as

  E =  \int\int_{body surface} G\rho {z^2\over 2} \vec k \cdot \vec{dS}.

This integral is done over each facet that bounds a body. If a facet
bounds two bodies of different density, then the appropriate difference in
density is used. Facets lying in the z = 0 plane make no contribution, and
may be omitted if they are otherwise unneeded. Facets lying in constraints
may be omitted if their contributions to the gravitational energy are
contained in constraint energy integrals. In the string model, all this
happens in one lower dimension.

Example datafile: mound.fe

<---------------------------- gravity_constant ---------------------------->

Internal read-write variable. Value of the gravitational constant,
which can also be set by the G command.   The initial value of the
gravitational constant may be set in the top of the datafile with the syntax
  GRAVITY_CONSTANT value
The default value is 1.

<------------------------------ ps_gridflag ------------------------------->
<-------------------------------- gridflag -------------------------------->

Evolver toggle command. If toggled on, the postscript command will show
all edges of displayed facets, instead of just those satisfying the current
edge show condition. "gridflag" is an old name for "ps_gridflag".


<------------------------------- gv_binary -------------------------------->

Evolver toggle command. Toggles sending data to geomview in binary format,
which is faster than ascii. Default is binary on SGI, ascii on other
systems, since there have been problems with binary format on some systems.
Ascii is also useful for debugging.


<----------------------------------- h ------------------------------------>

Single letter main command. Prints a very primitive help message listing
common commands. "help" is much better, as it accesses the full HTML
documentation. Or best, use a separate HTML browser on html\evolver.htm 
in the Evolver distribution, or 
http://www.susqu.edu/brakke/evolver/html/evolver.htm.



<---------------------------- h_inverse_metric ---------------------------->

Toggle. Replaces force by Laplacian of force. For doing motion by
Laplacian of mean curvature.

<--------------------------------- h_zero --------------------------------->

Some physical surfaces have their lowest energy state when their
mean curvature is some nonzero value.  An example is a membrane
made of parallel stacked molecules which have one end bigger than
the other.  Their curvature energy is thus proportional to (h-h0)^2,
where h is the actual mean curvature and h0 is the equilibrium or
intrinsic mean curvature. Several of the squared mean curvature
named methods can use h0, either in the form of a variable h_zero
or a real-valued vertex attribute h_zero.  If the vertex attribute
exists, it takes precedence. 

Methods using h_zero:
  sq_mean_curv_cyl
  sq_mean_curvature
  eff_area_sq_mean_curvature
  normal_sq_mean_curvature
  star_normal_sq_mean_curvature
  star_perp_sq_mean_curvature
  sqcurve2_string

Methods not using h_zero:
  star_sq_mean_curvature
  star_eff_area_sq_mean_curvature
  sqcurve_string
  sqcurve_string_marked 
  sqcurve3_string
  circle_willmore

<---------------------------------- help ---------------------------------->

Main prompt command.  Prints what Evolver knows about an identifier
or keyword.  User-defined variables, named quantities, named methods,
named constraints, and element attributes are identified as such.
Information for syntax keywords comes from a file evhelp.txt in
the doc subdirectory of your Evolver installation, so that subdirectory
should be on your EVOLVERPATH environment variable.
Syntax:

   help keyword

The keyword need not be in quotes, unless there are embedded blanks. After
printing the help section exactly matching the keyword, a list of related
terms is printed. These are just the keywords containing your keyword as a
substring.

Graphics mode command: 'h' or '?' will print a brief help screen for
graphics mode commands.

<-------------------------------- hessian --------------------------------->

Main prompt command. Does one step using Newton's method with the Hessian
matrix of the energy. If the Hessian is not positive definite, a warning
will be printed, but the move will be made anyway. If the check_increase
toggle is on, then no move will be made if it would increase energy.
Hessian_seek will use a variable step size to seek minimum energy in the
direction of motion. The motion vector is stored, and may be accessed with
the move command. Not all energies and constraints have Hessian
calculations yet. See the Hessian tutorial for more.   If the surface
is too far from equilibrium, a hessian move can blow up.  For safer
hessian moves, see hessian_seek, which does a line search along the
direction of the hessian move for minimum energy.


<---------------------------- hessian caveats ----------------------------->

When not near enough to an equilibrium, incautious use of "hessian" can
wreck a surface. If you don't know what's going to happen, save the surface
first. Or use hessian_seek. Or use hessian_menu, where you can restore the
surface with option 7. Or set " check_increase", which will abort a hessian
iteration that would increase energy. But remember sometimes hessian should
increase energy, for example to satisfy a volume constraint or reach an
unstable equilibrium.

Not all energies have built-in Hessians. If Evolver complains about
lacking a Hessian for a particular energy, you will either have to forego
hessian or find a way to phrase your problem in terms of an energy with a
Hessian.

There are three methods of sparse matrix factoring built into Evolver:
YSMP (Yale Sparse Matrix Package), my own minimal degree algorithm, and
METIS recursive bisection. The ysmp and metis_factor toggles can be used to
control which is active. METIS is the best overall, particularly on large
surfaces, but requires a separate download and compilation of the METIS
library (but it's easy; see the installation instructions).


<----------------------------- hessian intro ------------------------------>

Consider a particular surface in a particular configuration X, and
consider a small perturbation Y added to X. Then the energy may be expanded
in a Taylor series:

   E(X+Y) = E_0 + G^T Y + 1/2 Y^T H Y + ...

Here the constant E_0 is the original energy, E_0 = E(X). G is the vector
of first derivatives, the gradient, which is a vector the same dimension as
Y or X (G^T is a 1-form, if you want to get technical). Here ^T denotes the
transpose. H is the square matrix of second derivatives, the Hessian. The
Hessian is automatically a symmetric matrix. The gradient G determines the
best linear approximation to the energy, and the Hessian H determines the
best quadratic approximation.

Positive definiteness. If the quadratic term 1/2 Y^T H Y is always
positive for any nonzero Y, then H is said to be positive definite. At an
equilibrium point, this means the point is a strict local minimum; this is
the multivariable version of the second derivative test for a minimum. If
the quadratic term is zero or positive, then H is positive semi-definite.
No conclusion can be drawn about being a local minimum, since third-order
terms may prevent that. If the quadratic term has positive and negative
values, then H is indefinite.

Constraints. If there are constraints on the surface, then the the
perturbation vector Y is required to be tangent to the feasible set in
configuration space. The curvature of the feasible set can have an effect
on H, but this is taken care of automatically by the Evolver. This effect
arises from the slight change in energy due to the projection back to the
feasible set after motion. This does not affect the gradient, but it does
affect the Hessian. In particular, if Q is the Hessian of a global
constraint and q is the Lagrange multiplier for the constraint, then the
adjusted energy Hessian is H - qQ. Therefore it is necessary to do a 'g'
step to calculate Lagrange multipliers before doing any Hessians when there
are global constraints.


<--------------------------- hessian iteration ---------------------------->

Or how to converge really really fast.
Suppose we assume the quadratic approximation to the surface energy is a
good one. Then we can find an equilibrium point by solving for motion Y
that makes the energy gradient zero. Recalling that G and H depend only on
X, the energy gradient as a function of Y is

          grad E = G^T + Y^T H.

So we want G^T + Y^T H = 0, or transposing,

           G + H Y = 0.

Solving for Y gives

            Y = - H^-1 G.

This is actually the Newton-Raphson Method applied to the gradient. The
Evolver's "hessian" command does this calculation and motion. It works best
when the surface is near an equilibrium point. It doesn't matter if the
equilibrium is a minimum, a saddle, or a maximum. However, nearness does
matter. Remember we are dealing with thousands of variables, and you don't
have to be very far away from an equilibrium for the equilibrium to not be
within the scope of the quadratic approximation. When it does work,
"hessian" will converge very quickly, 4 or 5 iterations at most.

Example: Start with the cube datafile cube.fe. Evolve with "r; g 5; r; g
5;". This gets very close to an equilibrium. Doing "hessian" a couple of
times gets to the equilibrium:

Enter command: hessian
  1. area:  4.85807791572284 energy:  4.85807791572284
Enter command: hessian
  1. area:  4.85807791158432 energy:  4.85807791158432
Enter command: hessian
  1. area:  4.85807791158431 energy:  4.85807791158431

So Hessian iteration converged in two steps. Furthermore, this is a local
minimum rather than a saddle point, since Evolver did not complain about a
non-positive definite Hessian.

NOTE: The hessian command will work with indefinite Hessians, as long as
there are no eigenvalues too close to zero. The warning about non-positive
definite is for your information; it is does not mean hessian has failed.


<----------------------------- hessian metric ----------------------------->

Hessian with metric.

One would expect that refining the surface would lead the eigenvalues to
converge to the eigenvalues for the smooth surface. But as the previous
section showed, refining caused the eigenvectors to all shrink by about a
factor of 4. This is no way to converge. The explanation is that so far we
have been looking at eigenvectors in slightly the wrong way. An eigenvector
is supposed to represent a mode of perturbation that is proportional to the
force. However, the response of a surface to a force need not be
numerically equal to the force. After all, forces and displacements are
different kinds of things. They have different units: displacement has
units of distance, and force has units of energy per distance. In other
words, displacement is a vector and force is a covector. Note that matrix
multiplication by the Hessian H turns a vector into a covector. In general,
to turn a vector into an equivalent covector, one needs an inner product,
or metric. So far we have been using the Euclidean inner product on
configuration space, but that is not the proper one to use if you want to
approximate smooth surfaces. The proper inner product of perturbations f
and g of a smooth surface is the integral over the surface of the pointwise
inner product:

           /
   <f,g> = | <f(x),g(x)> dA.
           /

In discrete terms, the inner product takes the form of a square matrix M
such that <Y,Z> = Y^T M Z for vectors Y,Z. We want this inner product to
approximate integration with respect to area. Having such an M, the
eigenvalue equation becomes

               H Q = q M Q.

Officially, Q is now called a "generalized eigenvector" and q is a
"generalized eigenvalue". But we will drop the "generalized". An intuitive
interpretation of this equation is as Newton's Law of Motion,
              Force = Mass * Acceleration
where HQ is the force, M is the mass, and qQ is the acceleration. In other
words, in an eigenmode, the acceleration is proportional to the
perturbation.

The Evolver command "linear_metric" includes M in the eigenvector
calculations. Two metrics are available. In the simplest, the "star
metric", M is a diagonal matrix, and the "mass" associated with each vertex
is 1/3 of the area of the adjacent facets (1/3 since each facet gets shared
among 3 vertices). The other, the "linear metric", extends functions from
vertices to facets by linear interpolation and integrates with respect to
area. By default, "linear_metric" uses a 50/50 mix of the two, which seems
to work best. See the more detailed discussion below in the eigenvalue
accuracy section. The fraction of linear metric can be set by assigning the
fraction to the internal variable linear_metric_mix. By default,
linear_metric_mix is 0.5. In quadratic mode, however, only the quadratic
interpolation metric is used, since the star metric restricts convergence
to order h^2 while the quadratic interpolation metric permits h^4
convergence.

Example: Run square.fe, and refine twice. Do "linear_metric" and
"ritz(0,10)".

Enter command: linear_metric
Using linear interpolation metric with Hessian.
Enter command: ritz(0,10)
Eigencounts:    0
  1.    2.036549240354335
  2.    4.959720306550875
  3.    4.959720306550875
  4.    7.764634143334637
  5.   10.098798069316683
  6.   10.499717069102575
  7.   12.274525789880887
  8.   12.274525789880890
  9.   15.7679634642721
 10.   16.7214142904405
Iterations: 127. Total eigenvalue changes in last iteration: 1.9602375e-014

 After refining again:

Enter command: ritz(0,10)
Eigencounts:    0
  1.    2.009974216370147
  2.    4.999499042685446
  3.    4.999499042685451
  4.    7.985384943789077
  5.   10.090156419079085
  6.   10.186524915471155
  7.   13.008227978344527
  8.   13.008227978344527
  9.   17.242998229925817
 10.   17.2429982299600
Iterations: 163. Total eigenvalue changes in last iteration: 1.9186042e-014

This looks much more convergent.

Using linear_metric does NOT change the inertia of the Hessian, by
Sylvester's Law of Inertia. So the moral of the story is that if you care
only about stability, you don't need to use linear_metric. If you do care
about the actual values of eigenvectors, and want them relatively
independent of your triangulation, then use linear_metric.


<-------------------------- hessian normal mode --------------------------->

The alert reader will have notice that in the examples so far there has
been only one degree of freedom per vertex, instead of the three one might
expect, since a vertex has three degrees of freedom to move in space. The
answer is that in Hessian activities, it is usually best to only allow
motion perpendicular to the surface, and suppress the two degrees of
freedom of motion of a vertex tangential to the surface. The reason is that
tangential motion changes the energy of the surface very little if at all,
leading to many small eigenvalues and a severely singular Hessian. For
example, run square.fe, refine twice, and do "hessian_normal off" to enable
all degrees of freedom. Now "eigenprobe 0" reveals 50 zero eigenvalues:

   Enter command: hessian_normal off
   hessian_normal OFF. (was on)
   Enter command: eigenprobe 0
   Eigencounts:    0

For a curved surface, the extra eigenvalues generally won't be zero, but
they will all be close to zero, both positive and negative, which can
really foul things up. The default value of hessian_normal is therefore the
ON state. The moral of the story is to always leave hessian normal on,
unless you really really know what you are doing.

On some surfaces, for example soap films with triple junctions and
tetrahedral points, there are vertices with no natural normal vector.
Evolver hessian_normal mode assigns those points normal subspaces instead,
so that vertices on a triple line can move in a two-dimensional normal
space perpendicular to the triple line, and tetrahedral points can move in
all three dimensions.

If you wish to run in hessian_normal mode but exempt particular vertices
from the restriction, you can "set" the vertices' no_hessian_normal
attribute, for example
   set vertex no_hessian_normal where z > 1.2

The reason for possible negative extra eigenvalues when hessian_normal is
off is that one rarely has the best possible vertex locations for a given
triangulation of a surface, even when its overall shape is very close to
optimal. Vertices always seem to want to slither sideways to save very very
small amounts of energy. The amount of energy saved this way is usually
much less than the error due to discrete approximation, so it is usually
advisable not to try to get the absolute best vertex positions.

There is one effect of hessian_normal that may be a little puzzling at
first. Many times a surface is known to have modes with zero eigenvalue;
translational or rotational modes, for example. Yet no zero eigenvalues are
reported. For example, with the cube eigenvalues found above,

Eigencounts:    0
  1.    0.001687468263013
  2.    0.001687468263013
  3.    0.001687468263013
  4.    0.2517282974725
  5.    0.2517282974731

One might expect 6 zero eigenvalues from three translational modes and
three rotational modes. But the rotational modes are eliminated by the
hessian_normal restriction. The three translational modes have eigenvalue
near 0, but not exactly 0, since normal motion can approximate the
translation of a cube, but not exactly. The effective translation results
from vertices moving in on one hemisphere and out on the other. This
distorts the triangulation, raising the energy, hence the positive
eigenvalue. This effect decreases with refinement.

There are times when the normal direction is not the direction one 
wants. If one knows the perturbation direction, one can use the 
hessian_special_normal feature to use that instead of the default normal.
Beware that hessian_special_normal also applies to the normal calculated by
the vertex_normal attribute and the normal used by regular vertex averaging.


<---------------------------- hessian tutorial ---------------------------->

For a tutorial on using the hessian and related commands, see
eigentut.htm in the doc subdirectory of the Evolver distribution, or
browse http://www.susqu.edu/brakke/evolver/html/eigentut.htm.

<------------------------------ hessian_diff ------------------------------>

Evolver toggle command. Toggles computing the hessian matrix by finite
differences. Used only for debugging, since it is very slow, and there
are some features it cannot handle.

<------------------------- hessian_double_normal -------------------------->

Evolver toggle command. When hessian_normal is also on, and the space
dimension is even, this toggle makes the normal vector components in the
last half of the dimensions copies of the components in the first half. Sounds
weird, huh? But it is useful in calculating the stability of cylindrically
symmetric surfaces using a string model in 4D.


<---------------------------- hessian_epsilon ----------------------------->

Internal read-write variable. This is the magnitude regarded as zero by
the hessian command when factoring the Hessian matrix. If a zero appears on
the diagonal at the pivot during factoring, a check is made to see if the
rest of the row is zero. If it is, then a 1 is placed on the diagonal; else
an error is reported.

<------------------------------ hessian_menu ------------------------------>

Main prompt command. Brings up a subsidiary command prompt involving the
energy Hessian matrix. Not all of it works well, and may disappear in
future versions. A one-line prompt with options appears. Use option '?' to
get a fuller description of the choices. For those options that calculate
an eigenvalue, the eigenvalue (or first, if several) is saved in the
internal variable last_eigenvalue. A quick summary of the current options,
with the hessian_menu help line and additional comments:
 1. Fill in hessian matrix.
    Allocation and calculation of Hessian matrix.

 2. Fill in right side. (Do 1 first)
    Calculates gradient and constraint values.

 3. Solve. (Do 2 first)
    Solves system for a motion direction.

 4. Move. (Do 3, A, B, C, E, K, or L first)
    Having a motion direction, this will move some stepsize in that
    direction. Will prompt for stepsize. The direction of motion is saved and
    is available in the move command.

 7. Restore original coordinates.
    Will undo any moves. So you can move without fear.

 9. Toggle debugging. (Don't do this!)
    Prints Hessian matrix and right side as they are calculated in other
    options. Produces copious output, and is meant for development only. Do NOT
    try this option.

 B. Chebyshev (For Hessian solution ).
    Chebyshev iteration to solve system. This option takes care of its own
    initialization, so you don't have to do steps 1 and 2 first. Not too
    useful.

 C. Chebyshev (For most negative eigenvalue eigenvector).
    Chebyshev iteration to find most negative eigenvalue and eigenvector.
    Will ask for number of iterations, and will prompt for further iterations.
    End by just saying 0 iterations. Prints Rayleigh quotient every 50
    iterations. After finding an eigenpair, gives you the chance to find next
    lowest. Last eigenvector found becomes motion for step 4. Self
    initializing. Not too useful.

 E. Lowest eigenvalue. (By factoring. Do 1 first)
    Uses factoring to probe the inertia of the shifted Hessian H-cI until it
    as the lowest eigenvalue located within .01. Then uses inverse iteration
    to find eigenpair.

 F. Lowest eigenvalue. (By conjugate gradient. Do 1 first)
    Uses conjugate gradient to minimize the Rayleigh quotient.

 L. Lanczos. (Finds eigenvalues near probe value. )
    Uses Lanczos method to solve for 15 eigenvalues near the probe value
    left over from menu choices 'P' or 'V'. These are approximate eigenvalues,
    but the first one is usually very accurate. Do not trust apparent
    multiplicities. From the main command prompt, you can use the lanczos
    command.

 R. Lanczos with selective reorthogonalization.
    Same as 'L', but a little more elaborate to cut down on spurious
    multiplicities by saving some vectors to reorthogonalize the Lanczos
    vectors. Not quite the same as the official "selective reorthogonalization"
    found in textbooks.

 Z. Ritz subspace iteration for eigenvalues. (Do 1 first) : Calculate a
    number of eigenpairs near a probe value. Will prompt for probe value and
    number of eigenpairs. Same as ritz main command. Can be interrupted
    gracefully by keyboard interrupt. Afterwards, one can use the X option to
    pick a particular eigenvector to look at.

 X. Pick Ritz vector for motion. (Do Z first)
    Selects an eigenvector calculated by the Z option for use in motion
    (option 4). First eigenvalue listed is number 1, etc. Particularly useful
    for discriminating among high multiplicity eigenvalues, which the V option
    does not let you do. You can enter the eigenvector by its number in the
    list from the Z option. As a special bonus useful when there are multiple
    eigenvectors for an eigenvalue, you can enter the vector as a linear
    combination of eigenvectors, e.g. ``0.4 v1 + 1.3 v2 - 2.13 v3''.

 P. Eigenvalue probe. (By factoring. Do 1 first)
    Reports the inertia of the shifted Hessian H-cI for user-supplied values
    of the shift c. The Hessian H includes the effects of constraints. Will
    prompt repeatedly for c. Null response exits. From the main command prompt,
    you can use the eigenprobe command.

 V. Eigenvalue probe with eigenvector. (By factoring. Do 1 first)
    Reports the inertia of the shifted Hessian H-cI for user-supplied values
    of the shift c, and calculates the eigenvector for the eigenvalue nearest c
    by inverse power iteration. You will be prompted for c and for the maximum
    number of iterations to do. From the main command prompt, you can use the
    eigenprobe command.

 S. Seek along direction. (Do 3, A, B, E, C, K, or L first)
    Can do this instead of option 4 if you want Evolver to seek to lowest
    energy in an already found direction of motion. Uses the same line search
    algorithm as the optimizing `g' command.

 Y. Toggle YSMP/alternate minimal degree factoring.
    Default Hessian factoring is by Yale Sparse Matrix Package. The
    alternate is a minimal degree factoring routine of my own devising that is
    a little more aware of the surface structure, and maybe more efficient. If
    YSMP gives problems, like running out of storage, try the alternate. This
    option is available at the main prompt as the ysmp toggle.

 U. Toggle Bunch-Kaufman version of min deg.
    YSMP is designed for positive definite matrices, since it doesn't do any
    pivoting or anything. The alternate minimal degree factoring method,
    though, has the option of handling negative diagonal elements in a special
    way. This option is available at the main prompt as the bunch_kaufman
    toggle.

 M. Toggle projecting to global constraints in move.
    Toggles projecting to global constraints, such as volume constraints.
    Default is ON. Don't mess with this. Actually, I don't remember why I put
    it in.

 G. Toggle minimizing square gradient in seek.
    For converging to unstable critical points. When this is on, option 'S'
    will minimize the square of the energy gradient rather than minimizing the
    energy. Also the regular saddle and hessian_seek commands will minimize
    square gradient instead of energy.

 =. Subshell.
    Starts a command prompt while still in hessian_menu. You can do pretty
    much any command, but you should not do anything that changes the surface,
    thus invalidating the Hessian data. This is meant, for example, for
    creating a graphics file of an eigenvalue perturbation and then returning
    to the hessian_menu prompt. You exit the subshell with the "q" command.

 D. Dump Hessian to text file in Matlab sparse format.  Will prompt for 
    file name.  Includes Hessian, constraints, right side, metric, etc.
    for full external analysis.

 K. Dump Hessian to text file in Mathematica sparse format.  Will prompt for
    file name.  Includes Hessian, constraints, right side, metric, etc.
    for full external analysis.

 0. Exit hessian.
    Exits the menu. `q' also works.

For example, to inspect what eigenvectors look like, one would do steps 1
and z, then repeatedly use x to pick an eigenvector, 4 to move, and 7 to
restore.   After the 4 step, you could use "=" to go to a subcommand prompt
and dump the perturbed surface or make a PostScript file of it.

<----------------------------- hessian_normal ----------------------------->

Evolver toggle command. Constrains Hessian to move each vertex
perpendicular to the surface. This eliminates all the fiddly sideways
movement of vertices that makes convergence difficult. Perpendicular is
usually defined as the volume gradient, but at triple (and higher) junction
lines it is a subspace perpendicular to the line, and singular points where
several triple lines meet have full degrees of freedom. See
hessian_normal_one to alter this behavior.  Default is ON.

If you wish to run in hessian_normal mode but exempt particular vertices
from the restriction, you can "set" the vertices' no_hessian_normal
attribute, for example
   set vertex no_hessian_normal where z > 1.2


<--------------------------- hessian_normal_one --------------------------->

Evolver toggle command. If this and hessian_normal are on, then the normal
at any point will be one dimensional. This is meant for soap films with
Plateau borders, where there are triple junctions with tangent films.
Ordinary hessian_normal permits lateral movement of such triple junctions,
but hessian_normal_one does not. Valid only for string model in 2D and
soapfilm model in 3D. The normal vector is computed as the eigenvector of
the largest eigenvalue of the sum of the normal projection matrices of all
edges or facets adjoining a vertex.


<-------------------------- hessian_normal_perp --------------------------->

Evolver toggle command. If this is on, then the Hessian linear_metric uses
only the component of the normal perpendicular to the facet or edge. This
raises eigenvalues slightly.


<----------------------------- hessian_quiet ------------------------------>

Evolver toggle command. Toggles suppression of printing of information
during hessian calculations. Default is ON.


<------------------------------ hessian_seek ------------------------------>

Main prompt command. Seeks to minimize energy along the direction found by
Newton's method using the Hessian. Otherwise same as the hessian command.
Syntax:

  HESSIAN_SEEK maxscale

where maxscale is an optional upper bound for the distance to seek. The
default maxscale is 1, which corresponds to a plain hessian step. The seek
will look both ways along the direction, and will test down to 1e-6 of the
maxscale before giving up and returning a scale of 0. This command is meant
to be used when the surface is far enough away from equilibrium that the
plain hessian command is unreliable, as hessian_seek guarantees an energy
decrease, if it moves at all.


<-------------------------- hessian_slant_cutoff -------------------------->

Internal read-write variable. Makes Hessian commands treat vertices
whose normal vector is nearly perpendicular to constraints
as fixed. hessian_slant_cutoff is the cosine of angle. Works on vertices
with one degree of freedom in hessian_normal mode. Default value 0.


<------------------------- hessian_special_normal ------------------------->

Evolver toggle command. When hessian_normal is on, this toggles using a
special vectorfield for the direction of the perturbation, rather than the
usual surface normal. The vectorfield is specified in the
hessian_special_normal_vector section of the datafile header. Beware that
hessian_special_normal also applies to the normal calculated by the
vertex_normal attribute and the normal used by regular vertex averaging.

<--------------------- hessian_special_normal_vector ---------------------->

Evolver toggle command. When hessian_special_normal is on, hessian commands
use a special vectorfield for the direction of the perturbation, rather than
the usual surface normal. The vectorfield is specified in the top of the
datafile in the format

HESSIAN_SPECIAL_NORMAL_VECTOR
c1: expr
c2: expr
c3: expr

One can use vertex attributes in the expressions. Beware that
hessian_special_normal also applies to the normal calculated by the
vertex_normal attribute and the normal used by regular vertex averaging.

<-------------------------- hexadecimal numbers --------------------------->

The format for hexadecimal integers is to start with 0x, as in 0x12Af.
There is no bound on the size, but values too large for the internal
representation of integers will have their higher digits truncated.

<----------------------------- high_boundary ------------------------------>

Internal read-only variable giving the number of the highest
parametric boundary defined.  Remember that the name of a named
boundary is internally interpreted as a number, and that boundary
may be referred to by that number.   Useful in iterating through
all boundaries, for example

  for ( bnum := 1 ; bnum <= high_boundary ; bnum += 1 )
    if valid_boundary(bnum) then
       printf "Boundary %d has %d vertices on it\n",bnum,
          sum(vertex,on_boundary bnum);

<---------------------------- high_constraint ----------------------------->

Internal read-only variable giving the number of the highest
level-set constraint.  Remember that the name of a named
constraint is internally interpreted as a number, and that constraint
may be referred to by that number.   Useful in iterating through
all constraints, for example

  for ( cnum := 1 ; cnum <= high_constraint ; cnum += 1 )
    if valid_constraint(cnum) then
       printf "Constraint %d has %d vertices on it\n",cnum,
          sum(vertex,on_constraint cnum);

<------------------------------- histogram -------------------------------->
<------------------------------ loghistogram ------------------------------>

Main prompt command. For printing histograms in text form to standard
output. Syntax:

HISTOGRAM(generator, expr)
LOGHISTOGRAM(generator, expr)

Prints a histogram of the values of expr for the generated elements. It
uses 20 bins evenly divided between minimum and maximum values. It finds
its own maximum and minimum values, so the user does not have to specify
binsize. The log version will lump all zero and negative values into one
bin. Examples:

 histogram(edge,dihedral*180/pi)
 loghistogram(facet where color == red, area)
 histogram(vertex where on_constraint 1, sqrt(x^2+y^2+z^2))


<-------------------------------- history --------------------------------->

Main prompt command. Print the saved history list of commands.

<------------------------------ history list ------------------------------>

Successfully parsed commands are saved in a history list, up to 100
commands. They may be accessed with !! for the last command or !string for
the latest command with matching initial string. !n will repeat a command
by history list number. The command will be echoed. The saved history list
may be printed with the "history" command.

<----------------------------- hit_constraint ----------------------------->

Vertex read-only attribute. Boolean attribute for whether a vertex exactly
satisfies a given constraint. Particularly meant for vertices on one-sided
constraints. The full syntax of the attribute is "hit_constraint n" where n
is the number or name of the constraint. Examples:

   list vertex where hit_constraint 3
   print vertex[3].hit_constraint 1

<------------------------------- homothety -------------------------------->

Evolver toggle command. Adjust total volume of all bodies to fixed value
after each 'g' iteration by uniformly scaling entire surface.  The
total volume is in the read-write variable homothety_target, which
may also be set in the top of the datafile with the syntax

  HOMOTHETY_TARGET constexpr

<----------------------------- hooke2_energy ------------------------------>

Named method. Description: Same as hooke_energy, but each edge has an
equilibrium length extra attribute `hooke_size' (which the user need not
declare). If the user does not set hooke_size by the time the method is
first called, the value will default to the current length. Hooke_size is
not automatically adjusted by refining. It is the responsibility of the 
user to reset hooke_size after refining; you could re-define the 'r' command
   r :::= { 'r'; set vertex hooke_size hooke_size/2 }
to take care of it automatically.

The power of displacement used is given by the internal read-write variable 
hooke2_power, which has default value 2.   hooke2_power can be fractional
or negative.

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

   parameter hooke2_power  2     // the default
   define edge attribute hooke_size real
   quantity slinky energy method hooke2_energy global
   ...
   read
   r; r; set edge hooke_size length

<------------------------------ hooke2_power ------------------------------>

Parameter used by the hooke2_energy method.  See hooke2_energy for details.
hooke2_power can be fractional or negative.

<------------------------------ hooke3_power ------------------------------>

Parameter used by the hooke3_energy method.  See hooke3_energy for details.
hooke3_power can be fractional or negative.

<---------------------------- frickenhaus_flag ---------------------------->

Toggle variable used by hooke3_energy.  See hooke3_energy for details.
If frickenhaus_flag is nonzero, then the energy is taken to be 0 if the 
edge length is less than the equilibrium length.

<----------------------------- hooke3_energy ------------------------------>

Named method. Description: Same as hooke2_energy, but uses an elastic
model instead of a spring. The energy is
    energy = 0.5*(length-hooke_size)^2/hooke_size.
The exponent can be altered from 2 by setting the parameter hooke3_power.
If the internal variable frickenhaus_flag is nonzero, then the energy
is taken to be 0 if the length is less than the equilibrium length.
hooke2_power can be fractional or negative.  It defaults to 2.

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

   parameter hooke3_power  2     // the default
   quantity slinky energy method hooke3_energy global
   ...
   read
   r; r; set edge hooke_size length

<------------------------------ hooke_power ------------------------------->

Internal variable that specifies the exponent in the calculation of
the hooke_energy method.  Default value 2.  It can be negative or fractional.
See hooke_energy for more.

<------------------------------ hooke_energy ------------------------------>

Named method. Description: One would often like to require edges to have
fixed length. The total length of some set of edges may be constrained by
defining a fixed quantity. This is used to fix the total length of an
evolving knot, for example. But to have one constraint for each edge would
be impractical, since projecting to n constraints requires inverting an n x
n matrix. Instead there is a Hooke's Law energy available to encourage
edges to have equal length. Its form per edge is

   energy =  | L - L_0 |^p

where L is the edge length, L_0 is the equilibrium length, embodied as an
global variable `hooke_length', and the power p is an adjustable parameter 
`hooke_power', which can be negative or fractional. The default power is p = 2,
and the default equilibrium length is the average edge length in the initial 
datafile. You will want to adjust this, especially if you have a total length 
constaint. A high modulus will decrease the hooke component of the total 
energy, since the restoring force is linear in displacement and the energy is 
quadratic (when p=2). As an extra added bonus, a `hooke_power' of 0 will give
    energy = -\log|L-L_0|.
See hooke2_energy for individual edge equilibrium lengths. 

Element: edge.
Parameters: none. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: yes.
Example datafile declaration:

   parameter hooke_length 0.3   // will apply to all edges
   parameter hooke_power  2     // the default
   quantity slinky energy method hooke_energy global

<------------------------------ hooke_length ------------------------------>

Internal read-write variable that specifies the equilibrium length
for the hooke_energy named method.  It is the responsibility of the
user to divide hooke_length by 2 when refining.

<------------------------------- hooke_size ------------------------------->

Edge extra attribute that specifies the equilibrium length for
that edge for the hooke2_energy and hooke3_energy methods.  If not
initialized by the user, its default value is the initial length of
the edge.  It is the responsibility of the user to reset hooke_size
after refining; you could re-define the 'r' command
   r :::= { 'r'; set vertex hooke_size hooke_size/2 }
to take care of it automatically.

<----------------------------------- i ------------------------------------>

Single letter main command. Prints miscellaneous information:
   Name of datafile
   Total energy
   Total area of facets
   Count of elements and memory usage
   Area normalization, if on
   LINEAR or QUADRATIC model
   Whether conjugate gradient on
   Order of numerical integration
   Scale factor value and option (fixed or optimizing)
   Diffusion option and diffusion constant value
   Gravity option and gravitational constant value
   Jiggling status and temperature
   Gap constant (for gap energy, if active)
   Ambient pressure (if ideal gas model in effect)


<----------------------------------- id ----------------------------------->

Geometric element read-only attribute. The id of an element is a positive
integer uniquely associated with that element. The Evolver will assign id's
to elements read from the datafile in the order they are read, unless the
-i command line option or keep_originals is in the top of the datafile, in
which case the datafile element number is the id. In either case, you can
access the datafile id with the original attribute. Examples:
   list vertex where id < 10
   set edge color red where id == 4 or id == 6 or id == 9
   foreach facet ff do { printf "%g  %g %g %g\n",ff.id,ff.edge[1].id,
      ff.edge[2].id,ff.edge[3].id }
See also the "oid" attribute, for a signed version of the id indicating
element orientation.


<------------------------- ideal gas declaration -------------------------->

A line in the top section of the datafile of the form

   PRESSURE constexpr

specifies that bodies are compressible and the ambient pressure is the
value of constexpr. The default is that bodies with given volume are not
compressible.

<------------------------------ identifiers ------------------------------->

Identifiers follow standard C rules (composed of alphanumeric characters
and '_' with the leading character not a digit) and must not be keywords.
Identifiers are used for macro names (in the datafile) and user-defined
variables and commands. Identifiers must have at least two characters,
since single characters can be confused with commands. To find out if a
name is already in use as a keyword or user-defined name interactively, use
help command. In scripts, one can use the is_defined function, which has
the syntax

 is_defined(stringexpr)

The stringexpr must be a quoted string or other string expression. The
return value is 0 if the name is undefined, 1 if defined. This function is
evaluated at run-time, but variables in the whole command are parsed before
the command is executed, so a command like if is_defined("newvar") then
newvar := 1 else newvar := 2 will give newvar the value 1 even if this is
its first appearance. A better way in scripts to test is to use the define
command to define the variable without initialization, and then test to see
if it has the default value, i.e. 0 for a numeric variable and a sizeof 0
for a string variable.


<---------------------------------- idiv ---------------------------------->

Integer divide. Rounds toward zero, then does integer division. Examples:
   "7 idiv 2" is 3; "-3.5 idiv 2.1" is -1; "-3 idiv 2" is -1.


<----------------------------------- if ----------------------------------->
<---------------------------------- then ---------------------------------->

Commands may be conditionally executed by the syntax

   IF expr THEN command

   IF expr THEN command ELSE command

where expr is true if nonzero. Parentheses around expr are not needed, but do
not hurt. Do not use a semicolon to end the first command. Examples:

   if ( denom == 0 ) then return;
   if max(edges,length) > 0.02 then {r; g 100} else g 4;


<--------------------------- ignore_constraints --------------------------->
<------------------------------ ignore_fixed ------------------------------>

For squared curvature methods calculating at a boundary vertex,
the default calculation gives the proper curvature under the
assumption the surface is continued by reflection across the constraint.
This permits symmetric surfaces to be represented by one fundamental
region. If the edge of the surface is a fixed edge or on a 1-dimensional
boundary, then there is no way to calculate the curvature on a boundary
vertex from knowledge of neighboring facets. For example, the rings of
facets around the bases of a catenoid and a spherical cap may be identical.
Therefore curvature is calculated only at interior vertices, and when the
surface integral is done, area along the boundary is assigned to the
nearest interior vertex. However, including IGNORE_FIXED or
IGNORE_CONSTRAINTS in the method declaration will force the calculation of
energy even at fixed points or ignoring constraints respectively.

<--------------------------- immediate_autopop ---------------------------->

Toggle.  Modifies the autopop mode. Causes deletion of a short edge
or small facet immediately upon detection, before proceeding with further
detection of small edges or facets.  Original behavior was to do all
detection before any elimination, which could cause bad results if a 
lot of edges got short simultaneously. Default off for backward
compatibility, but you should probably turn it on.


<---------------------------------- imod ---------------------------------->

Integer arithmetic modulus, defined by

    x imod y = floor(x) - floor(floor(x)/floor(y))*floor(y)

<------------------------- implemented symmetries ------------------------->

The currently implemented symmetry groups are:
   torus - The underlying group for the torus model.
   rotate - Cyclic group of rotations in the x-y plane.
   flip_rotate - Cyclic group of rotations in the x-y plane with z -> -z
        with every odd rotation.
   cubocta - Full point group of a cube.
   xyz - The orientation-preserving subgroup of cubocta.
   genus2 - For a 2 dimensional genus 2 hyperbolic quotient space.
   dodecahedron - For a 3D hyperbolic quotient space with dodecahedral
        fundamental region.
   central_symmetry - Inversion through the origin, X -> -X.
   screw_symmetry - Screw motion along z axis.


<----------------------------- include files ------------------------------>

The standard C language method of including other files is available in
the datafile or files input with the "read" command. The file name must
be in double quotes. If the file is not in the current directory,
EVOLVERPATH will be searched. Includes may be nested to 10 deep.
Example:

        #include  "common.stuff"


<-------------------------- incompleteEllipticE --------------------------->

incompleteEllipticE(phi,m), incompleteEllipticF(phi,m): Incomplete elliptic
functions of parameters (phi,m); agrees with Mathematica definition.

<-------------------------- incompleteEllipticF --------------------------->

incompleteEllipticE(phi,m), incompleteEllipticF(phi,m): Incomplete elliptic
functions of parameters (phi,m); agrees with Mathematica definition.

<--------------------------------- index ---------------------------------->
<-------------------------------- inertia --------------------------------->

Index and inertia. The number of negative eigenvalues of H is called the
index of H. The triple of numbers of negative, zero, and positive
eigenvalues is called the inertia of H. One can also speak of the inertia
relative to a value c as the inertia of H-cI, i.e. the number of
eigenvalues less than c, equal to c, and greater than c. Sylvester's Law of
Inertia says that if P is a nonsingular matrix of the same dimension as H,
then the matrix

                        K = P H P^T

has the same inertia as H, although not the same eigenvalues. The Evolver
can factor a Hessian into a form

                        H = L D L^T

where L is a lower triangular matrix and D is diagonal. Hence the inertia
of H can be found by counting signs on the diagonal of D. Inertia relative
to c can be found by factoring H-cI.

The eigenvectors associated to a particular eigenvalue form a subspace,
whose dimension is called the "multiplicity" of the eigenvalue.


<---------------------------- indexed elements ---------------------------->

In aggregate commands or element generators, an element type name
referring to the whole set of an element type may be given an index
to generate just the one element with that id, for example:
  list vertex[3]
When the element type refers to a subelement of another element, then
the index refers to subelements in Evolver's internal order, for
example
  list edge ee where ee.vertex[1].z > 1.2

<------------------------------- info_only -------------------------------->

One of the types of named quantities, along with energy, fixed, and
conserved.  INFO_ONLY quantities whose values are merely reported to the user.
Info_only status may be set in the datafile declaration of the quantity,
for example,
   quantity george info_only method facet_area
or may be set at runtime with the "set" command:
   set george info_only


<----------------------------- initialization ----------------------------->

Whenever the Surface Evolver loads a new surface, either on startup or in
response to the q or load commands, the following actions occur:

 1. Any previous surface has all memory deallocated. All user-defined
    variables and commands are deleted, including any currently executing
    commands.

 2. Internal variables are initialized to default values.

 3. The datafile is read in.

 4. In the soapfilm model, any nontriangular face is divided into triangles
    by creating a vertex in the center and making edges from the center to the
    vertices.

 5. In the soapfilm model, the order of facets around each edge is
    determined geometrically.

 6. Vertices are projected to any level set constraints.

 7. Checks as described for the C command are done.

 8. Initial areas, energies, and volumes are calculated.

 9. The viewing matrix is reset to center the object in the graphics window.


10. If any graphics are active, the new surface is drawn.

11. The main command prompt is started.

<--------------------------------- input ---------------------------------->

Command input

The Surface Evolver command interpreter reads from an input stream, which
may be from the end of the datafile, from a file given on the system
command line, from stdin (the terminal), or from a file given in a READ
command.

The interactive command prompt is "Enter command: ".

Commands are read one at a time, parsed, and executed. By default, a line
is expected to contain a complete command, so no special end-of-command
token is needed.

Multi-line commands may be entered by enclosing them in braces {...}. If a
line ends while nested in braces or parenthesis, Evolver will ask for more
input with the prompt "more> ". It will also ask for more if the line ends
with certain tokens (such as `+') that cannot legally end a command.
Unclosed quotes will also ask for more, and embedded newlines will be
omitted from the final string. Explicit continuation to the next line may
be indicated by ending a line with a backslash (linesplicing). You may want
to use the read command to read long commands from a file, since there is
no command line editing.

Successfully parsed commands are saved in a history list, up to 100
commands. They may be accessed with !! for the last command or !string for
the latest command with matching initial string. !n will repeat a command
by history list number. The command will be echoed. The saved history list
may be printed with the history command.

Some single-letter commands require interactive input. For those, there
are equivalent commands that take input information as part of the command.
This is so commands may be read from a script without having to put input
data on additional lines after the command, although that can still be done
for the single-letter versions.

General note: Some commands will prompt you for a value. A null response
(just RETURN) will leave the old value unchanged and return you to the
command prompt. On options where a zero value is significant, the zero must
be explicitly entered. Commands that need a real value will accept an
arbitrary expression.

Many commands that change the surface or change the model will cause
energies and volumes to be recalculated. If you suspect a command has not
done this, the recalc command will recalculate everything. It will also
update any automatic display.

In the command syntax descriptions, keywords are shown in upper case,
although case is irrelevant in actual commands, except for single-letter
commands.

<---------------------------- instance modulus ---------------------------->

Every method instance has a "modulus", which is multiplied times the basic
method value to give the instance value. A modulus of 0 causes the entire
instance calculation to be omitted whenever quantities are calculated. The
modulus may be set in the declaration in the top of the datafile or by 
assignment at runtime.
Example commands:
  print moment.modulus
  moment.modulus := 1.3

A method instance may be declared to use a different modulus for each
element by specifying an element extra attribute to use for that purpose.
The extra attribute has to have already been declared. Example:

   define facet attribute mymod real
   quantity myquant energy method facet_area global element_modulus mymod

Of course, it is up to the user to properly initialize the values of the
extra attribute.


<------------------------- instance_name modulus -------------------------->

Internal read-write variable. Modulus of a named method instance.
Examples, supposing a named method instance "george" exists:
   print george.modulus
   george.modulus := 4


<-------------------------- instance_name value --------------------------->

Internal read-only variable. Value of a named method instance.
Example, supposing a named method instance "george" exists:
   print george.value

<------------------------- insulating_knot_energy ------------------------->

Datafile keyword that automatically creates an energy named quantity using
the method uniform_knot_energy as a global method. May be followed in the
datafile with a modulus value.

<-------------------------------- integer --------------------------------->

One of the datatypes possible for extra attributes, function arguments,
function return values, and arrays.

<----------------------------- integral_order ----------------------------->

Internal read-write variable. Order of polynomial done by 1D and 2D
Gaussian integration. Much better to set 1D and 2D separately.
Synonym: integration_order

<--------------------------- integral_order_1d ---------------------------->

Internal read-write variable. Order of polynomial done
by 1D Gaussian integration. Synonym: integration_order_1D

<--------------------------- integral_order_2d ---------------------------->

Internal read-write variable. Order of polynomial done
by 2D Gaussian integration. Synonym: integration_order_2D

<--------------------------- integration_order ---------------------------->

Internal read-write variable. Order of polynomial done by
1D and 2D Gaussian integration. Much better to set 1D and 2D separately.
Synonym: integration_order

<-------------------------- integration_order_1d -------------------------->

Internal read-write variable. Order of polynomial done
by 1D Gaussian integration. Synonym: integration_order_1D

<-------------------------- integration_order_2d -------------------------->

Internal read-write variable. Order of polynomial done
by 2D Gaussian integration. Synonym: integration_order_2D

<--------------------------- internal variables --------------------------->

These are pre-defined names for some of Evolver's internal variables. They
may be used in the same way as user-defined variables, except the values of
read-only variables may not be changed by the user.

 > ambient_pressure_value
 > background
 > body_count
 > breakflag
 > body_dissolve_count
 > brightness
 > check_count
 > clock
 > constraint_tolerance
 > cpu_counter
 > datafilename
 > date_and_time
 > delete_count
 > dissolve_count
 > edge_count
 > edge_delete_count
 > edge_dissolve_count
 > edge_refine_count
 > edge_pop_count
 > edgeswap_count
 > eigenneg
 > eigenpos
 > eigenvalues
 > eigenzero

 > equi_count
 > estimated_change
 > facet_count
 > facetedge_count
 > facet_delete_count
 > facet_dissolve_count
 > fix_count
 > gravity_constant
 > hessian_epsilon
 > hessian_slant_cutoff
 > instance_name.modulus
 > instance_name.value
 > inverse_periods
 > integral_order
 > integral_order_1d
 > integral_order_2d
 > iteration_counter
 > jiggle_temperature
 > lagrange_order
 > last_eigenvalue
 > last_error
 > last_hessian_scale

 > linear_metric_mix
 > memory_arena
 > memory_used
 > notch_count
 > pickvnum
 > pickenum
 > pickfnum
 > pop_count
 > pop_edge_to_tri_count
 > pop_quad_to_quad_count
 > pop_tri_to_edge_count
 > quadratic_metric_mix
 > quantity_name.modulus
 > quantity_name.pressure
 > quantity_name.target
 > quantity_name.value
 > random
 > random_seed
 > refine_count
 > rotation_order
 > scale

 > scale_scale
 > scrollbuffersize
 > simplex_representation
 > space_dimension
 > surface_dimension
 > symmetry_group
 > t1_edgeswap_count
 > target_tolerance
 > temperature
 > thickness
 > torus
 > torus_periods
 > total_area
 > total_energy
 > total_length
 > total_time
 > transform_count
 > unfix_count
 > vertex_count
 > vertex_dissolve_count
 > vertex_pop_count
 > where_count
 > window_aspect_ratio


<------------------------ interp_bdry declaration ------------------------->

Interpolation of parameters:
To use interpolation instead of extrapolation in calculating the
parameters of edge midpoints during refining, use the keyword

   INTERP_BDRY_PARAM

in the top of the datafile.  This should be done only if there are no
periodic parameters.   There is also the runtime toggle command
interp_bdry_param.

<--------------------------- interp_bdry_param ---------------------------->

Evolver toggle command. For edges on parametric boundaries, calculate the
parameter values of new vertices (introduced by refining) by interpolating
parameter values, rather than extrapolating from one endpoint. Useful only
when parameters are not periodic.  Default off.


<----------------------------- interp_normals ----------------------------->

Evolver toggle command. Display using interpolated vertex normals for
shading for those graphics interfaces that support it.


<------------------------------- interrupts ------------------------------->

Evolver operation may be interrupted with the standard keyboard interrupt,
CTRL-C usually (SIGINT for you unix gurus). During repeated operations,
this will set a flag which is checked at the end of each loop. Repetition
will cease after the current step and control will return to the main
prompt. If you give a second interrupt before the loop has ended, Evolver
will abort the command and return to the main prompt. Beware that this may
leave the surface in an inconsistent state if surface topology changing
operations were going on. An immediate abort will also happen if an
interrupt is received outside a loop. If Evolver receives SIGTERM (say from
the unix kill command), it will dump to the default dump file and exit.
This is useful for stopping a background Evolver running a script. The same
thing will happen with SIGHUP, so losing a modem connection will save the
current surface.

Note: In Microsoft Windows, the second interrupt doesn't do anything much
since Windows creates a separate thread to handle the interrupt, and I
can't find any way to force the offending thread to stop and longjmp back
to where it should. So if the Evolver is really, really stuck, you may just
have to kill the whole program.


<---------------------------- inverse_periods ----------------------------->

inverse_periods[expr][expr] : Internal read-only variable. Inverse matrix
of the torus_periods matrix. Uses 1-based indexes. Useful for normalizing
vertex coordinates to period basis.

<------------------------------- is_defined ------------------------------->

Funcion to find out if a name is already in use as a keyword or
user-defined namer. Syntax:

 is_defined(stringexpr)

The stringexpr must be a quoted string or other string expression. The
return value is 0 if the name is undefined, 1 if defined. This function is
evaluated at run-time, but variables in the whole command are parsed before
the command is executed, so a command like

     if is_defined("newvar") then newvar := 1 else newvar := 2

will give newvar the value 1 even if this is its first appearance. A better
way in scripts to test is to use the define command to define the variable
without initialization, and then test to see if it has the default value,
i.e. 0 for a numeric variable and a sizeof 0 for a string variable. Example:
     qwerty := 4
     ...
     define qwerty
     if qwerty == 0 then { /* new */ } else { /* old */ }


<-------------------------------- itdebug --------------------------------->

Evolver toggle command. Prints some debugging information during a 'g'
step. For gurus only.


<----------------------------- iteration step ----------------------------->

Each 'g' command iteration does the following:
 1. Calculates the force vector at each vertex as the gradient of the total
    energy.
 2. Calculates the gradients at each vertex of constrained body volumes and
    named quantities. Also calculates the multiple of gradient motion needed to
    restore target values of the constraints.
 3. Projects the forces to be tangent to level set constraints, volume
    constraints (pressure is calculated here), and fixed quantity constraints.
 4. If any mobility options are in effect, the proper force to velocity
    conversion is done.
 5. If the normal_motion toggle is on, then velocities are projected to the
    surface normal.
 6. Does the conjugate gradient projection, if conjugate gradient is in
    effect.
 7. The current vertex positions are saved.
 8. If the optimizing mode is on, then trial motions are made to find the
    optimal scale factor.
 9. The scale factor is multiplied by the value of the scale_scale internal
    variable. (Useful only if you want to muck around with modifying the
    optimal scale factor for some strange reason.)
10. Each vertex is moved by the scale factor times the velocity, plus the
    volume and fixed quantity restoring motions. If runge_kutta is in effect,
    then a fourth-order Runge-Kutta step is done instead of a simple Euler
    step.
11. All level set constraints are enforced. Vertices violating an inequality
    or equality constraint are projected to the constraint (Newton's method).
    Several projection steps may be needed, until the violation is less that a
    certain tolerance or a certain number of steps are done (which generates a
    warning message). The default constraint tolerance is 1e-12, but it can be
    set with the CONSTRAINT_TOLERANCE option in the datafile, or setting the
    constraint_tolerance variable.
12. If jiggling is on, the surface is randomly perturbed.
13. If autopop or autochop are on, then the appropriate edge deletion or
    division is done.
14. New energies, volumes, and quantities are calculated.
15. If check_increase is on and the surface energy has increased, then the
    vertices are restored to their old values.
16. If estimating is on, then a linear estimate of the energy change is
    printed. This is calculated from the velocities, gradients, and scale
    factor.
17. The number of iterations left, the new area, energy, and scale factor
    are printed.
18. If a graphics display is active and set to autodisplay, then graphics
    are redrawn.


<--------------------------- iteration_counter ---------------------------->

Internal read-only variable. Loop count of the current loop in an iterated
command.  Example:

Enter command: { {print iteration_counter } 3 } 4
                   3
                   2
                   1
                   3
                   2
                   1
                   3
                   2
                   1
                   3
                   2
                   1

<----------------------------------- j ------------------------------------>

Single letter main command. Jiggles all vertices once. Meant to be used
for simulated annealing. Useful for shaking up surfaces that get in a rut,
especially crystalline integrands. Syntax:
   j  value
You will be prompted for a value, which is used as a scaling factor, if
you don't give a value with the command. Default value is the value of
the "jiggle_temperature" internal variable, which starts as 0.05. The
actual jiggle is a random displacement of each vertex independently with
a Gaussian distribution with deviation being the temperature times the
mean edge length.  See the "longj" command for a user-definable perturbation.


<----------------------------------- J ------------------------------------>

Single letter main command. Toggles jiggling on every iteration of the g
command. If jiggling gets turned on, prompts for temperature value. Default
temperature is the value of the jiggle_temperature internal variable.


<--------------------------------- jiggle --------------------------------->

Evolver toggle command. Toggles jiggling on every iteration.


<--------------------------- jiggle_temperature --------------------------->

Internal read-write variable. Current temperature for jiggling.

<-------------------------------- johndust -------------------------------->

Named method. Description: For all point pairs (meant to be on a sphere),

       energy = (pi - asin(d/2))/d,

where d is chord distance. For point packing problems on the sphere.

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

  constraint 1 formula: x^2+y^2+z^2 = 1
  quantity jms energy method johndust global


<----------------------------------- k ------------------------------------>

Single letter main command. Sets "gap constant" for gap energy for convex
constraints. Adds energy roughly proportional to area between edge and
boundary. You will be prompted for a value if you don't give a value on the
command line. Normal values are on the order of magnitude of unity. Value k
= 1 is closest to true area. Use 0 to eliminate the energy.

Graphics window key command.  Activates clipping plane in rotation mode.
"L" deactivates clipping mode; "l" (lowercase L) activates clipping plane
in translation mode.

<----------------------------------- K ------------------------------------>

Single letter main command. Finds skinny triangles whose smallest angle is
less than a specified cutoff. You will be prompted for a value if you don't
give a value on the command line. Such triangles will have their longest
edge subdivided. Should be followed with tiny edge removal 't' and
equiangulation 'u'.  By default, the long edge is subdivided at its 
midpoint, but if you do "k_altitude_mode on" then it will be subdivided 
at the foot of the altitude from the opposite vertex.


<------------------------------ k_altitude_mode ------------------------------>

Evolver toggle command.  When on, the 'K' command uses the altitude from a
vertex rather than the median to subdivide a skinny triangle. Default is OFF.

<------------------------------ k_form_order ------------------------------>

Some named methods, such as form_integrand, can handle a differential
form of arbitrary order, and the k_form_order attribute in the method
declaration specifies the order of the form.

<----------------------------- k_vector_order ----------------------------->

A parameter in simplex_k_vector_integral and edge_k_vector_integral 
methods that specifies the order of the k-vector involved.

<------------------------------ keep_macros ------------------------------->

The keyword keep_macros in the top of the datafile will keep macro
definitions active during runtime, until the next datafile is loaded.


<----------------------------- keep_originals ----------------------------->

The presence of the keyword

    keep_originals

in the top of the datafile has the same effect as the -i command line
option, which is to keep the id numbers of geometric elements internally
the same as in the datafile, instead of renumbering them in the order
they are read in.  However, the "addload" command does not obey this,
since it adds the new surface to an existing surface.


<-------------------------- Kelvin foam example --------------------------->
<------------------------------ twointor.fe ------------------------------->

Example: Torus partitioned into two cells (Kelvin's foam), twointor.fe

This example has a flat 3-torus (i.e. periodic boundary conditions)
divided into two bodies. The unit cell is a unit cube, and the surface has
the topology of Kelvin's partitioning of space into tetrakaidecahedra [TW],
which was the least area partitioning of space into equal volumes known
until recently [WP].

The datafile handles the wrapping of edges around the torus by specifying
for each direction whether an edge wraps positively (+), negatively (-), or
not at all (*).

Note the use of the keyword TORUS_FILLED in the datafile. This informs
Evolver that one of the volume constraints is redundant, preventing a
singular matrix when the time comes to enforce volume constraints. One
could use just TORUS and only put on one volume constraint.

The display of a surface in a torus can be done several ways. The
connected command (my favorite) makes each body show as a single unit. The
clipped command shows the surface clipped to the fundamental parallelpiped.
The raw_cells command shows the unedited surface.

The Weaire-Phelan structure [WP]. is in the datafile phelanc.fe. It has
area 0.3% less than Kelvin's.

The initial two-cell Kelvin shape. Note that due to periodidity, a single
vertex or edge may appear multiple times in the image.



// twointor.fe
// Two Kelvin tetrakaidecahedra in a torus.

TORUS_FILLED   // signals that domain is a torus and bodies fill it.

periods
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

vertices // values from another program
1  0.499733 0.015302 0.792314
2  0.270081 0.015548 0.500199
3  0.026251 0.264043 0.500458
4  0.755123 0.015258 0.499302
5  0.026509 0.499036 0.794636
6  0.500631 0.015486 0.293622
7  0.025918 0.750639 0.499952
8  0.499627 0.251759 0.087858
9  0.256701 0.499113 0.087842
10 0.026281 0.500286 0.292918
11 0.500693 0.765009 0.086526
12 0.770240 0.499837 0.087382

edges // with wraps in axis directions, * no wrap, + pos wrap, - neg wrap
1    1 2  * * *
2    2 3  * * *
3    1 4  * * *
4    3 5  * * *
5    2 6  * * *
6    2 7  * - *
7    1 8  * * +
8    4 6  * * *
9    5 9  * * +
10   3 10 * * *
11   3 4  - * *
12   6 8  * * *
13   6 11 * - *
14   7 4  - + *
15   8 12 * * *
16   9 8  * * *
17   9 11 * * *
18   10 7 * * *
19   11 1 * + -
20   12 5 + * -
21   5 7  * * *
22  11 12 * * *
23  10 12 - * *
24   9 10 * * *

faces
1    1 2 4 9 16 -7
2    -2 5 12 -16 24 -10
3    -4 10 18 -21
4    7 15 20 -4 11 -3
5    -1 3 8 -5
6    6 14 -11 -2
7    5 13 -17 24 18 -6
8    -12 13 19 7
9    -16 17 22 -15
10   -10 11 8 12 15 -23
11   -21 9 17 19 1 6
12   -14 -18 23 -22 -13 -8
13   -24 -9 -20 -23
14   -19 22 20 21 14 -3

bodies
1    -1 -2 -3 -4 -5 9 7 11 -9 10 12 5 14 3 volume 0.500
2     2 -6 -7 8 -10 -12 -11 -13 1 13 -14 6 4 -8 volume 0.500


Doing some refining and iterating will show that the optimal shape is
curved a bit.

<------------------------------- keylogfile ------------------------------->

Main prompt command. Syntax:

  KEYLOGFILE stringexpr
  KEYLOGFILE OFF

Starts recording all input keystrokes to the file specified by stringexpr,
which must be a quoted string or a string variable or expression. Appends
to an existing file. To end logging, use keylogfile off. To record both
input and output, use logfile.


<------------------------ Klein hyperbolic metric ------------------------->

One special metric is available built-in. It is the Klein model of
hyperbolic space in n dimensions. The domain is the unit disk or sphere in
Euclidean coordinates. Including the keyword KLEIN_METRIC in the top
section of the datafile will invoke this metric. Lengths and areas are
calculated exactly, but as with other metrics you are on your own for
volumes and quantities.


<------------------------------- klein_area ------------------------------->

Named method. Description: Facet area in Klein hyperbolic 3D space model.
Does not depend on klein_metric being declared in the datafile. Vertices
should be inside the unit sphere. 

Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

   quantity kleinarea energy method klein_area global


<------------------------------ klein_length ------------------------------>

Named method. Description: Edge length in Klein hyperbolic plane model.
Does not depend on klein_metric being declared. Vertices should be inside
unit sphere. 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: 2. 
Hessian: no. 
Example datafile declaration:

   quantity kleinlen energy method klein_length global


<------------------------------ klein_metric ------------------------------>

A Riemannian metric on the ambient space may be declared in the top
section of the datafile with the syntax

METRIC
expr expr expr
expr expr expr
expr expr expr

 or

CONFORMAL_METRIC expr

 or

KLEIN_METRIC

The keyword METRIC is followed by the N^2 components of the metric tensor,
where N is the dimension of space. The components do not have to obey any
particular line layout; they may be all on one line, or each on its own
line, or any combination. It is up to the user to maintain symmetry. A
conformal metric is a scalar multiple of the identity matrix, and only the
multiple need be given. A conformal metric will run about twice as fast.
The Klein metric is a built-in metric for hyperbolic n-space modelled on
the unit disk or ball.


<--------------------------------- kmetis --------------------------------->

Main prompt command. Partitions the set of facets (edges in string model)
into n parts using the METIS library of Karypis and Kumar, if this library
has been compiled into the Evolver. Meant for experiments in partitioning
the surface for multiprocessors. The partition number of facet is left in
the facet extra attribute fpart (edge epart for string model), which will
be created if it does not already exist. METIS uses the PMETIS algorithm,
KMETIS uses the KMETIS algorithm. Syntax:

  METIS n
  KMETIS n

 Example:
  metis 20;
  set facet color (fpart imod 15) + 1;

For partitioning bodies, see body_metis.


<------------------------------ knot_energy ------------------------------->

Named method.   Description: An electrostatic-type energy in which vertices
are endowed with equal charges.  Inverse power law of potential is adjustable
via the global parameter `knot_power', default value 2 (which is not 
electrostatic, but the knot theorists like it).  If the extra attribute 
`node_charge' is defined for vertices, then that value is used for
the vertex charge.  Use of this energy is not restricted to knots;
it has been used to embed complicated network graphs in space.

Element: vertex.
Parameters: none.
Models: string; linear.
Ambient dimension: any.
Hessian: yes.
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knotten energy method knot_energy global

<-------------------------- knot_local_thickness -------------------------->

Named method. Description: Calculates the radius of curvature at a vertex
of the circle containing the vertex and its two neighbor vertices. Meant to
investigate the radius at individual vertices. 

Element: vertex. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3. 
Gradient: no. 
Hessian: no.
Example datafile declaration: 
 
  quantity klocalthick info_only method knot_local_thickness global

<------------------------------- knot_power ------------------------------->

Internal read-write variable used as exponent on some term in
various knot energies.  Named methods using knot_power are:

 buck_knot_energy
 charge_gradient
 knot_energy
 knot_thickness_0
 knot_thickness_p
 knot_thickness_p2
 proj_knot_energy
 uniform_knot_energy
 uniform_knot_energy_normalizer
 uniform_knot_normalizer1
 uniform_knot_normalizer2

<----------------------------- knot_thickness ----------------------------->

Named method. Description: Calculates global radius of curvature at one
vertex v, as the minimum radius of circle containing the vertex and the
endpoints of any non-adjacent edge. Because of "min", this has no gradient,
so should be used in info_only quantities. 

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Gradient: no. 
Hessian: no.
Example datafile declaration: 
 
  quantity kthick info_only method knot_thickness global 

<---------------------------- knot_thickness2 ----------------------------->

Named method. Description: calculates global radius of curvature at one
vertex v, as the minimum radius of circle containing the vertex and the
neighbor vertices of any non-adjacent vertex. Because of "min", this has no
gradient, so should be used in info_only quantities. 

Element: vertex.
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Gradient: no.
Hessian: no. 
Example datafile declaration: 
 
  quantity kthick info_only method knot_thickness2 global 

 
<---------------------------- knot_thickness_0 ---------------------------->

Named method. Description: Calculates global radius of curvature at one
vertex, as Lp integral of radius of curvature of circle containing the
vertex and the endpoints of edges not adjacent to the vertex. Integrand
raised to -p power. The power p is taken from the global variable
knot_power. No factor of length in integral. This method has a gradient.

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3.
Hessian: no. 
Example datafile declaration: 
 
  quantity kthick info_only method knot_thickness_0 global 
 
<---------------------------- knot_thickness_p ---------------------------->

Named method. Description: purpose: calculates global radius of curvature
at one vertex v, as Lp integral of radius of curvature of v and endpoints
of nonadjacent edges. Includes factors of length at v and w. This method
has a gradient. The power p is taken from the global variable knot_power.

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3.
Hessian: no. 
Example datafile declaration: 
 
   quantity kthick info_only method knot_thickness_p global 

 
<--------------------------- knot_thickness_p2 ---------------------------->

Named method. Description: Calculates the global radius of curvature at
one vertex v, as Lp integral of r(v,w1,w2) over all vertices w. Here w1 and
w2 are the two neighbors of vertex w. Includes factors of length at v and
w. This has not been extended to allow open arcs (valence 1 vertices). This
method does have a gradient. The power p is taken from the global variable
knot_power. 

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration: 
 
   quantity kthick info_only method knot_thickness_p2 global 

 
<----------------------------- kraynikpopedge ----------------------------->

Main command toggle. Toggles edge-popping mode (in "O" or "pop" commands)
in which poppable edges look for adjacent facets of different
edge_pop_attribute values to split off from the original edge; failing
that it reverts to the regular mode of popping the edge. This is meant
to give the user greater control on how edge popping is done. It is up
to the user to declare the edge_pop_attribute integer facet attribute
and assign values.


<---------------------------- kraynikpopvertex ---------------------------->

Toggles 3D vertex popping mode in which a poppable vertex is examined to
see if it is a special configuration of six edges and 9 facets. If it is, a
special pop is done that is much nicer than the default pop.


<--------------------------------- kusner --------------------------------->

Evolver toggle command. Calculation of squared curvature by edge formula
rather than vertex formula.


<----------------------------------- l ------------------------------------>

 l (lower case L)

Single letter main command. Subdivides long edges, creating new facets as
necessary. You will be prompted for a cutoff edge length, if you don't give
a value with the command. Existing edges longer than the cutoff will be
divided once only. Newly created edges will not be divided. Hence there may
be some long edges left afterward. If you enter h, you will get a histogram
of edge lengths. If you hit RETURN with no value, nothing will be done. It
is much better to use the refine command r than to subdivide all edges. A
synonym for "l value" is "edge_divide value". This command does not respect
the no_refine attribute.

Graphics mode command. Rotate left. Rotates about vertical axis,
default 6 degrees.  Integer prefix specifies how many 6 degree rotations
to do; decimal prefix specifies degrees of rotation.
Example: `15l' does 90 degree rotation, `15.0l' does 15 degree rotation.

<------------------------------- labelflag -------------------------------->

Evolver toggle command. When on, the postscript command will print element
labels in the postscript file. Synonym for ps_labelflag.


<--------------------------------- labels --------------------------------->

Postscipt output option for numerically labelling elements with their id's.
One of the prompts of the "P 3" command is
  Do labels? (i for ids, o for originals) : 
which gives you a chance to put numeric labels on vertices, edges, and
facets, which is useful for debugging or modifying a datafile. Edge labels
are slightly displaced toward the head of the edge, and facet labels are
signed according to which side of the facet is visible. Choose 'i' or 'y'
for the current element id, or 'o' for the original element number. If you
don't want any labels, just hit RETURN. The postscript command uses the
ps_labelflag toggle to control this. The relative size of the labels can be
controlled with the ps_labelsize variable, whose default value is 3.0.

<-------------------------------- lagrange -------------------------------->

Main prompt command. Changes to Lagrange model from quadratic or linear
models. Syntax:

  LAGRANGE n

where n is the lagrange_order, which is between 1 and some built-in
maximum (currently 8). This command can also convert between Lagrange
models of different orders. Note that lagrange 1 gives the Lagrange model
of order 1, which has a different internal representation than the linear
model. Likewise, lagrange 2 does not give the quadratic model.


<----------------------------- Lagrange model ----------------------------->

The Evolver has a very limited implementation of higher-order elements. In
the Lagrange model of order n, each edge is defined by interpolation on n+1
vertices evenly spaced in the parameter domain, and each facet is defined
by interpolation on (n+1)(n+2)/2 vertices evenly spaced in a triangular
pattern in the parameter domain. That is, the elements are Lagrange
elements in the terminology of finite element analysis.

The Lagrange model is defined only for named quantities and methods, so
Evolver will automatically do convert_to_quantities when you invoke the
Lagrange model. The methods that currently accept the Lagrange model are
   vertex_scalar_integral
   edge_length
   edge_area
   edge_scalar_integral
   edge_vector_integral
   edge_general_integral
   facet_area
   facet_volume
   facet_vector_integral
   facet_scalar_integral
   facet_general_integral

A surface may be converted to an order n Lagrange model with the command
"lagrange n". This will convert linear or quadratic models to Lagrange, and
will convert between different order Lagrange models. The commands linear
and quadratic will convert Lagrange model back to the linear or quadratic
models.

No triangulation manipulations are available in the Lagrange model. No
refining, equiangulation, or anything. There is some vertex averaging, but
just internal to edges and facets. Use the linear or quadratic model to
establish your final triangulation, and just use the Lagrange model to get
extra precision.

The current order can be accessed through the read-only internal variable
lagrange_order. The Lagrange model can be dumped and reloaded.

As the Lagrange order is raised, calculations slow down rapidly. This is
not only due to the large number of points involved, but is also due to the
fact that the order of Gaussian integration is also raised.

Lagrange elements are normally plotted subdivided on their vertices, but
if the smooth_graph flag is on, they are plotted with 8-fold subdivision.

The toggle command bezier_basis toggle replaces the Lagrange interpolation
polynomials (which pass through the control points) with Bezier basis
polynomials (which do not pass through interior control points, but have
positive values, which guarantees the edge or facet is within the convex
hull of the control points). This is experimental at the moment, and not
all features such as graphing or refinement have been suitably adjusted.

<-------------------------- lagrange_multiplier --------------------------->

The syntax for defining a named quantity in the data file is:

 QUANTITY name  ENERGY|FIXED=value|CONSERVED|INFO_ONLY
    [LAGRANGE_MULTIPLIER constexpr] [TOLERANCE constexpr]
    [MODULUS constexpr] methodlist | FUNCTION methodexpr

For fixed quantities, the optional Lagrange multiplier value supplies the
initial value of the Lagrange multiplier (the "pressure" attribute of the
quantity). It is meant for dump files, so on reloading no iteration need be
done to have a valid Lagrange multiplier.

The "pressure" column of the "v" command output is the Lagrange multiplier
for constrained quantities.

<----------------------------- lagrange_order ----------------------------->

Internal read-only variable. Order of Lagrange model. Set
with the "lagrange n" command.

<-------------------------------- lanczos --------------------------------->

Main prompt command. For finding eigenvalues of the energy Hessian near a
given value. Syntax:

   LANCZOS expr

   LANCZOS (expr,expr)

Does a little Lanczos algorithm and reports the nearest approximate
eigenvalues to the given probe value. In the first form, expr is the probe
value, and 15 eigenvalues are found. In the second form, the first argument
is the probe value, the second is the number of eigenvalues desired. The
output begins with the number of eigenvalues less than, equal to, and
greater than the probe value. Then come the eigenvalues in distance order
from the probe. Not real polished yet. Beware that multiplicities reported
can be inaccurate. The eigenvalue nearest the probe value is usually very
accurate, but others can be misleading due to incomplete convergence. Since
the algorithm starts with a random vector, running it twice can give an
idea of its accuracy.

<------------------------ laplacian_mean_curvature ------------------------>

Named method. Description: Calculates the velocity of a vertex as the
Laplacian of the mean curvature of the surface, meant to model the
surface diffusion of atoms in sintering. The mean curvature at each vertex is 
calculated as a scalar, in the same way as for area_normalized area gradient, 
i.e. area gradient dotted with volume gradient, divided by the area of the
surrounding facets.  Then finite differences are used to calculate the
Laplacian of the mean curvature.  This calculates velocity only;
the energy is always 0.  This method should only be used with fixed 
scale in the 'g' command.

The relative speed of vertices can be controlled by the vertex 
attribute lmc_mobility, which the user should declare if wanted.
If the user wants to access the values of mean curvature the method
finds, the user should define the vertex scalar attribute lmc_mean_curvature.
This method conserves volume ideally, but you might want to put on volume
constraints anyway due to numerical inaccuracies.

Warning: This method should only be used with a fixed 'g' scale factor.
And for stability, the factor should be proportional to the fourth power of 
the shortest edge, since Laplacian of mean curvature is a fourth-derivative
operator, something like 0.001*length^4.  This can make for very slow
evolution for highly refined surfaces.

Element: vertex. 
Parameters: none. 
Models: string, soapfilm; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

  area_method_name "null_area"
  define facet attribute lmc_mobility real
  define facet attribute lmc_mean_curvature real
  quantity lmc energy method laplacian_mean_curvature global


<------------------------------ lmc_mobility ------------------------------>

A vertex attribute used by the laplacian_mean_curvature named
method to control the relative velocity of a vertex.  See
laplacian_mean_curvature for more.

<--------------------------- lmc_mean_curvature --------------------------->

A vertex attribute used by the laplacian_mean_curvature named
method to record the mean curvature found at a vertex.  See
laplacian_mean_curvature for more.

<---------------------------- last_eigenvalue ----------------------------->

Internal read-only variable. Eigenvalue from last saddle or ritz
command.  For the full list of ritz eigenvalues, use the eigenvalues[]
array.

<------------------------------- last_error ------------------------------->

Internal read-write variable. Has error number of last error message.

<--------------------------- last_hessian_scale --------------------------->

Internal read-only variable. Stepsize from last hessian_seek command.

<------------------------------- LEBweight -------------------------------->

Facet extra attribute used to weight individual facets in the named 
methods linear_elastic_B, relaxed_elastic, and relaxed_elastic_A.

<--------------------------------- length --------------------------------->

Edge read-only attribute. Length of the edge. Examples:
   histogram(edge where on_constraint 1, length)
   print edge[3].length


<--------------------------- length_method_name --------------------------->

This item in the top of the datafile, length_method_name, specifies
the name of the pre-defined method to use as the method to compute
edge length in place of the default edge_length method. It is optional.
Developed so circular arcs can be used in two-dimensional foams. Current
reasonable methods are circular_arc_length and spherical_arc_length.
Usage implies converting to everything_quantities mode. Syntax:

  length_method_name quoted_method_name

For example,

  string
  space_dimension 2
  length_method_name "circular_arc_length"
  area_method_name "circular_arc_area"

<------------------------- level set constraints -------------------------->

A level-set constraint is a restriction of vertices to lie on the zero
level-set of a function. The formula may include any expressions whose
values are known to the Evolver, given the particular vertex. Most commonly
one just uses the coordinates (x,y,z) of the vertex, but one can use
variables, quantity values, or vertex extra attributes. Using a vertex
extra attribute is a good way to customize one formula to individual
vertices. For example, if there were a vertex extra attribute called zfix,
one could force vertices to individual z values with one constraint with
the formula z = zfix, after of course assigning proper values to zfix for
each vertex.

A level set constraint may have several roles:

 > Vertices may be required to lie on a constraint (equality constraint) or
   on one side (inequality constraint). A constraint may be declared GLOBAL,
   in which case it applies to all vertices. See mound.fe for an example.

 > A constraint may have an energy vectorfield associated with it that is
   integrated over edges lying in the constraint to give an energy. This is
   useful for specifying wall contact angles and for calculating gravitational
   energy. Integrals are not evaluated over edges that are FIXED. See mound.fe
   for an example. In the string model, the energy integrand is a single
   component evaluated on vertices on the constraint.

 > A constraint may have a content vectorfield associated with it that is
   integrated over edges lying in the constraint to give a volume contribution
   to a body whose boundary facets contain the edges. This is useful for
   getting correct volumes for bodies without completely surrounding them with
   otherwise useless facets. It is important to understand how the content is
   added to the body in order to get the signs right. The integral is
   evaluated along the positive direction of the edge. If the edge is
   positively oriented on a facet, and the facet is positively oriented on a
   body, then the integral is added to the body. This may wind up giving the
   opposite sign to the integrand from what you think may be natural.
   Integrals are not evaluated over edges that are FIXED. See tankex.fe for an
   example. In the string model, the content integrand is a single component
   evaluated on vertices on the constraint.

 > A constraint may be declared CONVEX, in which case edges in the
   constraint have an energy associated with them that is proportional to the
   area between the straight edge and the curved wall. This energy (referred
   to as "gap energy") is meant to compensate for the tendency for flat facets
   meeting a curved wall to minimize their area by lengthening some edges on
   the wall and shortening others, with the net effect of increasing the net
   gap between the edges and the wall. See tankex.fe for an example.

Level set constraints are declared in the top section of the datafile. They
may be applied to vertices, edges, or facets. Constraints are usually
applied to vertices and edges, as in mound.fe. Remember that you need to
apply a constraint to an edge to get that constraint to apply to vertices
created on that edge by refining. Sometimes one applies constraints to
facets, usually to get the facet to conform to a predetermined shape. Be
sure that the constraints applied to a vertex are linearly independent at
the vertex.

Constraints are usually applied in the datafile vertices, edges, and faces
sections, but they may also be set or removed with the set or unset
commands. Examples:
   set vertex[4] constraint 4
   unset edge constraint 1 where id < 10

It does not hurt to unset an element that isn't on the constraint. When a
vertex is set to a constraint, the vertex coordinates are immediately
projected to the constraint. Setting an edge on a constraint does not set
its vertices. Likewise for facets.


<----------------------------- lexical format ----------------------------->

For those who know about such things, the datafile and commands are read
with a lexical analyzer generated by the lex program. The specification is
in datafile.lex. Commands are further parsed by a yacc-generated parser.
In parsing an expression, the longest legal expression is used. This
permits coordinates to be specified by several consecutive expressions with
no special separators.


<----------------------------- line splicing ------------------------------>

The datafile and any file Evolver inputs with the "read" command are made up 
of text lines. Line breaks are significant. The next physical line can be 
spliced onto the current line by having \ be the last character of the current 
line. Line splicing is not effective in // comments. Blank lines and comment 
lines may be placed freely anywhere. The various combinations of CR and NL 
that various computer systems use are all recognized.

The most common use of line-splicing is in datafile lines that get overly
long.  Long commands should be enclosed in {  }, which is much more
convenient and reliable.


<--------------------------------- linear --------------------------------->

Main prompt command. Changes to linear model from quadratic or Lagrange
models.


<------------------------------ linear model ------------------------------>

In the linear model, all edges and triangular facets are flat line
segments and triangles, respectively. For all calculations, an edge is
defined by its two endpoints, and a facet (in the soapfilm model) is
defined by its three vertices. This is the default. Quadratic or Lagrange
models may be changed to linear with the M 1 or linear commands. An
exception is if the spherical_arc_length method is used for
length_method_name in the string model, in which case edges are computed
and drawn on a sphere centered at the origin.

<----------------------------- linear_elastic ----------------------------->

Named method. Description: To calculate the isotropic linear elastic
strain energy energy for facets based on the Cauchy-Green strain matrix.
Let S be Gram matrix of unstrained facet (dots of sides). Let Q be the
inverse of S. Let F be Gram matrix of strained facet. Let C = (FQ-I)/2, the
Cauchy-Green strain tensor. Let v be Poisson ratio. Then energy density is

 (1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))

Each facet has extra attribute poisson_ratio and extra attribute array
form_factors[3] = {s11,s12,s22}, which are the entries in S. That is, s11 =
dot(v2-v1,v2-v1), s12 = dot(v2-v1,v3-v1), and s22 = dot(v3-v1,v3-v1). If
form_factor is not defined by the user, it will be created by Evolver, and
the initial facet shape will be assumed to be unstrained. For a version of
this method that gives compression zero energy, see relaxed_elastic_A.

Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3.
Hessian: yes. 
Example datafile declaration:

  quantity lastic energy method linear_elastic global


<---------------------------- linear_elastic_B ---------------------------->

Named method. Description: A variation of the linear_elastic method. To
calculate the linear elastic strain energy energy for facets based on the
Cauchy-Green strain matrix. Let S be Gram matrix of unstrained facet (dots
of sides). Let Q be the inverse of S. Let F be Gram matrix of strained
facet. Let C = (FQ-I)/2, the Cauchy-Green strain tensor. Let v be Poisson
ratio. Then energy density is

 (1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))

Each facet has extra attribute poisson_ratio and each vertex has two extra
coordinates, the coordinates of the unstrained surface in a plane. Hence
the surface must be set up as five dimensional.  There can also be a
real-valued facet extra attribute LEBweight, which can be used to give
a per-facet weighting of the energy.  For a version of this
method that gives compression zero energy, see relaxed_elastic.
 
Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: 5.
Hessian: yes. 
Example datafile declaration:

  space_dimension 5
  quantity lastic energy method linear_elastic_B global


<----------------------------- linear_metric ------------------------------>

Evolver toggle command. Eigenvalues and eigenvectors of the Hessian are
defined with respect to a metric. This command toggles a metric that
imitates the smooth surface natural metric of L_2 integration on the
surface. Use with hessian_normal to get eigenvalues and eigenvectors
similar to those on smooth surfaces.

<--------------------------- linear_metric_mix ---------------------------->

Internal read-write variable. Fraction of linear interpolation in
Hessian metric.

<---------------------------------- list ---------------------------------->

Main prompt command. List elements on the screen in the same format as in
the datafile, or lists individual constraint, boundary, quantity, or method
instance definitions. Syntax:

   LIST generator
   LIST constraintname
   LIST CONSTRAINT constraintnumber
   LIST boundaryname
   LIST BOUNDARY boundarynumber
   LIST quantityname
   LIST instancename

On unix systems, piping to "more" or other commands can be used for
long displays. Examples:

   list edges where id <= 12
   list vertices | "more"
   list vertices where x < 1 and y > 2 and z >= 3  | "tee vfile"
   list facet[3]
   list facet[3].edges where on_constraint 1
   list facet[3].edge[2].vertex[1]
   list constraint 1

See also "list attributes", "list bottomingo", "list procedures",
and "list topingo".


<---------------------------- list attributes ----------------------------->

Prints a list of the "extra attributes" of each type of element. Besides
user-defined extra attributes, this list also contains the predefined
attributes that make use of the extra attribute mechanism (being of
variable size), such as coordinates, parameters, forces, and velocities. It
does not list permanent, fixed-size attributes such as color or fixedness,
or possible attributes that are not used at all.


<---------------------------- list bottominfo ----------------------------->

Main prompt command. Prints what would be dumped in the "read" section at
the end of a dumpfile: command definitions and various toggle states.


<---------------------------- list procedures ----------------------------->

Main prompt command. Prints names all current user-defined commands,
procedures, and functions.


<------------------------------ list topinfo ------------------------------>

Main prompt command. Prints the first section of the datafile on the
screen. This is everything that would be before the vertices section
in a dump file.

<----------------------------- little_endian ------------------------------>

Evolver toggle command. Controls the order of bytes in binary_printf
numerical output. Little-endian is least significant byte first. To change
to big-endian, use big_endian, not "little_endian off".


<---------------------------------- load ---------------------------------->

Main prompt command. For loading a new surface. Syntax:

   LOAD filename

Terminates the current surface and loads a new datafile. The filename is
the datafile name, and can be either a quoted string or a string variable.
This completely re-initializes everything, including the command
interpreter. In particular, the currently executing command ends. Useful
only as the last command in a script. For loading a new surface and
continuing with the current command, see permload. Wildcard matching is in
effect on some systems (Windows, linux, maybe others), but be very careful
when using wildcards since there can be unexpected matches.


<------------------------------ load_library ------------------------------>

To load a dynamic load library of compiled functions, the syntax is

 LOAD_LIBRARY "filename"

where the double-quoted filename is the library. The current directory and
the EVOLVERPATH will be searched for the library.  See "dynamic load library"
for more.

<--------------------------------- local ---------------------------------->

The scope of a variable name may be restricted to a compound command block
by declaring the name to be local. Example:

   do_stuff := {
     local inx;
     for ( inx := 1 ; inx < 5 ; inx += 1 )
     { local jnx;
       jnx := inx*2;
       print jnx;
     };
   }

Using local variables is good for avoiding pollution of global namespace
and for writing recursive functions (storage space for locals is allocated
on the runtime stack). Note that the local declaration is a scope
declaration, not a type declaration. Also, it cannot be combined with
initialization of the variable (yet), and there is one name per
declaration. Function arguments also act as local variables.

<--------------------------- local_hooke_energy --------------------------->

Named method. Description: Energy of edges as springs with equilibrium
length being average of lengths of neighbor edges. Actually, the energy is
calculated per vertex,

 E = ({L_1 - L_2 \over L_1 + L_2})^2

where L_1 and L_2 are the lengths of the edges adjacent to the vertex.
Meant for loops of string. (by John Sullivan) 

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity slinky energy method local_hooke_energy global

<---------------------------- local_hooke_flag ---------------------------->

Variable that when set to nonzero prevents local_hooke_energy from
being evaluated at vertices with valence not equal to 2.

<---------------------------------- log ----------------------------------->

 log(x), exp(x) : Natural log, exponentiation base e.

<-------------------------------- logfile --------------------------------->

Main prompt command. Syntax:

   LOGFILE stringexpr
   LOGFILE OFF

Starts recording all input and output to the file specified by stringexpr,
which must be a quoted string or a string variable or expression. Appends
to an existing file. To end logging, use logfile off. To record just input
keystrokes, use keylogfile.

<--------------------------------- LONGDOUBLE -------------------------------->
<--------------------------------- FLOAT128 -------------------------------->

If your system supports the long double data type, you can compute and
print values in higher precision by compiling with -DLONGDOUBLE in CFLAGS 
in Makefile.  But this slows computations somewhat, and should be used only 
by precision fanatics. And on Intel chips, it only does 80 bit precision, 
even if it allocates 128 bits of storage, since that is the hardware precision 
of the 8087 math coprocessor.  For 128 bit precision (in software, so much 
slower), compile with -DFLOAT128 and link with the quadmath library (which 
you have to find on your own).

<--------------------------------- longj ---------------------------------->

Main prompt command. For perturbing the surface. This does a "long
jiggle", which provides long wavelength perturbations that can test a
surface for stability. The parameters are a wavevector, a phase, and a
vector amplitude. The user will be prompted for values. Numbers for vectors
should be entered separated by blanks, not commas. An empty reply will
accept the defaults. A reply of r will generate random values. Any other
will exit the command without doing a jiggle. In the random cases, a random
amplitude $\vec A$ and a random wavelength $\vec L$ are chosen from a
sphere whose radius is the size of the object. The wavelength is inverted
to a wavevector $\vec w$. A random phase $\psi$ is picked. Then each vertex
$\vec v$ is moved by $\vec A\sin(\vec v \cdot \vec w + \psi)$. This command
is archaic. More control over perturbations may be had with the "set vertex
x ..." type of command.


<----------------------------------- M ------------------------------------>

Single letter main command. Syntax:

  M n

where n is the order of the model.  Sets model type to linear, quadratic,
or Lagrange depending on n.

<----------------------------------- m ------------------------------------>

Single letter main command. Toggles quadratic search for optimal global
motion scale factor. If search is toggled OFF, you will be prompted for a
fixed scale factor. If you give a value with the command, then you are
setting a fixed scale factor.

Graphics mode command. Center image in viewing window.

<--------------------------------- macros --------------------------------->

Macros are text substitutions done by replacing an identifier by a string
of characters before parsing. Macros are only defined in the datafile, and
do not work from the command prompt. Simple macros (no parameters) may be
defined as in C:

         #DEFINE  identifier  string

"identifier" must be an identifier without other special meaning to the
parser. "string" is the rest of the logical line, not including comments. It
will be substituted for identifier whenever identifier occurs as a token
subsequently. Substitutions are re-scanned. No checks for recursiveness are
made. There is a maximum length (currently 500 characters) on a macro
definition. Note: macro identifiers are separate tokens, so if "-M"
translates into "-2", this will be read as two tokens, not a signed number.
The keyword keep_macros in the datafile will keep macro definitions active
during runtime, until the next datafile is loaded.

<--------------------------- matrix_determinant --------------------------->

Syntax: det := matrix_determinant(A)

Built-in matrix determinant of a square array. Has function syntax, 
so it returns the value of the determinant. Example:

  Enter command: define aaa real[2][2]
  Enter command: aaa[1][1] := 2; aaa[1][2] := 3; aaa[2][1] := 4; aaa[2][2] := 5
  Enter command: print matrix_determinant(aaa)
                  -2

Also works on square 2D array attributes of elements.  Does not modify 
the array.

<----------------------------- matrix_inverse ----------------------------->

Main prompt function. For computing the inverse of a square matrix.
Currently applies only to global matrices, not element attribute matrices.
Syntax:

  retval := MATRIX_INVERSE(matrix1, matrix2)

Here matrix1 is the name of the original matrix, and matrix2 is the name
of the inverse matrix. They may be the same matrix to get an in-place
inverse.  The return value is 1 if the inversion is successful and
0 if matrix1 is singular.  Examples:
  define mata real[5][5]
  define matb real[5][5]
  ...  // fill in values of mata
  retval := matrix_inverse(mata,matb)
  retval := matrix_inverse(mata,mata)


<---------------------------- matrix_multiply ----------------------------->

Main prompt command. For computing the product of matrices. Currently
applies only to global matrices, not element attribute matrices. Syntax:

  MATRIX_MULTIPLY(matrix1, matrix2, matrix3)

Here matrix1 and matrix2 are the names of the multiplicands, and matrix3
is the name of the product matrix. The product matrix may be the same as
one (or both) of the multiplicands. The matrices can be one-dimensional or
two-dimensional, so you can do vector-matrix or matrix-vector
multiplication (but you can't do vector times vector). Examples:
  define mata real[5][5]
  define matb real[5][5]
  define matc real[5][5]
  ...  // fill in values of mata and matb
  matrix_multiply(mata,matb,matc)
  matrix_multiply(mata,mata,mata)

Obsolete now, since the * operator does matrix multiplication as well as
scalar multiplication.

<-------------------------------- MAXCOORD -------------------------------->

Internal constant governing the maximum dimension of ambient space.
By default, surfaces live in 3 dimensional space. However, the phrase
"SPACE_DIMENSION n" in the datafile header sets the dimension to n. This
means that all coordinates and vectors have n components. The only
restriction is that Evolver has to be compiled with the MAXCOORD macro
defined to be at least n in Makefile or in model.h. The default MAXCOORD is
4. Change MAXCOORD and recompile if you want more than four dimensions. The
actual space dimension can be accessed in commands through the read-only
variable space_dimension.

Graphics will display only the first three dimensions of spaces with more
than three dimensions, except for geomview, which has a four-dimensional
viewer built in (although its use is awkward now).

<-------------------------------- maximum --------------------------------->

 minimum(a,b), maximum(a,b): Extreme of two arguments.

<----------------------------- mean_curvature ----------------------------->

Vertex read-only attribute, available in the string and soapfilm model. 
The mean curvature is calculated as the magnitude of the gradient of area 
(or length in the string model) divided by the area (or length) associated 
with the vertex, which is one-third the area of the facets adjacent to the 
vertex (or one-half of the length of adjacent edges).  It is divided by 2 
in the soapfilm model to account for the "mean" part of the definition.  
The sign of the mean curvature is relative to the orientation of the first 
adjacent facet (or edge) Evolver finds. This calculation can be done even 
if the vertex is on a triple junction or other non-planar topology, even 
if it doesn't interpret well as mean curvature there.

<------------------------ mean_curvature_integral ------------------------->

Named method. Description: Integral of signed scalar mean curvature of a
2D surface. The computation is exact, in the sense that for a polyhedral
surface the mean curvature is concentrated on edges and singular there, but
the total mean curvature for an edge is the edge length times its dihedral
angle. 

Element: edge. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  quantity mci energy method mean_curvature_integral

The method mean_curvature_integral_a does the same thing, but uses a
numerical formulation which may be better behaved.

There is an obsolete use of mean_curvature_integral in the top of the
datafile to indicate the integral of the mean curvature should be 
included as an energy, with syntax
  mean_curvature_integral: modulus
where modulus is the multiplier for the energy.  The modulus winds up
as the internal read-write variable mean_curvature_modulus.

<------------------------- mean_curvature_modulus ------------------------->

There is an obsolete use of mean_curvature_integral in the top of the
datafile to indicate the integral of the mean curvature should be 
included as an energy, with syntax
  mean_curvature_integral: modulus
where modulus is the multiplier for the energy.  The modulus winds up
as the internal read-write variable mean_curvature_modulus.

<----------------------- mean_curvature_integral_a ------------------------>

Named method. Description: Integral of signed scalar mean curvature of a
2D surface. The computation is exact, in the sense that for a polyhedral
surface the mean curvature is concentrated on edges and singular there, but
the total mean curvature for an edge is the edge length times its dihedral
angle. 

Element: edge. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity mci energy method mean_curvature_integral_a

The method mean_curvature_integral_a does the same thing as 
mean_curvature_integral, but uses a numerical formulation which may be
better behaved.

<------------------------------ sq_mean_mix ------------------------------->

User-defined variable used by the mix_sq_mean_curvature method to
determine the combination of mean curvature approximations used.

<-------------------------------- memdebug -------------------------------->

Evolver toggle command. When ON, the 'c' command prints full memory usage
statistics on some systems. Also, each allocation or freeing of memory is
printed. Causes heap checking to be done on some systems at each memory
operation.


<-------------------------- memory debug option --------------------------->
<--------------------------------- option --------------------------------->

Command line option -m : Turn memory debugging on at start of program.
Same effect as runtime memdebug command.

<------------------------------ memory_arena ------------------------------>

Internal read-only variable. Total memory allocated to the
program's heap. Available only on SGI and Win32 versions.

<------------------------------ memory_used ------------------------------->

Internal read-only variable. Total memory used in the
program's heap. Available only on SGI and Win32 versions.

<------------------------------ merit_factor ------------------------------>

If the keyword MERIT_FACTOR is present in the top of the datafile,
then the i command will print the ratio total_area^3/total_volume^2,
which measures the efficiency of area enclosing volume. A holdover
from the early days of trying to beat Kelvin's partition of space.

<--------------------------------- method --------------------------------->

A "method" is a way of calculating a scalar value from some particular
type of element (vertex, edge, facet, body), and used as a component
of a named quantity. Each method is implemented internally as a set of
functions for calculating the value and its gradient as a function of
vertex positions. The most common methods also have Hessian functions.
Methods are referred to by their names.

See "implemented methods" for a list of available methods. Adding a new
method involves writing C routines to calculate the value and the gradient
(and maybe the Hessian) as functions of vertex coordinates, adding the
function declarations to quantity.h, and adding a structure to the method
declaration array in quantity.c. All the other syntax for invoking it from
the datafile is already in place.


<---------------------- method instance declaration ----------------------->
<---------------------------- method_instance ----------------------------->

Method instances are usually defined as part of the definition of a named
quantity, but there are circumstances where a quantity is composed of
several method instances and the method instances need to be referred to
individually; perhaps the user wants to know the values of the individual
instances. The general syntax for defining an instance of a named method in
a datafile is:

  METHOD_INSTANCE name METHOD methodname [MODULUS constexpr]
   [ELEMENT_MODULUS attrname]  [GLOBAL] [parameters]

Here, name is a user-assigned name for referring to this particular
instance. methodname is one of the pre-defined methods in Evolver. The
modulus value multiplies the method value to give the instance value. The
default modulus is 1. Individual elements may be given multipliers by
specifying an extra attribute attrname for the type of element; the
attribute must have been defined earlier. GLOBAL makes the method apply to
all elements of the appropriate type. Non-global instances may be applied
to elements individually by adding the instance name to the datafile line
defining an element. They may also be applied or unapplied at runtime with
the set and unset commands. Orientable methods can be applied with negative
orientation in the datafile by following the name with a dash. The
orientation in a set command follows the orientation the element is
generated with.

Each method may have various parameters to specialize it to an instance.
Currently the only parameters specified are:

 SCALAR_INTEGRAND: expr 

where expr is a scalar function of coordinates
(and of tangent or normal vector components in edge_general_integral or
facet_general_integral). Element attributes of the appropriate type element
may also be used.

 VECTOR_INTEGRAND:
 Q1: expr
 Q2: expr
 Q3: expr

where the expressions are functions of the coordinates. Element
attributes of the appropriate type element may also be used.

 FORM_INTEGRAND:
 Q1: expr
 Q2: expr
 Q3: expr
 ...
 
where the expressions are functions of the coordinates. Element
attributes of the appropriate type element may also be used. When used in
the facet_2form_integral method. The form components are listed in
lexicographic order, i.e. in 4D the six components 12,13,14,23,24,34 would
be listed as Q1 through Q6.

 PARAMETER_1 constexpr 

for specifying miscellaneous numeric parameters to certain methods.

 K_FORM_ORDER constexpr 

for methods that use differential k-forms, this specifies the value of k. 
Should occur before FORM_INTEGRAND when needed.


<---------------------------- method instances ---------------------------->

A "method instance" is the sum of a particular method applied to a
particular set of geometric elements. Some methods (like facet_area) are
completely self-contained. Others (like facet_vector_integral) require the
user to specify some further information. For these, each instance has a
specification of this further information. Method instances are defined in
the datafile, and may either be unnamed parts of named quantity definitions
or separate named method instances for inclusion in named quantities. The
separate named version is useful if you want to inspect instance values for
the whole surface or individual elements.

An instance total value can be referred to as "instancename.value" in 
commands. The instance name itself may be used as an element attribute. 
For example, supposing there is an instance named moment, which applies to 
facets. Then typical commands would be
  print moment.value
  print facet[3].moment
  list facet where moment > 0.1

Every method instance has a "modulus", which is multiplied times the basic
method value to give the instance value. A modulus of 0 causes the entire
instance calculation to be omitted whenever quantities are calculated. The
modulus may be set in the datafile or by assignment.
Example commands:
  print moment.modulus
  moment.modulus := 1.3

A method instance may be declared to use a different modulus for each
element by specifying an element extra attribute to use for that purpose.
The extra attribute has to have already been declared. Example:

  define facet attribute mymod real
  quantity myquant energy method facet_area global element_modulus mymod

Of course, it is up to the user to properly initialize the values of the
extra attribute.



<---------------------- method_instances_predicted -------------------------->

Datafile keyword in the top section of the datafile that specifies the
initial allocation of method instance structures.  Optional.  The purpose is 
to prevent repeated reallocation of memory as the instance list grows.
Not significant if there are only a few method instances,  but there are
times when there can be thousands of instances, such as when 
"everything_quantities" is used with a large foam. Automatically put in
dump files by the "d" or "dump" commands, based on the current number of 
method instances. This declaration obviously should come before any quantities
are defined.
Example:
    vertices_predicted 30748
    edges_predicted    92166
    facets_predicted   61446
    bodies_predicted    2048 
    facetedges_predicted  184320
    method_instances_predicted   4098
    quantities_predicted   2050

<--------------------------------- metis ---------------------------------->

Main prompt command. Partitions the set of facets (edges in string model)
into n parts using the METIS library of Karypis and Kumar, if this library
has been compiled into the Evolver. Meant for experiments in partitioning
the surface for multiprocessors. The partition number of facet is left in
the facet extra attribute fpart (edge epart for string model), which will
be created if it does not already exist. METIS uses the PMETIS algorithm,
KMETIS uses the KMETIS algorithm. Syntax:

  METIS n
  KMETIS n

Example:
  metis 20;
  set facet color (fpart imod 15) + 1;

For partitioning bodies, see body_metis.


<------------------------------ metis_factor ------------------------------>

Evolver toggle command.
Computes and uses an ordering for Hessian factoring using the METIS
library of Karypis and Kumar, if this library has been compiled into
the Evolver.

<----------------------------- metis_readjust ----------------------------->

Main prompt command for MPI Evolver.  Does a repartition of the surface
among the tasks, but using a METIS partitioning algorithm in a way that 
is supposed to be based on the current partition rather than repartioning 
from scratch. Syntax:
   metis_readjust n
where n is the desired number of partitions; n must be between
1 and mpi_maxtask.

<--------------------------------- metric --------------------------------->

For length and area to make sense, the ambient space must be endowed
with a metric.  The Evolver offers several choices, but keep in mind
that they are only used to calculate default length and area.  Other
quantities that depend on the metric, such as volume, are up to the
user to put in by hand with named quantities.  All displaying is done
as if the metric is Euclidean.   Available metrics:

  Euclidean metric (default)
  Riemannian metric
  Conformal metric
  Klein hyperbolic metric

<--------------------------- metric declaration --------------------------->

A Riemannian metric on the ambient space may be declared in the
top section of the datafile with the syntax

  METRIC
  expr expr expr
  expr expr expr
  expr expr expr

or

  CONFORMAL_METRIC expr

or

  KLEIN_METRIC

The keyword METRIC is followed by the N^2 components of the metric tensor,
where N is the dimension of space. The components do not have to obey any
particular line layout; they may be all on one line, or each on its own
line, or any combination. It is up to the user to maintain symmetry. A
conformal metric is a scalar multiple of the identity matrix, and only the
multiple need be given. A conformal metric will run about twice as fast.
The Klein metric is a built-in metric for hyperbolic n-space modelled on
the unit disk or ball.


<--------------------------- metric_conversion ---------------------------->
<----------------------------- metric_convert ----------------------------->

Evolver toggle command. If a Riemannian metric is defined, whether to use
the metric to do gradient form to vector conversions. Synonym:
metric_conversion.

<--------------------------- metric_edge_length --------------------------->

Named method. Description: In the string model with a Riemannian metric,
this is the length of an edge. 

Element: edge. 
Parameters: none. 
Models: string, soapfilm, simplex; linear,Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  string
  space_dimension 2
  metric
  1+x^2 y
  y   1+y^2
  quantity mel energy method metric_edge_length global


<--------------------------- metric_facet_area ---------------------------->

Named method. Description: For a Riemannian metric, this is the area of a
facet. 

Element: edge. 
Parameters: none. 
Models: soapfilm, simplex; linear,Lagrange.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

   metric
   1+x^2 0 z
   0 1+y^2 0
   z 0 1+z^2
   quantity mfa energy method metric_facet_area global


<-------------------------------- mid_edge -------------------------------->

Vertex read-only attribute. True (1) if the vertex is on an edge but not
an endpoint. Relevant in the quadratic model or Lagrange model. Example:

   list edge[23].vertex vv where vv.mid_edge


<------------------------------- mid_facet -------------------------------->

Vertex read-only attribute. True (1) if the vertex is an interior control
point of a facet in the Lagrange model. Example:

   list facet[23].vertex vv where vv.mid_facet


<---------------------------------- midv ---------------------------------->

Edge read-only attribute. In the quadratic model, gives the id of the
midpoint vertex of an edge. Example:
  print edge[23].midv

<--------------------------- mindeg_debug_level --------------------------->

Internal read-write variable controlling verbosity of messages during
Hessian sparse matrix factoring when my own minimal degree algorithm
is in effect (ysmp off). 0 for no messages, 7 for most.  Special 
value of -1 toggles graphical display of stages of factorization;
sets all edges between non-eliminated vertices to red, others to black.  
Pauses for user response.  For my own use, not users.

<----------------------------- mindeg_margin ------------------------------>

Internal read-write variable controlling how high to go above minimum 
degree in seeking good elimination when my own minimal degree Hessian
factoring algorithm is in effect (ysmp off).  Default 5. For my use,
not users.

<------------------------- mindeg_min_region_size ------------------------->

Internal read-write variable controlling smallest size region desired
when my own minimal degree Hessian factoring algorithm is in effect 
(ysmp off); smaller regions will be merged with parent node. Default 0.
For my use, not users. 


<-------------------------------- minimum --------------------------------->

minimum(a,b),maximum(a,b): Extreme of two arguments.


<------------------------- mix_sq_mean_curvature -------------------------->

Named method. Description: Integral of squared mean curvature of a
surface, with a slightly different definition from sq_mean_curvature or
eff_area_sq_mean_curvature or normal_sq_mean_curvature.
It uses a linear combination of two formulas for the mean curvature:

  h = ((F dot F)/(N dotF)*sq_mean_mix + (F dot F)/(N dot F)*(1-sq_mean_mix))/2

  E = h^2*A/3

Here F is the force vector, i.e. the area gradient vector, and N is the 
unit normal, defined by the volume gradient.  sq_mean_mix is a user variable
that controls the combination; its default value is zero. WARNING: For some
extreme shapes, Evolver may have problems detecting consistent local surface
orientation. The assume_oriented toggle lets Evolver assume that the facets
have been defined with consistent local orientation.

If the parameter or vertex attribute h_zero is defined, then the value per
vertex is

  E = (h-h_0)^2*A/3 

If the vertex is on one or several constraints, the F and N are projected
to the constraints, essentially making the constraints act as mirror
symmetry planes.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

  parameter sq_mean_mix = 0.5
  quantity mixsq energy method mix_sq_mean_curvature global


<-------------------------------- mobility -------------------------------->

There is a choice to be made in the conversion of the forces on vertices
into velocities of vertices. Technically, force is the gradient of energy,
hence a covector on the manifold of all possible configurations. In the
Evolver representations of surfaces, that global covector can be
represented as a covector at each vertex. The velocity is a global vector,
which is represented as a vector at each vertex. Conversion from the global
covector to the global vector requires multiplication by a metric tensor,
i.e. singling out a particular inner product on global vectors and
covectors. The tensor converting from force to velocity is the mobility
tensor, represented as the mobility matrix M in some coordinate system. Its
inverse, converting from velocity to force, is the resistance tensor S =
M^{-1}. The same inner product has to be used in projecting the velocity
tangent to the constraints, whether they be level set constraints on
vertices or constraints on body volumes or quantity integrals. There are
several choices implemented in the Evolver, corresponding to several
different physical pictures of how the medium resists the motion of the
surface through it:
 unit mobility
 area normalization
 area normalization with effective area
 approximate polyhedral curvature
 user-defined mobility

<-------------------------- mobility declaration -------------------------->
<---------------------------- mobility_tensor ----------------------------->

A mobility matrix may be defined in the top section of the datafile by the
syntax

MOBILITY_TENSOR
expr expr expr
expr expr expr
expr expr expr

 or

MOBILITY expr

The first form gives the full mobility matrix, and the second form gives
the matrix as a scalar multiple of the identity matrix. The formulas are
evaluated at each vertex at each iteration, and so formulas may depend on
vertex position and any vertex attributes.  The velocity of a vertex
is calculated as velocity = mobility x force.


<---------------------------------- mod ----------------------------------->

%, mod: Real arithmetic modulus, x % y = x - floor(x/y)*y.


<--------------------------------- models --------------------------------->

The Surface Evolver can handle several different models of surfaces.
See "linear model", "quadratic model", or "lagrange model" for different
orders of polynomial representation, and 
"string model", "soapfilm model", or "simplex model" for different 
combinatorial types.

<-------------------------------- modulus --------------------------------->

A keyword that is an attribute of a named quantity or a method instance,
which is a multiplier for the calculated value.  Default value is 1. 
It can be set initially in a quantity (or method_instance) declaration 

    quantity bopeep energy modulus 23 method hooke_energy

or by run-time assignment:

    bopeep.modulus := 12


<----------------------------- mound example ------------------------------>

Example: Mound with gravity.

This example is a mound of liquid sitting on a tabletop with gravity
acting on it. The contact angle between the drop surface and the tabletop
is adjustable, to simulate the different degrees to which the liquid wets
the table. This example illustrates macros, variables, constraints with
energy, and omitting faces from body surfaces.

The drop starts as a cube with one face (face 6 of the cube example) on
the tabletop (the z = 0 plane). The most straightforward way to specify a
contact angle is to declare face 6 to be constrained to stay on the
tabletop and give it a surface tension different than the default of 1. But
this leads to problems described below. The way the contact angle is
handled instead is to omit face 6 and give the edges around face 6 an
energy integrand that results in the same energy we would get if we did
include face 6. If we let the interface energy density for face 6 be T,
then we want a vectorfield w such that

        /             /
        |  T k . dS = | w . dl
        / face 6      / bdry of face 6

So by Green's Theorem, all we need is curl w = Tk, and I will use w = -Tyi. 
Here i j k are the standard unit basis vectors. In practice, I don't think 
about Green's Theorem as such; I just write down a line integral that
sums up strips of surface.

I have chosen to parameterize the contact angle as the angle in degrees
between the table and the surface on the interior of the drop. This angle
can be adjusted by assigning a new value to the variable "angle" at
runtime. I could have made WALLT the parameter directly, but then I
wouldn't have had an excuse to show a macro.

Here is the datafile mound.fe:

// mound.fe
// Evolver data for drop of prescribed volume sitting on plane with gravity.
// Contact angle with plane can be varied.

PARAMETER angle = 90    // interior angle between plane and surface, degrees

gravity_constant 0  // start with gravity off

#define WALLT  (-cos(angle*pi/180))  // virtual tension of facet on plane

constraint 1   /* the table top */
formula: x3 = 0
energy:  // for contact angle
e1: -(WALLT*y)
e2: 0
e3: 0

vertices
1   0.0  0.0 0.0  constraint 1  /* 4 vertices on plane */
2   1.0  0.0 0.0  constraint 1
3   1.0  1.0 0.0  constraint 1
4   0.0  1.0 0.0  constraint 1
5   0.0  0.0 1.0
6   1.0  0.0 1.0
7   1.0  1.0 1.0
8   0.0  1.0 1.0
9   2.0  2.0 0.0  fixed   /* for table top */
10  2.0 -1.0 0.0  fixed
11 -1.0 -1.0 0.0  fixed
12 -1.0  2.0 0.0  fixed

edges  /* given by endpoints and attribute */
1   1 2    constraint 1 /* 4 edges on plane */
2   2 3    constraint 1
3   3 4    constraint 1
4   4 1    constraint 1
5   5 6
6   6 7
7   7 8
8   8 5
9   1 5
10  2 6
11  3 7
12  4 8
13  9 10   fixed  /* for table top */
14 10 11   fixed
15 11 12   fixed
16 12  9   fixed

faces  /* given by oriented edge loop */
1   1 10 -5  -9
2   2 11 -6 -10
3   3 12 -7 -11
4   4  9 -8 -12
5   5  6  7   8
7  13 14 15  16  density 0 fixed /* table top for display */

bodies  /* one body, defined by its oriented faces */
1   1 2 3 4 5   volume 1  density 1

read
re := refine edges where on_constraint 1

// end of datafile


The mound itself was basically copied from cube.fe, but with face 6
deleted. The reason for this is that face 6 is not needed, and would
actually get in the way. It is not needed for the volume calculation since
it would always be at z = 0 and thus not contribute to the surface integral
for volume. The bottom edges of the side faces are constrained to lie in
the plane z = 0, so face 6 is not needed to keep them from catastrophically
shrivelling up. We could have handled the contact angle by including face 6
with a surface tension equal to the interface energy density between the
liquid and surface, but that can cause problems if the edges around face 6
try to migrate inward. After refinement a couple of times, interior
vertices of the original face 6 have no forces acting on them, so they
don't move. Hence it would be tough for face 6 to shrink when its outer
vertices ran up against its inner vertices. The tabletop face, face 7, is
entirely extraneous to the calculations. Its only purpose is to make a nice
display. You could remove it and all its vertices and edges without
affecting the shape of the mound. It's constraint 1 that is the tabletop as
far as the mound is concerned. To see what happens with the bottom face
present, load moundB.fe and do "run".

Now run Evolver on mound.fe. The command "re" defined at the end of the
datafile is good to use first in order to refine some edges that need it.
Refine and iterate a while. You should get a nice mound. It's not a
hemisphere, since gravity is on by default with G = 1. If you use the G
command to set "G 0" and iterate a while, you get a hemisphere. Try
changing the contact angle, to 45 degrees (with the command "angle := 45"}
or 135 degrees for example. You can also play with gravity. Set "G 10" to
get a flattened drop, or "G -5" to get a drop hanging from the ceiling. "G
-10" will cause the drop to try to break loose, but it can't, since its
vertices are still constrained.

<---------------------------------- move ---------------------------------->

Main prompt command. For moving along the current direction of motion.
Syntax:

  MOVE expr

Moves the surface along the previous direction of motion by the stepsize
given by expr. The previous direction can be either from a gradient step (g
command) or a hessian step (hessian, saddle, hessian_seek, hessian_menu
option 4, etc.). The stepsize does not affect the current scale factor. A
negative step is not a perfect undo, since it cannot undo projections to
constraints. "Move" sometimes does not work well with optimizing parameters
and hessian together.


<---------------------------------- MPI ----------------------------------->

MPI (Message Passing Interface) is a portable message-passing interface
for distributed parallel processing. The MPI Evolver is not too
sophisticated yet, passing all data to all processes. Hence it should be
regarded as experimental rather than practical. Improvements are planned
some day. The only practical use of it so far has been massive knot energy
calculations, where every process does need to have all data. Interested
users should contact brakke@susqu.edu.

<------------------------------ MPI commands ------------------------------>
 
All user commands are entered into the master task and executed by the
master task. Some commands (listed below) have been modified to execute in
parallel across all tasks in a coordinated way. The rest will just execute
on the master task. 

Variables exist independently on each task; they are not automatically
synchonized. 

Special MPI version commands: 
task_exec n,string : Have task n execute the string as a command. Any
aggregate commands execute across all local and imported elements. 

<---------------------------- MPI compilation ----------------------------->

All regular Evolver files, but not metis.c, along with the mpi*.c files
(except mpi_sparse.c, for now) should be compiled with these manifest
constants defined in the compiler command in your makefile: 
 
   MPI_EVOLVER 
   TASK_ID_BITS=22 
   LONG_ID 

The resulting object files should be linked with the appropriate MPI
library. The same executable is used for the master and slave tasks. Note:
the variables nproc and procs_requested you might find in variable.c have
nothing whatsoever to do with MPI; do not change them. 

If you want to easily repartition the surface among the tasks, it is
advisable to link in the PARMETIS and METIS libraries, which can be found
here. In this case, you should also define these manifest constants in
compiling: 
 
   METIS 
   PARMETIS 

<----------------------------- MPI datafiles ------------------------------>
 
There are several ways to set up the datafiles: 

1. Use the same regular Evolver datafile for each task. Then the entire
surface is allocated to task 1 (the first slave task), but all tasks read
the same header information. The surface can be reallocated among the slave
tasks with the "repartition" command described below. 
 
2. Have all the surface in one datafile, but with the various elements
labelled with the task they are allocated to. The labelling is done by
appending "@n" to each element number, where n is the task number. One
advantage of this type of datafile is that it can be read by the regular
Surface Evolver, which just ignores the "@n" labels. For example: 
 
Vertices 
1@4    0.0000000000    0.0000000000    1.0000000000  fixed 
2@1    2.0000000000    0.0000000000    0.0000000000  fixed 
3@2    2.0000000000    2.0000000000    1.0000000000  fixed 
4@3    0.0000000000    2.0000000000    0.0000000000  fixed 
... 
Edges 
1@4   1@4 546@4  fixed 
2@1   2@1 547@1  fixed 
3@2   3@2 548@2  fixed 
4@3   4@3 549@3  fixed 
... 
Faces 
1@4   -3139@4 -3137@4 -3138@4 
2@1   -3142@1 -3140@1 -3141@1 
3@2   -3145@2 -3143@2 -3144@2 
4@3   -3148@3 -3146@3 -3147@3 
... 
Bodies 
1@1  362@3 384@3 383@3 382@2 381@3 ... 

3. Have distinct datafiles for each task. The datafile structure is the same
as in method 2, but elements not allocated to a particular task are
omitted. It is legal to have the same element numbers used on different
tasks; that is, vertex 23@2 is an entirely distinct element from vertex
23@4. Each datafile should have identical header info. 
 
In any case, only the master task reads material in the "read" section at
the bottom of the datafile. Slave tasks do NOT read the "read" section.
This is so that the master task has complete control, and the same file can
be read by all tasks. If slave tasks need to do initialization, the master
task should instruct it with one of the methods described below. 
 

<------------------------------ MPI Evolver ------------------------------->

MPI Surface Evolver - Experimental version of Surface Evolver
that distributes a surface among multiple processors and machines.
See:
MPI Overview
MPI Compilation
MPI Datafiles
MPI Invocation
MPI Execution of commands
MPI Graphics

<------------------------------ MPI graphics ------------------------------>

There are two ways to get screen graphics with MPI Evolver: 
 
1. Use the regular screen graphics on a task. This will display on the same
machine as the task is executing on. Most useful when executing a few tasks
all on one machine for testing purposes. Use the "showq" command to avoid
going into the graphics prompt. For example, 

    parallel_exec "showq" 

to see all the pieces. 
 
2. Use the screen graphics on the master task, and have it import data from
other tasks. I've only tested this for the OpenGL graphics. First, start
graphics in the master task with 's'. This will show the task 1 part of the
surface by default. The task to display may be chosen in the graphics
display by hitting 'M' for menu mode, then using the right mouse key to
display the main menu, then going to the MPI task submenu near the bottom,
and picking the task you want. 
 
The 'y' key toggles showing of the thick corona, if it is present. 

<----------------------------- MPI invocation ----------------------------->
 
However you invoke MPI tasks, each task (master and slave) should have the
name of a datafile on its command line. The datafiles can be different for
each task, or the same one, as described above. If the datafile name
contains "%d", then that will be automatically replaced by the task number
to form the actual datafile name (actually, any version of the C printf %d
format can be used, e.g. %03d to guarantee 3 digits for the task number).
This permits a single MPI command line to load different datafiles on
different tasks. Each task's datafile must be accessible from the machine
it runs on. The master task, task 0, should be run on the machine being
used as the console. 
 

<------------------------------ MPI overview ------------------------------>

MPI (Message Passing Interface) is a protocol for passing messages between
multiple processes, usually on different machines. The MPI version of the
Surface Evolver can execute Evolver on multiple processors on multiple
machines, all working on the same surface, with one machine controlling the
others. It is assumed the user is familiar with MPI, and has MPI installed.

MPI Evolver is still early in development, and still does not do things
necessary for production use. In particular, it does not do topology
changes safely. Anybody using MPI Evolver at this point is doing so just
because they like playing with new toys.
 
MPI Evolver is organized to run task 0 as the master task that interacts
with the user through the command line interface, and a set of slave tasks.
Each slave task is a full version of the Evolver, except it receives its
commands from the master task and there is synchronization of data between
the tasks at key points. Each slave task has a piece of the whole surface,
but the master task does not. Vertices, edges, and facets are allocated
among the slave tasks, but all tasks (including the master task) know about
all bodies (for now, at least). 
 
The surface on each task is divided into "native" elements, that belong to
the task, and "corona" elements copied from other tasks. There are three
levels of corona state currently implemented: 
Level 0: No corona elements. This is the state immediately after the
datafiles are read in, but ordinarily the user never sees it. 
Level 1: Corona vertices and edges of native facets are present. This
suffices for calculation of ordinary surface tension evolution, and is the
default state the user sees after loading. 
Level 2: All corona edges and facets adjacent to native vertices are
present, along with their vertices. This state is needed for certain
energies like squared mean curvature that need more extensive information
around a vertex. In the OpenGL graphics display, the key 'y' toggles
showing the level 2 corona. 
 
 
<------------------------------- mpi_debug -------------------------------->

Main prompt command that toggles the printing of trace messages
by MPI activity in MPI Evolver.  Don't do this.

<------------------------------ mpi_maxtask ------------------------------->

MPI Evolver read-only variable. Highest task number, so task 
numbers run from 0 to mpi_maxtask.  Since task 0 does not have
a piece of the surface, mpi_maxtask is also the number of pieces
the surface can be divided into. 

<-------------------------------- mpi_task -------------------------------->

MPI Evolver read-only element attribute, whose value is which task 
this element belongs to. For example, if you wanted to see which 
vertices task 5 imports from task 2, you could say 
 
         task_exec 5,"list vertex where mpi_task == 2" 

 
<------------------------- multiprocessor option -------------------------->
<--------------------------------- option --------------------------------->

Command line option -pn : Forces use of n processes for an Evolver
compiled in multi-processor mode. n may be larger or smaller than the
physically available number of processors. The default is 1. This option
should be regarded as experimental; there is still too much overhead for
it to be useful usually.

<----------------------------------- N ------------------------------------>

Single letter main command. Set all body target volumes to current actual
volumes.

<----------------------------------- n ------------------------------------>

Single letter main command. Notching ridges and valleys. Finds edges that
have two adjacent facets, and those facets' normals make an angle greater
than some cutoff angle. You will be prompted for the cutoff angle (radians)
if you don't give a value with the command. Qualifying edges will have the
adjacent facets subdivided by putting a new vertex in the center. Should
follow with equiangulation. In the string model, it will refine edges next
to vertices with angle between edges (parallel orientation) exceeding the
given value. Optionally takes cutoff angle on command line.

<----------------------------- named methods ------------------------------>

A "method" is a way of calculating a scalar value from some particular
type of element (vertex, edge, facet, body). Each method is implemented
internally as a set of functions for calculating the value and its gradient
as a function of vertex positions. The most common methods also have
Hessian functions. Methods are referred to by their names.

See "Implemented methods" for a list of available methods. Adding a new
method involves writing C routines to calculate the value and the gradient
(and maybe the Hessian) as functions of vertex coordinates, adding the
function declarations to quantity.h, and adding a structure to the method
declaration array in quantity.c. All the other syntax for invoking it from
the datafile is already in place.


<---------------------------- named quantities ---------------------------->

A "named quantity" is the sum total of various method instances, although
usually just one instance is involved. The instances need not apply to the
same type of element; for example, both facet and edge integrals may be
needed to define a volume quantity. Each named quantity is one of four
types:
 1. "energy" quantities which are added to the total energy of the surface;
 2. "fixed" quantities that are constrained to a fixed target value (by
    Newton steps at each iteration); and
 3. "conserved" quantities are like fixed, but the value is irrelevant. The
    quantity gradient is used to eliminate a degree of freedom in motion.
    Rarely used, but useful to eliminate rotational degree of freedom, for
    example. Will not work with optimizing parameters, since they do gradients
    by differences.
 4. "info_only" quantities whose values are merely reported to the user.
    This type is initially set in a quantity's datafile declaration. A quantity
    can be toggled between fixed and info_only with the "fix quantityname" 
    and "unfix quantityname" commands.

The value of a quantity may be displayed with the A or v commands, or as
an expression "quantityname.value". Furthermore, using the quantity name as
an element attribute evaluates to the sum of all the applicable component
instance values on that element. For example, supposing there is a quantity
named vol, one could do
  print vol.value
  print facet[2].vol
  histogram(facet,vol)

Each quantity has a "modulus", which is just a scalar multiplier for the
sum of all instance values. A modulus of 0 will turn off calculation of all
the instances. The modulus can be set in the datafile declaration, or by 
assignment:
   quantityname.modulus := 1.2

Each fixed quantity has a target value, to which the Evolver attempts to
constraint the quantity value. Each time an iteration is done ( g command
or the various Hessian commands), Newton's Method is used to project the
surface to the constrained values. The target value can be displayed with
the A or v commands, or as "quantityname.target". It can be changed by 
assignment. Example:
  print qname.target
  qname.target := 3.12

A quantity can have a constant value added to it, similar to the body
attribute volconst. This quantity attribute is also called volconst. It is
useful for adding in known values of say integrals that are omitted from
the actual calculation. It can be set in the quantity's datafile
definition, or by an assignment command.

Each fixed quantity has a Lagrange multiplier associated to it. The
Lagrange multiplier of a constraint is the rate of energy change with
respect to the constraint target value. For a volume constraint, the
Lagrange multiplier is just the pressure. Lagrange multipliers are
calculated whenever an iteration step is done. They may be displayed with
the v command in the "pressure" column, or as an expression
"quantityname.pressure".

A fixed quantity can have a tolerance attribute, which is used to judge
convergence. A surface is deemed converged when the sum of all ratios of
quantity discrepancies to tolerances is less than 1. This sum also includes
bodies of fixed volume. If the tolerance is not set or is negative, the
value of the variable target_tolerance is used, which has a default value
of 0.0001.

The sample datafile column.fe contains some examples of named quantities
and instances.

It is planned that eventually all energies and global constraints will be
converted to named quantity system. However, existing syntax will remain
valid wherever possible. Starting Evolver with the -q option will do this
conversion now.

Some methods, those that logically depend on the orientation of the
element, can be applied with a relative orientation. When applied to
individual elements in the datafile, a negative orientation is indicated by
a '-' after the instance name. When applied at runtime with the set
command, the orientation will be negative if the element is generated with
negative orientation, i.e. set body[1].facet method_instance qqq. The
methods currently implementing this feature are: edge_vector_integral,
string_gravity, facet_vector_integral, facet_2form_integral, facet_volume,
facet_torus_volume, simplex_vector_integral, simplex_k_vector_integral,
edge_k_vector_integral, gravity_method, and full_gravity_method.



<------------------------ named quantities option ------------------------->
<--------------------------------- option --------------------------------->

Command line option -q : Convert everything to named quantities internally.
There are a few things for which no quantities exist yet; they will produce
error messages.


<----------------------- named quantity declaration ----------------------->

The syntax for defining a named quantity in the datafile is:

 QUANTITY name   ENERGY|FIXED=value|CONSERVED|INFO_ONLY 
    [LAGRANGE_MULTIPLIER constexpr] [TOLERANCE constexpr]  
    [MODULUS constexpr] methodlist | FUNCTION methodexpr

 Here name is an identifier assigned by the user in order to refer to the
quantity. Any quantities must be declared to be one of three types:
 > ENERGY quantities are added to the overall energy of the surface;
 > FIXED quantities that are constrained to a fixed target value;
 > CONSERVED quantities are like FIXED in that the motion is projected to
   conserve the quantity, but the actual value is not projected to a given
   value.
 > INFO_ONLY quantities whose values are merely reported to the user.

For fixed quantities, the optional Lagrange multiplier value supplies the
initial value of the Lagrange multiplier (the "pressure" attribute of the
quantity). It is meant for dump files, so on reloading no iteration need be
done to have a valid Lagrange multiplier.

For fixed quantities, the tolerance attribute is used to judge
convergence. A surface is deemed converged when the sum of all ratios of
quantity discrepancies to tolerances is less than 1. This sum also includes
bodies of fixed volume. If the tolerance is not set or is negative, the
value of the variable target_tolerance is used, which has a default value
of 0.0001.

Each quantity has a modulus, which is just a scalar multiplier of the
whole quantity. A modulus of 0 will turn off an energy quantity. The
default modulus is 1.

The methodlist version of the quantity definition may contain one or more
method instances. To incorporate a previously explicitly defined instance,
include METHOD instancename. GLOBAL_METHOD may be used instead of METHOD to
indicate the method applies to all elements of the appropriate type; it is
equivalent to using GLOBAL in the method definition. To instantiate a
method in the quantity definition, you essentially incorporate the instance
definition, but without an instance name. Example of a quantity with one
predefined method instance and one implicitly defined instance:
   method_instance qwerty method facet_scalar_integral
     scalar_integrand: x^2
   quantity foobar energy method qwerty method edge_scalar_integral
     scalar_integrand: y^3

Usually the second, implicit definition will be more convenient. Several
method instances may be included in one methodlist (up to a current limit
of 50), and their values are added together and multiplied by the quantity
modulus to get the quantity value. The FUNCTION methodexpr variant defines
the quantity as a function of previously defined method instances. Example:

   method_instance qwerty method facet_scalar_integral
     scalar_integrand: x^2
   quantity foobar energy function qwerty^3


Non-global quantities may be applied to elements individually by adding
the quantity name to the datafile line defining an element. They may also
be applied or unapplied at runtime with the set and unset commands.
Orientable methods can be applied with negative orientation in the datafile
by following the name with a dash. The orientation in a set command follows
the orientation the element is generated with.

Methods applying to different types of elements may be combined in one
quantity. If such a quantity is applied to an element, then all method
instances of that quantity of the appropriate type are applied to the
element. Original attachments of quantities are remembered, soIf an edge
method is applied to a facet, then edges created from refining that facet
will inherit the edge method.

<------------------------------ neo_hookean ------------------------------->
<------------------------------- neo_lambda ------------------------------->
<--------------------------------- neo_mu --------------------------------->

Named method. Contributed by Prof. Rabah Bouzidi. I don't seem to have the
compact formula for this one. Needs neo_lambda, neo_mu, and form_factors.

Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration: 
 
   quantity bender energy method neo_hookean global 


<-------------------------------- new_body -------------------------------->

Main prompt command. For creating a new body. The syntax is that of a
function instead of a verb, since it returns the id number of the new body.
There are no arguments. Syntax:

  newid := NEW_BODY

The body is created with no facets. Use the set facet frontbody and set
facet backbody commands to install the body's facets. The new body has the
same default properties as if it had been created in the datafile with no
attributes, so you will need to explicitly add any attributes you want,
such as density or target volume. Example:
  newb := new_body
  set facet frontbody newb where color == red


<-------------------------------- new_edge -------------------------------->

Main prompt command. For creating a new edge. The syntax is that of a
function instead of a verb, since it returns the id number of the new edge.
The arguments are the id's of the tail and head vertices. Syntax:

  newid := NEW_EDGE(expr, expr)

The new edge has the same default properties as if it had been created in
the datafile with no attributes, so you will need to explicitly add any
attributes you want. Example to create a set of coordinate axes in 3D:
  newv1 := new_vertex(0,0,0); fix vertex[newv1];
  newv2 := new_vertex(1,0,0); fix vertex[newv2];
  newv3 := new_vertex(0,1,0); fix vertex[newv3];
  newv4 := new_vertex(0,0,1); fix vertex[newv4];
  newe1 := new_edge(newv1,newv2); fix edge[newe1];
  newe2 := new_edge(newv1,newv3); fix edge[newe2];
  newe3 := new_edge(newv1,newv4); fix edge[newe3];
  set edge[newe1] no_refine; set edge[newe1] bare;
  set edge[newe2] no_refine; set edge[newe2] bare;
  set edge[newe3] no_refine; set edge[newe3] bare;


<------------------------------- new_facet -------------------------------->

Main prompt command. For creating a new facet. The syntax is that of a
function instead of a verb, since it returns the id number of the new
facet. The arguments are the oriented id's of the edges around the boundary
of the facet, in the same manner that a face is defined in the datafile.
The number of edges is arbitrary, and they need not form a closed loop in
the string model. In the soapfilm model, if more than three edges are
given, the new face will be triangulated by insertion of a central vertex.
In that case, the returned value will be the original attribute of the new
facets. In the simplex model, the arguments are the id's of the facet
vertices. Syntax:

  newid := NEW_FACET(expr, expr,...)

The new facet has the same default properties as if it had been created in
the datafile with no attributes, so you will need to explicitly add any
attributes you want. Example:
  newf := new_facet(1,2,-3,-4); fix facet where original == newf;


<------------------------------- new_vertex ------------------------------->

Main prompt command. For creating a new vertex. The syntax is that of a
function instead of a verb, since it returns the id number of the new
vertex. The arguments are the coordinates of the vertex. The new vertex is
not connected to anything else; use the new_edge command to connect it.
Syntax:

  newid := NEW_VERTEX(expr, expr,...)

Examples:
  newid1 := new_vertex(0,0,1)
  newid2 := new_vertex(pi/2,0,max(vertex,x))



<------------------------- no autoconvert option -------------------------->
<--------------------------------- option --------------------------------->

Command line option -a- :
Do not enable automatic conversion to named methods and quantities mode when a
situation requiring it arises; prompt instead.


<------------------------- no renumbering option -------------------------->
<--------------------------------- option --------------------------------->

command line option -i :
Keeps elements numbers as listed in the datafile, instead
of renumbering them consecutively.  The same effect can be achieved
by putting the keyword keep_originals in the top of the datafile.


<------------------------------- no_dump ------------------------------->

Variable boolean attribute.  When set, it prevents the value of a variable
from being written out by the "dump" or "d" commands.  Useful with the
"replace_load" and "add_load" commands when reloading dumps of the current
file and you want to preserve variable values that would otherwise be
overwritten by loading the dump file, which has variables declared in
the top of the datafile by default.  "no_dump" variables are instead
written in the "read" section of the dump file, so the dump file will
load as a stand-alone file  Works on global variables and
arrays.  Syntax (run-time commands; not in top of datafile):
   variable.no_dump on
   variable.no_dump off
The no_dump declaration must come after the variable exists.
Example:
   frame := 1;
   frame.no_dump;
   dump "temp.dmp";
   frame := 2;
   replace_load "temp.dmp"


<------------------------------- no_display ------------------------------->
<------------------------------- nodisplay -------------------------------->

Facet read-write attribute.  When set, suppresses the display of the
facet in graphics.  Can be set in the datafile by adding "no_display"
to the line defining the facet. Can also be manipulated by the set
and unset commands. Nodisplay is a synonym.
Example:

   set facet nodisplay where color != red

<----------------------------- no_hessian_normal ----------------------------->

If you wish to run in hessian_normal mode but exempt particular vertices
from the restriction, you can "set" the vertices' no_hessian_normal
attribute, for example
   set vertex no_hessian_normal where z > 1.2


<------------------------------- no_refine -------------------------------->

Edge and facet read-write Boolean attribute. An edge with the "no_refine"
attribute will not be refined by the r command. This is useful for avoiding
needless refining of lines or planes that are used only for display. Giving
a facet the no_refine attribute has no effect except that edges created
within the facet by refining will inherit the no_refine attribute. So to
avoid refinement of a plane, all edges and facets in the plane must be
given the no_refine attribute. The no_refine attribute may be specified on
the datafile line for an edge or facet, or the set command may be used.
Examples:
  set edge no_refine where fixed
  unset edge[2] no_refine
  list edge where no_refine
  print edge[3].no_refine

<------------------------------ no_transform ------------------------------->

Edge and facet read-write Boolean attribute. An edge or facet with the 
"no_transform" attribute will not be duplicated by the view_transform
mechanism; only the original element will occur.  For example, you might
have edges that form a display of coordinate axes, which you would not want
duplicated.
Example:
   set edge no_transform where valence == 0


<------------------------------ node_charge ------------------------------->

An extra attribute used by the knot_energy named method.

<------------------------------- noncontent ------------------------------->

Edge read-write attribute. When set, indicates this facet should not be
used in volume calculations in the soapfilm model or facet area
calculations in the string model. Useful, for example, if you want to have
edges be part of a body boundary for display purposes, but want to use
constraint integrands for greater accuracy in volume calculations. Example:

   set edge noncontent where on_constraint 1 

<------------------------------ nonnegative ------------------------------->

Level set constraint attribute that vertices on the constraint are
confined to nonnegative values of the constraint.  See "constraint
declaration" for syntax, and "one-sided constraints" for semantics.
Example datafile declaration:
  constraint floorcon nonnegative
  formula: z = 0
This would keep any vertices it was applied to above z = 0, since in 
this context the = is interpreted as >.  Actually, Evolver interprets
= here as - (of low precedence), and the constraint is that the resulting 
expression is nonnegative.

The type of a constraint can be queried at runtime as an expression
     is_constraint[number].nonnegative
or   is_constraint[name].nonnegative
which has value 1 if the constraint is nonnegative, else the value is 0.
"number" may be an expression; "name" is the unquoted name of the
constraint, if it has one.
Example:
     print is_constraint[floorcon].nonnegative
  
Also see hit_constraint for detecting vertices that run into the constraint.

<------------------------------ nonpositive ------------------------------->

Level set constraint attribute that vertices on the constraint are
confined to nonpositive values of the constraint.  See "constraint
declaration" for syntax, and "one-sided constraints" for semantics.
Example datafile declaration:
  constraint topcon nonpositive
  formula: z = 2
This would keep any vertices it was applied to below z = 2, since in 
this context the = is interpreted as <.  Actually, Evolver interprets
= here as - (of low precedence), and the constraint is that the resulting 
expression is nonpositive.

The type of a constraint can be queried at runtime as an expression
     is_constraint[number].nonpositive
or   is_constraint[name].nonpositive
which has value 1 if the constraint is nonpositive, else the value is 0.
"number" may be an expression; "name" is the unquoted name of the
constraint, if it has one.
Example:
     print is_constraint[floorcon].nonpositive

Also see hit_constraint for detecting vertices that run into the constraint.
  

<-------------------------------- nonwall --------------------------------->

Level set constraint attribute. NONWALL indicates this constraint is
to be ignored in vertex and edge popping.  Also, it is used by the various
star_sq_mean_curvature methods to indicate constraints that should not
be taken into account in detecting mirror planes that vertices are on.
Example constraint declaration:
  constraint sphere_con nonwall
  formula: x^2 + y^2 = rad^2

<---------------------------- normal_curvature ---------------------------->

Evolver toggle command. Calculation of squared curvature by taking area of
vertex to be the component of the volume gradient parallel to the mean
curvature vector.  This applies to the sqcurve vertex attribute and
the old-style specification of squared mean curvature energy by
the keyword squared_curvature.


<----------------------------- normal_motion ------------------------------>

Evolver toggle command. Projects motion to surface normal, defined as the
volume gradient. May be useful with squared curvature if vertices tend to
slither sideways into ugly patterns.


<------------------------ normal_sq_mean_curvature ------------------------>

Named method. Description: Integral of squared mean curvature of a
surface, with a slightly different definition from sq_mean_curvature or
eff_area_sq_mean_curvature. To alleviate the instability of
eff_area_sq_mean_curvature, normal_sq_mean_curvature considers the area
around the vertex to be the component of the volume gradient parallel to
the mean curvature vector, rather than the magnitude of the volume
gradient. Thus

  h = (1/2)(F dot F)/(N dot F)

  E = h^2A/3 = (3/4)(F dot F/N do t F)^2 A.

This is still not perfect, but is a lot better. WARNING: For some extreme
shapes, Evolver may have problems detecting consistent local surface
orientation. The assume_oriented toggle lets Evolver assume that the facets
have been defined with consistent local orientation.

If the parameter or vertex attribute h_zero is defined, then the value per
vertex is

  E = (h-h_0)^2 A/3 = (3/4)(F dot F/N dot F - 2h_0)^2A

If the vertex is on one or several constraints, the F and N are projected
to the constraints, essentially making the constraints act as mirror
symmetry planes.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

  quantity nsq energy method normal_sq_mean_curvature global


<--------------------------------- notch ---------------------------------->

Main prompt command. For refining a surface in regions of high curvature.
Syntax:

 NOTCH expr

Notches all edges with dihedral angle greater than given value. Same as
'n' command, or the command

    foreach edge ee where ee.dihedral > expr do refine ee.facet

Notching is done by adding a vertex in the middle of adjacent facets.
Should be followed by equiangulation.

<------------------------------ notch_count ------------------------------->

Internal read-only variable. Number of edges notched in last
notch command.   Prints and resets to 0 at the end of a command
execution, or when flush_counts is done. Also reset by reset_counts.

<------------------------------- null_area -------------------------------->

Named method. Description: Simply returns 0 for any facet.  Useful
with area_method_name when you don't want area as energy, but you still 
want to assign facets tension.

Element: edge. 
Parameters: none. 
Models: any.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  area_method_name "null_area"


<------------------------------ null_length ------------------------------->

Named method. Description: Simply returns 0 for any edge.  Useful
in the string model with length_method_name when you don't want edge 
energy, but you still want to assign edges tension.

Element: edge. 
Parameters: none. 
Models: any.
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  length_method_name "null_length"

<-------------------------------- numbers --------------------------------->

Constant values may be in any of the usual forms. This includes integers,
fixed point, and scientific notation such as
      2    -3    .5    23.    5e-10    +0.7D2

Hexadecimal integers starting with 0x, as in 0x12Af, are also accepted, as
are binary numbers such as 11001b, indicated by a trailing 'b'. Color names
are interpreted as integers.

<----------------------------------- O ------------------------------------>

Single letter main command. Pop non-minimal edges. Scans for edges with
more than three facets attached. Splits such edges into triple-facet edges.
Splits propagate along a multiple edge until they run into some obstacle.
This command is meant for surfaces that have equal tension on all facets.
Also tries to pop edges on walls properly. For finer control on which edges
to try, use the pop command. Try octa.fe for an example.

<----------------------------------- o ------------------------------------>

Single letter main command. Pop non-minimal vertices. This command scans
the surface for vertices that don't have the topologies of one of the three
minimal tangent cones that are legal in soap films (plane, triple edge,
tetrahedral point). These are "popped" to proper local topologies. The
algorithm is to replace the vertex with a sphere. The facets into the
original vertex are truncated at the sphere surface. The sphere is divided
into cells by those facets, and the largest cell is deleted, which
preserves the topology of the complement of the surface. A special case is
two cones meeting at a vertex; if the cones are broad enough, they will be
merged, otherwise they will be split. In case of merging cones, if both
cone interiors are defined to be part of the same body, then no facet is
placed across the neck created by the merger; if they are different bodies
or no bodies, a facet will be placed across the neck. Only vertices in the
interior of a surface, not fixed or on constraints or boundaries, are
tested. Try popstr.fe and octa.fe for examples.


<---------------------------------- oid ----------------------------------->

Geometric element read-only attribute. The oid of an element is the
"oriented id" of an element as used in an expression. It is the id number
signed according to whether the use of the element is with the same or
opposite orientation as the way it is stored. Example: to get an edge list
for a facet as in the datafile, use oid instead of id:

   foreach facet ff do { printf "%g  %g %g %g\n",ff.id,ff.edge[1].oid,
      ff.edge[2].oid,ff.edge[3].oid }

<-------------------------------- old_area -------------------------------->

Evolver toggle command. In the string model with area normalization, at a
triple vertex Evolver normally tries to calculate the motion so that Von
Neumann's Law will be obeyed, that is, the rate of area change is
proportional to the number of sides of a cell. If old_area is ON, then
motion is calculated simply by dividing force by star area.

<--------------------------- old_force_ribiere ---------------------------->

Vertex extra attribute used internally by conjugate gradient mode.

<--------------------------------- ometis --------------------------------->

Main prompt command. Computes an ordering for Hessian factoring using the
METIS library of Karypis and Kumar, if this library has been compiled into
the Evolver (not part of the public distribution yet). Prints ordering
tree. To actually use METIS ordering during factoring, use the toggle
metis_factor. Note: ometis no longer works for Metis version 3 or later,
since Metis does not return the tree any more. But metis_factor still
works. Syntax:

  OMETIS n  // n is smallest partition size
  OMETIS           // defaults to n = 100

<---------------------------- on_assign_call ------------------------------>

A procedure may be designated to be called whenever the value of the
variable is changed.  The syntax in the top of the datafile is

      PARAMETER identifier = expr ON_ASSIGN_CALL procedure_name

The purpose of this feature is to permit side-effects of changing
a variable value.  The value is a procedure without arguments, and can only
be assigned in the top of the datafile.  However, the procedure itself may
be redefined at will.  Example (in the top of the datafile):

  procedure tester();
  parameter aaa = 4
  parameter bbb = 5 on_assign_call tester
  procedure tester() { aaa := bbb; }

Note that there is a declaration of "tester" first, so Evolver recognizes
"tester" as a procedure name during the declaration of "bbb".  But the full
declaration of "tester" may be in the top of the datafile or in the "read"
section of the datafile.


<------------------------------ on_boundary ------------------------------->

Vertex, edge, or facet read-only attribute.
The status of whether an element is on a boundary can be queried with the
Boolean attribute on_boundary. Elements can be unset from boundaries, but
not set on them (since parameter values would be unknown). Examples:

  list vertex where on_boundary 1
  unset vertex boundary 2

<----------------------------- on_constraint ------------------------------>

Vertex, edge, or facet read-only attribute. Boolean attribute for whether
an element is on a given constraint. The full syntax of the attribute is
"on_constraint n" where n is the number of the constraint. Examples:

   list edge where on_constraint 3
   print vertex[3].on_constraint 1


<--------------------------- on_method_instance --------------------------->

Vertex, edge, or facet read-only attribute. Boolean attribute for whether
an element contributes to a given named method instance. The full syntax of
the attribute is "on_method_instance instancename". Examples:

   list facet where on_method_instance  center_of_mass_x_edges
   print vertex[3].on_method_instance blue_area_1

<------------------------------ on_quantity ------------------------------->

Vertex, edge, or facet read-only attribute. Boolean attribute for whether
an element contributes to a given named quantity. Actually, it tests
whether the element is on any of the method instances comprising a
quantity. The full syntax of the attribute is "on_quantity quantityname".
Examples:

   list facet where on_quantity  center_of_mass_x
   print vertex[3].on_quantity blue_area

<------------------------- one-sided constraints -------------------------->

If a level set constraint is declared NONNEGATIVE or NONPOSITIVE in the
datafile, the vertices subject to the constraint must stay in that part of
the domain of the level set function. It is usually unwise to give edge
integrals to edges on one-sided constraints, or to declare them CONVEX.
Whether a vertex exactly satisfies the constraint may be queried with the
vertex hit_constraint attribute. The 'g' iteration step will check for a
vertex wanting to leave a one-sided constraint it has hit, but hessian
commands do not; therefore it is wise to intersperse 'g' with hessian or
hessian_seek when there are one-sided constraints involved. Example:
Suppose one wanted to keep a bubble inside a spherical tank of radius 5.
Then one would define the constraint in the datafile
constraint 1 nonpositive
formula: x^2 + y^2 + z^2 = 25

For purposes of evaluating nonnegativity or nonpositivity, all terms are
shifted to the left side of the formula. One would then apply this
constraint to all vertices, edges, and facets of the bubble surface.

If you define the real-valued vertex extra attribute one_sided_lagrange, the
Lagrange multipliers for vertices hitting one-sided constraints will
be recorded.  one_sided_lagrange may be defined as an array.  If a vertex
hits more constraints than the size of one_sided_lagrange, then the 
first ones that fit will be recorded.

<--------------------------- one_sided_lagrange --------------------------->

If you define the real-valued vertex extra attribute one_sided_lagrange, the
Lagrange multipliers for vertices hitting one-sided constraints will
be recorded.  one_sided_lagrange may be defined as an array.  If a vertex
hits more constraints than the size of one_sided_lagrange, then the 
first ones that fit will be recorded.

<-------------------------------- ooglfile -------------------------------->

Main prompt command. Writes a file containing OOGL-formatted graphics data
for the surface as a POLY or CPOLY quad file. This is a non-interactive
version of the P 2 command. Syntax:

 ooglfile stringexpr

 The string gets ".quad" appended to form the filename. This command does
not ask any of the other questions the P 2 command asks; it uses the
default values, or whatever the last responses were to the previous use of
the interactive P 2 command. Good for use in scripts. Example:
   ooglfilename := sprintf "frame%d",framecounter;
   ooglfile ooglfilename;
   framecounter += 1;


<-------------------------------- opacity --------------------------------->

Facet attribute for transparency. Syntax: 
   set facet opacity value where condition
where value is between 0 (clear) and 1 (opaque).  Screen graphics will
show transparency, but PostScript output will not.  Hitting the letter 'O'
key in the graphics window will toggle transparency, if the opacity
attribute has been assigned values.  Showing transparency properly requires 
sorting the facets back to front, so graphics will be slower if there are 
many facets. 

<--------------------------------- OpenGL --------------------------------->

Ideally, you have a version of the Evolver that uses OpenGL/GLUT for its
screen graphics. OpenGL is standard on Mac OSX, most unix systems, and
Microsoft Windows. Tbe graphics display is invoked with the 's' command,
which leaves you at the graphics prompt, which you should quit 'q' right
away since graphics commands are better given in the graphics window. There
are many mouse and keyboard actions that can be performed in the graphics
window itself. Holding down and dragging the left mouse button moves the
surface continuously, and the clicking right mouse button picks vertices,
edges, and facets. Picked element id numbers are printed in the console
window. With the graphics window in the foreground, these keyboard commands
are active:

h Print a help screen on the console window.
r Rotate mode for left mouse button.
t Translate mode for left mouse button.
z Zoom mode for left mouse button (and use F to focus on particular vertex).
c Clockwise/counterclockwise spin mode for left mouse button.
k Active clipping plane in rotate mode.
l (lower case L) Active clipping plane in translate mode.
L Deactivate clipping plane.
+ Widen edges.
- Narrow edges.
b Decrement edge front bias by .001.
B Increment edge front bias by .001 (to show edges more clearly).
R Reset the view.
m Center the image.
M Have the right mouse button bring up a menu instead of picking.
P Have the right mouse button do picking instead of menu (default).
p Toggle orthogonal/perspective projection.
s Toggle cross-eyed stereo.
e Toggle showing edges, regardless of "show edge" condition.
f Toggle showing facets obeying "show facet" condition or no facets.
F Move the rotate/zoom origin to the last picked vertex.
G Start another graphics window with independent camera.
o Toggle drawing a bounding box.
g Toggle Gourard (smooth) shading.
x Close the graphics window.
arrow keys Translate a bit.
And some more advanced commands most users will never use, but are listed
here for completeness:
H Print advanced help.
a Toggle using OpenGL element arrays.
i Toggle interleaved elements in OpenGL arrays.
I Toggle indexed OpenGL arrays.
S Toggle OpenGL triangle strips.
Y Toggle strip coloring (I was curious as to what OpenGL triangle strips
would look like).
D Toggle using a display list.
Q Toggle printing drawing statistics.

<------------------------------- operators -------------------------------->

These are the arithmetic operators that may appear in expressions:

 +,-,*,/: Usual real arithmetic. NOTE: A '+' or '-' preceded by whitespace
          and followed by a number is taken to be a signed number. 
          Thus "3 - 5" and "3-5" are single expressions, but "3 -5" is not. 
          This is for convenience in separating multiple expressions listed 
          on the same line for vertex coordinates, metric components, etc. 
          in the datafile.

 idiv : Integer divide. Rounds toward zero, then does integer division. Ex:
        7 idiv 2 is 3; -3.5 idiv 2.1 is -1; -3 idiv 2 is -1.

 %, mod: Real arithmetic modulus, x % y = x - floor(x/y)*y.

 imod: Integer arithmetic modulus, defined as
           x imod y = floor(x) - floor(floor(x)/floor(y))*floor(y).

 (,): Parentheses for grouping and functional notation.

 ^,**: Raise to real power.

 ? : : Conditional expression, as in the C language. x ? y : z evaluates to
       y if x is nonzero and to z if x is zero.

++,--  C-style pre- and post-increment and decrement commands.  These work only
       on single variables and only as stand-alone commands, as in "for"
       loops for example:
           for ( inx := 1 ; inx <= 10 ; inx++ )


<-------------------------------- optimise -------------------------------->
<-------------------------------- optimize -------------------------------->

Main prompt command. Set gradient descent iteration to optimizing mode,
with an upper bound on the scale factor. "Optimise" is a synonym. Syntax:
  OPTIMIZE expr

<-------------------------- optimising_parameter -------------------------->
<-------------------------- optimizing_parameter -------------------------->

A variable may be made subject to optimization during iteration or hessian
commands with the datafile declaration

  OPTIMIZING_PARAMETER identifier=constexpr PDELTA=constexpr PSCALE=constexpr

Such a variable joins the vertex coordinates as an independent variable
during optimization. However, it differs from a coordinate in that
gradients with respect to it are calculated numerically, rather than
analytically. Thus it may be used anywhere a variable is permitted.
Hessians with optimizing parameters are implemented. The optional pdelta
value is the parameter difference to use in finite differences; the default
value is 0.0001. The optional pscale value is a multiplier for the
parameter's motion, to do "impedance matching" of the parameter to the
surface energy. These attributes may be set on any parameter, for potential
use as an optimizing parameter. At runtime, a parameter may be toggled to
be optimizing or not with the FIX and UNFIX commands. That is, fix radius
would make the radius variable non-optimizing (fixed value). Also, the
pdelta and pscale attributes may be accessed at runtime, as in

   height.pscale := 2*height.pscale

"Optimising_parameter" is a synonym.


<---------------------------- optimizing scale ---------------------------->

In using gradient descent to seek a minimum energy, one finds a direction
of motion and does a line search along that direction to find the minimum
energy. Evolver will do that in optimizing scale mode. The line search
consists of halving or doubling the current scale factor until an energy
minimum is bracketed; then quadratic interpolation is used to estimate the
optimum scale. Optimizing scale is the default; it also may be turned on
with the m command or the optimizing command.

For safety, there is an upper bound to the scale; it defaults to 1 but may
be changed with the optimizing command. There is also a lower bound; if
Evolver gets a scale below 1e-12 of the scale bound when attempting to find
a minimum, it gives up and just uses scale 0. Scale 0 is not a null
operation since it still projects to constraints, if they are not exactly
satisfied.

In general, a good scale factor depends on the type of energy being
minimized and the level of refinement. However, for minimizing area, when
the triangulation is well-behaved and area normalization is off, the best
scale factor is usually around 0.2, independent of refinement. In
optimizing mode, a scale factor getting small, say below 0.01, indicates
triangulation problems. Too large a fixed scale factor will show up as
total energy increasing. If you have motion by area normalization ON use a
small scale factor, like 0.001, until you get a feel for what works.

If check_increase is toggled on, then the motion is not done if it would
increase energy. But be aware that energy sometimes may have to increase in
order to satisfy constraints.


<-------------------------------- options --------------------------------->

Command line options:

The syntax for starting the Evolver from the system command prompt is:

  evolver [-ffilename] [options] [datafile] 

Options:
 [-a-] [-d] [-e] [-i] [-m] [-pn] [-q] [-Q] [-w] [-x] [-y]

The current directory and EVOLVERPATH will be searched for datafile. If the
datafile is not found, then a new search with extension .fe is done.
Wildcard matching is in effect on some systems (Windows, linux, maybe
others), but be very careful when using wildcards since there can be
unexpected matches. If the datafile still not found, or the datafile is not
given on the command line, then the user will be prompted. For information
on individual options, see "option -a" etc.


<------------------------------ orientation ------------------------------->

Facet and edge read-write attribute. Controls the sign of oriented integrals 
on a facet or edge. Value +1 or -1. Useful when triangulation manipulations 
create a facet with an undesired orientation. Example:

   set facet[123] orientation -1

Note that this is different from the "reverse_orientation" command, which
physically changes vertex order.

<-------------------------------- original -------------------------------->

Geometric element read-only attribute. For elements read from the
datafile, this is the number given to the element in the datafile, which
may be overridden by an explicit original attribute value in the datafile
line defining the element. The value is inherited by all elements of the
same type that result from subdivision. For elements otherwise generated at
run time, the original attribute value is -1. Example: to show which facets
descended from face 1 in the datafile:

   set facet color red where original == 1

<----------------------------------- p ------------------------------------>

Single letter main command. Sets ambient pressure in ideal gas model. If
you don't give a value with the command, you will be prompted. A large
value gives more incompressible bodies.

<----------------------------------- P ------------------------------------>

Single letter main command. Produce graphics output files. "P" is for
"picture". This brings up a menu, unless you give the menu option on the
command line. For the 2D graphics options, the view is the same as seen
with the s command. For options that output to a file, you will be prompted
for a filename. Some other possible options you may be asked:

Display raw cells, connected bodies or clipped cells? (0,1,2) : If you are
doing torus model, you will be asked for a display option, unless you have
already set one.

Do normal interpolation? : Some formats are capable of doing interpolation
between vertex normals for smoother shading, and you will be asked if you
want to do that.

Do inner, outer, or all surfaces? (i,o,a) : When bodies are present, there
is an option to plot the inner surfaces(adjacent to two bodies), outer
surfaces (adjacent to 0 or 1 bodies), or all surfaces of the bodies.

Do body colors? : This gives you a chance to color the bodies differently.
If you do, the current colormap file will be used to color the bodies
according to id number. This scheme is a relict of early days of the
Evolver, and it is suggested that you use the color, frontcolor and
backcolor facet attributes instead.

Enter name of colormap file: : If there is no current colormap file, you
will be prompted. The colormap file has the format of RGB values, one set
per line, values between 0 and 1. (This map may not be effective on all
devices.)

Thicken? (n | y [thickness(0.001)]) : You may also be asked if you want
thickening. If you do, each facet will be recorded twice, with opposite
orientations, with vertices moved from their original positions by the
thickening distance (which the option lets you enter) in the normal
direction. The normal used at each vertex is the same as used for normal
interpolation, so all the facets around a planar vertex will have that
vertex moved the same amount. Triple junctions will be separated.
Thickening is good for rendering programs that insist on consistently
oriented surfaces, or that have problems with show-through of the backside
of a surface. Choosing 'y' or 'n' will reset the thicken toggle. If you
answer 'y', you can optionally specify the thickness, which defaults to the
value of the thickness internal variable.

The menu choices for types of output are:
1. Pixar file : For Pixar format. Actually same format as option 2.
2. OOGL file : This is a file in a file format used by geomview, which is
   Object Oriented Graphics Language. Suitable for direct input into geomview.
3. PostScript file : Generates a PostScript file.
4. Triangle file : A private format file, just listing data. Not much use
   any more.
5. Softimage file : Output file in Softimage format.
8. Start simultaneous geomview : If you have the geomview package
   installed, this command will start geomview and display the current
   surface. Changes to the surface are automatically displayed unless
   autodisplay is toggled off.
9. End simultaneous geomview : Terminates any geomview program or pipe.
A. Start OOGL pipe. : Geomview uses a pipe interface at the moment. This
   starts a named pipe with geomview output, but without invoking geomview.
   You will be told the name of the pipe, and it is up to you to start a pipe
   reader. Evolver blocks until a pipe reader is started. This is useful for
   having a second instance of Evolver feed a second surface to geomview by
   having geomview load the pipe. Also good for checking exactly what Evolver
   is sending to geomview. The geompipe command does the same thing. Terminate
   the pipe with "P 9". Note that only one geomview output at a time is
   possible, so you can't have a geomview display and separate pipe active at
   the same time.
B. End OOGL pipe. : Same as option 9.

<----------------------------------- p1 ----------------------------------->
<----------------------------------- p2 ----------------------------------->

P1 and p2 are the names of the parameters of a vertex on a parametric
boundary. P1 is used for a 1-parameter boundary, and p1 and p2 for
a 2-parameter boundary.  And p3 is available for a 3-parameter boundary.
Examples:
    vertex[1].p1 := 1.2
    print vertex[2].p1

<----------------------------- parallel_exec ------------------------------>

Main prompt command in MPI Evolver. Causes each slave task to execute 
the string. Syntax:
   parallel_exec string
where string may be a double-quoted string or a string variable.
In individual tasks, any aggregate commands such as "sum" execute 
across all local and imported elements. 

<------------------------------- parameter -------------------------------->
<------------------------------- parameters ------------------------------->

Refers to either a "parametric boundary" parameter, or a user-defined
variable.  In the latter case, a variable can be declared in the
top of the datafile with the syntax

   parameter pname = value

where "pname" is the name of the variable and "value" is a numeric
expression involving known variables.  The initial value is required.
See also "optimizing_parameter".


<---------------------------- parameter scale ----------------------------->
<--------------------------------- pscale --------------------------------->

Optimizing paramater attribute, used as a multiplier for the
parameter's motion, to do "impedance matching" of the parameter to the
surface energy. Default value is 1.  The pscale attribute may be set
in the datafile parameter declaration, for example

  optimizing_parameter height = 1.5  pscale = 10.0

and accessed at runtime with the usual attribute syntax, as in

  height.pscale := 2*height.pscale


<---------------------------- parameter values ---------------------------->

Vertex read-write attribute. Vertices on parametric boundaries are located
according to the parameter values. Parameters are referred to as p1,p2,...
Usually only p1 is used, since one-parameter curves used as boundary wires
are most common. Such vertices in the original surface have their parameter
values given in the vertices section of the datafile instead of their
coordinates. Vertex parameters may be read or modified with the command
language. Example:

  foreach vertex do printf "%g %f\n",id,p1
  set vertex[1] p1 1.2


<----------------------------- parameter_file ----------------------------->

In the top section of the datafile, a variable can be initialized with a
set of values in a file with the syntax

  PARAMETER name PARAMETER_FILE string

I forget exactly how it is all supposed to work.

<------------------------------ parameter_1 ------------------------------->

A generic parameter used by a couple of named methods.

<------------------------- parametric boundaries -------------------------->
<-------------------------- parametric boundary --------------------------->

Parametric "boundary" curves and surfaces
Vertex locations may be given in terms of parameters on a parameterized
curve or surface. Such curves or surfaces are called "boundaries" in
Evolver terminology, since they are usually used as boundary curves of
surfaces, for example a soap film on a wire loop could have the wire
implemented as a boundary. Vertices, edges, and facets may be deemed to lie
in a boundary. For a vertex, this means that the fundamental parameters of
the vertex are the parameters of the boundary, and its coordinates are
calculated from these. Vertices on boundaries may move during iteration,
unless declared fixed. See cat.fe for an example.

Boundaries are defined in the top section of the datafile. Vertices on
boundaries are listed in the datafile with their parameter values instead
of their coordinates, with "boundary n" appended to each such vertex
definition. Edges and faces on boundaries are defined as usual, but with
"boundary n" appended to each definition. So the datafile has lines like
these:

boundary 1 parameters 1
x1:  cos(p1)
x2:  sin(p1)
x3:  0.75
...
Vertices
1   0.0  boundary 1
2   pi/3 boundary 1
...
Edges
1   1 2 boundary 1
...


Putting an edge on a boundary means that vertices created on that edge will
be on the boundary. An edge on a boundary must have at least one endpoint
on the boundary, for use in extrapolating the boundary parameters of any
created vertices. Extrapolating instead of interpolating midpoint
parameters solves the problem of wrap-arounds on a boundary such as a
circle or cylinder. However if you do want interpolation, you can use the
keyword INTERP_BDRY_PARAM in the top of the datafile, or use the toggle
command interp_bdry_param. Interpolation requires that both endpoints of an
edge be on the same boundary, which cannot happen where edges on different
boundaries meet. To handle that case, it is possible to add extra boundary
information to a vertex by declaring two particular vertex extra
attributes, extra_boundary and extra_boundary_param:

  interp_bdry_param
  define vertex attribute extra_boundary integer
  define vertex attribute extra_boundary_param real[1]

Then declare attribute values on key vertices, for example

   vertices
   1    0.00  boundary 1   fixed extra_boundary 2 extra_boundary_param 2*pi

If the extra_boundary attribute is not set on a vertex when wanted,
Evolver will silently fall back on interpolation.

Putting a face on a boundary means that all edges and vertices created
from refining the face will be on the boundary. In this case, the boundary
should have two parameters (or whatever the dimension of the surface is).
This is good for getting a surface to conform to a known parametric shape.
Edges on boundaries have energy and content integrals like level-set
constraints edges, but they are internally implemented as. named
quantities.

Whether an element is on a particular boundary can be queried with the
on_boundary Boolean attribute. Elements can be removed from boundaries with
the unset command, but they cannot be set on boundaries. A typical use of
unset is to define an initial surface using a 2-parameter boundary, refine
a couple of times, then unset. Examples:
  list vertex where on_boundary 2
  unset vertex boundary 1 where on_boundary 1
  unset edge boundary 1
  unset facet boundary 1

It does not hurt to unset an element not on the boundary.
Vertex parameters can be accessed in expressions as the attribute p1 (and
p2,... for further parameters). Vertex parameters can be changed with the
set command. Example:
  print vertex[5].p1
  set vertex p1 p1+.1 where id < 4
  vertex[2].p1 := 3

It is not an error to access the parameters of a vertex not on a boundary
as long as some vertex is on a boundary (so that space is allocated in the
vertex structure for parameters).

A general guideline is to use constraints for two-dimensional walls and
boundaries for one-dimensional wires. If you are using a boundary wire, you
can probably declare the vertices and edges on the boundary to be FIXED.
Then the boundary becomes just a guide for refining the boundary edges.

NOTE: A vertex on a boundary cannot also have constraints.


<--------------------------------- pause ---------------------------------->

Main prompt command. Pauses execution until the user hits RETURN. Useful
in scripts to give the user a chance to look at some output before
proceeding.


<--------------------------------- pdelta --------------------------------->

Optimizing parameter attribute, used for the magnitude of change in
numerical differencing to find the gradient with respect to the paramter.
This should be small enough that the surface stays in the linear change
regime when the variabls is changed by pdelta.  Default value 0.0001.  
May be set in the parameter's datafile declaration, for example

   optimizing_parameter height = 0.01 pdelta = 0.000001

and accessed at runtime with the usual attribute syntax:

   height.pdelta := 1e-5


<-------------------------------- periods --------------------------------->

If periodic boundary conditions are used (the torus model) , the period
vectors of the fundamental unit cell parallelpiped may be defined in the
top section of the datafile. Default is the unit cube. The syntax is the
keyword PERIODS followed by expressions for the components of each period
vector:

  PERIODS
  expr expr expr
  expr expr expr
  expr expr expr

The size of this matrix depends on the space dimension. Variables may be
used in the expressions, so the fundamental domain may be changed
interactively by assigning new values to the variables. Be sure to give a
recalc command whenever you change such a variable, in order to get the
period matrix re-evaluated.

<-------------------------- permanent assignment -------------------------->

The permanent assignment operator ::= can be used to make assignments to
variables and commands that are not forgotten when a new datafile is
loaded. Such a command may only make reference to permanent variables,
permanent commands, and internal variables. See permload command for an
example of use.


<-------------------------------- permload -------------------------------->

Deprecated.  See replace_load.

Main prompt command. Loads a new datafile and continues with the current
command after the read section of the datafile finishes. The filename is
the datafile name, and can be either a quoted string or a string variable.
Since the automatic re-initialization makes Evolver forget all
non-permanent variables, care should be taken that the current command only
uses permanently assigned variables (assigned with ::= ). Useful for
writing scripts that run a sequence of evolutions based on varying
parameter values. Using permload is a little tricky, since you don't want
to be redefining your permanent commands and variables every time you
reload the datafile, and your permanent command cannot refer directly to
variables parameterizing the surface. One way to do it is to read in
commands from separate files. For example, the catenoid of cat.fe has
height controlled by the variable zmax. You could have a file permcat.cmd
containing the overall series script command

  run_series ::= {
    for ( height ::= 0.5 ; height < 0.9 ; height ::= height + .05 )
    { permload "cat"; read "permcat.gogo"; }
  }

and a file permcat.gogo containing the evolution commands

  u; zmax := height; recalc; r; g 10; r; g 10; hessian;
  printf "height: %f  area: %18.15f\n",height,total_area >> "permcat.out";

Then at the Evolver command prompt,

  Enter command: read "permcat.cmd"
  Enter command: run_series

For loading a new surface and not continuing with the current command, see
load. Wildcard matching is in effect on some systems (Windows, linux, maybe
others), but be very careful when using wildcards since there can be
unexpected matches.


<--------------------------------- phase ---------------------------------->
<--------------------------- phase declaration ---------------------------->
<------------------------------- phasefile -------------------------------->

To declare that the surface tension of an edge or facet depends on the
phases of its adjacent facets or bodies, the top section of the datafile
should contain a line of the form

 PHASEFILE "filename"

The information is read from an ASCII file, whose name is given in a
double-quoted string. The first line of the file has the number of
different phases. Each line after consists of two phase numbers and the
surface tension between them. Lines not starting with a pair of numbers are
taken to be comments. If a pair of phases is not mentioned, the surface
tension between them is taken to be 1.0. Facets in the string model or
bodies in the soapfilm model can be labelled with phases with the PHASE n
phrase in the datafile.

<----------------------------------- pi ----------------------------------->

Mathematical constant, ratio of circle circumference to radius.


<-------------------------------- pickenum -------------------------------->

Internal read-write variable. Number of last edge picked in geomview.

<-------------------------------- pickfnum -------------------------------->

Internal read-write variable. Number of last facet picked in geomview.

<-------------------------------- picking --------------------------------->

One of the big advantages of using geomview or the OpenGL version is that
you can pick vertices, edges, and facets in the geomview window by
right-mouse-clicking, and the id numbers of the picked objects will be
printed in the main window. Be careful when picking; it does not always
work as you might hope. It may be necessary to zoom in on the surface to
get a clear shot at the element you want. Be wary when the element returned
is 1; that seems to be a common response when Evolver is confused as to
what element was picked. Also, Evolver polls geomview for pick results only
when at a prompt awaiting user input.

Picked vertex, edge, and facet numbers are stored in the internal
variables pickvnum, pickenum, and pickfnum, respectively. The 'F' key
command on the graphics window sets the rotation and scaling center to the
pickvnum vertex. Pickvnum is settable with ordinary assignment commands, so
the user can zoom in on any vertex desired.

Note: Since vertices are not drawn individually, Evolver reports a vertex
as picked only when two edges with a common vertex are simultaneously
picked. Therefore a vertex at the end of a single edge cannot be picked.

<-------------------------------- pickvnum -------------------------------->

Internal read-write variable. Number of last vertex picked in geomview.

<-------------------------------- pinning --------------------------------->

Evolver toggle command. Check for vertices that can't move because
adjacent vertices are not on same constraint when they could be. Obscure.


<--------------------------------- piping --------------------------------->

The output of a command can be piped to a system command using the
unix-style pipe symbol `|'. Syntax:

   command | stringexpr

The stringexpr is interpreted as a system command.
Examples:

   list facets | "more"
   list vertices | "tee vlist" ; g 10 | "tee g.out"
   { {g 10; u } 20 } >> "logfile"
   {foreach facet do print area} | "cat >areafile"

<----------------------------- poisson_ratio ------------------------------>

Facet extra attribute used by various elastic named methods:
linear_elastic, linear_elastic_B, neo_hookean, relaxed_elastic, 
relaxed_elastic_A, relaxed_elastic_B, SVK_elastic, and dirichlet_elastic.  
This is the two-dimensional isotropic poisson ratio.

<-------------------------- polyhedral curvature -------------------------->

A type of mobility. Following a suggestion of Gerhard Dzuik and Alfred
Schmidt, the inner product of global vectors is taken to be the integral of
the scalar product of their linear interpolations over the facets (or edges
in the string model). This has the advantage that the rate of area decrease
of the surface is equal to the rate volume is swept out by the surface,
which is a characteristic of motion by mean curvature. A big disadvantage
is that the matrices M and S are no longer local (see mobility). S is a
sparse matrix with entries corresponding to each pair of vertices joined by
an edge, and M is its dense inverse. Approximate polyhedral curvature can
be toggled with the approx_curv toggle command.

<---------------------------------- pop ----------------------------------->

Main prompt command. Pops an individual edge or vertex or set of edges or
vertices, giving finer control than the universal popping of the O and o
commands. The specified vertices or edges are tested for not being minimal
in the soap film sense. For vertices, this means having more than four
triple edges adjacent; higher valence edges are automatically popped. For
edges, this means having more than three adjacent facets when not on
constraints or otherwise restricted. It tries to act properly on
constrained edges also, but beware that my idea of proper behavior may be
different from yours. Normally, popping puts in new edges and facets to
keep originally separated regions separate, but that behavior can be
changed with the pop_disjoin toggle. The style of popping a cone over a
triangular prism can be controlled with the pop_to_edge and pop_to_face
commands. The pop_enjoin toggle forces joining cones to be popped by
widening the vertex into a neck. Examples:

   pop edge[2]
   pop edge where valence==5

Under some circumstances, popping a vertex can leave two regions 
connected by a tunnel; if the septum_flag toggle is on, it will 
force a  surface to be placed across the tunnel.

<------------------------------- pop_count -------------------------------->

Internal read-only variable. Sum of vertex_pop_count and
edge_pop_count. Kept for backwards compatibility.

<------------------------------ pop_disjoin ------------------------------->

Evolver toggle command. Changes the behavior of popping edges and vertices
to act like merging Plateau borders, i.e. produce disjoined films instead
of films joined with cross-facets. In the edge case, if four facets meet
along an edge and two opposite bodies are the same body, then popping the
edge will join the bodies if pop_disjoin is in effect. In the vertex case,
if the vertex has one body as an annulus around it, then the vertex will be
separated into two vertices so the annulus becomes a continuous disk. This
is all done regardless of the angles at which facets meet. Applies to pop,
o, and O commands.


<------------------------------- pop_enjoin ------------------------------->

Evolver toggle command. Changes the behavior of popping vertices in the
soapfilm model so that when two distinct cones are detected meeting at a
common vertex, the popping result is a widening of the cone vertex into a
neck rather than a disjoining of the cones. meet. Applies to pop and o
commands. 
 
<---------------------------- pop_edge_to_tri ----------------------------->

Main prompt command. This command does a particular topological
transformation common in three-dimensional foam evolution. An edge with
tetrahedral point endpoints is transformed to a single facet. A preliminary
geometry check is made to be sure the edge satisfies the necessary
conditions, one of which is that the triple edges radiating from the
endpoints have no common farther endpoints. If run in verbose mode,
messages are printed when a specified edge fails to be transformed. This
command is the inverse of the pop_tri_to_edge command. Works in linear and
quadratic mode. Examples:

   pop_edge_to_tri edge[2]
   pop_edge_to_tri edge where valence==3 and length < 0.001


<------------------------- pop_edge_to_tri_count -------------------------->

Internal read-only variable. Number of edges flipped to triangles by the
pop_edge_to_tri command. Prints and resets to 0 at the end of a command
execution, or when flush_counts is done. Also reset by reset_counts.

<---------------------------- pop_quad_to_quad ---------------------------->

Main prompt command. This command does a particular topological
transformation common in three-dimensional foam evolution. A quadrilateral
bounded by four triple edges is transformed to a quadrilateral oriented in
the opposite direction. The shortest pair of opposite quadrilateral edges
are shrunk to zero length, converting the quadrilateral to an edge, then
the edge is expanded in the opposite direction to form the new
quadrilateral. The new quadrilateral inherits attributes such as color from
the first quadrilateral, although all the facet numbers are different. A
preliminary geometry check is made to be sure the edge satisfies the
necessary conditions, one of which is that the triple edges radiating from
the quadrilateral corners have no common farther endpoints. If run in
verbose mode, messages are printed when a specified quadriteral fails to be
transformed. The specified facet can be any one of the facets of the
quadrilateral with a triple line on its border. It doesn't hurt to apply
the command to all the facets of the quadrilateral, or to facets of
multilple quadrilaterals. Quadrilaterals may be arbitrarily subdivided into
facets; in particular, they may have some purely interior facets. Works in
linear and quadratic mode. Examples:

   pop_quad_to_quad facet[2]
   pop_quad_to_quad facet where color==red


<------------------------- pop_quad_to_quad_count ------------------------->

Internal read-only variable. Number of quadrilaterals flipped by the
pop_quad_to_quad command. Prints and resets to 0 at the end of a command
execution, or when flush_counts is done. Also reset by reset_counts.

<------------------------------ pop_to_edge ------------------------------->

Evolver toggle command.  The non-minimal cone over a triangular prism
frame can pop in two ways. If this toggle is on, then popping to an edge
rather that a facet will be done. Default off.


<------------------------------ pop_to_face ------------------------------->

Evolver toggle command. The non-minimal cone over a triangular prism frame
can pop in two ways. If this toggle is on, then popping to a facet rather
that an edge will be done. Default off.


<---------------------------- pop_tri_to_edge ----------------------------->

Main prompt command. This command does a particular topological
transformation common in three-dimensional foam evolution. A facet with
three tetrahedral point vertices is transformed to a single facet. A
preliminary geometry check is made to be sure the edge satisfies the
necessary conditions, one of which is that the triple edges radiating from
the vertices have no common farther endpoints. If run in verbose mode,
messages are printed when a specified edge fails to be transformed. This
command is the inverse of the pop_edge_to_tri command. Works in linear and
quadratic mode. Examples:

   pop_tri_to_edge facet[2]
   pop_tri_to_edge facet where color == red


<------------------------- pop_tri_to_edge_count -------------------------->

Internal read-only variable. Number of triangles flipped to edges by the
pop_tri_to_edge command. Prints and resets to 0 at the end of a command
execution, or when flush_counts is done. Also reset by reset_counts.

<------------------------------ fgagfa_coeff ------------------------------>
<------------------------------ gfa_2_coeff ------------------------------->
<------------------------------ gfaafg_coeff ------------------------------>
<------------------------------ gfagfa_coeff ------------------------------>
<------------------------------- gga_coeff -------------------------------->

Internal variable used by the pos_area_hess method.  See pos_area_hess.

<----------------------------- pos_area_hess ------------------------------>

Named method. Description: Same as the facet_area method, but the Hessian
can be adjusted various ways by setting the variables fgagfa_coeff,
gfa_2_coeff, gfagfa_coeff, and gfaafg_coeff. This will make sense if you
look at the Dirichlet section of the Technical Reference chapter of the
printed manual. The default values of the coefficients are -1, 1, -1, and 0
respectively. 

Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

   quantity parea energy method pos_area_hess global

<------------------------------ post_project ------------------------------>

Evolver toggle command. Introduces extra projections to volume and fixed
quantity constraints each g iteration. If convergence fails after 10
iterations, you will get a warning message, repeated iterations will stop,
and the internal variable iteration_counter will be negative.


<------------------------------- postscript ------------------------------->

The Surface Evolver can generate PostScript files by either the postscript
command or the P command option 3, or just "P 3". The image is the same one
shown with the native screen graphics, so one should use the s command and
graphics mode commands to get the image looking as desired. The variable
brightness can be used to set the median gray level. The PostScript image
is put into an 8 inch square at the lower left of the page.

With the P command, you will be prompted for options.
Show grid lines? : This is asked if you are graphing a 2D surface. If you
reply 'y', all triangle edges will be plotted. If 'n', only special edges
will be plotted (triple junctions, borders, etc.; this can be controlled
with the show edges command). Default 'n'. The postscript command uses the
ps_gridflag toggle to control this.

Do colors? : If you reply 'y', edges and facets will be plotted with their
color attributes and shading (if activated). If 'n', then all edges are
plotted as black, and all facets as white with shading. Default 'n'. The
postscript command uses the ps_colorflag toggle to control this.

Do crossings? : This is asked if the surface is 1-dimensional (the string
model) and the dimension of space is at least 3. If you reply 'y', a 3D
effect will be created by plotting edges back to front, with each edge
plotted first as a thick white line and then as a thin black line. This
creates a broken back line and continuous foreground line at each crossing.
Default 'n'. The postscript command uses the ps_crossingflag toggle to control
this.

Do labels? (i for ids, o for originals) : This PostScript P 3 command
subprompt gives you a chance to put numeric labels on vertices, edges, and
facets, which is useful for debugging or modifying a datafile. Edge labels
are slightly displaced toward the head of the edge, and facet labels are
signed according to which side of the facet is visible. Choose 'i' or 'y'
for the current element id, or 'o' for the original element number. If you
don't want any labels, just hit RETURN. The postscript command uses the
ps_labelflag toggle to control this. The relative size of the labels can be
controlled with the ps_labelsize variable, whose default value is 3.0.

Enter file name (.ps will be added): : Give the name of the PostScript
output file. A ".ps" extension will be added if ".ps" or ".eps" is missing.
Not a good idea to just hit RETURN, since that will produce the file ".ps".


The linewidth of PostScript edges may be controlled by the user. Widths
are relative to the image size, which is 3 units square. If the real-valued
edge extra attribute ps_linewidth is defined, that value is used as the
edge width. Otherwise some internal read-write variables are consulted for
various types of edges, in order:
 ps_stringwidth - edges in the string model, default 0.004
 ps_bareedgewidth - "bare" edges, no adjacent facets, default 0.005
 ps_fixededgewidth - "fixed" edges, default 0.004
 ps_conedgewidth - edges on constraints or boundaries, default 0.004
 ps_tripleedgewidth - edges with three or more adjacent facets, default 0.003
 ps_gridedgewidth - other edges, default 0.002

The bounding box listed in the PostScript file is normally the actual
extent of the surface in the window (i.e. the bounding box is never bigger
than the window, but may be smaller). The full_bounding_box toggle will
force the bounding box to be the full window. This is useful in controlling
the image size while making a series of images of different views or
evolution stages of a surface.


<--------------------------- postscript command --------------------------->

Main prompt command. Creates a PostScript file of the current surface in a
file. Syntax:

  POSTSCRIPT stringexpr

The string gives the name of the file; a .ps extension will be appended if
it is missing. It is the same as the P option 3 command, except that there
are no interactive responses needed. Output options are controlled by the
ps_colorflag, ps_gridflag, ps_crossingflag, and labelflag toggles.
full_bounding_box toggles.

See "postscript" for more.

<---------------------------------- pow ----------------------------------->

 pow(x,y) : Raise x to real power y; x may be negative if y is an integer.

<------------------------------- precedence ------------------------------->
<----------------------------- associativity ------------------------------>

Here is the order of operator precedence, listed from high to low with
equal precedence on same line, with associativity.

Operator            Associativity
^,**               left associative
unary -            right associative
*,/,%,IMOD,IDIV    left associative
+,-                left associative
on_boundary
on_constraint
hit_constraint
on_quantity
on_method_instance nonassociative
==,>,<,>=,<=,!=    right associative
NOT, !             right associative
AND, &&            left associative
OR, ||             left associative
? :                left associative
=                  left associative

<-------------------------------- pressure -------------------------------->

Usually means an attribute of fixed-volume bodies or fixed named quantities 
that is actually the Lagrange multiplier for the constraint, as printed
by the "v" command. As a body attribute in the datafile, it establishes 
fixed pressure for the body.  Also used rarely in the top section of the 
datafile to establish the "ideal gas model"; see "ideal gas declaration".


<---------------------------- pressure energy ----------------------------->

Each body with a prescribed pressure P contributes energy E = PV. where V
is the actual volume of the body. This can be used to generate surfaces of
prescribed mean curvature, since mean curvature is proportional to
pressure. Pressure can be prescribed in the bodies section of the datafile,
and can be changed with the b command, or by assigning a value to the
pressure attribute of a body.

<--------------------------------- print ---------------------------------->

Main prompt command. For printing expression values, strings, commands,
arrays, or accumulated warning messages. Syntax:

  PRINT expr
  PRINT stringexpr
  PRINT commandname
  PRINT arrayslice
  PRINT WARNING_MESSAGES

The arrayslice option takes an array name or a partially indexed array
name. If more than one element results, the slice is printed in nested
curly braces. The arrayslice can also be that of an array attribute of an
element. The warning_messages option is handy for reviewing warning
messages that occur early in the loading of a datafile but scroll off the
screen too rapidly to see. PRINT expr can also be used inside an
expression, where it prints the expression and evaluates to the value of
its expression. Examples:

  print datafilename;
  print max(edge,length);
  print max(vertex, print (x^2+y^2+z^2) );
  gg := {list vertex where id < 10; g 5};
  print gg;
  define parts real[3][2][3];
  print parts;
  print parts[3][2];


<------------------------------- profiling -------------------------------->
<---------------------------- print profiling ----------------------------->
<---------------------------- reset_profiling ----------------------------->

Expression Evaluation Profiling
 
On systems where Evolver has cpu_counter available and Evolver has been
compiled with the manifest constant PROF_EVALS defined, the expression
evaluator inside Evolver keeps track of the clock cycles elapsed during
each expression evaluation. These expressions include procedures,
functions, constraint and boundary formulas, content integrands, energy
integrands, quantity integrands, etc; everything that prints out as code in
a dump file. The "print profiling" command will print the accumulated CPU
cycles so far for each type of expression. The times are inclusive of any
child functions or procedures. An example, from mound.fe after running
"gogo": 
 
Enter command: print profiling 
Inclusive profiling counts: 
                      Name            CPU Cycles 
                              re           1,952,792 
                            gogo         125,201,889 
                           gogo2                   0 
                           gogo3                   0 
                           gogo4                   0 
                           gogo5                   0 
 
Constraint expressions 
                    Constraint  Formula Cycles   Energy Cycles  Content Cycles 
                             1         877,047       2,337,727               0 

Note that hard-coded evaluations of area, volume, etc. do not show up
here, except for their effect on overall elapsed time. 

The command reset_profiling will set all the cycle values back to 0. 

<--------------------------------- printf --------------------------------->

Main prompt command. For printing formatted output. Syntax:

   PRINTF string,expr,expr,...

Prints to standard output using the standard C sprintf function. All
string, integer, and floating point formats are valid. Integer formats
force floating point arguments to be converted to integer. The format
string can be a string variable or a quoted string. There is a limit of
1000 characters on the format string, otherwise there is no limit on the
number of arguments. Example:

  printf "This is %s with total energy %f\n",datafilename,total_energy


<-------------------------- procedure definition -------------------------->

Users may define their own procedures with arguments with the syntax

   procedure identifier ( type arg1, type arg2, ... )
   { commands }

Right now the implemented types for arguments are real and integer. The
argument list can be empty. Example:

   procedure proc1 ( real ht, real wd )
   {
     prod := ht*wd;   // this would make prod a global variable
     return;
   }

Note that the procedure arguments act as local variables, i.e. their scope
is the procedure body, and they have stack storage so procedures may be
recursive. Procedure prototypes may be used to declare procedures before
their bodies are defined with the same syntax, just replacing the body of
the procedure with a semicolon. Prototype syntax:

   procedure identifier ( type arg1, type arg2, ... );

Note that a procedure is used as a command, and a function is used in a
numerical expression.


<---------------------------- proj_knot_energy ---------------------------->

Named method. Description: This energy is due to Gregory Buck. It tries to
eliminate the need for a normalization term by projecting the energy to the
normal to the curve. Its form is

   E_{e_1e_2} = {L_1L_2 \cos^p\theta\over |x_1 - x_2|^p}

where x_1,x_2 are the midpoints of the edges and \theta is the angle
between the normal plane of edge e_1 and the vector x_1 - x_2. The default
power is 2. Power law of potential is adjustable via the global parameter
`knot_power'. 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knotten energy method proj_knot_energy global


<---------------------------- ps_bareedgewidth ---------------------------->

Internal read-write variable for width of bare edges in PostScript output.
The linewidth of PostScript edges may be controlled by the user. Widths
are relative to the image size, which is 3 units square. If the real-valued
edge extra attribute ps_linewidth is defined, that value is used as the
edge width. Otherwise some internal read-write variables are consulted for
various types of edges, in order:
 ps_stringwidth - edges in the string model, default 0.004
 ps_bareedgewidth - "bare" edges, no adjacent facets, default 0.005
 ps_fixededgewidth - "fixed" edges, default 0.004
 ps_conedgewidth - edges on constraints or boundaries, default 0.004
 ps_tripleedgewidth - edges with three or more adjacent facets, default
0.003
 ps_gridedgewidth - other edges, default 0.002


<------------------------------ ps_cmykflag ------------------------------>

Evolver toggle command. When on, the postscript command will use CMYK
colors instead of RGB in the file it creates. 


<------------------------------ ps_colorflag ------------------------------>
<------------------------------ pscolorflag ------------------------------->

Evolver toggle command. When on, the postscript command will do color.

<---------------------------- ps_conedgewidth ----------------------------->

Internal read-write variable for width of constraint edges in PostScript output.
The linewidth of PostScript edges may be controlled by the user. Widths
are relative to the image size, which is 3 units square. If the real-valued
edge extra attribute ps_linewidth is defined, that value is used as the
edge width. Otherwise some internal read-write variables are consulted for
various types of edges, in order:
 ps_stringwidth - edges in the string model, default 0.004
 ps_bareedgewidth - "bare" edges, no adjacent facets, default 0.005
 ps_fixededgewidth - "fixed" edges, default 0.004
 ps_conedgewidth - edges on constraints or boundaries, default 0.004
 ps_tripleedgewidth - edges with three or more adjacent facets, default
0.003
 ps_gridedgewidth - other edges, default 0.002

<--------------------------- ps_fixededgewidth ---------------------------->

Internal read-write variable for width of fixed edges in PostScript output.
The linewidth of PostScript edges may be controlled by the user. Widths
are relative to the image size, which is 3 units square. If the real-valued
edge extra attribute ps_linewidth is defined, that value is used as the
edge width. Otherwise some internal read-write variables are consulted for
various types of edges, in order:
 ps_stringwidth - edges in the string model, default 0.004
 ps_bareedgewidth - "bare" edges, no adjacent facets, default 0.005
 ps_fixededgewidth - "fixed" edges, default 0.004
 ps_conedgewidth - edges on constraints or boundaries, default 0.004
 ps_tripleedgewidth - edges with three or more adjacent facets, default
0.003
 ps_gridedgewidth - other edges, default 0.002


<---------------------------- ps_gridedgewidth ---------------------------->

Internal read-write variable for width of ordinary edges in PostScript output.
The linewidth of PostScript edges may be controlled by the user. Widths
are relative to the image size, which is 3 units square. If the real-valued
edge extra attribute ps_linewidth is defined, that value is used as the
edge width. Otherwise some internal read-write variables are consulted for
various types of edges, in order:
 ps_stringwidth - edges in the string model, default 0.004
 ps_bareedgewidth - "bare" edges, no adjacent facets, default 0.005
 ps_fixededgewidth - "fixed" edges, default 0.004
 ps_conedgewidth - edges on constraints or boundaries, default 0.004
 ps_tripleedgewidth - edges with three or more adjacent facets, default
0.003
 ps_gridedgewidth - other edges, default 0.002


<------------------------------ ps_labelflag ------------------------------>

Evolver toggle command. When on, the postscript command will print element
labels in the postscript file. Synonym for labelflag.

<------------------------------ ps_labelsize ------------------------------>

Internal read-write variable for the relative size of element labels
in PostScript output. Default value is 3.0, for historical reasons.


<------------------------------ ps_linewidth ------------------------------>

Edge extra attribute that if defined is used as the edge thickness
in PostScript graphics.  Value is relative to image size; values
around 0.003 are reasonable.

<----------------------------- ps_stringwidth ----------------------------->

Internal read-write variable for width of string model edges in
PostScript output. Default value 0.004.

<--------------------------- ps_tripleedgewidth --------------------------->

Internal read-write variable for width of triple edges in PostScript output.
The linewidth of PostScript edges may be controlled by the user. Widths
are relative to the image size, which is 3 units square. If the real-valued
edge extra attribute ps_linewidth is defined, that value is used as the
edge width. Otherwise some internal read-write variables are consulted for
various types of edges, in order:
 ps_stringwidth - edges in the string model, default 0.004
 ps_bareedgewidth - "bare" edges, no adjacent facets, default 0.005
 ps_fixededgewidth - "fixed" edges, default 0.004
 ps_conedgewidth - edges on constraints or boundaries, default 0.004
 ps_tripleedgewidth - edges with three or more adjacent facets, default
0.003
 ps_gridedgewidth - other edges, default 0.002


<-------------------------------- p_force --------------------------------->

Read-only attribute of optimizing variables.  This scalar gives the gradient
of energy with respect to the variable, before any corrections for constraints.
Example:
   g
   print height.p_force

<-------------------------------- p_velocity --------------------------------->

Read-only attribute of optimizing variables.  This scalar gives the rate of
change of the optimizing variable with respect to the scale in the "g" step.
Example:
   g
   print height.p_velocity

<----------------------------------- Q ------------------------------------>

Single letter main command. Report current values of user-defined
method instances and named quantities.  If the show_all_quantities toggle
is on, then internal quantities and method instances are also shown.
This is particularly informative if convert_to_quantities has been done
(same as -q command line option), since then internal values such as
constraint integrals are in the form of method instances.


<----------------------------------- q ------------------------------------>

Single letter main command. Syntax:
    q
    q value
Alone, "q" brings up a prompt to enter a new datafile.  At this prompt,
hitting the Enter key will return to the current surface, another "q" will 
exit Evolver, and anything else will be taken to be the name of a new datafile.
When "quit" is followed by a value, Evolver exits immediately, and uses
the value as the exit code, which is useful when running Evolver in a
script or from some other program.  Quitting Evolver automatically closes 
any graphics windows, and does not save anything. Same as "quit" command. 
"quit", "bye", and "exit" are synonyms.

q,x: Graphics mode command. Exit from graphics mode, and return to main
command mode.


<------------------------------- quadratic -------------------------------->

Main prompt command. Changes to quadratic model from linear or Lagrange
models.


<------------------------- quadratic declaration -------------------------->

To declare that the datafile lists a surface in the quadratic model, the
top section of the datafile should contain the line

  QUADRATIC

The only effect on datafile syntax is that the edge section may list edge
midpoint vertices.


<---------------------------- quadratic model ----------------------------->

By default, edges and facets are linear. But it is possible to represent
edges as quadratic curves and facets as quadratic patches by using the
quadratic model. Each edge is endowed with a midpoint vertex. Most features
are implemented for the quadratic representation, but some named quantity
methods are not available, such as those involving curvature.
A special case is circular arc mode, which is effective in quadratic mode
in the string model with the circular_arc_length method used for
length_method_name. Then edges are calculated and drawn as exact circular
arcs through their three vertices.
 The quadratic model can be invoked by putting the QUADRATIC keyword in the
top section of the datafile or by using the quadratic or M 2 commands.

<-------------------------- quadratic_metric_mix -------------------------->

Internal read-write variable. Fraction of linear interpolation in
Hessian metric in the quadratic model. Not very useful.

<---------------------------- quantities_only ----------------------------->

Evolver toggle command. Inactivates all energies except named quantities.
Meant for programmer's debugging use.


<---------------------- quantities_predicted -------------------------->

Datafile keyword in the top section of the datafile that specifies the
initial allocation of named quantity structures.  Optional.  The purpose is 
to prevent repeated reallocation of memory as the quantity list grows.
Not significant if there are only a few quantities,  but there are
times when there can be thousands of quantities, such as when 
"everything_quantities" is used with a large foam. Automatically put in
dump files by the "d" or "dump" commands, based on the current number of 
quantities.  This declaration obviously should come before any quantities
are defined. 
Example:
    vertices_predicted 30748
    edges_predicted    92166
    facets_predicted   61446
    bodies_predicted    2048 
    facetedges_predicted  184320
    method_instances_predicted   4098
    quantities_predicted   2050

<-------------------------------- quantity -------------------------------->

There is a systematic scheme of calculating global quantities such as
area, volume, and surface integrals that supplements and can replace
the original ad hoc scheme in the Evolver. Briefly, a "method" is a built-in
function for calculating a value for a particular type of geometric element,
and a "named quantity" is a combination of instances of methods.
See the ringblob datafile for an example. The original ad hoc calculations
are still the default where they exist, but all new quantities are being
added in the named quantity scheme. Some new features will work only with
named quantities. To convert everything to named quantities, start Evolver
with the -q option or use the convert_to_quantities command. This has not
been made the default since named quantities can be slower than the originals.
The sample datafiles qcube.fe, qmound.fe, and ringblob.fe contains some
examples of named quantities and instances. The first two are quantity
versions of cube.fe and mound.fe. These illustrate the most general and
useful methods, namely facet_vector_integral, facet_scalar_integral, and
edge_vector_integral, rather than the faster but more specialized methods
such as facet_area. My advice is that the user stick to the old implicit
methods for area, volume, and gravitational energy, and use named
quantities only for specialized circumstances.


<--------------------------- quantity attribute --------------------------->

Geometric element read-only attribute. Named quantities and method
instances can be applied to geometric elements either in the datafile (by
adding the quantity or method name to the line defining an element) or with
the "set" command. Nonglobal quantities or methods can be unset for
individual elements. The values for individual elements can be accessed
using attribute syntax. Examples: Suppose there is a named quantity
"xmoment" that can be evaluated for facets. Then one could give commands

   foreach facet do printf "%g %f\n",id,xmoment
   list facet where xmoment > 4
   set facet quantity xmoment where original == 1
   unset facet quantity xmoment


<---------------------- quantity Lagrange multiplier ---------------------->
<--------------------------- quantity pressure ---------------------------->

Each "fixed" quantity has a Lagrange multiplier associated to it. The
Lagrange multiplier of a constraint is the rate of energy change with
respect to the constraint target value. For a volume constraint, the
Lagrange multiplier is just the pressure. Lagrange multipliers are
calculated whenever an iteration step is done. They may be displayed with
the v command in the "pressure" column, or as an expression
"quantityname.pressure".


<---------------------------- quantity modulus ---------------------------->

Each quantity has a "modulus", which is just a scalar multiplier for the
sum of all instance values. A modulus of 0 will turn off calculation of all
the instances. The modulus can be set in the datafile declaration, or by 
assignment:
   quantityname.modulus := 1.2


<---------------------------- quantity target ----------------------------->

Each "fixed" quantity has a target value, to which the Evolver attempts to
constraint the quantity value. Each time an iteration is done ( g command
or the various Hessian commands), Newton's Method is used to project the
surface to the constrained values. The target value can be displayed with
the A or v commands, or as "quantityname.target". It can be changed by 
assignment. Example:
  print qname.target
  qname.target := 3.12


<--------------------------- quantity tolerance --------------------------->

A fixed quantity can have a tolerance attribute, which is used to judge
convergence. A surface is deemed converged when the sum of all ratios of
quantity discrepancies to tolerances is less than 1. This sum also includes
bodies of fixed volume. If the tolerance is not set or is negative, the
value of the variable target_tolerance is used, which has a default value
of 0.0001.   The sample datafile column.fe contains some examples of named
quantities and instances.


<----------------------------- quantity value ----------------------------->

The value of a namee quantity may be displayed with the A or v commands, or as
an expression "quantityname.value". Furthermore, using the quantity name as
an element attribute evaluates to the sum of all the applicable component
instance values on that element. For example, supposing there is a quantity
named vol, one could do
  print vol.value
  print facet[2].vol
  histogram(facet,vol)


<--------------------------- quantity volconst ---------------------------->

 A quantity can have a constant value added to it, similar to the body
attribute volconst. This quantity attribute is also called volconst. It is
useful for adding in known values of say integrals that are omitted from
the actual calculation. It can be set in the quantity's datafile
definition, or by an assignment command.

<-------------------------- quarter_turn_period --------------------------->

User-defined variable used by the quarter_turn symmetry group.
See "quarter_turn" for more.

<------------------------------ quarter_turn ------------------------------>

Symmetry group.  3D torus with quarter turn in identification of top 
and bottom. x and y periods taken to be 1. z period is the user-defined 
variable quarter_turn_period.  Generators x,y,z. x and y as in regular 
torus mode. z is vertical translation with quarter turn: (x,y,z)->(-y,x,z).
Relations: x z = z y^-1,   y z = z x
Numerical representation: as in torus, for powers of x,y,z
with generators applied in that order.

<--------------------------------- quiet ---------------------------------->

Evolver toggle command. Suppresses all normal output messages
automatically generated by commands. Good while running scripts, or for
loading datafiles with long read sections. Explicit output from print,
printf, and list commands will still appear, as will prompts for user
input. Applies to redirected output as well as console output. An error or
user interrupting a command (i.e. with CTRL-C) will turn QUIET off, for
sanity.

<-------------------------------- quietgo --------------------------------->

Evolver toggle command. Suppresses g iteration step output, but permits
other messages.


<------------------------------- quietload -------------------------------->

Evolver toggle command. Suppresses echoing of files being read in. This
applies to the read section at the end of the datafile and any files read
in with the read command. This toggle does not get reset at the start of a
new datafile. This toggle can be set with the -Q command line option, to
suppress echoing in the first datafile loaded. Default is OFF.


<---------------------------- quietload option ---------------------------->
<--------------------------------- option --------------------------------->

Command line option -Q : Suppresses echoing of read section of datafile,
and of files input with the read command; same as quietload toggle.


<---------------------------- quotient spaces ----------------------------->

Symmetry groups and quotient spaces.
As a generalization of the torus model, you may declare the domain to be
the quotient space of R^n with respect to some symmetry group. Several
built-in groups are available, and ambitious users can compile C code into
Evolver to define group operations. Group elements are represented by
integers attached to edges (like the wrap specifications in the torus model
at runtime). You define the integer representation of the group elements.
See the file quotient.c for an example. See khyp.c and khyp.fe for a more
intricate example modelling an octagon in Klein hyperbolic space identified
into a genus 2 surface.

The datafile requires the keyword SYMMETRY_GROUP followed by the name for
the group in quotes. Edges that wrap have their group element specified in
the datafile by the phrase "wrap n", where n is the number of the group
element. The wrap values are accessible at run time with the wrap attribute
of edges. The group operations are accessible by the functions
wrap_inverse(w) and wrap_compose( w1,w2).

Using any Hessian commands with any symmetry group (other than the
built-in torus model) will cause automatic converting to named quantities
(with the " convert_to_quantities" command, since only named quantity
Hessian evaluation routines have the proper symmetry transformation of the
Hessian programmed in.

Volumes of bodies might not be calculated correctly with a symmetry group.
The volume calculation only knows about the built-in torus model. For other
symmetry groups, if you declare a body, it will use the Euclidean volume
calculation. It is up to you to design an alternate volume calculation
using named quantities and methods.

The currently implemented symmetry groups are:
   torus - The underlying group for the torus model.
   rotate - Cyclic group of rotations in the x-y plane.
   flip_rotate - Cyclic group of rotations in the x-y plane with z -> -z
         with every odd rotation.
   cubocta - Full point group of a cube.
   xyz - The orientation-preserving subgroup of cubocta.
   genus2 - For a 2 dimensional genus 2 hyperbolic quotient space.
   dodecahedron - For a 3D hyperbolic quotient space with dodecahedral
         fundamental region.
   central_symmetry - Inversion through the origin, X -> -X.
   screw_symmetry - Screw motion along z axis.


<----------------------------------- r ------------------------------------>

Single letter main command. Refines the triangulation. Edges are divided
in two, and facets are divided into four facets with inherited attributes.
Reports the number of element structures and amount of memory used by those
structures.  Edges and facets with the no_refine attribute set are not
refined.

Graphics mode command. Rotate right. Rotates about vertical axis,
default 6 degrees.  Integer prefix indicates how many 6 degree rotations
to do, and decimal prefix indicates angle of rotation.
Examples: `15r' does 90 degree rotation, `15.0r' does 15 degree rotation.


<----------------------------------- R ------------------------------------>

Graphics mode command. Reset viewing angles to original defaults and
rescale the image to fit the viewing window.

<--------------------------------- random --------------------------------->

Internal read-only variable. Random number between 0 and 1 that is
different every time the variable is evaluated.  Assign a value to
the random_seed variable to initialize the random number generator
to a known state.

<------------------------------ random_seed ------------------------------->

Internal read-write variable. Seed for random number generator, used when
the "random" variable is evaluated, in jiggling, and in finding random initial
vectors in various Hessian eigenvector algorithms. Defaults to 1 at start
of datafile.  Assigning a value to random_seed initializes the random
number generator to a known state.

<------------------------------- raw_cells -------------------------------->

Evolver toggle command. Sets torus model display for plain, unwrapped
facets. Not an on-off toggle; 3-way toggle with "clipped" and "connected".
Default is unset, so Evolver prompts the user when graphics are first 
displayed.  The setting persists when loading a new surface.  But loading 
a torus model when a non-torus model is currently displayed will not prompt.


<--------------------------- raw_vertex_average --------------------------->

Main prompt command. Does vertex averaging on selected vertices without
conserving volume on each side of surface, as vertex_average does. Will
only average vertices with those of like type of constraints. Doesn't
move vertices on boundaries.  See "rawest_vertex_average" for averaging
without any restrictions.  Having the "verbose" toggle on will print
messages. Syntax:

  RAW_VERTEX_AVERAGE generator

Example:

  raw_vertex_average vertex where valence == 6

<------------------------- rawest_vertex_average -------------------------->

Main prompt command. Does vertex averaging on selected vertices without
conserving volume on each side of surface, or attention to being on like
constraints. Doesn't move vertices on boundaries.  See "vertex_average"
and "raw_vertex_average" for more restricted averaging. Having the "verbose"
toggle on will print messages. Syntax:

   RAWEST_VERTEX_AVERAGE generator

Example:

   rawest_vertex_average vertex[3]

<-------------------------------- rawestv --------------------------------->

Main prompt command. Does vertex averaging for all vertices without regard
for conserving volume or whether averaged vertices have like constraints.
But doesn't move vertices on boundaries. To do a selected group of
vertices, use rawest_vertex_average. See "V" and "rawv" for more
restricted averaging.


<---------------------------------- rawv ---------------------------------->

Main prompt command. Does vertex averaging for all vertices without
conserving volume on each side of surface. Will only average vertices with
those of like type of constraints. Doesn't move vertices on boundaries. To
do a selected group of vertices, use raw_vertex_average.  See also "V"
and "rawestv".

<------------------------------ raw_velocity ------------------------------>

Internal vertex read-only attribute used when one-sided level-set constraints
are present, so the Lagrange multipliers for said constraints can be 
calculated.  This is the velocity before any projection to volume or 
level-set constraints.  Not of interest to the ordinary user.

<---------------------------------- read ---------------------------------->

Main prompt command. For reading commands from a file. Syntax:

   READ filename

The filename can be either a quoted string or a string variable. The
effect is as if the file were typed in at the keyboard. Hence main
commands, responses to commands, and graphics mode commands can be
included. Read commands may be nested. On the occurence of an error, input
reverts to the original standard input.  Echoing of input may be
suppressed with the "quietload" toggle. Example:
   read "zebra.cmd"

<------------------------------ read section ------------------------------>

The final section of the datafile may contain commands. These commands are
read and executed immediately, just as if they had been entered at the
command prompt. Encountering the keyword READ in the datafile causes the
Evolver to switch from datafile mode to command mode and read the rest of
the datafile as command input. This feature is useful for automatic
initialization of the surface with refining, iteration, defining your own
commands, etc. The READ section is optional. Example:

  bodies
  1   1 2 3 4 5 6 volume 1

  read

  // automatically do this when datafile is loaded
  refine edge where on_constraint 1

  // typical evolution
  gogo := { g 5; r; g 10; r; g 20 }

The "list bottominfo" command prints the READ section that would be printed
in a dump file.

<---------------------------------- real ---------------------------------->

Possible type for user-defined variables, arrays, functions, and
extra attributes.  Example declarations, which work both in the top
of the datafile and at runtime:

  define george real
  define my_array real[3][4]
  define edge attribute charlie real
  define vertex attribute newx real[3]
  define facet attribute knots real[5][5][5]
  define edge attribute bbb real function { self.bbb := self.x+self.y }

<------------------------ reasonable scale factor ------------------------->

Trouble in evolving is usually signaled by a small scale, which means
there is some obstacle to evolution. Of course, that means you have to know
what a reasonable scale is, and that depends on the type of energy you are
using and how refined your surface si. In normal evolution, the size of the
scale is set by the development of small-scale roughness in the surface.
Combined with a little dimensional analysis, that leads to the conclusion
that the scale should vary as L^2-q, where L is the typical edge length and
the units of energy are length^q. The dimensional analysis goes like this:
Let D be the perturbation of one vertex away from an equilibrium surface.
In general, energy is quadratic around an equibrium, so

  E = D^2L^q-2

So the gradient of energy at the vertex is

  grad E = 2 D L^q-2

The motion is the scale times the gradient, which we want proportional to D, so

 scale * grad E = scale * 2 D L^q-2 = D

So scale is on the order of L ^2-q.
Some examples of dimensional dependence of scale factor:
 Energy                    Energy dimension      Scale            Example file
 Area of soapfilm                L^2              L^0                quad.fe
 Length of string                L^1              L^1              flower.fe
 String squared curvature        L^-1             L^3            elastic8.fe
 Surface squared mean curvature  L^0              L^2              sqcube.fe
In particular, the scale for area evolution is independent of refinement,
but for most other energies the scale decreases with refinement.
Another common influence on the scale for area evolution is the surface
tension. Doing a liquid solder simulation in a system of units where the
surface tension of facets is assigned a value 470, say, means that all
calculated gradients are multiplied by 470, so the scale decreases by a
factor of 470 to get the same geometric motion. Thus you should set
scale_limit to be the inverse of the surface tension.


<--------------------------------- rebody --------------------------------->

Main prompt command. Recalculates connected bodies. Useful after a body
has been disconnected by a neck pinching off. Facets of an old body are
divided into edge-connected sets, and each set defines a new body (one of
which gets the old body id). The new bodies inherit the attributes of the
old body. If the original body volume was fixed, then the new bodies'
target volumes become the new actual volumes. If the original body had a
volconst, the new bodies will inherit the same value. This will likely lead
to incorrect values, so you will have to adjust the volconsts by hand. In
commands, you may specify the new bodies descended from an original body by
using the 'original' atttribute.


<--------------------------------- recalc --------------------------------->

Main prompt command. Recalculates and redisplays everything. Useful after
changing some variable or something and recalculation is not automatically
done. Evolver tries to automatically recalculate when some significant
change is made, but doesn't always know. Also see autorecalc.


<------------------------------ redefinition ------------------------------>

Single letter redefinition:
It is possible to reassign a single letter to your own command by the
syntax

 letter :::= command

but this should only be used in special circumstances, such as redefining
'r' to do additional actions along with refinement. The standard meaning
can be restored with a null assignment:

 letter :::=

Use single quotes around the letter to get the standard meaning, i.e. 'r'
will do a standard refine when r has been redefined. Redefinitions are
cleared when a new surface is loaded. Be careful when using redefined
commands in defining other commands. Redefinition is effective on execution
of the redefinition command, not on parsing. Redefinition is not
retroactive to uses in previously defined commands, but restoring the
standard meaning is retroactive. Examples:

   V :::= { fix vertex[5]; 'V'; unfix vertex[5] }
   r :::= { divisions := divisions * 2;
            hooke_length := hooke_length/2; 'r' }


<------------------------------ redirection ------------------------------->

The output of a command can be redirected to a file with the unix-style
append symbol '>>'. This appends output to the file; it does not erase any
existing file. Syntax:

   command >> stringexpr

To overwrite a possibly existing file, the output of a command can be 
redirected with the symbol '>>>'. Syntax:

   command >>> stringexpr

Redirection with just `>' is not available due to the use of `>' as an
comparison operator.

Standard redirection does not apply to error messages, including 
output done with "errprintf", on the assumption that the user wants
them visible on the screen while a script runs.  However, error
messages can be redirected using ">>2" and ">>>2".  The "2" comes
from the fact that in popular operating systems the standard
error output is internally file number 2.  Redirection of error
messages could be useful for example in saving the output of the
"C" or "chack" commands.

The output of a command can be piped to a system command using the
unix-style pipe symbol `|'. Syntax:

   command | stringexpr

The stringexpr is interpreted as a system command.

Examples:

   { {g 10; u } 20 } >> "logfile"
   printf "Step: %d  Energy: %f\n",step,total_energy >> "output.txt"
   list facets | "more"


<--------------------------------- refine --------------------------------->

Main prompt command. For subdividing sets of edges or facets. Syntax:

  REFINE generator

Subdivides the generated edges or facets. Subdivides edges by putting a
vertex in the middle of each edge, and splitting neighboring facets in two
in the soapfilm model. It is the same action as the long edge subdivide
command (command l). Facets will be subdivided by putting a vertex in the
center and creating edges out to the old vertices. It is strongly suggested
that you follow this with equiangulation to nicen up the triangulation.
Edge refinement is better than facet refinement as facet refinement can
leave long edges even after equiangulation. This command does not respect
the no_refine attribute. Example:

       refine edges where not fixed and length > .1


<------------------------------ refine_count ------------------------------>

Internal read-only variable. Number of elements refined in
last refine command.   Prints and resets to 0 at the end of a command
execution, or when flush_counts is done. Also reset by reset_counts.

<---------------------------- relaxed_elastic ----------------------------->
<---------------------------- relaxed_elastic1 ---------------------------->
<---------------------------- relaxed_elastic2 ---------------------------->

Named method. Description: A variation of the linear_elastic method.
Calculates the linear elastic strain energy energy for facets based on the
Cauchy-Green strain matrix, with compression counting for zero energy,
simulating, say, plastic film. The effect is to permit wrinkling. Let S be
Gram matrix of unstrained facet (dots of sides). Let Q be the inverse of S.
Let F be Gram matrix of strained facet. Let C = (FQ-I)/2, the Cauchy-Green
strain tensor. Let v be Poisson ratio. Then energy density is

   (1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))

Each facet has extra attribute poisson_ratio and each vertex has two extra
coordinates, the coordinates of the unstrained surface in a plane. Hence
the surface must be set up as five dimensional. The compression is detected
by doing an eigenvalue analysis of the strain tensor, and discarding any
negative eigenvalues. The eigenvalues may be separately accessed by the
relaxed_elastic1 (lower eigenvalue) and relaxed_elastic2 (higher
eigenvalue) methods, which are meant to be used in info_only mode. For a
sample datafile, see mylarcube.fe.  There can also be a real-valued facet 
extra attribute LEBweight, which can be used to give a per-facet weighting 
of the energy.  For a version of relaxed elastic energy using only three 
ambient dimensions but an additional facet form_factor array facet attribute, 
see relaxed_elastic_A.

Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: 5.
Hessian: yes. 
Example datafile declaration:

  space_dimension 5
  quantity lastic energy method relaxed_elastic global
  quantity lastic_lo info_only method relaxed_elastic1 global
  quantity lastic_hi info_only method relaxed_elastic2 global

<--------------------------- relaxed_elastic_A ---------------------------->
<--------------------------- relaxed_elastic1_A --------------------------->
<--------------------------- relaxed_elastic2_A --------------------------->

Named method. Description: Calculates the linear elastic strain energy
energy for facets based on the Cauchy-Green strain matrix, with compression
counting for zero energy, simulating, say, plastic film. The effect is to
permit wrinkling. Let S be the Gram matrix of unstrained facet (dots of
sides). Let Q be the inverse of S. Let F be Gram matrix of strained facet.
Let C = (FQ-I)/2, the Cauchy-Green strain tensor. Let v be Poisson ratio.
Then the energy is

 (1/2/(1+v))(Tr(C^2) + v*(Tr C)^2/(1-(dim-1)*v))

Each facet has extra attribute poisson_ratio and extra attribute array
form_factors[3] = {s11,s12,s22}, which are the entries in S. That is, s11 =
dot(v2-v1,v2-v1), s12 = dot(v2-v1,v3-v1), and s22 = dot(v3-v1,v3-v1). If
form_factor is not defined by the user, it will be created by Evolver, and
the initial facet shape will be assumed to be unstrained. The compression
is detected by doing an eigenvalue analysis of the strain tensor, and
discarding any negative eigenvalues. Facets which are stressed in one or
two dimensions can be separately counted by the relaxed_elastic1_A (one
stress direction, and one wrinkle direction) and relaxed_elastic2_A (two
stressed directions) methods, which are meant to be used in info_only mode.
There can also be a real-valued facet extra attribute LEBweight, which 
can be used to give a per-facet weighting of the energy.  

For a sample datafile, see mylarcube.fe.  For a version of relaxed elastic
energy that uses two extra ambient dimensions instead of form_factors,
see relaxed_elastic.  For a version of this method that
gives compression positive energy, see linear_elastic.

Element: facet.
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: yes.
Example datafile declaration:

   quantity lastic energy method relaxed_elastic_A global


<------------------------------ renumber_all ------------------------------>

Reassigns element id numbers of all types of elements in accordance with
order in storage, i.e. as printed with the LIST commands. Besides
renumbering after massive topology changes, this can be used with the
reorder_storage command to number elements as you desire. Do NOT use this
command inside an element generator loop!  Also see reorder_storage.

<---------------------------- reorder_storage ----------------------------->

Reorders the storage of element data structures, sorted by the extra
attributes vertex_order_key, edge_order_key, facet_order_key,
body_order_key, and facetedge_order_key. Originally written for testing
dependence of execution speed on storage ordering, but could be useful for
other purposes, particularly when renumber_all is used afterwards. Example:

   define vertex attribute vertex_order_key real
   define edge attribute edge_order_key real
   define facet attribute facet_order_key real
   define body attribute body_order_key real
   define facetedge attribute facetedge_order_key real

   reorder := {
     set vertex vertex_order_key x+y+z;
     set edge ee edge_order_key min(ee.vertex,vertex_order_key);
     set facetedge fe facetedge_order_key fe.edge[1].edge_order_key;
     set facet ff facet_order_key min(ff.vertex,vertex_order_key);
     set body bb body_order_key min(bb.facet,facet_order_key);
     reorder_storage;
     }


<------------------------------ repartition ------------------------------->

Main prompt command. In the MPI version of Evolver, this command
re-distributes the elements of the surface according to the task 
numbers set in respective element attributes that are declared thus: 
 
           define vertex attribute v_newpart integer[2] 
           define edge   attribute e_newpart integer[2] 
           define facet  attribute f_newpart integer[2] 
           define facetedge attribute fe_newpart integer[2] 
           define body  attribute b_newpart integer[2] 
  
Probably a good idea just to include the above lines in any MPI Evolver
datafile. The user sets the first component of each; the second is for
internal use. For example, assuming you have Metis linked into your 
Evolver:

mpi_equalize := { 
  // set new partition numbers 
  metis mpi_maxtask; 
  parallel_exec "set vertex v_newpart[1] vpart+1"; 
  parallel_exec "set edge e_newpart[1] epart+1"; 
  parallel_exec "set facet f_newpart[1] fpart+1"; 
  parallel_exec "set body b_newpart[1] 0"; 
  parallel_exec "set facetedge fe fe_newpart[1] fe.facet[1].fpart";  
  repartition; 
}  

<------------------------------ replace_load --------------------------------->

Main prompt command.
Replaces the current surface with a new surface from a datafile without a 
total re-initialization.  Syntax:
   replace_load  filename
where filename is a double-quoted string or a string variable.  The
replace_load command actually dissolves all the elements of the current
surface and then does the addload command to read in the desired datafile.
Thus only the top section and the elements of the new file are read in;
the "read" section of the new datafile is not read.   All variables,
constraints, quantities, and commands from the original file are remembered,
although they may be re-initialized in the top of the new datafile.  This
command can be used in loops to repeatedly evolve a surface under different
conditions, for example
    run := { printf "Height     Energy\n" >>> "results.txt";
             for ( htvar := 1.0 ; htvar <= 2.0 ; htvar += 0.1 )
             { replace_load datafilename;
               height := htvar;
               gogo;
               printf "%f     %f\n",height,total_energy >> "results.txt";
             }
           }
It is necessary that htvar NOT appear in the top of the datafile, so that
it does not get re-initialized when replace_load is done.  You can set the 
no_dump property of a variable to prevent it from being dumped in the
top of the datafile; it will be dumped in the bottom section instead.
Example (as commands, not in the top of the datafile):
  htvar := 2.3
  htvar.no_dump on

Replace_load is meant as a replacement for permload, which I have never 
been able to get to work right.
 
<------------------------------ reset_counts ------------------------------>

Main prompt command. Resets to 0 various internal counters. The counters
are:
 > equi_count,
 > edge_delete_count,
 > facet_delete_count,
 > edge_refine_count,
 > facet_refine_count,
 > notch_count,
 > vertex_dissolve_count,
 > edge_dissolve_count,
 > facet_dissolve_count,
 > body_dissolve_count,
 > vertex_pop_count,
 > edge_pop_count,
 > pop_tri_to_edge_count,
 > pop_edge_to_tri_count,
 > pop_quad_to_quad_count,
 > where_count,
 > edgeswap_count,
 > fix_count,
 > unfix_count,
 > t1_edgeswap_count, and
 > notch_count.

Normally, a count is set to 0 at the start of a command that potentially
affects it, accumulated during the execution of the command, and printed at
the end of the command. To be precise, each counter has a "reported" bit
associated with it, and if the "reported" bit is set when the appropriate
command (such as 'u') is encountered, the counter will be reset to 0 and
the "reported" bit cleared. The "reported" bit is set by either
flush_counts or the end of a command. The idea is to have the counts from
previous commands available to subsequent commands as long as possible, but
still have the counter reflect recent activity.

<--------------------------------- return --------------------------------->

Command syntax for exiting the current command. This is essentially a
return from a subroutine. If the current command is a user-defined command
called by another command, the parent command continues. Example:
  if ( acc < 1.e-10 ) then return;


<-------------------------- reverse_orientation --------------------------->

Main prompt command. For reversing the orientation of sets of edges or
facets. Syntax:

   REVERSE_ORIENTATION generator

Reverses the internal orientation of selected edges or facets, as if they
had been entered in the datafile with the opposite orientation. Useful, for
example, when edges come in contact with a constraint and you want to get
them all oriented in the same direction. Relative orientations of
constraint and quantity integrals change to compensate, so energy, volumes,
etc. should be the same after the command, but it would be wise to check in
your application. Examples:

   reverse_orientation edge[7]
   reverse_orientation facets where backbody != 0

Note that this is different from setting the "orientation" attribute of
an element.  Doing reverse_orientation of an element will also reverse
the "orientation" attribute, so oriented integrals are the same before
and after.  So beware that after reverse_orientation, oriented quantities 
may not change as you expect.  It may be necessary to remove edges or 
facets from constraints or quantities, reverse them, declare their 
orientation positive, and re-apply constraints and quantities.

<------------------------------- rgb_colors ------------------------------->

Evolver toggle command. Toggles graphics to use user-specified
red-green-blue components of color for elements rather than the "color"
attribute indexing the pre-defined 16-color palette. The individual element
rgb values are in element extra attributes: ergb for edges, frgb for
facets, and fbrgb for facet backcolor. It is up to the user to define these
attributes; if they are not defined, then they are not used and do not take
up space. If frgb is defined but not fbrgb, then frgb is used for both
front and back color. The attributes are type real of dimension 3 or 4; if 4
dimensional, the fourth component is passed to the graphics system as the
alpha value, but probably won't have any effect. The value range is 0 to 1.
Be sure to initialize the rgb attributes, or else you will get an all-black
surface. The attribute definitions to use are:

   define edge attribute ergb real[3]
   define facet attribute frgb real[3]
   define facet attribute fbrgb real[3]

<-------------------------------- ribiere --------------------------------->

Evolver toggle command. Makes the conjugate gradient method use the
Polak-Ribiere version instead of Fletcher-Reeves. (The toggle doesn't turn
on conjugate gradient.) Polak-Ribiere seems to recover much better from
stalling. Ribiere is the default mode.


<--------------------------- Riemannian metric ---------------------------->

The ambient space can be endowed with a general Riemannian metric by
putting the keyword METRIC in the datafile followed by the elements of the
metric tensor. Only one coordinate patch is allowed, but the quotient space
feature makes this quite flexible. Edges and facets are linear in
coordinates, they are not geodesic. The metric is used solely to calculate
lengths and areas. It is not used for volume. To get a volume constraint on
a body, you will have to define your own named quantity constraint. See
quadm.fe for an example of a metric.   Syntax:

METRIC
expr expr expr
expr expr expr
expr expr expr

<-------------------------------- ringblob -------------------------------->

Example: Ring around rotating rod

This example consists of a ring of liquid forming a torus around a rod
rotating along its long axis (z axis) in weightlessness. The liquid has
controllable contact angle with the rod. The interesting question is the
stability of the ring as the spin increases.

The effect of the rotation is incorporated in the energy through an
integral using the Divergence Theorem:

        ///
  E = - ||| (1/2) p r^2 w^2 dV
        ///B  


        //
    = - ||       (1/2) p w^2 (x^2+y^2) z k . dA
        //bdry B

where B is the region of the liquid, r is radius from the axis, p is the
fluid density and w is the angular velocity. Note the energy is negative,
because spin makes the liquid want to move outward. This has to be
countered by surface tension forces holding the liquid on the rod. If p is
negative, then one has a toroidal bubble in a rotating liquid, and high
spin stabilizes the torus. The spin energy is put in the datafile using the
named quantity syntax (see below). "centrip" is a user-chosen name for the
quantity, "energy" declares that this quantity is part of the total energy,
"global_method" says that the following method is to be applied to the
whole surface, "facet_vector_integral" is the pre-defined name of the
method that integrates vector fields over facets, and "vector_integrand"
introduces the components of the vectorfield.

The rod surface is defined to be constraint 1 with equation x^2 + y^2 =
R^2, where R is the radius of the rod. The contact energy of the liquid
with the rod is taken care of with an edge integral over the edges where
the liquid surface meets the rod:

      //                          /                  /
  E = || -T cos(a) dA = -T cos(a) |  z ds = T cos(a) | (z/R)(yi - xj).ds
      //S                         /bdry S            / bdry S

Here S is the rod surface not included as facets in bdry B, T is the
surface tension of the free surface, and a is the internal contact angle. A
more intuitive way to arrive at this integral is to think in cylindrical
coordinates and imagine the replaced surface of the rod between the contact
line and z = 0 to be divided into thin vertical strips of height z and
width R dtheta. The energy of a strip is -T cos(a) z R dtheta. Converting
back to Cartesian coordinates, dtheta = (x dy - y dx)/(x^2 + y^2), so

                 //                                   //
  E =  -T cos(a) || z R (x dy - y dx)/R^2 = -T cos(a) || (z/R)(x dy - y dx)
                 //                                   //


Constraint 2 is a horizontal symmetry plane. By assuming symmetry, we only
have to do half the work.

Constraint 3 is a one-sided constraint that keeps the liquid outside the
rod. Merely having boundary edges on the rod with constraint 1 is not
enough in case the contact angle is near 180 degrees and the liquid volume
is large. Constraint 3 may be put on any vertices, edges, or faces likely
to try to invade the rod. However, it should be noted that if you put
constraint 3 on only some vertices and edges, equiangulation will be
prevented between facets having different constraints.
 Constraint 4 is a device to keep the vertices on the rod surface evenly
spaced. Edges on curved constraints often tend to become very uneven, since
long edges short-cutting the curve can save energy. Hence the need for a
way to keep the vertices evenly spread circumferentially, but free to move
vertically. One way to do that is with another constraint with level sets
being vertical planes through the z axis at evenly spaced angles.
Constraint 4 uses the real modulus function with arctangent to create a
periodic constraint. Each refinement, the parameters need to be halved to
cut the period in half. This is done by redefining the "r" refinement
command at the end of the datafile. Note that autorecalc is temporarily
turned off to prevent projecting vertices to the constraint when it is in
an invalid state. Also note the pi/6 offset to avoid the discontinuity in
the modulus function. pi/6 was cleverly chosen so that all refinements
would also avoid the discontinuity.

One way of detecting stability is to perturb the torus and seeing if it
evolves back to equilibrium. The datafile defines a command

    perturb := set vertex y y+.01 where not on_constraint 1

This sets the y coordinate of each vertex to y+.01. This command is
defined in the "read" section at the end of the datafile, where you can put
whatever commands you want to execute immediately after the datafile is
loaded. To detect small perturbations, and get numerical values for the
size of perturbations, the y moment of the liquid is calculated in the
named quantity "ymoment". It is not part of the energy, as indicated by the
info_only keyword. You can see the value with the `v' command.

A better way to check stability is to examine the eigenvalues of the
Hessian matrix. First, evolve normally to reasonably near an equilibrium.
Then use the hessian command several times to converge exactly to the
equilibrium. Then use the command "ritz(0,5)" to display the 5 eigenvalues
of the Hessian nearest 0. By gradually raising the spin and tracking the
lowest eigenvalue, one can detect the onset of instability, where the
lowest eigenvalue becomes 0. Note that the datafile toggles on
hessian_normal so that the Hessian only considers perturbations normal to
the surface.

The initial ringblob skeleton, with vertices and edges numbered. Taking
advantage of symmetry, just the top half is represented.



// ringblob.fe

// Toroidal liquid ring on a rotating rod in weightlessness.
// Half of full torus
// Using second periodic constraint surface intersecting rod to
// confine vertices on rod to vertical motion.

// Important note to user: Use only the 'rr' command defined at
// the end of this file to do refinement.  This is due to the
// nature of constraint 4 below.

// This permits drawing both halves of the ring
view_transforms 1
1 0 0 0
0 1 0 0
0 0 -1 0
0 0 0 1

// Basic parameters.  These may be adjusted at runtime with the
// 'A' command.  Only spin is being adjusted in these experiments.
parameter rodr = 1  // rod radius
parameter spin = 0.0 // angular velocity
parameter angle = 30 // internal contact angle with rod
parameter tens = 1   // surface tension of free surface
#define rode (-tens*cos(angle*pi/180))  // liquid-rod contact energy
parameter dens = 1  // density of liquid, negative for bubble

// spin centripetal energy
quantity centrip energy global_method facet_vector_integral
vector_integrand:
q1: 0
q2: 0
q3: -0.5*dens*spin*spin*(x^2+y^2)*z

// y moment, for detecting instability
quantity ymoment info_only global_method facet_vector_integral
vector_integrand:
q1: 0
q2: 0
q3: y*z

// Constraint for vertices and edges confined to rod surface,
// with integral for blob area on rod
constraint 1
formula: x^2 + y^2 = rodr^2
energy:
e1: -rode*z*y/rodr
e2: rode*z*x/rodr
e3: 0

// Horizontal symmetry plane
constraint 2
formula: z = 0

// Rod surface as one-sided constraint, to keep stuff from caving in
// Can be added to vertices, edges, facets that try to cave in
constraint 3 nonnegative
formula: x^2 + y^2 = rodr^2

// Constraint to force vertices on rod to move only vertically.
// Expressed in periodic form, so one constraint fits arbitrarily
// many vertices. Note offset to pi/6 to avoid difficulties with
// modulus discontinuity at 0.
parameter pp = pi/2    /* to be halved each refinement */
parameter qq = pi/6    /* to be halved each refinement */
constraint 4
formula:  (atan2(y,x)+pi/6) % pp = qq

//initial dimensions
#define ht 2
#define wd 3

vertices
1  0   -wd 0  constraints 2    // equatorial vertices
2  wd    0 0  constraints 2
3  0    wd 0  constraints 2
4  -wd   0 0  constraint 2
5  0   -wd ht                 // upper outer corners
6  wd    0 ht
7  0    wd ht
8  -wd   0 ht
9  0 -rodr ht constraints 1,4   // vertices on rod
10 rodr  0 ht constraints 1,4
11 0  rodr ht constraints 1,4
12 -rodr  0 ht constraints 1,4

edges
1   1 2 constraint 2  // equatorial edges
2   2 3 constraint 2
3   3 4 constraint 2
4   4 1 constraint 2
5   5 6               // upper outer edges
6   6 7
7   7 8
8   8 5
9   9  10 constraint 1,4   // edges on rod
10  10 11 constraint 1,4
11  11 12 constraint 1,4
12  12  9 constraint 1,4
13   1  5        // vertical outer edges
14   2  6
15   3  7
16   4  8
17   5  9        // cutting up top face
18   6 10
19   7 11
20   8 12

faces  /* given by oriented edge loop */
1   1 14 -5 -13 tension tens // side faces
2   2 15 -6 -14 tension tens  // Remember you can't change facet tension
3   3 16 -7 -15 tension tens  // dynamically just by changing tens; you have
4   4 13 -8 -16 tension tens  // to do "tens := 2; set facet tension tens"
5   5 18 -9 -17 tension tens  // top faces
6   6 19 -10 -18 tension tens
7   7 20 -11 -19 tension tens
8   8 17 -12 -20 tension tens

bodies  /* one body, defined by its oriented faces */
1   1 2 3 4 5 6 7 8  volume 25.28

read  // some initializations
transforms off     // just show fundamental region to start with

// special refinement command redefinition
r :::= { autorecalc off;  pp := pp/2; qq := qq % pp; 'r'; autorecalc on; }

// a slight perturbation, to check stability
perturb := set vertex y y+.01 where not on_constraint 1

hessian_normal // to make Hessian well-behaved
linear_metric  // to normalize eigenvalues


<---------------------------------- ritz ---------------------------------->

Main prompt command. For finding eigenvalues of the energy Hessian near a
given value. Syntax:

   RITZ(expr,expr)

Applies powers of inverse shifted Hessian to a random subspace to
calculate eigenvalues near the shift value. First argument is the shift.
Second argument is the dimension of the subspace. Prints out eigenvalues as
they converge to machine accuracy. This may happen slowly, so you can
interrupt it by hitting whatever your interrupt key is, such as CTRL-C, and
the current values of the remaining eigenvalues will be printed out. Good
for examining multiplicities of eigenvalues. It is legal to shift to an
exact eigenvalue, but not wise, as they will not be printed. See the
Hessian tutorial for more. The first eigenvalue is subsequently available
in the last_eigenvalue internal variable. The full list of eigenvalues
produced is subsequently available in the eigenvalues[] array. Example: To
get the lowest 5 eigenvalues of a Hessian you know is positive definite:

   ritz(0,5)

<--------------------------------- rotate --------------------------------->

See "graphics commands". Or "rotate symmetry group".

<-------------------------- rotate_lights --------------------------------->

Evolver toggle command.  When ON, this makes the lights rotate with the
object in the graphics display.  Default OFF.

<------------------------- rotate symmetry group -------------------------->

This is the cyclic symmetry group of rotations in the x-y plane, where the
order of the group is given by the internal variable rotation_order (default
value 4). There is also an internal variable generator_power (default 1)
such that the angle of rotation is 2*pi*generator_power/rotation_order.

Note:
Since this group has fixed points, some special precautions are necessary.
Vertices on the rotation axis must be labelled with the attribute
axial_point in the datafile. Edges out of an axial point must have the
axial point at their tail, and must have zero wrap. Facets including an
axial point must have the axial point at the tail of the first edge in the
facet.
Example datafile declaration:
  symmetry_group "rotate"
  parameter rotate_order = 6

Group element encoding: An element is encoded as the power of the group
generator.


<----------------------------- rotation_order ----------------------------->

Internal read-write variable. Order of rotation group for
symmetry groups rotate and flip_rotate.

<------------------------------ runge_kutta ------------------------------->

Evolver toggle command. Use Runge-Kutta method in a g iteration step
(fixed scale factor only).

<----------------------------------- s ------------------------------------>

Single letter main command. Shows the surface with screen graphics. Goes
into the graphics command mode. Torus model surfaces have display options
you will be asked for the first time. The graphics window may be closed
with the close_show command.

Graphics mode command. Shrink. Contracts image by factor, default 1.2.
arrow keys : Graphics mode command. Move image in appropriate direction.
May be prefixed by a real number, which is multiple of thirds of screen
width to move. Default move is 1/12 screen width. May not work on all
terminals.


<--------------------------------- saddle --------------------------------->

Main prompt command. Seek to minimum energy along the eigenvector of the
lowest negative eigenvalue of the Hessian. If there is no negative
eigenvalue, then the surface is unchanged. The alternate form

   SADDLE expr

will limit the step size to expr. The motion vector is available
afterwards through the move command.


<---------------------------- scalar_integrand ---------------------------->

One of the possible types of supplementary information needed for
named methods such as vertex_scalar_integral, edge_scalar_integral,
facet_scalar_integral, edge_general_integral, and facet_general_integral.
The syntax consists of appending a scalar_integrand definition to
a quantity or method declaration. Example:

   quantity facet_weight energy method facet_scalar_integral
   scalar_integrand:  G*rho*z

<--------------------------------- scale ---------------------------------->

Internal read-write variable. Current scale factor for multiplying
the vertex velocity to get the motion in the 'g' command.

<------------------------------ scale factor ------------------------------>

In the 'g' command, once a direction of motion is found, the direction
must be multiplied by a scale factor to compute the actual motion. If
one interprets the direction of motion as a velocity (as in motion by
mean curvature), then the scale factor becomes a time step. The scale
factor may be fixed with the "m" command, or it may be in "optimizing"
mode. The default is to start in optimizing mode.  Set scale_limit
to set an upper bound on the scale factor.

<------------------------------ scale_limit ------------------------------->

To set an upper bound of valueon the gradient descent scale factor,
include the line

   SCALE_LIMIT value

in the top section of the datafile. The upper bound can be changed at
runtime with the m command, or by setting the scale_limit variable. If
surface tension is the main energy, the scale_limit should be set to the
inverse of the surface tension.


<------------------------------ scale_scale ------------------------------->

Internal read-write variable. Multiplier for the scale factor used in
the 'g' command.  Useful in optimizing scale mode if you only want to
move a fraction of the optimum scale for better linearity, or force
greater than optimum motion in hopes of accelerated convergence.
Default value 1.

<---------------------------- screen graphics ----------------------------->

The Surface Evolver has the ability to produce its own screen graphics
directly. The Windows version has nice OpenGL/GLUT graphics, which should
also be available on any Unix/Linux/Mac OSX system. The Mac OS 9 version
has some simple graphics, and there is a primitive X-windows graphics
module for Unix/Linux systems that for some reason can't do OpenGL. Those
compiling unix versions must link in the appropriate graphics module.

Screen graphics appear in their own window but can be controlled by typing
graphics commands at the "graphics command: " prompt in the main window.
OpenGL graphics can also be controlled by mouse and keyboard actions in the
graphics window.

Main prompt commands relevant to screen graphics:
  "s" or "show" for starting screen graphics and entering graphics command mode
  "close_show" for ending screen graphics
  "D" or "autodisplay" for toggling automatic redraw when the surface changes.
         Default is automatic redraw.
  "transform_expr" for showing multiple transforms of a surface.
  "show edges" and "show facets" for showing subsets of elements.

The native screen graphics view is controlled by a view transformation
matrix, which may be specified in the datafile, and which is dumped by the
d or list topinfo commands. The view matrix may be changed with graphics
mode commands. The view matrix elements may be read or set at runtime by
view_matrix[i][j], where the indices start at 1. In particular, one can
write command scripts to save and reload particular view matrices; see
saveview.cmd in the distribution package. The view matrix does not affect
geomview.

The display consists entirely of facets and edges. Special edges (fixed
edges, boundary edges, constraint edges, triple edges, bare edges) are
always shown, unless you make their color CLEAR. The individual facet edges
can be toggled with the graphics mode command `e'.

<------------------------------ screw_height ------------------------------>

Internal variable used by the screw_symmetry symmetry group.  
See "screw_symmetry".

<------------------------------ screw_angle ------------------------------->

Internal variable used by the screw_symmetry symmetry group.  
See "screw_symmetry".

<----------------------------- screw_symmetry ----------------------------->

This is the symmetry group of screw motions along the z axis. The global
parameter screw_height is the translation distance (default 1), and the
global parameter screw_angle is the rotation angle in degrees (default 0).
Datafile declaration:

  parameter screw_height = 4.0
  parameter screw_angle  = 180.0
  symmetry_group "screw_symmetry"

Group element encoding: the integer value is the power of the group
generator.


<---------------------------- scrollbuffersize ---------------------------->

Internal read-write variable. The command window scroll buffer size
on Windows machines. Meant for non-NT Windows that don't have
menu properties option for this.

<---------------------------------- self ---------------------------------->

Name of parent element in extra attribute functions.
Example declaration:
  define edge attribute bbb real function { self.bbb := self.x+self.y }

<------------------------------ self_similar ------------------------------>

Evolver toggle command. If squared mean curvature energy is being used,
this scales the velocity toward a self-similar motion.   Applies only
when the old top-of-datafile "squared_curvature" declaration is used,
or the sqcurve named method. The global read-write variable self_sim_coeff 
is used as a multiplier.

<----------------------------- self_sim_coeff ----------------------------->

Global read-write variable used as magnitude coefficent when
self_similar is toggled on.

<------------------------------ septum_flag ------------------------------->

Evolver toggle command.  Under some circumstances, popping a vertex 
can leave two regions connected by a tunnel; if the septum_flag toggle 
is on, it will force a  surface to be placed across the tunnel.

<---------------------------------- set ----------------------------------->

Main prompt command. For setting element attributes to values and other
miscellaneous things. Syntax:

 SET elementtype [name] attrib expr1 where expr2
 SET elementtype attrib expr1 where expr2
 SET name.attrib expr
 SET quantityname.attrib expr
 SET instancename.attrib expr

The first two forms set the value of the attribute attrib to the value
expr1 for all elements of the given type that satisfy expr2. elementtype
can be vertex, edge, facet, or body, or any element generator without a
where clause. The optional name refers to the element under consideration,
and can be used in expr1 and expr2 to refer to attributes of that element.
Even without name, attributes of the element can be referred to if the
references are not nested in element generators in expr1 or expr2. The next
form can be used inside an element generator which defines "name". When
name is not used, a '.' can be used, for those who like that sort of thing.
SET can change the following attributes: constraint, coordinates, density,
orientation, non-global named quantity or named method, user-defined extra
attributes, body target volume, body volconst, fixed, frontbody, backbody,
pressure, color, frontcolor, backcolor, boundary, and opacity (for the
appropriate type elements). Fixed, named quantity, and named method
attributes are just toggled on; they do not need the first expr. Setting
the pressure on a body automatically unfixes its volume. For constraint,
the expr is the constraint number. If using set to put a vertex on a
parametric boundary, set the vertex's boundary parameters p1, p2, etc.
first. Examples:

  set facets density 0.3 where original == 2
  set vertices x 3*x where id < 5  // multiplies x coordinate by 3
  set body target 5 where id == 1   // sets body 1 target volume to 5
  set vertices constraint 1 where id == 4
  set facet color clear where original < 5
  foreach facet ff do set ff color red
  define vertex attribute weight real; set vertex weight 3
  set vertex quantity my_quantity
  set vertex[1].facet color red

Note the first form of syntax has the attribute and new value in the
middle of an element generator. Syntactically inconsistent with other
commands that use element generators, but more natural English. Actually,
the syntactically consistent
 set facet where id
 does work.

The last two forms set the value of a named quantity or named method
instance attribute. For a named quantity, the settable attributes are
target, modulus, volconst, and tolerance. For a named method instance, only
modulus. There is no implicit reference to the quantity in the expression,
so say

   set myquant target myquant.value

rather than set myquant target value.

Also see "unset".


<-------------------------------- shading --------------------------------->

Evolver toggle command. Toggles facet shading in certain graphics
interfaces (xgraph, psgraph). Darkness of facet depends on angle of normal
from vertical, simulating a light source above surface. Default is ON.


<--------------------------------- shell ---------------------------------->

Main prompt command. Invokes a system subshell for the user on systems
where this is possible. No arguments. See the "system" command for execution
of an explicit shell command.


<---------------------------------- show ---------------------------------->

Main prompt command.  Used alone, it starts the native graphics display
and changes to graphics command mode (use "showq" to start graphics without
changing to graphics command mode).  Also, which edges and facets are
actually shown in graphics displays can be controlled by defining boolean
expressions that edges or facets must satisfy in order to be passed to
the graphics display. There are two expressions internally: one for edges
and one for facets. They may be set with the syntax

   show edges where expr

   show facets where expr

The default is to show all facets, and to show all special edges: fixed
edges, constraint edges, boundary edges, and edges without exactly two
adjacent facets. The defaults can be restored with "show facets" and "show
edges". Some graphics modules (like geomview) can show edges of facets on
their own initiative. This is separate from the edge show criterion here;
to show the colors of edges, the edges must satisfy the criterion. Show
causes graphics to be redrawn. If a graphics display is not active, show
will start screen graphics. Show_expr is the same as show in setting the
show expressions, except it does not start graphics. Show alone will just
start screen graphics. Examples:
 show facets where color == red
 show edges where 1
 show edges where color != black

As an edge or facet attribute, "show" is a Boolean read-only
attribute giving the current status of the edge or facet, for
example, to report the number of edges being shown, do

   print sum(edge,show)

<-------------------------- show_all_edges --------------------------->

Evolver toggle command. Controls the showing of all edges in the graphics
window, regardless of the current "show edges ..." condition.  Same as
the 'e' key in the graphics window.

<-------------------------- show_all_quantities --------------------------->

Evolver toggle command. By default, only explicitly user-defined named
quantities are shown by the Q or v commands. If show_all_quantities is on,
then all internal quantities created by the command line option -q or by
doing convert_to_quantities are also shown.

<--------------------------- show_bounding_box ---------------------------->

Evolver toggle command.  Controls showing the bounding box in graphics.
Corresponds to the "o" key in the graphics window and the "b" command
at the graphics prompt.  Its advantage is that it lets a script set
the bounding box state to a definite value.

<------------------------------- show_expr -------------------------------->

Main prompt command. This does the same as "show", except it does not start
or redraw graphics; it just sets a show expression for edges or facets.
Good for use in the "read" section of the datafile for controlling which
elements will be displayed without automatically starting a display.
Examples:
 show_expr facets where color == red
 show_expr edges where 1
 show_expr edges where color != black

<------------------------------- show_inner ------------------------------->

Evolver toggle command. Display interior facets, those on 2 bodies.

<-------------------------------- show_off -------------------------------->

Main prompt command. Closes the native graphics window started by the `s'
or SHOW commands. Does not affect geomview version.


<------------------------------- show_outer ------------------------------->

Evolver toggle command. Display outer facets, those on 0 or 1 body.

<------------------------------- show_trans ------------------------------->

Main prompt command. Applies string of graphics commands to the image
transformation matrix without doing any graphic display. The string must be
in double quotes or be a string variable, and is the same format as is
accepted by the regular graphics command prompt. Example:

  show_trans "rrdd5z"

<-------------------------------- show_vol -------------------------------->

Main prompt command. Synonym for 'v'.  Shows target volume, actual volume, and
pressure of each body. Also shows named quantities. Pressures are really
the Lagrange multipliers. Pressures are computed before an iteration, so
the reported values are essentially are one iteration behind.

<--------------------------------- showq ---------------------------------->

Main prompt command. Displays screen graphics, but returns immediately to
the main prompt and does not go into graphics command mode.

<--------------------------------- shrink --------------------------------->

Graphics mode command 's'. Shrink. Contracts image by factor, default 1.2.
arrow keys : Graphics mode command. Move image in appropriate direction.
May be prefixed by a real number, which is multiple of thirds of screen
width to move. Default move is 1/12 screen width. May not work on all
terminals.

<---------------------- simon_knot_energy_normalizer ---------------------->

Named method. Description: Another normalization of edge_knot_energy,
which I don't feel like deciphering right now. 

Element: edge. 
Parameters: none. 
Models: string linear. 
Ambient dimension: 3.
Hessian: no. 
Example datafile declaration:

   quantity kenergy energy method edge_knotenergy global
                           method simon_knot_energy_normalizer global

<-------------------------- simplex declaration --------------------------->

To declare that the datafile lists a surface in the simplex model, the top
section ot the datafile should contain the line

  SIMPLEX_REPRESENTATION

The main effect on the datafile is that faces are defined by oriented
vertex lists rather than edge lists.

<----------------------------- simplex model ------------------------------>

The simplex model enables the representation of arbitrary dimension
surfaces, but many Evolver features are not available with it. Here each
facet is represented as an oriented list of k+1 vertices, where k is the
dimension of the surface. Edges may be specified as k-1 dimensional
simplices, but they are used only to compute constraint and named quantity
integrals; a complete list of edges is not needed. Bodies are specified as
lists of oriented facets.

The datafile must have the keyword SIMPLEX_REPRESENTATION in the top
section, and the phrase 'SURFACE_DIMENSION k' if k isn't 2. k = 1 and k = 2
are allowed, but not very useful in comparison to the string or soapfilm
models. If the domain is not 3-dimensional, then 'SPACE_DIMENSION n' must
also be included. The datafile edges section is optional. Each facet should
list k+1 vertex numbers. Non-simplicial facets are not allowed. See the
sample datafile simplex3.fe.

Most features are not implemented. The quadratic model is not allowed, but
the Lagrange model is. Vertices may be FIXED. Constraints are allowed, with
energy integrands. Several basic named quantity methods work. No torus
model or symmetry groups. No changing of surface topology or combinatorics
is allowed except global refining with the r command. Refining subdivides
each simplex 1-edge, with the edge midpoint inheriting the common
attributes of the edge endpoints. Refining will increase the number of
facets by a factor of 2^k.

<----------------------- simplex_k_vector_integral ------------------------>

Named method. Description: Integral of a simple (n-k)-vector over an
oriented k-dimensional simplicial facet in n-space. The vector integrand
lists the components of each of the k vectors sequentially. Evaluation is
done by forming a determinant whose first k rows are k vectors spanning the
facet, and last (n-k) rows are vectors of the integrand. 

Element: facet.
Parameters: k_vector_order, vector_integrand. 
Models: simplex; linear. 
Ambient dimension: any. 
Hessian: yes. 
Orientable: yes. 
Example datafile declaration, for 3D surface in 5D:

   quantity kvec energy method simplex_k_vector_integral
   k_vector_order 3
   vector_integrand:
   q1: 0   // first vector
   q2: 0
   q3: 0
   q4: 0
   q5: x4
   q6: 0   // second vector
   q7: 0
   q8: 0
   q9: x3
   q10: 0


<------------------------- simplex_representation ------------------------->

Internal read-only variable. Whether the simplex model is in effect.

<----------------------------- simplex_to_fe ------------------------------>

Main prompt command. Converts a simplex model surface to a string or
soapfilm model surface. Only works for dimension 1 or 2 surfaces, but works
in any ambient dimension. 
 
<------------------------ simplex_vector_integral ------------------------->

Named method. Description: Integral of a vectorfield over a
(n-1)-dimensional simplicial facet in n-space. Vectorfield is dotted with
normal of facet; actually the side vectors of the simplex and the integrand
vector are formed into a determinant. 

Element: facet. 
Parameters: vector_integrand. 
Models: simplex; linear. 
Ambient dimension: any. 
Hessian: no.
Orientable: yes. 
Example datafile declaration, for 4-volume under a 3D surface in 4D:

   quantity xvint energy method simplex_vector_integral
   vector_integrand:
   q1: 0
   q2: 0
   q3: 0
   q4: x4

<---------------------------------- sin ----------------------------------->

sin(x),cos(x),tan(x): Trig functions, argument in radians.

<---------------------------- sin_knot_energy ----------------------------->

Named method. Description: Another weird way to calculate a nonsingular
energy between midpoints of pairs of edges. (by John Sullivan) 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity knotten energy method sin_knot_energy global


<----------------------------- single letter ------------------------------>

Single letter main commands

The oldest and most commonly used Surface Evolver commands are just single
letters. Case is significant for these. Single letters are always
interpreted as commands, so you may not use single letters for variable
names. Single letter commands may be redefined.

 Single letter commands may be summarized in five groups:
   Reporting:
     C Run consistency checks.
     c Report count of elements.
     e Extrapolate.
     i Information on status.
     v Report volumes.
     v List extra attributes.
     z Do curvature test.
   Model characteristics:
     A Display and set variables and various parameters.
     a Toggle area normalization
     b Set body pressures.
     f Set diffusion constant.
     G Set gravity.
     J Toggle jiggling on every move.
     k Set boundary gap constant.
     M Toggle linear/quadratic model.
     m Toggle fixed motion scale.
     p Set ambient pressure.
     Q Report or set quantities.
     U Toggle conjugate gradient method.
     W Homothety toggle.
   Surface modification
     g Go one iteration step. Often followed by a repetition count.
     j Jiggle once.
     K Skinny triangle long edge divide.
     l Subdivide long edges.
     N Set target volumes to actual.
     n Notch ridges and valleys.
     O Pop non-minimal edges.
     o Pop non-minimal vertices.
     r Refine triangulation.
     t Remove tiny edges.
     u Equiangulate.
     V Vertex averaging.
     w Weed out small triangles.
     y Torus duplication.
     Z Zoom in on vertex.
   Output:
     D Toggle display every iteration.
     d Dump surface to datafile.
     P Graphics output (geomview, Postscript, etc.).
     s Screen display (native graphics).
   Miscellaneous:
     F Toggle command logging.
     H,h,? Help screen.
     q,x Exit.


<---------------------------------- sinh ---------------------------------->

 sinh(x),cosh(x),tanh(x): Hyperbolic functions.

<--------------------------------- sizeof --------------------------------->

Returns the number of entries in an array or array extra attribute. Can
also be applied to a string or string variable to get the number of
characters in the string. Syntax:

  SIZEOF(name)
  SIZEOF(string)

where in the first form, name is the name of the array or extra attribute, 
not in quotes.
Example:
  Enter command: define aa real[3][4]
  Enter command: print sizeof(aa)
                    12
  Enter command: print sizeof(datafilename)
                     6

<------------------------------ slice_coeff ------------------------------->

Internal vector used by slice_view command.  See "slice_view".

<------------------------------- slice_view ------------------------------->

Main prompt command that toggles displaying a cross-section
of the surface. The slice is defined by a plane of the form 
ax + by + cz = d. The coefficients a,b,c,d are stored in the array 
slice_coeff[] (which the user does not have to create). To use 
slice_view, first set the coefficients and then use the slice_view 
toggle. For example, to get a vertical slice parallel to the x
and y axes and a little in front of them: 
 
   slice_coeff[1] := 1; 
   slice_coeff[2] := 0; 
   slice_coeff[3] := 0; 
   slice_coeff[4] ;= .2; 
   slice_view; 

Evolver initializes slice_coeff[] with a vertical plane through
the middle of the surface, so you can do just "slice_view".
The cross-section will be in the form of line segments of the same color
as the facets they are sections of. With OpenGL graphics, the slice plane
can be varied interactively by hitting the 'l' key (lower case 'L')
in the graphics window and dragging the mouse horizontally.  The 'k' key
will make mouse dragging change the orientation of the slice plane.
Hit 'r' or  'c' or 't' to get back to another mouse mode.  The 'L' key
will end slice_view.
 
Slice view works separately, and after, torus model viewing modes such as
clipped and connected, so it is no problem to have them together. 
In case slice_view and clip_view are both in effect, slice_view operates
instead of clip_view. 
 

<------------------------------ smooth_graph ------------------------------>

Evolver toggle command.
In string quadratic and Lagrange model, causes edges to be plotted with
many subdivisions for smooth look. In soapfilm Lagrange model, causes edges
and facets to be plotted with 8-fold subdivision rather than Lagrange order
subdivision. Is not implemented in quadratic soapfilm model. Default off.


<-------------------------------- soapfilm -------------------------------->

The default dimension of the surface is 2. If not, it must be declared in
the top section of the datafile. For a 1-dimensional surface (the string
model), simply include the line
 STRING
The default dimension 2 soapfilm model is equivalent to using
 SOAPFILM
In general, the line
 SURFACE_DIMENSION n
defines the surface to have dimension n. Dimension over 2 is valid only in
the simplex model. The surface dimension may be accessed at runtime through
the read-only variable surface_dimension.


<----------------------------- soapfilm model ----------------------------->

The term "soapfilm model" means that the dimension of the surface is 2.
This is the default model. The surface is subdivided into triangular
facets, and the default energy is surface area. Edges are defined by their
vertices. Facets are defined by an oriented list of three edges, which must
form a closed loop. However, faces in the datafile may have more than three
edges, since they are automatically refined into facets when loaded. In
official Evolver-speak, a "face" is what appears in the datafile, and a
"facet" is the triangle in the internal Evolver representation of the
surface. Bodies are defined by a set of oriented facets, which need not
form the complete boundary of the body, for example if part of the boundary
is on a constraint.

Internally, the surface is held together by a set of structures called
"facet-edges". There is one such structure for each incidence of an edge on
a facet. There is a doubly linked list of facet-edges around each facet, so
edges can be traversed in order, and there is a doubly-linked list around
each edge, so the facets around an edge can be traversed in geometric
order. Evolver figures out the geometric order from the geometric data in
the datafile. If geometric order does not make sense, as when the space
dimension is 4 or more, then the order is random.

<-------------------------------- sobolev --------------------------------->

Main prompt command. Uses a positive definite approximation to the area
Hessian to do one Newton iteration, following a scheme due to Renka and
Neuberger [RN]. Works only on area with fixed boundary; no volume
constraints or anything else. Seems to converge very slowly near minimum,
so not a substitute for other iteration methods. But if you have just a
simple soap film far, far from the minimum, then this method can make a big
first step. SOBOLEV_SEEK will do an energy-minimizing search in the
direction.

<------------------------------ sobolev_seek ------------------------------>

Main prompt command.  Does a variable-step energy-minimizing search along
teh sobolev direction; see "sobolev".

<------------------------------ sobolev_area ------------------------------>

Named method. Description: Same as the facet_tension method, but the
Hessian is modified to be guaranteed positive definite, after the scheme of
Renka and Neuberger. [RN]. Hence the hessian command always works, but
final convergence may be slow (no faster than regular iteration) since it
is only an approximate Hessian. Also see the sobolev command.

Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

   quantity sobarea energy method sobolev_area global

<------------------------------ sobolev_mode ------------------------------>

Evolver toggle command. When the facet_area method is being used to
calculate areas in hessian commands, this toggles using an approximate
facet_area hessian that is positive definite. This permits hessian
iteration to make big steps in a far-from-minimal surface without fear of
blowing up. However, since it is only an approximate hessian, final
convergence to the minimum can be slow. Linear model only. Does
convert_to_quantities implicitly. Another variant of this is triggered by
dirichlet_mode.

<---------------------------- space dimension ----------------------------->

By default, surfaces live in 3 dimensional space. However, the phrase
"SPACE_DIMENSION n" in the datafile header sets the dimension to n. This
means that all coordinates and vectors have n components. The only
restriction is that Evolver has to be compiled with the MAXCOORD macro
defined to be at least n in Makefile or in model.h. The default MAXCOORD is 4. 
Change MAXCOORD and recompile if you want more than four dimensions. The
actual space dimension can be accessed in commands through the read-only
variable space_dimension.

Graphics will display only the first three dimensions of spaces with more
than three dimensions, except for geomview, which has a four-dimensional
viewer built in (although its use is awkward now).

<---------------------- space dimension declaration ----------------------->

The default dimension of space is 3. Otherwise it must be declared in the
top section of the datafile, with syntax

  SPACE_DIMENSION n

The dimension must be at most the value of MAXCOORD in model.h, which is 4
in the distributed version. The space dimension may be accessed at runtime
through the read-only variable space_dimension.


<---------------------------- space_dimension ----------------------------->

Internal read-only variable. Dimension of ambient space.  Can only be set
in the top section of the datafile with the syntax

    space_dimension n

Default is dimension 3.


<--------------------------- sparse_constraints --------------------------->

Evolver toggle command. Toggles using sparse matrix techniques to
accumulate and handle body and quantity gradients in iteration and hessian
commands. Now the default.

<--------------------------- surface_cos_power ---------------------------->

Internal variable used by sphere_knot_energy method.  See sphere_knot_energy
for details.

<--------------------------- sphere_knot_energy --------------------------->

Named method. Description: This is the 2D surface version of the circle
energy. Its most general form is

  E_{f_1f_2} = { A_1A_2(1 - \cos\alpha)^p \over |x_1 - x_2|^q},

where A_1,A_2 are the facet areas, x_1,x_2 are the barycenters of the
facets, and \alpha is the angle between f_1 and the sphere through x_1
tangent to f2 at x_2. The energy is conformally invariant for p = 1 and q =
4. For p=0 and q=1, one gets electrostatic energy for a uniform charge
density. Note that facet self-energies are not included. For electrostatic
energy, this is approximately 2.8A^{3/2} per facet.

The powers p and q are Evolver variables surface_knot_power and
surface_cos_power respectively. The defaults are p=1 and q=4. 

Element: facet. Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   parameter surface_knot_power  1     // the default
   parameter surface_cos_power  4     // the default
   quantity knotten energy method sphere_knot_energy global


<-------------------------- spherical_arc_area_n -------------------------->

Named method. Description: Area on a sphere between an edge (considered as
a great circle arc) and the north (or south) pole. This is an exact
calculation in the linear model. Meant for calculating the areas of facets
in the string model with the string network confined to a sphere of
arbitrary radius centered at the origin. There are two versions of this
method, since calculation of facet areas by means of edges necessarily has
a singularity somewhere on the sphere. Spherical_arc_area_n has its
singularity at the south pole, and spherical_arc_area_s has its singularity
at the north pole. Thus spherical_arc_area_s will work accurately for
facets not including the north pole in there interiors; a facet including
the north pole will have its area calculated as the negative complement of
its true area, so a body defined using it could get the correct area by
using a volconst of a whole sphere area. If the singular pole falls on an
edge or vertex, then results are unpredictable. With these caveats, these
methods are suitable for use with the area_method_name feature for
substituting the default edge area method. If you do a facet as an explicit
quantity, you are responsible for applying or unapplying the quantity after
topology changes!! 

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Orientable: yes. 
Hessian: yes. 
Example datafile declaration:

   parameter rad = 2
   constraint 1
   formula: x^2 + y^2 + z^2 = rad^2
   area_method_name "spherical_arc_area_n"

<-------------------------- spherical_arc_area_s -------------------------->

Named method. Description: Area on a sphere between an edge (considered as
a great circle arc) and the north (or south) pole. This is an exact
calculation in the linear model. Meant for calculating the areas of facets
in the string model with the string network confined to a sphere of
arbitrary radius centered at the origin. There are two versions of this
method, since calculation of facet areas by means of edges necessarily has
a singularity somewhere on the sphere. Spherical_arc_area_n has its
singularity at the south pole, and spherical_arc_area_s has its singularity
at the north pole. Thus spherical_arc_area_s will work accurately for
facets not including the north pole in there interiors; a facet including
the north pole will have its area calculated as the negative complement of
its true area, so a body defined using it could get the correct area by
using a volconst of a whole sphere area. If the singular pole falls on an
edge or vertex, then results are unpredictable. With these caveats, these
methods are suitable for use with the area_method_name feature for
substituting the default edge area method. If you do a facet as an explicit
quantity, you are responsible for applying or unapplying the quantity after
topology changes!! 

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Orientable: yes. 
Hessian: yes. 
Example datafile declaration:

   parameter rad = 2
   constraint 1
   formula: x^2 + y^2 + z^2 = rad^2
   area_method_name "spherical_arc_area_s"

<-------------------------- spherical_arc_length -------------------------->

Named method. Description: Edge length, modelling the edge as a spherical
great circle arc between its two endpoints, which are assumed to lie on an
arbitrary radius sphere centered at the origin. This method is meant for
modelling string networks on spheres, and is suitable for use with the
length_method_name feature for substituting the default edge length
calculation method. Note that this method is an exact spherical calculation
in the linear model, so there is no need to refine edges or use higher
order models for accuracy. Edges are graphed as spherical arcs (actually,
lots of segments). 

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: yes. 
Example datafile declaration:

   parameter rad = 2
   constraint 1
   formula: x^2 + y^2 + z^2 = rad^2
   length_method_name "spherical_arc_length"


<----------------------------- spherical_area ----------------------------->

Named method. Description: Area of the facet projected to unit sphere. The
vertices of the facet are assumed to be on the unit sphere. 

Element: facet.
Parameters: none. 
Models: linear. 
Ambient dimension: any. 
Hessian: no.
Example datafile declaration:

   constraint 1  formula: x^2 + y^2 + z^2 = 1
   quantity spharea energy method spherical_area global


<------------------------- spinning ring example -------------------------->

Example: Ring around rotating rod

This example consists of a ring of liquid forming a torus around a rod
rotating along its long axis (z axis) in weightlessness. The liquid has
controllable contact angle with the rod. The interesting question is the
stability of the ring as the spin increases.

The effect of the rotation is incorporated in the energy through an
integral using the Divergence Theorem:

        ///
  E = - ||| (1/2) p r^2 w^2 dV
        ///B  

        //
    = - ||       (1/2) p w^2 (x^2+y^2) z k . dA
        //bdry B

where B is the region of the liquid, r is radius from the axis, p is the
fluid density and w is the angular velocity. Note the energy is negative,
because spin makes the liquid want to move outward. This has to be
countered by surface tension forces holding the liquid on the rod. If p is
negative, then one has a toroidal bubble in a rotating liquid, and high
spin stabilizes the torus. The spin energy is put in the datafile using the
named quantity syntax (see below). "centrip" is a user-chosen name for the
quantity, "energy" declares that this quantity is part of the total energy,
"global_method" says that the following method is to be applied to the
whole surface, "facet_vector_integral" is the pre-defined name of the
method that integrates vector fields over facets, and "vector_integrand"
introduces the components of the vectorfield.

The rod surface is defined to be constraint 1 with equation x^2 + y^2 =
R^2, where R is the radius of the rod. The contact energy of the liquid
with the rod is taken care of with an edge integral over the edges where
the liquid surface meets the rod:

      //                          /                  /
  E = || -T cos(a) dA = -T cos(a) |  z ds = T cos(a) | (z/R)(yi - xj).ds
      //S                         /bdry S            / bdry S

Here S is the rod surface not included as facets in bdry B, T is the
surface tension of the free surface, and a is the internal contact angle. A
more intuitive way to arrive at this integral is to think in cylindrical
coordinates and imagine the replaced surface of the rod between the contact
line and z = 0 to be divided into thin vertical strips of height z and
width R dtheta. The energy of a strip is -T cos(a) z R dtheta. Converting
back to Cartesian coordinates, dtheta = (x dy - y dx)/(x^2 + y^2), so

                 //                                   //
  E =  -T cos(a) || z R (x dy - y dx)/R^2 = -T cos(a) || (z/R)(x dy - y dx)
                 //                                   //

Constraint 2 is a horizontal symmetry plane. By assuming symmetry, we only
have to do half the work.

Constraint 3 is a one-sided constraint that keeps the liquid outside the
rod. Merely having boundary edges on the rod with constraint 1 is not
enough in case the contact angle is near 180 degrees and the liquid volume
is large. Constraint 3 may be put on any vertices, edges, or faces likely
to try to invade the rod. However, it should be noted that if you put
constraint 3 on only some vertices and edges, equiangulation will be
prevented between facets having different constraints.

Constraint 4 is a device to keep the vertices on the rod surface evenly
spaced. Edges on curved constraints often tend to become very uneven, since
long edges short-cutting the curve can save energy. Hence the need for a
way to keep the vertices evenly spread circumferentially, but free to move
vertically. One way to do that is with another constraint with level sets
being vertical planes through the z axis at evenly spaced angles.
Constraint 4 uses the real modulus function with arctangent to create a
periodic constraint. Each refinement, the parameters need to be halved to
cut the period in half. This is done by redefining the "r" refinement
command at the end of the datafile. Note that autorecalc is temporarily
turned off to prevent projecting vertices to the constraint when it is in
an invalid state. Also note the pi/6 offset to avoid the discontinuity in
the modulus function. pi/6 was cleverly chosen so that all refinements
would also avoid the discontinuity.

One way of detecting stability is to perturb the torus and seeing if it
evolves back to equilibrium. The datafile defines a command

    perturb := set vertex y y+.01 where not on_constraint 1

This sets the y coordinate of each vertex to y+.01. This command is
defined in the "read" section at the end of the datafile, where you can put
whatever commands you want to execute immediately after the datafile is
loaded. To detect small perturbations, and get numerical values for the
size of perturbations, the y moment of the liquid is calculated in the
named quantity "ymoment". It is not part of the energy, as indicated by the
info_only keyword. You can see the value with the `v' command.

A better way to check stability is to examine the eigenvalues of the
Hessian matrix. First, evolve normally to reasonably near an equilibrium.
Then use the hessian command several times to converge exactly to the
equilibrium. Then use the command "ritz(0,5)" to display the 5 eigenvalues
of the Hessian nearest 0. By gradually raising the spin and tracking the
lowest eigenvalue, one can detect the onset of instability, where the
lowest eigenvalue becomes 0. Note that the datafile toggles on
hessian_normal so that the Hessian only considers perturbations normal to
the surface.

The initial ringblob skeleton, with vertices and edges numbered. Taking
advantage of symmetry, just the top half is represented.



// ringblob.fe

// Toroidal liquid ring on a rotating rod in weightlessness.
// Half of full torus
// Using second periodic constraint surface intersecting rod to
// confine vertices on rod to vertical motion.

// Important note to user: Use only the 'rr' command defined at
// the end of this file to do refinement.  This is due to the
// nature of constraint 4 below.

// This permits drawing both halves of the ring
view_transforms 1
1 0 0 0
0 1 0 0
0 0 -1 0
0 0 0 1

// Basic parameters.  These may be adjusted at runtime with the
// 'A' command.  Only spin is being adjusted in these experiments.
parameter rodr = 1  // rod radius
parameter spin = 0.0 // angular velocity
parameter angle = 30 // internal contact angle with rod
parameter tens = 1   // surface tension of free surface
#define rode (-tens*cos(angle*pi/180))  // liquid-rod contact energy
parameter dens = 1  // density of liquid, negative for bubble

// spin centripetal energy
quantity centrip energy global_method facet_vector_integral
vector_integrand:
q1: 0
q2: 0
q3: -0.5*dens*spin*spin*(x^2+y^2)*z

// y moment, for detecting instability
quantity ymoment info_only global_method facet_vector_integral
vector_integrand:
q1: 0
q2: 0
q3: y*z

// Constraint for vertices and edges confined to rod surface,
// with integral for blob area on rod
constraint 1
formula: x^2 + y^2 = rodr^2
energy:
e1: -rode*z*y/rodr
e2: rode*z*x/rodr
e3: 0

// Horizontal symmetry plane
constraint 2
formula: z = 0

// Rod surface as one-sided constraint, to keep stuff from caving in
// Can be added to vertices, edges, facets that try to cave in
constraint 3 nonnegative
formula: x^2 + y^2 = rodr^2

// Expressed in periodic form, so one constraint fits arbitrarily
// many vertices. Note offset to pi/6 to avoid difficulties with
// modulus discontinuity at 0.
parameter pp = pi/2    /* to be halved each refinement */
parameter qq = pi/6    /* to be halved each refinement */
constraint 4
formula:  (atan2(y,x)+pi/6) % pp = qq

//initial dimensions
#define ht 2
#define wd 3

vertices
1  0   -wd 0  constraints 2    // equatorial vertices
2  wd    0 0  constraints 2
3  0    wd 0  constraints 2
4  -wd   0 0  constraint 2
5  0   -wd ht                 // upper outer corners
6  wd    0 ht
7  0    wd ht
8  -wd   0 ht
9  0 -rodr ht constraints 1,4   // vertices on rod
10 rodr  0 ht constraints 1,4
11 0  rodr ht constraints 1,4
12 -rodr  0 ht constraints 1,4

edges
1   1 2 constraint 2  // equatorial edges
2   2 3 constraint 2
3   3 4 constraint 2
4   4 1 constraint 2
5   5 6               // upper outer edges
6   6 7
7   7 8
8   8 5
9   9  10 constraint 1,4   // edges on rod
10  10 11 constraint 1,4
11  11 12 constraint 1,4
12  12  9 constraint 1,4
13   1  5        // vertical outer edges
14   2  6
15   3  7
16   4  8
17   5  9        // cutting up top face
18   6 10
19   7 11
20   8 12

faces  /* given by oriented edge loop */
1   1 14 -5 -13 tension tens // side faces
2   2 15 -6 -14 tension tens  // Remember you can't change facet tension
3   3 16 -7 -15 tension tens  // dynamically just by changing tens; you have
4   4 13 -8 -16 tension tens  // to do "tens := 2; set facet tension tens"
5   5 18 -9 -17 tension tens  // top faces
6   6 19 -10 -18 tension tens
7   7 20 -11 -19 tension tens
8   8 17 -12 -20 tension tens

bodies  /* one body, defined by its oriented faces */
1   1 2 3 4 5 6 7 8  volume 25.28

read  // some initializations
transforms off     // just show fundamental region to start with

// special refinement command redefinition
r :::= { autorecalc off;  pp := pp/2; qq := qq % pp; 'r'; autorecalc on; }

// a slight perturbation, to check stability
perturb := set vertex y y+.01 where not on_constraint 1

hessian_normal // to make Hessian well-behaved
linear_metric  // to normalize eigenvalues

<---------------------------- spring_constant ----------------------------->

See "gap_constant".

<-------------------------------- sprintf --------------------------------->

Main prompt command. Prints to a string using the standard C sprintf
function. May be used whereever a stringexpr is called for in syntax.
Otherwise same as printf. Syntax:
SPRINTF stringexpr,expr,expr,...

 Example:

   dumpname := SPRINTF "file%04g.dmp",counter

<--------------------------- sq_gauss_curvature --------------------------->

Named method. Description: Computes the integral of the squared Gaussian
curvature. At each vertex, the Gaussian curvature is calculated as the
angle defect divided by one third of the total area of the adjacent facets.
This is then squared and weighted with one third of the area of the
adjacent facets. This method works only on closed surfaces with no
singularities due to the way it calculates the angle defect. 

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity sqg energy method sq_gauss_curvature global

<-------------------------- sq_gaussian_curv_cyl -------------------------->

Named method. Description: Integral of the squared gaussian curvature of a
surface of revolution. The generating curve is set up in the string model,
and this method applied to its vertices. The axis of rotation is the x-axis.

Element: vertex. 
Models: string; linear. 
Ambient dimension: 2. 
Hessian: yes.
Example datafile declaration: 
 
   quantity sqgausscyl energy method sq_gaussian_curv_cyl global 

<---------------------------- sq_mean_curv_cyl ---------------------------->

Named method. Description: Integral of the squared mean curvature of a
surface of revolution. The generating curve is set up in the string model,
and this method applied to its vertices. The axis of rotation is the x-axis.
This method will do intrinsic curvature by means either of a global
variable h_zero or a real-valued vertex attribute h_zero. 

Element: vertex.
Models: linear string. 
Ambient dimension: 2. 
Hessian: yes. 
Example datafile declaration: 
 
   define vertex attribute h_zero real 
   quantity sqcyl energy method sq_mean_curv_cyl global 

<------------------------------ sq_mean_curv ------------------------------>
<-------------------------------- sqcurve --------------------------------->
Squared mean curvature

Vertex read-only attribute. SQCURVE is the squared mean curvature at a vertex, 
calculated by the same formula as used in the sq_mean_curvature named method.  
In particular, the formula is affected by the normal_curvature toggle, which 
should be on if you want this to be the square of the value reported by the 
mean_curvature attribute.  Also accommodates the h_zero parameter. 


<--------------------------- sq_mean_curvature ---------------------------->

Named method.
Description: Integral of squared mean curvature of a surface. There are
several methods implemented for calculating the integral of the squared
mean curvature of a surface. The older methods sq_mean_curvature,
eff_area_sq_mean_curvature, and normal_sq_mean_curvature, are now
deprecated, since they don't have Hessians and the newer methods
star_sq_mean_curvature, star_eff_area_sq_mean_curvature,
star_normal_sq_mean_curvature, and my current favorite
star_perp_sq_mean_curvature, do have Hessians and can now handle incomplete
facet stars around vertices. But read the following for general remarks on
squared curvature also.

The integral of squared mean curvature in the soapfilm model is calculated
for this method as follows: Each vertex v has a star of facets around it of
area A. The force F due to surface tension on the vertex is the gradient of
area, Since each facet has 3 vertices, the area associated with v is A/3.
Hence the average mean curvature at v is
   h = (1/2)(F/(A/3)),
where the 1/2 factor comes from the "mean" part of "mean curvature". This
vertex's contribution to the total integral is then
E = h^2A/3 = (3/4)F^2/A.

Philosophical note: The squared mean curvature on a triangulated surface
is technically infinite, so some kind of approximation scheme is needed.
The alternative to locating curvature at vertices is to locate it on the
edges, where it really is, and average it over the neighboring facets. But
this has the problem that a least area triangulated surface would have
nonzero squared curvature, whereas in the vertex formulation it would have
zero squared curvature.

Practical note: The above definition of squared mean curvature seems in
practice to be subject to instablities. One is that sharp corners grow
sharper rather than smoothing out. Another is that some facets want to get
very large at the expense of their neighbors. Hence a couple of alternate
definitions have been added.

Curvature at boundary: If the edge of the surface is a free boundary on a
constraint, then the above calculation gives the proper curvature under the
assumption the surface is continued by reflection across the constraint.
This permits symmetric surfaces to be represented by one fundamental
region. If the edge of the surface is a fixed edge or on a 1-dimensional
boundary, then there is no way to calculate the curvature on a boundary
vertex from knowledge of neighboring facets. For example, the rings of
facets around the bases of a catenoid and a spherical cap may be identical.
Therefore curvature is calculated only at interior vertices, and when the
surface integral is done, area along the boundary is assigned to the
nearest interior vertex. However, including IGNORE_FIXED or
IGNORE_CONSTRAINTS in the method declaration will force the calculation of
energy even at fixed points or ignoring constraints respectively.

If the parameter or vertex attribute h_zero is defined, then the value per
vertex is the same as for the following method, eff_area_sq_mean_curvature.

Element: vertex. 
Parameters: IGNORE_CONSTRAINTS, IGNORE_FIXED. 
Models: soapfilm; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

   quantity sqc energy method sq_mean_curvature global

<------------------------------ sq_mean_mix ------------------------------->

User-defined variable used by the mix_sq_mean_curvature method to
determine the combination of mean curvature approximations used.


<----------------------------- sqcurve_string ----------------------------->

Named method. Description: Integral of squared curvature in string model.
Assumes two edges per vertex, so don't use with triple points. Value zero
at endpoint of curve. Calue is calculated as if the exterior angle at the
vertex is evenly spread over the adjacent half-edges. More precisely, if s1
and s2 are the adjacent edge lengths and t is the exterior angle, value =
4*(1 - cos(t))/(s1+s2). Other powers of the curvature can be specified by
using the parameter parameter_1 in the instance definition.  If parameter_1
is not present, then the internal read-write variable curvature_power is
used, which defaults to 2.

Element: vertex. 
Parameters: parameter_1. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: yes (but only for power 2). 
Example datafile declaration:

  quantity sq energy method sqcurve_string global
  parameter_1 3

<-------------------------- sqcurve_string_mark --------------------------->

Edge attribute used by the sqcurve_string_marked method.  
See "sqcurve_string_marked".

<------------------------- sqcurve_string_marked -------------------------->

Named method. Description: Integral of squared curvature in string model.
Same as sqcurve_string, but only "marked" edges are used, so the topology
of edges can be more complicated than a loop or curve. The marking is done
by declaring an integer-valued edge attribute named sqcurve_string_mark and
setting it to the proper bit value pattern for those edges you want to be 
involved, two at each vertex to which this method is applied. Value zero at
vertex with not two marked edges.  Different instances of this method
can use parameter_2 to specify a bit in sqcurve_string_mark to use in case
multiple instances are using overlapping edges.  If parameter_2 is not used,
any nonzero sqcurve_string_mark will activate an edge. 

The method value is calculated as if the exterior angle at the vertex is 
evenly spread over the adjacent half-edges. More precisely, if s1 and s2 
are the adjacent edge lengths and t is the exterior angle, 
value = 4*(1 - cos(t))/(s1+s2). Other powers of the curvature can be
specified by using the parameter parameter_1 in the instance definition.

Element: vertex. 
Parameters: parameter_1: the power of the curvature. 
            parameter_2: power of 2 used to match bit in sqcurve_string_mark
Models: string; linear. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration: 
 
   define edge attribute sqcurve_string_mark integer 
   quantity sqmark energy method sqcurve_string_marked 

<---------------------------- sqcurve2_string ----------------------------->

Named method. Description: Integral of squared curvature in string model,
but with an intrinsic curvature. The intrinsic curvature is specified by a
global variable h_zero, or real-valued vertex attribute named h_zero.

The value zero at endpoint of curve. The value is calculated as if the
exterior angle at the vertex is evenly spread over the adjacent half-edges.
More precisely, if s1 and s2 are the adjacent edge lengths, h0 is the
intrinsic curvature, and t is the exterior angle, then value =
(sin(t)/((s1+s2)/2)-h0)^2.  T

Element: vertex. 
Models: linear. 
Ambient dimension: 2 
Hessian: no. 
Example datafile declaration: 
 
define vertex attribute h_zero real 
quantity sq2 energy method sqcurve2_string global 


<---------------------------- sqcurve3_string ----------------------------->

Named method. Description: Same as sqcurve_string, but uses a slightly
different formula to encourage equal length edges The value zero at
endpoint of curve. The value is calculated as if the exterior angle at the
vertex is evenly spread over the adjacent half-edges. More precisely, if s1
and s2 are the adjacent edge lengths, h0 is the intrinsic curvature, and t
is the exterior angle, value = 2*(1 - cos(t))*(1/s1+1/s2). 

Element: vertex.
Models: string; linear. 
Ambient dimension: any 
Hessian: yes. 
Example datafile declaration: 
 
   quantity sq3 energy method sqcurve3_string global 

<-------------------------------- sqgauss --------------------------------->
<-------------------------- square_gauss_modulus -------------------------->
<----------------------- squared_gaussian_curvature ----------------------->

To add an energy of squared Gaussian curvature, include a line in the top
of the datafile

  SQUARED_GAUSSIAN_CURVATURE modulus

The modulus is a multiplier for the energy, and is available at runtime
in the read-write variable square_gauss_modulus. Synonyms:
square_gaussian_curvature, sqgauss


<---------------------------------- sqr ----------------------------------->

 sqr(x) : Square.

<---------------------------------- sqrt ---------------------------------->

 sqrt(x) : Square root. Argument must be nonnegative.

<---------------------------- sq_torsion ---------------------------->

Named method. Integral of squared torsion for curves.
The torsion is approximated by looking at triples of adjacent
edges; if A,B,C are the edge vectors, then the sin of the angle the
osculating plane twists by (from AxB to BxC) is
       [A,B,C] |B|
  S =  -----------
       |AxB| |BxC|
(This is analogous to t = [T,T',T'']/k^2, where T is the tangent
vector and k is the curvature.  I'm using [A,B,C] as notation for
cross product.)  Then the torsion is

   t = arcsin(S)/|B|
   
and the integral of the square of the torsion is

   t^2 |B| = arcsin(S)^2/|B|

This function assumes the edges in each component are consistently oriented.
Since this method is meant to be used on boundary wires of surfaces, it
uses a "sq_torsion_mark" attribute on edges to tell which edges are to be
included.  Example top of datafile declaration:

  define edge attribute sq_torsion_mark integer
  quantity sqtor energy method sq_torsion

Then mark the edges you want included, for example using quad.fe

edges
1   1  2 constraints 1,2 sq_torsion_mark 1 quantity sqtor
2   2  3 constraints 1,2 sq_torsion_mark 1 quantity sqtor
3   3  4 constraints 1,2 sq_torsion_mark 1 quantity sqtor
4   4  1 constraints 1,2 sq_torsion_mark 1 quantity sqtor

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3.
Hessian: no. 


<---------------------------- square_curvature ---------------------------->

To add an energy of squared mean curvature, include a line in the top of
the datafile

  SQUARED_CURVATURE modulus

The modulus is a multiplier for the energy. This is the original squared
mean curvature energy; later versions are in the squared curvature named
methods.


<----------------------- square_gaussian_curvature ------------------------>

To add an energy of squared Gaussian curvature, include a line in the top
of the datafile

  SQUARED_GAUSSIAN_CURVATURE modulus

The modulus is a multiplier for the energy. Synonyms:
square_gaussian_curvature, sqgauss


<--------------------------- squared_curvature ---------------------------->
<-------------------------- sq_curvature_modulus -------------------------->


To add an energy of squared mean curvature, include a line in the top of
the datafile

  SQUARED_CURVATURE modulus

The modulus is a multiplier for the energy, and is available as a
read-write variable at runtime. This is the original squared mean 
curvature energy; later versions are in the squared curvature named
methods.

In the string model, the internal read-write variable curvature_power
can be used to control the power of the curvature.


<---------------------------- squared_gradient ---------------------------->

Evolver toggle command. In hessian_seek, use minimizing the square of the
gradient of the energy as the objective rather than minimizing the energy.

<------------------------------- stability -------------------------------->

The timestep of a 'g' iteration should not be so large as to amplify
perturbations of the surface. Short wavelength perturbations are most prone
to amplification. This section contains a sketch of the stability
characteristics of the various mobility modes, enough to let the user
relate the maximum timestep to the minimum facet or edge size. Two examples
are discussed: a zigzag string and a nearly flat surface with equilateral
triangulation. Effective area is not included, as it is an insignificant
correction for nearly flat surfaces. The general moral of this section is
that the maximum time step in iteration is limited by the length of the
shortest edge or the area of the smallest facet, except in one case.


<----------------------------- stability_test ----------------------------->

Command to find largest eigenvalue of mobility matrix. Don't really recall
what this was for.

<-------------------- star_eff_area_sq_mean_curvature --------------------->

Named method. Description: Integral of squared mean curvature over a
surface. This is a different implementation of eff_area_sq_mean_curvature,
and it has a Hessian. 

This method no longer requires a complete circle of vertices around a vertex; 
boundary edges are treated as if they are on mirror symmetry planes, which is 
usually true.  Level-set constraints that should not be counted as mirror 
planes should be given the attribute "nonwall" in there declaration in the 
top of the datafile.

The positive orientation of the surface is determined by the positive 
orientation of the first facet of the vertex's internal facet list. This 
method does not use the h_zero parameter.

The curvature calculation works in any dimension space. If for some reason
the space has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the toggle
"calculate_in_3d" will do that.

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

  quantity seffsq energy method star_eff_area_sq_mean_curvature global

<----------------------------- star_finagling ----------------------------->

Toggle. In the soapfilm model, the delete command for edges or facets normally
will not do the deletion if it would result in the creation of two edges
with the same endpoints.  Some simple configurations that cause this are
detected and handled automatically, namely a "star" configuration in
which there are three facets forming a triangle adjacent to the edge
being deleted.  Such a star is automatically removed by deleting one of
its internal edges before deleting the original edge.  But sometimes
there are more complicated configurations that such unstarring won't
handle, and then Evolver will not delete the edge unless the force_deletion 
toggle is on.  An alternative is to first refine the edges that would have 
the common endpoints, and this is what the star_finagling toggle enables.  
Default off.


<-------------------------- star_gauss_curvature -------------------------->

Named method. Computes the angle deficit around vertices to which this
method is applied. The angle deficit is 2*pi minus the sum of all the
adjacent angles of facets. No compensation is made for vertices on the
boundary of a surface; you just get big deficits there. Deficits are
counted as positive, following the convention for gaussian curvature.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: no. 
Example datafile declaration:

 quantity total_deficit energy method star_gauss_curvature global

<--------------------- star_normal_sq_mean_curvature ---------------------->

Named method. Description: Integral of squared mean curvature over a
surface. This is a different implementation of normal_sq_mean_curvature
which is more suitable for parallel calculation and has a Hessian. 

This method no longer requires a complete circle of vertices around a vertex; 
boundary edges are treated as if they are on mirror symmetry planes, which is 
usually true.  Level-set constraints that should not be counted as mirror 
planes should be given the attribute "nonwall" in there declaration in the 
top of the datafile.

The positive orientation of the surface is determined by the positive 
orientation of the first facet of the vertex's internal facet
list. This method can use the h_zero parameter or vertex attribute for
prescribed mean curvature.

The curvature calculation works in any dimension space. If for some reason
the space has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the toggle
"calculate_in_3d" will do that.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

 quantity stnsq energy method star_normal_sq_mean_curvature global

<---------------------- star_perp_sq_mean_curvature ----------------------->

Named method. Description: Integral of squared mean curvature over a
surface. This is my current favorite implementation of squared mean
curvature. It is an implementation specifically designed to agree with the
mean curvature computed as the gradient of area when normal motion is on
(either the normal_motion toggle for 'g' iteration, or Hessian with
hessian_normal). Thus if you get zero squared mean curvature with this
method, then switch to area energy, the hessian will report exact
convergence. Likewise if you do prescribed curvature and then convert to
area minimization with a volume constraint. This method has a Hessian. This
method does not require a complete circle of vertices around a vertex;
boundary edges are treated as if they are on mirror symmetry planes, which
is usually true. This method can use the h_zero parameter or vertex
attribute for prescribed mean curvature. The actual formula for the energy
at a vertex is

  h = (1/2)(F dot N/N dot N)

  E = (h-h_0)^2 A/3 = (3/4)(F dot N/N dot N - 2h_0)^2A

where F is the area gradient at the vertex, N is the volume gradient, and
A is the area of the adjacent facets. If the vertex is on one or several
constraints, the F and N are projected to the constraints, essentially
making the constraints act as mirror symmetry planes.

This method no longer requires a complete circle of vertices around a vertex; 
boundary edges are treated as if they are on mirror symmetry planes, which is 
usually true.  Level-set constraints that should not be counted as mirror 
planes should be given the attribute "nonwall" in there declaration in the 
top of the datafile.

The positive orientation of the surface is determined by the positive 
orientation of the first facet of the vertex's internal facet
list. This method can use the h_zero parameter or vertex attribute for
prescribed mean curvature.

The curvature calculation works in any dimension space. If for some reason
the space has an ambient dimension greater than 3, and you want to restrict
the calculation of curvature to the first three coordinates, the toggle
"calculate_in_3d" will do that.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

  quantity stnsq energy method star_perp_sq_mean_curvature global

<------------------------- star_sq_mean_curvature ------------------------->

Named method. Description: Integral of squared mean curvature over a
surface. This is a different implementation of sq_mean_curvature, and it
has a Hessian. 

This method no longer requires a complete circle of vertices around a vertex; 
boundary edges are treated as if they are on mirror symmetry planes, which is 
usually true.  Level-set constraints that should not be counted as mirror 
planes should be given the attribute "nonwall" in there declaration in the 
top of the datafile.

The positive orientation of the surface is determined by the positive 
orientation of the first facet of the vertex's internal facet
list. 

This method does NOT do prescribed mean curvature with the h_zero parameter.

Element: vertex. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: any.
Hessian: yes. 
Example datafile declaration:

  quantity starsq energy method star_sq_mean_curvature global


<-------------------------------- stokes2d -------------------------------->
<------------------------------ stokes_type ------------------------------->
<---------------------------- stokes_velocity ----------------------------->

stokes2d
Named method. Description: Square of the Laplacian of z viewed as a
function of (x,y). Meant for the calculation of two-dimensional Stokes flow
of a fluid (i.e. slow steady-state flow where inertia is not significant)
by having the Evolver surface be the graph of the velocity potential and
minimizing the viscous dissipation, which is the square of the Laplacian of
z. Boundary conditions are handled by declaring a vertex attribute
"stokes_type" of type integer, and assigning each boundary vertex one of
these values:
   0 - vertex is not on a wall; treat as if on a mirror symmetry plane.
   1 - vertex is on a slip wall.
   2 = vertex is on a nonslip wall; normal derivative of potential is zero.

Boundary values of z should be set to constants between 0 and 1 on various
sections of boundary that represent walls. 

Element: vertex. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: yes. 
Example datafile declaration:

   quantity dissip energy method stokes2d global

Note: Evolver creates a vertex attribute stokes_velocity for internal use.

<--------------------------- stokes2d_laplacian --------------------------->

Named method. Description: The Laplacian of z viewed as a function of
(x,y). This is auxiliary to the stokes2d method. It is the same Laplacian,
unsquared, with the same boundary rules. Meant for calculating pressures
and such after stokes2d energy has been minimized. 

Element: vertex.
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: yes.
Example datafile declaration:

   quantity laplac info_only method stokes2d_laplacian global

<---------------------------- stress_integral ----------------------------->

Named method. Description: Hmm. Looks like this one calculates integrals
of components of a stress tensor. The scalar_integrand value is set as an
integer standing for which component to do (a kludge). See the function
stress_integral in method3.c for details. Does not have a gradient, so
should be used for just info_only quantities. 

Element: facet. 
Parameters: scalar_integrand. 
Models: linear. 
Ambient dimension: 3. 
Hessian: no.
Example datafile declaration:

  quantity stressy info_only method stress_integral global
  scalar_integrand: 3

<--------------------------------- string --------------------------------->

See "stringexpr" or "string model" for different uses of "string".

<------------------------------ string model ------------------------------>

The term "string model" means that the surface is one-dimensional. The
datafile must have the keyword "STRING" or "SURFACE_DIMENSION 1" in its top
section. Edges are defined in terms of their vertices, and facets by a list
of boundary edges. Facets are not divided into triangles, and may have any
number of edges. The edges of a facet need not form a closed loop, for
example if the facet is partly bounded by a constraint. A body is defined
by associating one facet to it, and the volume of the body is the area of
the facet. The default energy is edge length.

<------------------------- string_curve_tolerance ------------------------->

Internal read-write variable.
In the quadratic model, the smoothness of graphing of curved quadratic
edges can be controlled with the internal variable string_curve_tolerance,
which is the desired angle in degrees between successive graphed segments
making up the edge. 

<----------------------------- string_gravity ----------------------------->

Named method. Description: To calculate the gravitational potential energy
of a body in the string model. Uses differences in body densities. Does not
use gravitational constant G as modulus (unless invoked as internal
quantity by convert_to_quantities). 

Element: edge. 
Parameters: none.
Models: string; linear, quadratic, lagrange. 
Ambient dimension: 2. 
Hessian: yes. 
Orientable: yes. 
Example datafile declaration:

   quantity cell_grav energy modulus 980*8.5 method string_gravity


<------------------------------- stringexpr ------------------------------->

String expressions:
A string expression evaluates to a string of characters. At present, the
only ways to produce strings are:
 1. double-quoted string literals, e.g. "this is a string". The following
    standard C escape sequences are recognized:
     \n newline
     \r carriage return
     \t tab
     \b backspace
     \q double-quote mark
     \c the character c elsewise
    In DOS, MS-Windows, or Windows NT paths, use / as the directory separator,
    since \ is an escape character. DOS and Windows have always accepted / as a
    directory separator.
 2. successive double-quoted strings, which are concatenated into one string
    when read.
 3. string variables, either internal like datafilename, or user-defined.
 4. output from sprintf.
Examples:
  print  "Hello World!\n";
  printf "This is a" " concatenated format string.\n";
  print datafilename;
  dump sprintf"file%04d.dmp",dumpnumber;

<------------------------------- subcommand ------------------------------->

Main prompt command. Invokes a subsidiary command interpreter. Useful if
you want to pause in the middle of a script to give the user the chance to
enter commands. A subcommand interpreter gives the prompt "Subcommand: "
instead of "Enter command: ". Subcommands may be nested several deep, in which
case the prompt will display the subcommand level. To exit a subcommand
prompt, use q, quit, or exit. Note: The abort command will return to the prompt
on the same subcommand level. 
 
<---------------------------- suppress_warning ---------------------------->
<--------------------------- unsuppress_warning --------------------------->

Suppress_warning
Datafile keyword instructing Evolver not to print a certain warning.
Syntax: 
 
  SUPPRESS_WARNING number 

where number is the number of the warning. Meant to suppress irritating
warning messages that you know are irrelevant. Warnings can be restored
with the syntax 
 
  UNSUPPRESS_WARNING number 

 
<--------------------------- surface_knot_power --------------------------->

Internal read-write variable used in the facet_knot_energy  and
sphere_knot_energy named methods as the exponent of the denominator.

 
<--------------------- surface dimension declaration ---------------------->

The default dimension of the surface is 2. If not, it must be declared in
the top section of the datafile. For a 1-dimensional surface (the string
model), simply include the line

 STRING

The default dimension 2 soapfilm model is equivalent to using

 SOAPFILM

In general, the line

 SURFACE_DIMENSION n

defines the surface to have dimension n. Dimension over 2 is valid only in
the simplex model. The surface dimension may be accessed at runtime through
the read-only variable surface_dimension.


<---------------------------- surface tension ----------------------------->

Soap films and interfaces between different fluids have an energy content
proportional to their area. Hence they shrink to minimize energy. The
energy per unit area can also be regarded as a surface tension, or force
per unit length. Each facet has a surface tension, which is 1 unless the
datafile specifies otherwise (see TENSION attribute for faces). Different
facets may have different surface tensions. Facet tensions may be changed
interactively with the set facet tension ... command. The contribution to
the total energy is the sum of all the facet areas times their respective
surface tensions. The surface tension of a facet may also be specified as
depending on the phases of the bodies it separates. In the string model,
the tension resides on edges instead of facets.
 Example datafile: cube.fe

<--------------------------- surface_dimension ---------------------------->

Internal read-only variable. Dimension of surface.  Can only be set in
the top section of the datafile.  Syntax:

   string    // for surface_dimension 1
   soapfilm  // for surface_dimension 2, the default
   surface_dimension n   // for simplex model  

<----------------------------- surface_energy ----------------------------->

An obsolete way of including vector surface energy integrals in the
datafile. The present method is to use a named quantity with the
facet_vector_integral method.

<------------------------------ SVK_elastic ------------------------------->
<------------------------------- SVK_alpha -------------------------------->
<------------------------------- SVK_lambda ------------------------------->
<--------------------------------- SVK_mu --------------------------------->
<------------------------------- SVK_theta -------------------------------->
SVK_elastic
Named method. Description: SVK (Saint-Venant - Kirchhoff) potential. The
facet energy is 
  lambda/2*(tr(E))^2+mu*(E:E) - (3 lambda + 2 mu) * alpha*theta*tr(E) 
where E=(C-I)/2 is the Green-Lagrange Strain tensor, theta = T-T0 is the
temperature deviation, and alpha is the thermal dilation coefficient. 
Needs real-valued facet attributes SVK_alpha, SVK_mu, SVK_lambda, and
SVK_theta. Also needs the facet attribute form_factors, decribed in
linear_elastic. Written by Dr. Rabah Bouzidi. 

Element: facet. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: yes. 
Example datafile declaration: 
 
   define facet attribute SVK_alpha real 
   define facet attribute SVK_lambda real 
   define facet attribute SVK_mu real 
   define facet attribute SVK_theta real 
   define facet attribute form_factors real[3] 
   quantity svk energy method SVK_elastic  global 

 
<------------------------------ swap_colors ------------------------------->

A view transform attribute used to switch facet front and back colors,
depending on the transformation.  See "view_transforms" and
"view_transform_generators".

<--------------------------- symmetric_content ---------------------------->

The datafile keyword SYMMETRIC_CONTENT triggers the use of an alternate
surface integral for calculating body volumes, namely the vectorfield
(x,y,z)/3. It is useful if unmodelled sides of a body are radial from the
origin, or if constraint content integrals (which is evaluated by an
approximation) lead to asymmetric results on what should be a symmetric
surface.  Does not apply to gravitational potential energy; you may want
to write your own named quantity to do a symmetric version of gravity.

<------------------------------- symmetries ------------------------------->

There are many interesting problems dealing with symmetric surfaces. A
natural way to deal with a symmetric surface is to compute with only one
fundamental domain of the symmetry, and use special boundary conditions.
Some symmetries, such as mirror symmetries, can be handled with normal
Evolver features. For example, a mirror can be implemented as a planar
level set constraint. But symmetries such as translational or rotational
symmetry require some built-in features. In any case, multiple copies of
the fundamental domain may be displayed with the view_transforms command.
 No symmetry (default)
 Torus model (translational symmetry)
 Symmetry groups (general symmetry)

<-------------------------- symmetry declaration -------------------------->

To declare that the domain is the quotient space of a symmetry group, the
top section of the datafile must contain a line of the form

   SYMMETRY_GROUP "name"

"name" is a double-quoted name that is matched against the list of defined
symmetry groups. See "symmetry groups".


<---------------------------- symmetry groups ----------------------------->

As a generalization of the torus model, you may declare the domain to be
the quotient space of R^n with respect to some symmetry group. Several
built-in groups are available, and ambitious users can compile C code into
Evolver to define group operations. Group elements are represented by
integers attached to edges (like the wrap specifications in the torus model
at runtime). You define the integer representation of the group elements.
See the file quotient.c for an example. See khyp.c and khyp.fe for a more
intricate example modelling an octagon in Klein hyperbolic space identified
into a genus 2 surface.

The datafile requires the keyword SYMMETRY_GROUP followed by the name for
the group in quotes. Edges that wrap have their group element specified in
the datafile by the phrase "wrap n", where n is the number of the group
element. The wrap values are accessible at run time with the wrap attribute
of edges. The group operations are accessible by the functions
wrap_inverse(w) and wrap_compose( w1,w2).

Using any Hessian commands with any symmetry group (other than the
built-in torus model) will cause automatic converting to named quantities
(with the " convert_to_quantities" command, since only named quantity
Hessian evaluation routines have the proper symmetry transformation of the
Hessian programmed in.

Volumes of bodies might not be calculated correctly with a symmetry group.
The volume calculation only knows about the built-in torus model. For other
symmetry groups, if you declare a body, it will use the Euclidean volume
calculation. It is up to you to design an alternate volume calculation
using named quantities and methods.

The currently implemented symmetry groups are:
   torus - The underlying group for the torus model.
   rotate - Cyclic group of rotations in the x-y plane.
   flip_rotate - Cyclic group of rotations in the x-y plane with z -> -z
      with every odd rotation.
   cubocta - Full point group of a cube.
   xyz - The orientation-preserving subgroup of cubocta.
   genus2 - For a 2 dimensional genus 2 hyperbolic quotient space.
   dodecahedron - For a 3D hyperbolic quotient space with dodecahedral
      fundamental region.
   central_symmetry - Inversion through the origin, X -> -X.
   screw_symmetry - Screw motion along z axis.

<----------------------------- symmetry_group ----------------------------->

Internal read-only variable. Whether any symmetry group is active (Boolean).

<--------------------------------- system --------------------------------->

Main prompt command. For executing an external program. Syntax:

  SYSTEM stringexpr

Invokes a subshell to execute the given command, on systems where this is
possible. Command must be a quoted string or a string variable. Will wait
for command to finish before resuming.


<----------------------------------- t ------------------------------------>

Single letter main command. Eliminates tiny edges and their adjacent
facets. You will be prompted for a cutoff edge length if you don't give a
value with the command. If you enter h, you will get an edge length
histogram. If you hit RETURN without a value, nothing will happen. Some
edges may not be eliminable due to being FIXED or endpoints having
different attrtibutes from the edge.

Graphics mode command. Reset mode of displaying torus model. Choice of
raw unit cell, clipped unit cell, or connected bodies.


<------------------------------ t1_edgeswap ------------------------------->

Main prompt command. Does a T1 topological transition in the string model.
When applied to an edge joining two triple points, it reconnects edges so
that opposite faces originally adjacent are no longer adjacent, but two
originally non-adjacent faces become adjacent.

      \_/   =>   \/
      / \         |
                 /\

It will silently skip edges it is applied to that don't fulfill the two
triple endpoint criteria, or whose flipping is barred due to fixedness or
constraint incompatibilities. The number of edges flipped can be accessed
through the t1_edgeswap_count internal variable. Running with the verbose
toggle on will print details of what it is doing. Syntax:

 T1_EDGESWAP edge_generator

Examples:

   t1_edgeswap edge[23]
   t1_edgeswap edge where length < 0.1


<--------------------------- t1_edgeswap_count ---------------------------->

Internal read-only variable. Number of edges swapped by the t1_edgeswap
command. Prints and resets to 0 at the end of a command execution, or
when flush_counts is done. Also reset by reset_counts.

<---------------------------------- tag ----------------------------------->

Defunct built-in element attribute, from the days before Evolver
had user-definable extra attributes.  It has now been removed.  If you
load an old datafile that uses "tag", you will get an error.  The easiest
remedy is to define an integer attribute named "tag" on the type of element
needed, for example
    define facet attribute tag integer

<---------------------------------- tan ----------------------------------->

 sin(x),cos(x),tan(x): Trig functions, argument in radians.

<---------------------------------- tanh ---------------------------------->

 sinh(x),cosh(x),tanh(x): Hyperbolic functions.

<--------------------------------- target --------------------------------->

Body read-write attribute. The target volume of a volume constraint. May
be set in the datafile, by the b command, or the set command. A volume
constraint may be removed by the unset, or with the b command. Command
examples:
  set body[1] target 23
  unset body target where id == 2
  print body[2].target



<---------------------------- target_tolerance ---------------------------->

Internal read-write variable. When volume constraints or named quantity 
constraints are enforced, Newton's method is repeated until the total 
deviation from target values is less than target_tolerance.
Default value 1e-4.

<------------------------------- task_exec -------------------------------->

Main prompt command for MPI Evolver.  Causes a particular task to
execute the string as a command. Syntax:
   task_exec n,string
where n is the task number (between 1 and mpi_maxtask) and string
is any string expression, such as a double-quoted string or a
string variable.  Any aggregate commands such as "sum" execute 
across all local and imported elements. 


<------------------------------ temperature ------------------------------->

Datafile top section keyword.
Specifies amplitude for "j" or "jiggle" command.  Sets the internal
read-write variable "jiggle_temperature".

<-------------------------------- tension --------------------------------->

Edge read-write attribute. Energy per unit length of edge; line
tension. Default 1 in string model, 0 in soapfilm model. May be set in the
datafile by adding "tension expr" to the line defining an edge. The
density is inherited by any facets generated by refining. "Tension" and
"density" are synonyms. Examples:

  set edge tension 3 where original == 1
  list edge where density < .4

Facet read-write attribute. Energy per unit area of facet; surface
tension. Default 0 in string model, 1 in soapfilm model. May be set in the
datafile by adding "tension value" to the line defining the facet. The
density is inherited by any facets generated by refining. "Tension" and
"density" are synonyms. Examples:

  set facet tension 3 where original == 1
  list facet where density < .4


<------------------------------ tetra_point ------------------------------->

Vertex read-write attribute. For telling Evolver six films meet at this
vertex. Used when effective_area is on to adjust motion of vertex by making
the effective area around the vertex 1/sqrt(6) of actual.

<-------------------------------- thicken --------------------------------->

Evolver toggle command. Whether to display differently colored sides of a
facet separated by thickness. Default off. This helps prevent weird striping
due to limited resolution of depth buffers. But seems obsolete now;
graphics routines automatically do this whether the toggle is off or on.


<------------------------------- thickness -------------------------------->

Internal read-only variable. Thickness for thickened surfaces
in graphics output in P command. Used when facet frontcolor and backcolor
are different. Default value 0.001 times the maximum linear dimension of
the surface. If you get backside color showing through, increase the
thickness.   The "thicken" toggle enables this, and is on by default.

<------------------------------- this_task -------------------------------->

MPI Evolver read-only variable. Task number of the task, from 
0 (the master task) to mpi_maxtask.

<---------------------------- toggle commands ----------------------------->
<----------------------------------- on ----------------------------------->
<---------------------------------- off ----------------------------------->

There are a large number of Surface Evolver features that can be turned on
or off with simple "toggle" commands. The general syntax is "togglename ON"
or "togglename OFF", with just "togglename" being a synonym for "togglename
ON". The toggle names below have brief descriptions of their actions in the
ON state. Toggles will usually print their previous state. A togglename
used in an arithmetic expression is the current value of the toggle, 0 for
OFF and 1 for ON. The current value of a toggle may be found by "print
togglename".

All toggles (except quietload) are reset when a surface is loaded. Default
values are OFF unless otherwise noted.

Full-word toggle commands are not to be confused with various
single-letter toggle commands, which always change the state. All
single-letter toggles have full word toggle equivalents.

<------------------------------- tolerance -------------------------------->

As a keyword, "tolerance" refers to a fixed quantity attribute that is
used as the criterion for convergence. Uses target_tolerance as the default
value.


<-------------------------------- topinfo --------------------------------->

Top section of the datafile. "list topinfo" prints the first section of
the datafile on the screen. This is everything before the vertices section.

<--------------------------------- torus ---------------------------------->

Internal read-only variable. Whether the torus model is in effect.
(Boolean).

<--------------------------- torus declaration ---------------------------->

To declare periodic boundary conditions (i.e. make the domain a flat
torus), include in the top section of the datafile the line

  TORUS

All space dimensions will be periodic, with the period vectors given in
the periods declaration. If the domain is completely filled by bodies with
prescribed volumes, then the line

  TORUS_FILLED

should be used instead to prevent degenerate volume constraints.
Also see "periods".

<----------------------------- torus display ------------------------------>

There are several commands for ways of displaying a torus surface:

 raw_cells - Graph the facets as they are, without clipping. The first
             vertex of a facet is used as the basepoint for any unwrapping 
             of other vertices needed.

 connected - Each body's facets are unwrapped in the torus, so the body
             appears in one connected piece. Nicest option, but won't 
             show facets not on bodies.

 clipped - Shows the unit cell specified in the datafile. Facets are
           clipped on the parallelpiped faces.  Also see display_periods
           and display_origin for more control of "clipped" mode.


<------------------------------ torus model ------------------------------->

The Evolver can take as its domain a flat torus with an arbitrary
parallelpiped as its unit cell, i.e. the domain is a parallelpiped with its
opposite faces identified. This is indicated by the TORUS keyword in the
datafile. The defining basis vectors of the parallelpiped are given in the
TORUS_PERIODS entry of the datafile. See twointor.fe for an example.

Vertex coordinates are given as Euclidean coordinates within the unit
cell, not as linear combinations of the period vectors. The coordinates
need not lie within the parallelpiped, as the exact shape of the unit cell
is somewhat arbitrary.

The way the surface wraps around in the torus is given by saying how the
edges cross the faces of the unit cell. In the datafile edges section, each
edge has one symbol per dimension indicating how the edge vector crosses
each identified pair of faces, and how the vector between the endpoints
needs to be adjusted to get the true edge vector:
 * does not cross face
 + crosses in same direction as basis vector, so basis vector added to edge
      vector
 - crosses in opposite direction, so basis vector subtracted from edge
      vector. Wraps are automatically maintained by the various triangulation
      manipulation operations.
 There are several commands for ways of displaying a torus surface:
 raw_cells - Graph the facets as they are, without clipping. The first
      vertex of a facet is used as the basepoint for any unwrapping of other
      vertices needed.
 connected - Each body's facets are unwrapped in the torus, so the body
      appears in one connected piece. Nicest option, but won't show facets 
      not on bodies.
 clipped - Shows the unit cell specified in the datafile. Facets are
      clipped on the parallelpiped faces.

A few features are not available with the torus model, such as gravity and
the simplex model. (Actually, you could put them in, but they will not take
into account the torus model.)

Volumes and volume constraints are available. However, if the torus is
completely partitioned into bodies of prescribed volume, then the volumes
must add up to the volume of the unit cell and the TORUS_FILLED keyword
must be given in the datafile. Or just don't prescribe the volume of one
body.

Volumes are somewhat ambiguous. The volume calculation method is accurate
only to one torus volume, so it is possible that a body whose volume is
positive gets its volume calculated as negative. Evolver adjusts volumes
after changes to be as continuous as possible with the previous volumes as
possible, or with target volumes when available. You can also set a body's
volconst attribute if you don't like the Evolver's actions.

Level set constraints can be used in the torus model, but be cautious when
using them as mirror symmetry planes with volumes. The torus volume
algorithm does not cope well with such partial surfaces. If you must, then
use y=const symmetry planes rather than x=const, and use the -q option or
do convert_to_quantities. Double-check that your volumes are turning out
correctly; use volconst if necessary.

Display_periods:The displayed parallelogram unit cell can be different
from the actual unit cell if you put an array called display_periods in the
top of the datafile, in addition to the regular periods. For a string model
example,
   parameter shear = 1
   torus_filled
   periods
   4  0
   shear  4
   display_periods
   4 0
   0 4

This will always display a square, no matter how much the actual unit cell
is sheared. This feature works well for shears; it may not work nicely for
other kinds of deformation. Display_periods works better for the string
model than the soapfilm model. For the soapfilm model, it seems to do
horizontal shears best, but it can't cope with large shears, so if your
shear gets too large, I advise resetting your fundamental region to less
shear, say with the unshear command in unshear.cmd.

<----------------------------- torus periods ------------------------------>

If periodic boundary conditions are used (the torus model) , the period
vectors of the fundamental unit cell parallelpiped may be defined in the
top section of the datafile. Default is the unit cube. The syntax is the
keyword PERIODS followed by expressions for the components of each period
vector:

PERIODS
expr expr expr
expr expr expr
expr expr expr

The size of this matrix depends on the space dimension. Variables may be
used in the expressions, so the fundamental domain may be changed
interactively by assigning new values to the variables. Be sure to give a
recalc command whenever you change such a variable, in order to get the
period matrix re-evaluated.

<-------------------------- torus symmetry group -------------------------->

This is the underlying symmetry for the torus model. Although the torus
model has a number of special features built in to the Evolver, it can also
be accessed through the general symmetry group interface. The torus group
is the group on n-dimensional Euclidean space generated by n independent
vectors, called the period vectors. The torus group uses the torus periods
listed in the datafile.
Datafile declaration:

   symmetry_group "torus"

Group element encoding: The 32-bit code word is divided into 6-bit fields,
one field for the wrap in each dimension, with low bits for the first
dimension. Hence the maximum space dimension is 5. Within each bitfield, 1
codes for positive wrap and 011111 codes for negative wrap. The coding is
actually a 2's complement 5-bit integer, so higher wraps could be
represented.


<------------------------------ torus_filled ------------------------------>

Whether Evolver should treat one "fixed" body volume as not fixed, for the
purpose of avoiding redundant constraints in the case of a torus space
being completely filled with bodies of fixed volume, for example a
periodic foam. The top section of the datafile may contain a line

TORUS_FILLED

and there is also a "torus_filled" runtime toggle command.

<----------------------------- torus_periods ------------------------------>

torus_periods[expr][expr] : Internal read-only variable. Current values of
the period vectors in the torus model. Torus_periods[i][j] is component j
of vector i. Uses 1 based indexes. For changing the torus_periods, define
the periods in the datafile with variables, and alter the variables.
Note that just "PERIODS" is used to declare the torus period matrix
in the top of the datafile:

  PERIODS
  expr expr expr
  expr expr expr
  expr expr expr

<------------------------------- total_area ------------------------------->

Internal read-only variable. Total area of the surface in soapfilm or 
simplex models.  Beware that this is not continuously updated with every
change in the surface, but rather upon return to the command prompt.  If 
a script needs the current total_area recalculated, it should do the 
"recalc" command before using total_area.

<------------------------------ total_energy ------------------------------>

Internal read-only variable. Total energy of the surface. Beware that this 
is not continuously updated with every change in the surface, but rather 
upon return to the command prompt.  If a script needs the current total_energy:
recalculated, it should do the "recalc" command before using total_energy.

<------------------------------ total_length ------------------------------>

Internal read-only variable. Total length of the edges in
the string model.

<------------------------------- total_time ------------------------------->

Internal read-only variable. Elapsed evolution time in the
form of the sum of all the scale factors of 'g' steps.

<---------------------------- transform_count ----------------------------->

Internal read-only variable. Number of image transforms
active, as generated by the transform_expr command.

<---------------------------- transform_depth ----------------------------->

Main prompt command. Quick way of generating all possible view transforms
from view transform generators, to a given depth n. Syntax:

  TRANSFORM_DEPTH n

where n is the maximum number of generators to multiply together. This
will toggle immediate showing of transforms, if they are not already being
shown.


<----------------------------- transform_expr ----------------------------->

Main prompt command. If view transform generators were included in the
datafile, then a set of view transforms may be generated by an expression
with syntax much like a regular expression. An expression generates a set
of transform matrices, and are compounded by the following rules. Here a
lower-case letter stands for one of the generators, and an upper-case
letter for an expression.
    a     Generates set {I,a}.
   !a     Generates set {a}
   AB     Generates all ordered products of pairs from A and B.
   nA     Generates all n-fold ordered products.
  A|B     Generates union of sets A and B.
  (A)     Grouping; generates same set as A.
The precedence order is that nA is higher than AB which is higher than
A|B. Note that the expression string must be enclosed in double quotes or
be a string variable. The "!" character suppresses the identity matrix in
the set of matrices generated so far. Examples:

  transform_expr "3(a|b|c)"    //all products of 3 or fewer generators
  transform_expr "abcd"  // generates 16 transforms
  transform_expr "!a!a!a!"  // one copy shown, transformed three times

All duplicate transforms are removed (see view_transforms_use_unique_point
for more on uniqueness of transforms), so the growth of the sets does not
get out of hand. Note the identity transform is always included. The letter
denoting a single generator may be upper or lower case. The order of
generators is the same as in the datafile. In the torus model, transforms
along the three period vectors are always added to the end of the list of
generators given in the datafile. If 26 generators are not enough for
somebody, let me know. The current value of the expression may be accessed
as a string variable, and the number of transformations generated can be
accessed as transform_count. For example,
  print transform_expr
  print transform_count


<------------------------------- transforms ------------------------------->

Evolver toggle command. Toggles graphing multiple images of the surface,
according to the view transforms defined in the datafile, or according to
the current transform expression applied to the view transform generators
defined in the datafile.


<------------------------------ triple_point ------------------------------>

Vertex read-write attribute. For telling Evolver three films meet at this
vertex. Used when effective_area is on to adjust motion of vertex by making
the effective area around the vertex 1/sqrt(3) of actual.

<------------------------- true_average_crossings ------------------------->

Named method. Description: Calculates the average crossing number of an
edge with respect to all other edges, averaged over all projections. Knot
stuff. No gradient, so use just in info_only quantities. 

Element: edge.
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: no.
Example datafile declaration:

  quantity true_cross info_only method true_average_crossings global

<------------------------------ true_writhe ------------------------------->

Named method. Description: For calculating the writhe of a link or knot.
No gradient, so use just in info_only quantities. 

Element: edge.
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: no.
Example datafile declaration:

quantity twrithe info_only method true_average_crossings global

<--------------------------------- twist ---------------------------------->

Named method. Description: Another average crossing number calculation. No
gradient, so use just in info_only quantities. 

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

  quantity twister info_only method twist global

<-------------------------------- twointor -------------------------------->

Example: Torus partitioned into two cells (Kelvin's foam)

This example has a flat 3-torus (i.e. periodic boundary conditions)
divided into two bodies. The unit cell is a unit cube, and the surface has
the topology of Kelvin's partitioning of space into tetrakaidecahedra [TW],
which was the least area partitioning of space into equal volumes known
until recently [WP].

The datafile handles the wrapping of edges around the torus by specifying
for each direction whether an edge wraps positively (+), negatively (-), or
not at all (*).

Note the use of the keyword TORUS_FILLED in the datafile. This informs
Evolver that one of the volume constraints is redundant, preventing a
singular matrix when the time comes to enforce volume constraints. One
could use just TORUS and only put on one volume constraint.

The display of a surface in a torus can be done several ways. The
connected command (my favorite) makes each body show as a single unit. The
clipped command shows the surface clipped to the fundamental parallelpiped.
The raw_cells command shows the unedited surface.

The Weaire-Phelan structure [WP]. is in the datafile phelanc.fe. It has
area 0.3% less than Kelvin's.


// twointor.fe
// Two Kelvin tetrakaidecahedra in a torus.

TORUS_FILLED   // signals that domain is a torus and bodies fill it.

periods
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

vertices // values from another program
1  0.499733 0.015302 0.792314
2  0.270081 0.015548 0.500199
3  0.026251 0.264043 0.500458
4  0.755123 0.015258 0.499302
5  0.026509 0.499036 0.794636
6  0.500631 0.015486 0.293622
7  0.025918 0.750639 0.499952
8  0.499627 0.251759 0.087858
9  0.256701 0.499113 0.087842
10 0.026281 0.500286 0.292918
11 0.500693 0.765009 0.086526
12 0.770240 0.499837 0.087382

edges // with wraps in axis directions
1    1 2  * * *
2    2 3  * * *
3    1 4  * * *
4    3 5  * * *
5    2 6  * * *
6    2 7  * - *
7    1 8  * * +
8    4 6  * * *
9    5 9  * * +
10   3 10 * * *
11   3 4  - * *
12   6 8  * * *
13   6 11 * - *
14   7 4  - + *
15   8 12 * * *
16   9 8  * * *
17   9 11 * * *
18   10 7 * * *
19   11 1 * + -
20   12 5 + * -
21   5 7  * * *
22  11 12 * * *
23  10 12 - * *
24   9 10 * * *

faces
1    1 2 4 9 16 -7
2    -2 5 12 -16 24 -10
3    -4 10 18 -21
4    7 15 20 -4 11 -3
5    -1 3 8 -5
6    6 14 -11 -2
7    5 13 -17 24 18 -6
8    -12 13 19 7
9    -16 17 22 -15
10   -10 11 8 12 15 -23
11   -21 9 17 19 1 6
12   -14 -18 23 -22 -13 -8
13   -24 -9 -20 -23
14   -19 22 20 21 14 -3

bodies
1    -1 -2 -3 -4 -5 9 7 11 -9 10 12 5 14 3 volume 0.500
2     2 -6 -7 8 -10 -12 -11 -13 1 13 -14 6 4 -8 volume 0.500

// end of datafile

Doing some refining and iterating will show that the optimal shape is
curved a bit.

<----------------------------------- U ------------------------------------>

Single letter main command. This toggles conjugate gradient mode, which
will usually give faster convergence to the minimum energy than the default
gradient descent mode. The only difference is that motion is along the
conjugate gradient direction. The scale factor should be in optimizing
mode. The conjugate gradient history vector is reset after every surface
modification, such as refinement or equiangulation. After large changes
(say, to volume), run without conjugate gradient a few steps to restore
sanity.


<----------------------------------- u ------------------------------------>

Single letter main command. This command, called "equiangulation", tries
to polish up the triangulation. In the soapfilm model, each edge that has
two neighboring facets (and hence is the diagonal of a quadrilateral) is
tested to see if switching the quadrilateral diagonal would make the
triangles more equiangular. For a plane triangulation, a fully
equiangulated triangulation is a Delaunay triangulation, but the test makes
sense for skew quadrilaterals in 3-space also. It may be necessary to
repeat the command several times to get complete equiangulation. The
edgeswap command can force flipping of prescribed edges.

In the simplex model, equiangulation works only for surface dimension 3.
There, two types of move are available when a face of a tetrahedron
violates the Delaunay void condition: replacing two tetrahedra with a
common face by three, or the reverse operation of replacing three
tetrahedra around a common edge by two, depending on how the condition is
violated. This command is inoperative in the string model.

Graphics mode command. Tip up. Rotates image about horizontal axis,
default 6 degrees.  Integer prefix indicates how many 6 degree rotations
to do; decimal prefix indicates angle of tip in degrees.
Example: `15u' does 90 degree rotation, `15.0u' does 15 degree rotation.


<--------------------------------- unfix ---------------------------------->

Main prompt command. Removes the FIXED attribute from a set of elements,
or change a parameter to an optimizing paramater, or change a
named quantity to info_only mode.

Syntax:
 UNFIX generator

 Example:
  unfix vertices where on_constraint 2

 Can also convert a parameter from non-optimizing to optimizing. Example:

  unfix radius

 Can also convert a named quantity from fixed to info_only.  Example:

  unfix quantityname


<------------------------------ unfix_count ------------------------------->

Internal read-only variable. Number of elements unfixed by the unfix command. 
Prints and resets to 0 at the end of a command execution, or when flush_counts 
is done. Also reset by reset_counts.

<-------------------------- uniform_knot_energy --------------------------->

Named method. Description: A knot energy where vertex charge is
proportional to neighboring edge length. This simulates an electrostatic
charge uniformly distributed along a wire. Inverse power law of potential
is adjustable via the global parameter `knot_power' (default 2). 

Element: vertex. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: no. 
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knotten energy method uniform_knot_energy global


<--------------------- uniform_knot_energy_normalizer --------------------->

Named method. Description: Supposed to approximate the part of
uniform_knot_energy that is singular in the continuous limit. 

Element: vertex. 
Parameters: knot_power. 
Models: string; linear. 
Ambient dimension: any. 
Hessian: no.
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knottenorm energy method uniform_knot_energy global
                             method uniform_knot_energy_normalizer global


<------------------------ uniform_knot_normalizer1 ------------------------>

Named method. Description: Calculates internal knot energy to normalize
singular divergence of integral of uniform_knot_energy. Actually a synonym
for uniform_knot_energy_normalizer. No gradient. 

Element: vertex.
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3. 
Hessian: no.
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knottenorm energy method uniform_knot_energy global
                             method uniform_knot_energy_normalizer1 global

<------------------------ uniform_knot_normalizer2 ------------------------>

Named method. Description: Calculates internal knot energy to normalize
singular divergence of integral of uniform_knot_energy a different way from
uniform_knot_energy_normalizer. 

Element: edge. 
Parameters: none. 
Models: string; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

  parameter knot_power  2     // the default
  quantity knottenorm energy method uniform_knot_energy global
                             method uniform_knot_energy_normalizer2 global

<----------------------------- unit mobility ------------------------------>

The default mobility, in which the vertex velocity is equal to the force.
The physical interpretation of this is that there is a resistance to motion of
each vertex through the medium proportional to its velocity, but not for
the edges. This does not approximate motion by mean curvature, but it is
very easy to calculate.


<--------------------------------- unset ---------------------------------->

Main prompt command. Removes an attribute from a set of elements. Syntax:

UNSET elements [name] attrib where clause

Unsettable attributes are fixed (vertices, edges, or facets) , body target
volume, body pressure, body gravitational density, non-global named
quantities, non-global named methods, level-set constraints, parametric
boundary. frontbody, or backbody. A use for the last is to use a boundary
or constraint to define an initial curve or surface, refine to get a decent
triangulation, then use "unset vertices boundary 1" and "unset edges
boundary 1" to free the curve or surface to evolve. The form "unset facet
bodies ..." is also available to disassociate given facets from their
bodies. Examples:
   unset body[1] target
   unset vertices constraint 1; unset edges constraint 1


<--------------------------- unstable surfaces ---------------------------->

Detecting the onset of instability and evolving unstable surfaces.

The Hessian features can be used to detect the onset of instability as
some parameter changes, and even evolve unstable equilibrium surfaces.

Instability detection is done by watching eigenvalues with the ritz
command. As an example, consider a ring of liquid outside a cylinder, with
the volume increasing until the symmetric ring becomes unstable. This is
set up in the datafile catbody.fe, which is just cat.fe with a body defined
from the facets. Run catbody.fe with this initial evolution:
  u
  g 5
  r
  g 5
  body[1].target := 2
  g 5
  r
  body[1].target := 3
  g 5
  hessian
  hessian
  linear_metric
  ritz(0,5)

This gives eigenvalues

Eigencounts:    0
  1.    0.398411128930840
  2.    0.398411128930842
  3.    1.905446082321839
  4.    1.905446082321843
  5.    4.4342055632012

Note we are still in a stable, positive definite situation, but the lowest
eigenvalues are near enough to zero that we need to take care in increasing
the volume. Try an increment of 0.1:

  body[1].target += 0.1
  g 5
  hessian
  hessian
  ritz(0,5)
Eigencounts:    0
  1.    0.287925880010193
  2.    0.287925880010195
  3.    1.775425717998147
  4.    1.775425717998151
  5.    4.2705109310529

A little linear interpolation suggests try an increment of 0.3:

  body[1].target += 0.3
  g 5
  hessian
  hessian
  hessian
  ritz(0,5)
Eigencounts:    0
  1.    0.001364051154697
  2.    0.0013640511547
  3.    1.4344757227809
  4.    1.4344757227809
  5.    3.8350719808531

So we are now very very close to the critical volume. In view of the
coarse triangulation here, it is probably not worth the trouble to narrow
down the critical volume further, but rather refine and repeat the process.
But for now keep this surface running for the next paragraph.

Evolving into unstable territory Typically these are surfaces with just a
few unstable modes. The idea is to get close to the desired equilibrium and
use "hessian" to reach it. Regular 'g' gradient descent iteration should
not be used. To change the surface, i.e. to follow an equilibrium curve
through a phase diagram, make small changes to the control parameter and
use a couple of hessian iterations to reconverge each time. Particular care
is needed near bifurcation points, because of the several equilibrium
curves that meet. When approaching a bifurcation point, try to jump over it
so there is no ambiguity as to which curve you are following. The approach
to a bifurcation point can be detected by watching eigenvalues. An
eigenvalue crosses 0 when a surface introduces new modes of instability.

Example: Catbody.fe, continued. With catbody.fe in the nearly-critical
state found above, increase the body volume by steps of .1 and run hessian
a couple of times each step:

 body[1].target += .1
 hessian
 hessian
 hessian
 hessian
 body[1].target += .1
 hessian
 hessian
 hessian
 hessian
 body[1].target += .1
 hessian
 hessian
 hessian
 hessian

So hessian alone is enough to evolve with, as long as you stay near enough
to the equilibrium.

Other methods for evolving unstable surfaces:

Using symmetry. If the unstable surface is more symmetric than the
stable surfaces, then enforcing symmetry can remove the unstable modes. For
example, a surface of revolution could be retricted to just a 90 degree
wedge between two perpendicular mirror planes (level-set constraints), with
90 degree contact angles on the planes.

Using volume constraints. Recall that in general every constraint
removes one degree of freedom in the configuration space. Hence a volume
constraint has the potential to remove one unstable mode. For example,
unstable catenoids can be made stable by adding a volume constraint and
adjusting the volume until the pressure is 0.


<----------------------------- user functions ----------------------------->

User-defined functions can be defined in C in userfunc.c. They are meant
for situations where expression interpretation is too slow, or functions
such as elliptic integrals are wanted. Currently, they are automatically
functions of the coordinates. Do not give any arguments in the expression;
for example "(usr1 + usr3)/usr10".

<------------------------- user-defined mobility -------------------------->

The user may define a mobility tensor in the datafile. There is a scalar
form with the keyword MOBILITY and a tensor form with MOBILITY_TENSOR. When
in effect, this mobility is multiplied times the velocity to give a new
velocity. This happens after any of the previous mobilities of this section
have been applied and before projection to constraints. The formulas
defining the mobility may include adjustable parameters, permitting the
mobility to be adjusted during runtime. The formulas are evaluated at each
vertex at each iteration, and so formulas may depend on vertex position and
any vertex attributes.

<---------------------------------- usr ----------------------------------->

usr1, usr2, etc. : user-defined functions; see "user functions".

<--------------------------------- utest ---------------------------------->

Main prompt commnad. Runs a test to see if triangulation is Delaunay.
Meant for higher dimensions and simplex model.

<----------------------------------- v ------------------------------------>

Single letter main command. Shows target volume, actual volume, and
pressure of each body. Also shows named quantities. Pressures are really
the Lagrange multipliers. Pressures are computed before an iteration, so
the reported values are essentially are one iteration behind. Synonym:
show_vol

Graphics mode command. Toggles showing of convex and concave edges in
different colors. "v" stands for "valleys".

<----------------------------------- V ------------------------------------>

Single letter main command. Vertex averaging. For each vertex, computes
new position as area-weighted average of centroids of adjacent facets. Only
adjacent facets with the same constraints and boundaries are used.
Preserves volumes, at least to first order. See the rawv command for vertex
averaging without volume preservation, and rawestv for ignoring likeness of
constraints. Vertices on triple edges are averaged only with adjacent
vertices on the triple edge, and then only if there are exactly two
neighboring triple edge vertices. Fixed vertices do not move. Vertices on
constraints are projected back onto their constraints. The computation of
new vertex positions are all done before any vertex is moved. For
sequential movement applied to a subset of vertices, see the vertex_average
command.

<--------------------------- v_constraint_list ---------------------------->

Internal vertex read-only attribute. List of constraints a vertex
is on. v_constraint_list[1] is the number of constraints in the list,
followed by the numbers of the constraints. Note that for named
constraints, the internally assigned numbers are used.

<-------------------------------- valence --------------------------------->

An attribute of a vertex, which is the number of incident edges, or an
attribute of an edge, which is the number of incident facets, or an
attribute of a facet, which is the number of edges on the facet.
Example:
   refine edge where valence == 1 and length > 0.05

<----------------------------- valid_boundary ----------------------------->

Boolean function.  Returns 1 or 0 depending on whether a parametric
boundary with the given number exists (note that the name of a 
named boundary is internally interpreted as a number).  Syntax:

    VALID_BOUNDARY(expression)

One use is in looping through all parametric boundaries, in conjunction
with the high_boundary internal variable.  For example,

  for ( bnum := 1 ; bnum <= high_boundary ; bnum += 1 )
    if valid_boundary(bnum) then
       printf "Boundary %d has %d vertices on it\n",bnum,
          sum(vertex,on_boundary bnum);

<---------------------------- valid_constraint ---------------------------->

Boolean function.  Returns 1 or 0 depending on whether a level-set
constraint with the given number exists (note that the name of a 
named constraint is internally interpreted as a number).  Syntax:

    VALID_CONSTRAINT(expression)

One use is in looping through all level-set constraints, in conjunction
with the high_constraint internal variable.  For example,

  for ( cnum := 1 ; cnum <= high_constraint ; cnum += 1 )
    if valid_constraint(cnum) then
       printf "Constraint %d has %d vertices on it\n",cnum,
          sum(vertex,on_constraint cnum);

<----------------------------- valid_element ------------------------------>

Boolean function. Returns 1 or 0 depending on whether an
element of a given index exists. Syntax:

 VALID_ELEMENT(indexed_element)

Examples:

   if valid_element(edge[12]) then refine edge[12]
   if valid_element(body[2]) then set body[2].facet color red


<--------------------------------- value ---------------------------------->

The value of a quantity may be displayed with the A or v commands, or as
an expression "quantityname.value". Furthermore, using the quantity name as
an element attribute evaluates to the sum of all the applicable component
instance values on that element. For example, supposing there is a quantity
named vol, one could do
  print vol.value
  print facet[2].vol
  histogram(facet,vol)

<------------------------ value_of_constraint ----------------------------->

Built-in vertex constraint.  Evaluates the formula of the given
level-set constraint at the coordinates of the vertex.  Examples:
     print  vertex[5].value_of_constraint 1
     list vertex where value_of_constraint topcon > 0.5

      

<-------------------------- variable assignment --------------------------->

Values can be assigned to variables. Values can be numeric or string. The
variable names must be two or more letters, in order they not be confused
with single-letter commands. Syntax:

   identifier := expr
   identifier := stringexpr

If the variable does not exist, it will be created. These are the same
class of variables as the adjustable parameters in the datafile, hence are
all of global scope and may also be inspected and changed with the 'A'
command. Examples:

   maxlen := max(edge,length)
   newname := sprintf "file%03g",counter

<------------------------------- variables -------------------------------->

The Evolver command language has its own version of the user-defined
variables common to most programming languages. Variables are typed
according to the types of the values assigned to them: numeric or string.
Users may define numeric variables either by variable declarations in the
datafile, or both types by assigning a value to an identifier in a command.
A variable may be subjected to optimization by declaring it an
optimizing_parameter in the datafile.


<---------------------------- vector_integrand ---------------------------->

Additional attribute of some named methods, such as edge_vector_integral
and facet_vector_integral.  The following syntax is added to the
quantity or method declaration:

 VECTOR_INTEGRAND:
 Q1: expr
 Q2: expr
 Q3: expr

where the expressions may use space coordinates and element attributes,
besides any global values.


<------------------------------- v_velocity ------------------------------->

Internal vertex read-only attribute. This is an indexed attribute giving the
components of the vector used for vertex motion in the 'g' command. The
motion of a vertex is the scale factor times this vector. The velocity
vector is calculated from the force vector by applying area normalization,
mobilty, projecting to constraints, etc. Also, if a vertex is on a boundary, 
the velocity is projected back to parameters.


<-------------------------------- verbose --------------------------------->

Evolver toggle command. Toggles printing of progress messages during
surface modification commands such as refine, delete, notch, edgeswap, o,
O, c.

<-------------------------------- version --------------------------------->

If a datafile contains features present only after a certain version of
the Evolver, the datafile can contain a line of the form
    evolver_version "2.10"
This will generate a version error message if the current version is
earlier, or just a syntax error if run on an Evolver version earlier than
2.10.


<--------------------------------- vertex --------------------------------->

One of the basic geometric elements. As a keyword, it is used in element
generators.


<---------------------------- vertex boundary ----------------------------->

Vertex, edge, or facet read-only attribute.
The status of whether an element is on a boundary can be queried with the
Boolean attribute on_boundary. Elements can be unset from boundaries, but
not set on them (since parameter values would be unknown). Examples:

  list vertex where on_boundary 1
  unset vertex boundary 2

<------------------------------ vertex edges ------------------------------>

Vertex read-only attribute. Generates edges attached to a vertex, oriented
so vertex is the edge tail. The edges are in no particular order. Examples:

  list vertex[3].edges
  foreach vertex vv do { foreach vv.edge do print id }

Always use "vertexspec.edges" to generate vertex edges; using "edges" with an
implicit element, as in "foreach vertex do list edges" will list all edges
in the surface over and over again.

<----------------------------- vertex facets ------------------------------>

Vertex read-only attribute. Generates facets attached to a vertex, with
positive facet orientation. The facets are in no particular order.
Examples:

  list vertex[3].facets
  foreach vertex vv do { foreach vv.facet do print id }

Always use "vertexspec.facets" to generate vertex facets; using "facets" with
an implicit element, as in "foreach vertex do list facets" will list all
facets in the surface over and over again.

<----------------------------- vertex valence ----------------------------->

Vertex read-only attribute. The valence of a vertex is defined to be the
number of edges it is a member of. Example:

  list vertices where valence == 6
  histogram(vertex,valence)

<----------------------------- vertex_average ----------------------------->

Main prompt command. Does vertex averaging for one vertex at a time.
Syntax:

  VERTEX_AVERAGE vertex_generator

The action is the same as the V command, except that each new vertex
position is calculated sequentially, instead of simultaneously, and an
arbitrary subset of vertices may be specified. Fixed vertices do not move.
Examples:
  vertex_average vertex[2]
  vertex_average vertex where id < 10
  vertex_average vertex vv where max(vv.facet,color==red) == 1
See also "raw_vertex_average" and "rawest_vertex_average" for less
restricted averaging.


<------------------------------ vertex_count ------------------------------>

Internal read-only variable. Number of vertices.

<------------------------- vertex_dissolve_count -------------------------->

Internal read-only variable. Number of vertices dissolved by the dissolve
command. Prints and resets to 0 at the end of a command execution, or when
flush_counts is done. Also reset by reset_counts.

<------------------------------ vertex_merge ------------------------------>

Main prompt command. Merges two soapfilm-model vertices into one. Meant
for joining together surfaces that bump into each other. Should not be used
for vertices already joined by an edge. Syntax:

  vertex_merge(integer,integer)

Note the syntax is a function taking integer vertex id arguments, not
element generators. Example:

   vertex_merge(3,12)

The first vertex is the surviving vertex.

<---------------------------- vertex_order_key ---------------------------->

Integer vertex attribute used by reorder_storage to determine the new
order of vertexs in storage.  See reorder_storage for details of use.

<--------------------------- vertices_predicted --------------------------->

Datafile keyword in the top section of the datafile that specifies the
initial allocation of vertex structures.  Optional.  The purpose is to
prevent repeated reallocation of memory as the vertex list grows or as 
the surface evolves.  Should be faster, and prevents memory fragmentation.
Automatically put in dump files by the "d" or "dump" commands, based on
the current number of vertices.
Example:
    vertices_predicted 3074
    edges_predicted    9216
    facets_predicted   6144
    bodies_predicted      1
    facetedges_predicted  18432

<---------------------------- v_partition_proc ---------------------------->

Internal vertex attribute used when the multiprocessor option -pn is used.
Determines which thread owns a vertex.

<--------------------------- v_partition_stage ---------------------------->

Internal vertex attribute used when the multiprocessor option -pn is used.
Coordinates the sequencing of iteration over vertex in certain operations
so different threads don't conflict and time-consuming locks are not
necessary.

<---------------------------- vertex_pop_count ---------------------------->

Internal read-only variable. Number of vertices popped by "pop" or 'o' command.
Prints and resets to 0 at the end of a command execution, or when flush_counts
is executed. Also reset by reset_counts.

<------------------------- vertex_scalar_integral ------------------------->

Named method. Description: Function value at a vertex. This actually
produces a sum over vertices, but as a mathematician, I think of a sum over
vertices as a point-weighted integral. 

Element: vertex. 
Parameters: scalar_integrand. 
Models: string, soapfilm, simplex; linear, quadratic, Lagrange. 
Ambient dimension: any. 
Hessian: yes. 
Example datafile declaration:

  quantity point_value energy method vertex_scalar_integral
  scalar_integrand: x^2 + y^2 - 2x + 3

<------------------------------ vertexnormal ------------------------------>
<----------------------------- vertex_normal ------------------------------>

Vertex read-only attribute. This is an indexed attribute consisting of the
components of a normal to the surface at a vertex, normalized to unit
length. This is the same normal as used in hessian_normal mode. For most
vertices in the soapfilm model, the normal is the number average of the
unit normals of the surrounding facets. Along triple edges and such where
hessian_normal has a multi-dimensional normal plane, the vertex_normal is
the first basis vector of the normal plane. Example: To print the normal
components of vertex 3:

 print vertex[3].vertex_normal[1];
 print vertex[3].vertex_normal[2];
 print vertex[3].vertex_normal[3];

The vertex_normal vector can also be printed as an array:
 print vertex[3].vertex_normal

vertexnormal and vertex_normal are synonyms.

<-------------------------------- vertices -------------------------------->

A vertex is a point in space. The coordinates of the vertices are the
parameters that determine the location of the surface. It is the
coordinates that are changed when the surface evolves. A vertex carries no
default energy, but may have energy by being on a level set constraint in
the string model, or by having a named quantity energy applied to it. The
vertices of the original surface are defined in the vertices section of the
datafile.

 Attributes:

 > id
 > original
 > coordinates
 > parameter values
 > fixed
 > constraints
 > on_constraint
 > hit_constraint
 > v_constraint_list
 > boundary
 > on_boundary
 > bare
 > edges
 > facets

 > valence
 > quantities
 > on_quantity
 > on_method_instance
 > mid_edgedihedral
 > mid_facet
 > square mean curvature
 > axial_point
 > triple_point
 > tetra_point
 > vertex_normal
 > force
 > velocity
 > extra attributes


<---------------------------- vertices section ---------------------------->

The datafile vertex list is started by the keyword VERTICES at the start
of a line. It is followed by lines with one vertex specification per line.
If the vertex is not on a parametric boundary, the syntax is

  k   x y ... [FIXED] [CONSTRAINT c1 c2 ...]  [BARE]
              [quantityname ...] [methodname ...]

The syntax for a vertex on a parametric boundary is

  k p1 [p2 ...]  BOUNDARY b [FIXED] [BARE] [quantityname ...]
     [methodname ...]

Here k is the vertex number, a positive integer. Vertices do not need to
be listed in order, and there may be gaps in the numbering. However, if
they are not in consecutive order, then the numbering in dump files will be
different. x y ... are constant expressions for coordinates. In the
parametric boundary format, the boundary parameter values are given instead
of the coordinates. If FIXED is given, then the vertex never moves, except
possibly for an initial projection to constraints. If CONSTRAINT is given,
then one or more constraint numbers must follow. You can list as many
constraints as you want, as long as those that apply exactly at any time
are consistent and independent. The given coordinates need not lie exactly
on the constraints; they will be projected onto them. A vertex on a
parametric boundary cannot also be on a constraint.

The BARE attribute is just an instruction to the checking routines that
this vertex is not supposed to have an adjacent facet in the soapfilm
model, so spurious warnings will not be generated. This is useful when you
want to show bare wires or outline fundamental domains.
An arbitrary number of named quantities or method instances may be listed.
These add method values for this element to the named quantity. The named
quantity or instance must have been declared in the top section of the
datafile.

The "list vertices" command prints the datafile format listing of vertices.

<---------------------------- view generators ----------------------------->

Listing all the view transforms is tedious and inflexible. An alternative
is to list just a few matrices that can generate transforms. See the
transform_expr command for instructions on entering the expression that
generates the actual transforms. Special Note: in the torus model, the
period translations are automatically added to the end of the list. So in
the torus model, these are always available, even if you don't have
view_transform_generators in the datafile. Syntax in the top of the
datafile:

VIEW_TRANSFORM_GENERATORS n
SWAP_COLORS
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
    ...

The number of matrices follows the keyword VIEW_TRANSFORM_GENERATORS. Each
matrix is in homogeneous coordinates, with translation in the last column.
The size of each matrix is one more than the space dimension. Individual
matrices need no special separation; Evolver just goes on an expression
reading frenzy until it has all the numbers it wants. If SWAP_COLORS is
present, facet frontcolor and backcolor will be swapped when this matrix is
applied. The internal variable transform_count records the number of
transforms, and the transform matrices are accessible at runtime as a
three-dimensional matrix view_transforms[][][].


<------------------------------ view matrix ------------------------------->

The native screen graphics view is controlled by a view transformation
matrix, which may be specified in the datafile, and which is dumped by the
d or list topinfo commands. The view matrix may be changed with graphics
mode commands. The view matrix elements may be read or set at runtime by
view_matrix[i][j], where the indices start at 1. In particular, one can
write command scripts to save and reload particular view matrices; see
saveview.cmd in the distribution package. The view matrix does not affect
geomview.

The display consists entirely of facets and edges. Special edges (fixed
edges, boundary edges, constraint edges, triple edges, bare edges) are
always shown, unless you make their color CLEAR. The individual facet edges
can be toggled with the graphics mode command `e'.


<---------------------------- view transforms ----------------------------->

For the display of several transformations of the surface simultaneously,
a number of viewing transformation matrices may be given in the top section
of the datafile:

VIEW_TRANSFORMS n
COLOR color
SWAP_COLORS
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
    ...

The transforms apply to all graphics, internal and external, and are prior
to the viewing matrix for internal graphics. The identity transform is
always done, so it does not need to be specified. The number of matrices
follows the keyword VIEW_TRANSFORMS. Each matrix is in homogeneous
coordinates, with translation in the last column. The size of each matrix
is one more than the space dimension. Individual matrices need no special
separation; Evolver just goes on an expression reading frenzy until it has
all the numbers it wants. Each matrix may be preceded by an optional color
that applies to facets transformed by that matrix. The color applies to one
transform only; it does not continue until the next color specification. If
SWAP_COLORS is present instead, facet frontcolor and backcolor will be
swapped when this matrix is applied. Transforms may be activated or
deactivated interactively with the transforms toggle. The internal variable
transform_count records the number of transforms, and the transform
matrices are accessible at runtime as a three-dimensional matrix
view_transforms[][][]. View transform generators are a more sophisticated
way to control view transforms.

<-------------------------------- view_4d --------------------------------->

Evolver toggle command. Toggles sending 4D information to geomview.


<------------------------------ view_matrix ------------------------------->

The top section of the datafile may contain an initial viewing matrix:

VIEW_MATRIX
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr

The matrix is in homogeneous coordinates with translations in the last
column. The size of the matrix is one more than the space dimension. This
matrix will be part of all dump files, so the view can be saved between
sessions. This matrix is used and set by native screen graphics ('s'
command) and only applies to internal graphics (Postscript, Xwindows, etc.)
but not external graphics (geomview). The elements may be read or set at
runtime by view_matrix[i][j], where the indices start at 1. In particular,
one can write command scripts to save and reload particular view matrices;
see saveview.cmd in the distribution package.

<----------------------- view_transform_generators ------------------------>

Listing all the view transforms is tedious and inflexible. An alternative
is to list just a few matrices that can generate transforms. See the
transform_expr command for instructions on entering the expression that
generates the actual transforms. Special Note: in the torus model, the
period translations are automatically added to the end of the list. So in
the torus model, these are always available, even if you don't have
view_transform_generators in the datafile. Syntax in the top of the
datafile:

VIEW_TRANSFORM_GENERATORS n
SWAP_COLORS
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
    ...

The number of matrices follows the keyword VIEW_TRANSFORM_GENERATORS. Each
matrix is in homogeneous coordinates, with translation in the last column.
The size of each matrix is one more than the space dimension. Individual
matrices need no special separation; Evolver just goes on an expression
reading frenzy until it has all the numbers it wants. If SWAP_COLORS is
present, facet frontcolor and backcolor will be swapped when this matrix is
applied. The internal variable transform_count records the number of
transforms, and the transform matrices are accessible at runtime as a
three-dimensional matrix view_transforms[][][].


<---------------------------- view_transforms ----------------------------->

For the display of several transformations of the surface simultaneously,
a number of viewing transformation matrices may be given in the top section
of the datafile:

VIEW_TRANSFORMS n
COLOR color
SWAP_COLORS
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
  constexpr constexpr constexpr constexpr
    ...

The transforms apply to all graphics, internal and external, and are prior
to the viewing matrix for internal graphics. The identity transform is
always done, so it does not need to be specified. The number of matrices
follows the keyword VIEW_TRANSFORMS. Each matrix is in homogeneous
coordinates, with translation in the last column. The size of each matrix
is one more than the space dimension. Individual matrices need no special
separation; Evolver just goes on an expression reading frenzy until it has
all the numbers it wants. Each matrix may be preceded by an optional color
that applies to facets transformed by that matrix. The color applies to one
transform only; it does not continue until the next color specification. If
SWAP_COLORS is present instead, facet frontcolor and backcolor will be
swapped when this matrix is applied. Transforms may be activated or
deactivated interactively with the transforms toggle. The internal variable
transform_count records the number of transforms, and the transform
matrices are accessible at runtime as a three-dimensional matrix
view_transforms[][][]. View transform generators are a more sophisticated
way to control view transforms.

<------------------------- view_transform_parity -------------------------->

view_transform_parity[]
Internal read-only array that contains 0 or 1 for transforms that don't
or do swap front and back colors.  The order of transforms is the same
as for view_transforms[][][].

<----------------------- view_transform_swap_colors ----------------------->

view_transform_swap_colors[]
Internal read-only array that contains 0 or 1 for transforms that don't
or do swap front and back colors.  The order of transforms is the same
as for view_transforms[][][]. For my debugging purposes.


<-------------------- view_transforms_use_unique_point -------------------->
<---------------------- view_transforms_unique_point ---------------------->

When view transforms are generated with transform_expr, Evolver weeds out 
duplicate transforms.  By default, "duplicate" means the same transform 
matrix, but there are circumstances where different transform matrices carry 
the surface to the same spot. view_transforms_use_unique_point toggle enables 
a mode whereby two transform matrices are deemed identical if they transform 
the point given by the vector view_transforms_unique_point[] to the same 
image point.  The standard use is to make view_transforms_unique_point[] a 
vertex on the surface being transformed, for example


   view_transforms_unique_point := vertex[5].__x;
   view_transforms_use_unique_point on;
   transform_expr "abababa";

The vector view_transforms_unique_point[] is pre-defined, so the use does not
need to define it.

<---------------------------- visibility_debug ---------------------------->

Evolver toggle command, which causes printing of verbose information
when visibility_test is on; don't use it. 
 

<---------------------------- visibility_test ----------------------------->

Evolver toggle command. Toggles an occluded-triangle test for graphics
output that uses the Painter's Algorithm to produce 2D output (PostScript,
Xwindows). This can greatly reduce the size of a PostScript file, but
inspect the output since the implementation of the algorithm may have
flaws.

<-------------------------------- volconst -------------------------------->

Body read-write attribute. A constant added to the calculated volume.
Useful for correcting for omitted parts of body boundaries. Also used
internally as a correction in the torus model , which will use the target
volume to calculate volconst internally. In the torus model, the target
volume should be set within 1/12 of a torus volume of the actual volume for
each body, so the correct volconst can be computed. Each volconst will be
adjusted proportionately when the volume of a fundamental torus domain is
change by changing the period formulas. Volconst can be set in the datafile
bodies section, or interactively by the set command or by assignment.
Examples:
  print body[1].volconst
  set body[2] volconst 1.2
  body[2].volconst := 1.2

It is best to avoid using volconst except in the torus model. Rather, use
edge content integrals so that the proper adjustments will be made if the
boundary of the surface is moved, or rebody is done.

Named quantities can also have a volconst value.

<-------------------------------- volfixed -------------------------------->

Body read-only attribute. Value is 1 if the volume of the body is fixed, 0
if not.


<----------------------------- volgrads_every ----------------------------->

Evolver toggle command. Toggles recalculating volume constraint gradients
every projection step during constraint enforcement. Good for stiff
problems.

<--------------------------------- volume --------------------------------->

Body read-only attribute. Actual volume of a body. This is the sum of
three parts, in the soapfilm model:
 1. An integral over the facets bounding the body. This is \int z dx dy
    normally, but \int (x dy dz + y dz dx + z dx dy)/3 if SYMMETRIC_CONTENT is
    in effect.
 2. Any constraint content edge integrals applying to the body.
 3. The body's volconst attribute.

In the string model, the parts are
 1. An integral over the edges bounding the body's facet. This is \int -y dx.
 2. Any constraint content vertex integrals applying to the body.
 3. The body's volconst attribute.

Body volumes can be displayed with the v command, or with standard
attribute syntax. Example:
  print body[1].volume
  foreach body where volume > 2 do print id


<--------------------------- volume_method_name --------------------------->

This top-of-datafile item, volume_method_name, specifies the name of the
pre-defined method to use as the method to compute body volumes in place
of the default edge_area method in the string model or facet_volume method
in the soapfilm model. It is optional. Developed so circular arcs can be
used in two-dimensional foams. Synonymous with area_method_name in the string
model. Usage implies converting to everything_quantities mode. Syntax:

    volume_method_name quoted_method_name

For example,

   string
   space_dimension 2
   volume_method_name "circular_arc_area"

<----------------------------------- W ------------------------------------>

Single letter main command. Toggles homothety. If homothety ON, then after
every iteration, the surface is scaled up so that the total volume of all
bodies is 1. Meant to be used on surfaces without any blowup constraints of
any kind, to see the limiting shape as surface collapses to a point.



<----------------------------------- w ------------------------------------>

Single letter main command. Tries to weed out small triangles. You will be
prompted for the cutoff area value if you don't give a value with the
command. If you enter h, you will get a histogram of areas to guide you. If
you hit RETURN with no value, nothing will be done. Some small triangles
may not be eliminable due to constraints or other such obstacles. The
action is to eliminate an edge on the triangle, eliminating several facets
in the process. Edges will be tried for elimination in shortest to longest
order. WARNING: Although checks are made to see if it is reasonable to
eliminate an edge, it is predicated on facets being relatively small. If
you tell it to eliminate all below area 5, Evolver may eliminate your
entire surface without compunction.

Graphics mode command. Toggles display of facets entirely on
constraints. For a one-sided constraint, applies to facets whose vertices
all hit the constraint. "w" stands for "wall".

<---------------------------- warning_messages ---------------------------->

To print warning messages that have been emitted during reading of the
datafile but have scrolled off the top of your screen, you may use the
command "print warning_messages".

<--------------------------------- where ---------------------------------->

Clause in element generators to specify a subset of elements.
Examples:
   list facet where color == red
   foreach edge ee where ee.length < .3 do list ee.vertex
   print max(edge where on_constraint 1, length)

<------------------------------ where_count ------------------------------->

Internal read-only variable. Number of items satisfying last "where"
condition. Prints and resets to 0 at the end of a command execution,
or when flush_counts is done. Also reset by reset_counts.

<-------------------------------- whereami -------------------------------->

Debug prompt command that prints a stack trace showing the sequence 
of function or procedure calls made to reach the current spot. 
See "breakpoint".

<--------------------------------- while ---------------------------------->

Command syntax for pre-test iteration loop. Syntax:

  WHILE expr DO command

where expr is true if nonzero. Parentheses around expr are not needed, but do
not hurt. Example:

   count := 0
   while count < 10 do { g 10; u; print total_energy; count := count + 1 }

<------------------------------- whitespace ------------------------------->

In the datafile, whitespace consists of spaces, tabs, commas, colons, and
semicolons. So it's fine if you want to use commas to separate coordinate
values, and colons to prettify constraint definitions. In commands,
whitespace consists of spaces and tabs. CTRL-Z is also whitespace, for the
benefit of files imported from DOS.


<-------------------------- window_aspect_ratio --------------------------->

Internal read-write variable. The ratio of the the vertical to horizontal
dimensions of the display window. If set, this locks the aspect ratio to
the given value. The window may be resized with the mouse, but the
aspect ratio will stay the same. The unset value of window_aspect_ratio
is 0; setting window_aspect_ratio to 0 will unlock the aspect ratio.
Applies also to the PostScript bounding box, if full_bounding_box is on.
Currently implemented only in Evolver with GLUT graphics.
Caveat: the window doesn't always fully follow the mouse; just keep trying.


<---------------------------------- wrap ---------------------------------->

Edge read-write attribute. When a symmetry group is in effect (such as the
torus model) and an edge crosses the boundary of a fundamental domain, the
edge is labelled with the group element that moves the edge head vertex to
its proper position relative to the tail vertex. The label is internally
encoded as an integer, the encoding peculiar to each symmetry group. Edge
wrappings are set in the datafile. The torus model has its own peculiar
wrap representation in the datafile: * for no wrap, + for positive wrap,
and - for negative wrap. Wraps are maintained automatically by Evolver
during surface manipulations. The numeric edge wrap values can be queried
with attribute syntax. Example:

  list edge where wrap != 0

Unfortunately, the torus model wraps come out rather opaquely, since one
cannot print hex. The torus wrap number is the sum of numbers for the
individual directions: +x = 1; -x = 31; +y = 64; -y = 1984; +z = 4096; -z =
127040. Caution: even though this attribute can be written by the user at
runtime, only gurus should try it.


<------------------------------ wrap_compose ------------------------------>

wrap_compose(w1,w2) : Function returning the symmetry group code for the
composition of symmetry group elements w1, w2. Useful only if a
symmetry group has been declared in the datafile.

<------------------------------ wrap_inverse ------------------------------>

wrap_inverse(w) :  Function returning the symmetry group numerical code
for the inverse of symmetry group element w. Useful only if a symmetry
group has been declared in the datafile.

<------------------------------ wrap_vertex ------------------------------->

Main prompt command. Syntax:

 wrap_vertex(vexpr,wexpr)

In a symmetry group model, transforms the coordinates of vertex number
vexpr by symmetry group element wexpr and adjusts wraps of adjacent edges
accordingly.   Useful for re-setting vertices in torus model that get too
far outside the unit cell.

<--------------------------------- writhe --------------------------------->

Named method. Description: An average crossing number calculation. This
one does have a gradient. Suggested by Hermann Gluck. Programmed by John
Sullivan. Between pairs of edges, energy is inverse cube power of distance
between midpoints of edges, times triple product of edge vectors and
distance vector.

     E = 1/d^3 * (e1,e2,d)

Element: edge. 
Parameters: none. 
Models: linear. 
Ambient dimension: 3.
Hessian: no. 
Example datafile declaration:

  quantity writhy energy method writhe global


<--------------------------------- wulff ---------------------------------->

To declare that surface area energy should be calculated with a
crystalline integrand, the top section of the datafile should contain a
line of the form

 WULFF "filename"

The double-quoted filename (with path) refers to a file giving the Wulff
vectors of the integrand. The format of the file is one Wulff vector per
line with its components in ASCII decimal format separated by spaces. The
first blank line ends the specification. Some special integrands can be
used by giving a special name in place of the file name. Currently, these
are "hemisphere" for a Wulff shape that is an upper unit hemisphere, and
"lens" for two unit spherical caps of thickness 1/2 glued together on a
horizontal plane. These two don't need separate files.

<------------------------------- hemisphere ------------------------------->
<---------------------------------- hemi ---------------------------------->
<---------------------------------- lens ---------------------------------->

One of the special types of Wulff energy.  See "wulff".

<------------------------------ wulff_energy ------------------------------>

Named method. Description: Method version of wulff energy. If Wulff
filename is not given in top section of datafile, then the user will be
prompted for it. 

Element: facet. 
Parameters: none. 
Models: soapfilm; linear. 
Ambient dimension: 3. 
Hessian: no. 
Example datafile declaration:

   wulff "crystal.wlf"
   quantity wolf energy method wulff_energy global


<----------------------------------- X ------------------------------------>

Single letter main command. List the current extra attributes, including
name, dimension, type, size in bytes, and offset within the element
structure. Some internal attributes are also listed, whose names begin with
a double underscore.


<----------------------------------- x ------------------------------------>

Single letter main command. Same as q. Exit Evolver, or start new surface.

Graphics mode command. Exit from graphics mode, and return to main
command mode.

Vertex attribute.  Alone, the first coordinate of the vertex.  With index,
the indexed coordinate.  For treating coordinates as a single vector,
use the vertex attribute __x.

Edge attribute.  Alone, the first component of the edge vector.  With index,
the indexed component.  For treating the edge vector as a single vector,
use the edge attribute edge_vector.

Facet attribute.  Alone, the first component of the facet normal vector
(normalized so length is equal to facet area).  With index, the indexed 
component.  For treating the facet normal as a single vector,
use the facet attribute facet_normal.

<----------------------------------- x1 ----------------------------------->
<----------------------------------- x2 ----------------------------------->
<----------------------------------- x3 ----------------------------------->
<----------------------------------- x4 ----------------------------------->
<----------------------------------- x5 ----------------------------------->
<----------------------------------- x6 ----------------------------------->
<----------------------------------- x7 ----------------------------------->
<----------------------------------- x8 ----------------------------------->

Vertex attribute, alternate notation for x[n] or __x[n].
x1 is x, x2 is y, x3 is z.

Edge attribute, alternate notation for x[n] or edge_vector[n].

Facet attribute, alternate notation for x[n] or facet_normal[n].

<--------------------------- xyz symmetry group --------------------------->

The orientation-preserving subgroup of cubocta. Same representation.

<----------------------------------- y ------------------------------------>

Single letter main command. Torus duplication. In torus model, prompts for
a period number (1,2, or 3) and then doubles the torus unit cell in that
direction. Useful for extending simple configurations into more extensive
ones.

Vertex attribute.  The second coordinate of the vertex.  For treating 
coordinates as a single vector, use the vertex attribute __x.

Edge attribute. The second component of the edge vector.  For treating 
the edge vector as a single vector, use the edge attribute edge_vector.

Facet attribute.  The second component of the facet normal vector
(normalized so length is equal to facet area).  For treating the 
facet normal as a single vector, use the edge attribute facet_normal.

<---------------------------------- ysmp ---------------------------------->

Evolver toggle command. Toggles between Yale Sparse Matrix Package
routines for factoring hessians, and my own minimal degree factoring.
Default is YSMP off.


<----------------------------------- z ------------------------------------>

Single letter main command. Do curvature test on QUADRATIC model. Supposed
to be useful if you're seeking a surface with monotone mean curvature.
Currently checks angle of creases along edges and samples curvature on
facet interiors. Orientation is with respect the way facets were originally
defined. Deprecated.

Graphics mode command. Zoom. Expands image by factor, default 1.2.
Examples: `z' zooms by 1.2, `2z' zooms by 1.44, '2.0z' zooms by 2.

Vertex attribute.  The third coordinate of the vertex.  For treating 
coordinates as a single vector, use the vertex attribute __x.

Edge attribute. The third component of the edge vector.  For treating 
the edge vector as a single vector, use the edge attribute edge_vector.

Facet attribute.  The third component of the facet normal vector
(normalized so length is equal to facet area).  For treating the 
facet normal as a single vector, use the edge attribute facet_normal.


<----------------------------------- Z ------------------------------------>

Single letter main command. Zooms in on a vertex. Asks for vertex number
and radius. Number is as given in vertex list in datafile. Beware that
vertex numbers change in a dump (but correct current zoom vertex number
will be recorded in dump). Eliminates all elements outside radius distance
from vertex 1. New edges at the radius are made FIXED. Meant to investigate
tangent cones and intricate behavior, for example, where wire goes through
surface in the overhand knot surface. Zooming is only implemented for
surfaces without bodies.

<------------------------------ zener_coeff ------------------------------->

See "zener_drag".

<------------------------------- zener_drag ------------------------------->

Evolver toggle command. Toggles Zener drag feature, in which the velocity
of the surface is reduced by a magnitude given by the variable zener_coeff,
and the velocity is set to zero if it is smaller than zener_coeff.

<---------------------------------- zoom ---------------------------------->

Main prompt command. For isolating a region of a surface. Syntax:

   ZOOM integer expr

Zooms in on vertex whose id is the given integer, with radius the given
expr. Same as the 'Z' command, but not interactive.


<------------------------------ zoom_radius ------------------------------->

Datafile keyword setting the current zoom radius. Used in dump files after
a zoom command has been given.  See "Z".


<------------------------------ zoom_vertex ------------------------------->

Datafile keyword setting the current zoom vertex. Used in dump files after
a zoom command has been given.  See "Z".